机器学习03-神经网络
目录
一、非线性估值Non-Linear Hypothesis
二、神经网络建模 Neural Network
三、复习逻辑回归问题矩阵式
3.1 没有进行正则化
3.2 进行正则化
四、神经网络的代价函数
4.1 符号约定Notation
4.2 代价函数
五、反向传播算法 Backpropagation Alg
5.1 任务
5.2 一个训练样本
5.3 一个训练集
5.4 实现细节——随机初始化权重
5.5 实现细节——梯度检查
六、识别手写数字神经网络的实现过程
6.1 前项传播实现代价函数
6.2 前向传播+反向传播实现导数
6.3 实现随机初始化权重
6.4 实现sigmoid导数
复习Andrew Ng的课程Machine Learning,总结神经网络笔记一篇,涵盖课程week4、week5。
一、非线性估值Non-Linear Hypothesis
前面两篇博客讨论的技术——线性回归、逻辑回归,不管估值函数形式如何,参数与特征之间、特征各个维度之间的计算是都是线性的,也是
。这里面没有出现如
这样非线性的项。非线性的估值特别困难,原因在于非线性的特征太多,增长的速度也太快。
举个例子,在图像分类问题中,分类是否是一个“汽车”。一张50×50分辨率的图像有2500个像素,这2500个像素就是2500个特征(如果是RGB图像,那么就是2500×3=7500个特征)。如果加上非线性,即使只加入二次方的非线性,特征数也会达到约300万个。
特征总数 | ||||||
+ | + | = |
如此巨大的数据量使得非线性估值特别困难。因此,要想办法——引入神经网络Neural Network。神经网络要从神经元与大脑 Neurons & Brains说起。这个算法就是模仿神经系统工作的方式,详情看图,顺便认识几个医学、生物学英语单词。dendrite 树突,也就是神经元的输入;nucleus 细胞核; axon 轴突,也就是神经元的输出;
模仿神经元,我们建立自己的逻辑单元。输入有,其中“bias unit”偏置单元也就是
,由于恒等于1,这个可以不在图中画出来。
二、神经网络建模 Neural Network
Neural Network一般分为3类层次
- 输入层input layer;一般记作layer1;
- 隐(含)层hidden layer;可以有多层,一般记作layer2、layer3……
- 输出层output layer,视模型情况确定输出个数;最后一层layer
约定符号Notation及推导
="activation" of unit i in layer j . 第j层的第i个单元的激励
=matrix of weights controlling function mapping from layer j to layer j+1. 从layer j映射到layer j+1的权重控制函数矩阵。
这个最简单的神经网络传播过程就是这样的
If network has units in layer j,
units in layer j+1, then
will be dimension
.
如果网络中layer j有个units,layer j+1有
个units,那么
将是一个
维的矩阵。加了个1是因为每层都有偏置单元,偏置单元不是上一层的输出,但是得加上。比如上面推导的例子,网络第1层有3个单元,第2层有3个单元,那么
。
神经网络的分层结构,每一层都是下一层的输入。通过精心选择每一层的参数,就能构造出复杂的特征组合,从而避免了用第一层输入获得大量非线性组合的弊端。分层后,每层都作为下一层的输入,是更好的特征选择!!
三、复习逻辑回归问题矩阵式
重新考虑上一节的推导过程,可以写成矩阵式。训练集的特征,训练集的label是
,我们要求取的参数是
。
3.1 没有进行正则化
3.2 进行正则化
正则化要特别注意,不要对进行正则化。在octave中下标从1开始,所以在处理
相关的项(比如
)时都要表示相应向量的第一个分量,coding时应注意。
四、神经网络的代价函数
4.1 符号约定Notation
=total No. of layers in network. 神经网络中的层数。
=No. of units(not counting bias unit) in layer
. 第
层中神经元的个数(不包括偏置单元)。
训练集,共m个训练样本。
我们的多分类问题的label换了一个形式,不再是标量,而是一个向量,每个维度=1代表一个分类。
4.2 代价函数
其中,输出是一个向量,
表示该输出向量的第
个分量,
表示估值的第
个分量。
第一项是适应代价函数,一个样本估值有k个分量,一个label有k个分量,先对k个分量偏差求和,再对m个样本求和。
第二项是正则化部分,是把每层矩阵的每个元素都平方求和。每个矩阵是行,
列。再对
个矩阵求和。求和项中
从1开始计数,也就是不包括偏置单元的部分,也就是不包括
。
五、反向传播算法 Backpropagation Alg
5.1 任务
和前面讨论过的技术一样,这次的任务是,我们不断调整参数
,使代价函数
最小(找到局部最优解)。为此,我们需要推导两个公式,以用于计算。
5.2 一个训练样本
以上面这个网络为例,给出了一个训练样本,先计算forward propagation。
再计算backpropagation。
Intuition: ="error" of node j in layer l.
For each output unit (layer L = 4) ,向量化表达就是
。
然后考虑其他隐藏层的输出误差。
注意到和
。
注意到,和
之间的维度不同,根据我们实现的方式不同,
矩阵考虑了偏置单元而g函数没有考虑偏置单元,因此两者在维度上会有不同。我们在第六节里面举例具体说明。
注意,不要计算 ,因为layer1是输入,就是训练集里面的特征,不存在error。
5.3 一个训练集
这一部分给出了反向传播算法的实现过程,直接写英文了。由于Andrew Ng的PPT里面使用了两个做索引,索引的内容又不一样,因此容易混淆。我们把对训练集的索引用大写字母
来表示,这样就不会产生歧义了。
Traing Set
Set
For
Set
Perform forward propagation to compute for
Using
, compute
Compute
最终结论,,由此得到代价函数的偏导数。
5.4 实现细节——随机初始化权重
与线性回归、逻辑回归的初始化权重不同,反向传播算法初始化权重一定不能全部初始化为0。
假如我们将权重的元素全部初始化为0,那么前向传播时,各个隐藏层神经元得到的输入和权重都是一样的,那么神经元的输出也都一样。反向传播时,各层的
也是一样的,这也就意味着经过梯度下降以后,各个参数的变化值也是一样的。如此反复,每个神经元的输出都一样,最后输出层得到的每个特征也都是一样的,这就阻碍了神经网络的学习。
解决这个问题的办法就是随机初始化权重。我们选取一个足够小量,让各层权重
在区间
里面随机分布,这样权重足够小,学习的效率也更高。
选取的方法是,确定第
层的映射矩阵大小
,然后取
。
选取权重的方法是,随机生成之间的随机数,随机数乘以
,再减去
,这样随机数就会落在
。
5.5 实现细节——梯度检查
反向传播算法异常复杂,实现起来容易产生bug。而且,即使出现bug,梯度下降看起来也是正常的,无法从收敛结果上直观发现这类bug。因此要想办法发现bug。这就是梯度检查。
回想逼近切线的方法,我们逐渐逼近得到切线的斜率。图太难画了,直接截图Andrew Ng的PPT。
这个方法,也是选取一个足够小量(建议选择
),计算
和
,再计算
那么
我们可以用来估计
的大小,两者之间的差值应小于
。
六、识别手写数字神经网络的实现过程
6.1 前项传播实现代价函数
这一部分,描述了神经网络作业的实现过程——识别手写数字神经网络。
训练集有5000个训练样本。输入是20×20的灰度图像,并被拉成一个400×1的特征向量,label是一个数字,表示图像被识别成0~9里面的一个数字。为了方便octave的索引,我们将数字0映射到label数字10,数字0~9映射到label数字0~9。
神经网络模型如图,有一个Input Layer,一个Hidden Layer,一个Output Layer。Hidden Layer有25个神经元。由此算来,加上偏置单元我们可以得到权重矩阵的维度。
根据代价函数的定义,我们分两部分实现。
前项传播实现训练集的部分,注意
- 添加各层的偏置单元
- Label
的向量化
实现正则化部分,注意权重和
都包含了偏置单元的权重,正则化部分不应该包含这一部分。可以将权重赋值给临时变量,再将偏置单元权重置0。
代价函数最终结果
6.2 前向传播+反向传播实现导数
初始化。
遍历训练集所有的样本,对每个训练样本)进行前向传播,再反向传播求出
,再累加
。
将累加后的除以训练集的大小m,得到
。注意,这一步骤是在遍历训练集之后的操作。
正则化部分,注意正则化部分不包括偏置单元。
导数最终结果
6.3 实现随机初始化权重
这一部分的实现相对简单,参看 5.4 实现细节——随机初始化权重。
6.4 实现sigmoid导数
注意sigmoid的导数具有这样的性质,
相关文章:

python 打包
一、下载 pip install Pyinstaller 二、使用Pyinstaller 1、使用下载安装的方式安装的Pyinstaller打包方式 将需要打包的文件放在解压得到的Pyinstaller文件夹中,打开cmd窗口,把路径切换到当前路径打开命令提示行,输入以下内容(最…

iOS架构篇-3 网络接口封装
iOS架构篇-3 网络接口封装 关键字:iOS,网络接口封装,Alamofire,swift 网络接口API通常都需要自己封装一套管理,这里以swift版的Alamofire为例. 实现功能: 1.暴露参数请求地址url、请求方法method、请求参数params、请求头header、请求响应response(响应数据、响应头resp…

coursera 《现代操作系统》 -- 第十一周 IO系统
本周要求 错题 下列I/O控制方式中,哪一个不需要硬件支持? 中断方式 轮询方式 DMA方式 I/O处理机方式 中断方式:中断控制器 轮询方式:CPU不断查询设备以了解其是否就绪 DMA:使用到了 DMA 控制器 4。 在设备管理中,缓冲…

matlab图形绘制基础(东北大学MOOC笔记)
%% 二维图形绘制 % 多纵轴曲线绘制 figure(1); t 0:0.01:2*pi; y1 sin(t); y2 10*cos(t); % plotyy(t, y1, t, y2); yyaxis left plot(t, y1); ylim([min(y1), max(y1)]); yyaxis right plot(t, y2); ylim([min(y2), max(y2)]);% 绘制极坐标图 figure(2); theta 0 : 0.01 :…

【转载】pycharm远程调试配置
pycharm远程调试配置https://www.cnblogs.com/liangjiongyao/p/8794324.html

Tornado 类与类组合降低耦合
转载于:https://www.cnblogs.com/shiluoliming/p/6760548.html

matlab生成多组多维高斯分布数据
matlab生成多组多维高斯分布数据 之所以写这么一个函数,是因为在练习用matlab实现聚类分析,用matlab生成的高斯分布数据可以作为很好的数据。当然,直接load进鸢尾花数据集也可以拿来练手,到后边再对鸢尾花数据集进行分析。 代码…

Android架构篇-5 CI/CD(持续集成、持续交付、持续部署)
Android架构篇-5 CI/CD(持续集成、持续交付、持续部署) CI CI是指持续集成,代码的更新会定期自动构建、测试并合并到公共仓库中,方便多分支时解决冲突问题 CD CD是指持续交付和/或持续部署,开发人员改动代码会自动测试提交到仓库,运维实施人员将其部署到生产环境中,方…

OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式...
OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式 以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个…

CV01-语义分割笔记和两个模型VGG ResNet的笔记
目录 一、语义分割 二、VGG模型 2.1 VGG特征提取部分 2.2 VGG图像分类部分 三、ResNet模型 3.1 为什么是ResNet 3.2 11卷积调整channel维度大小 3.3 ResNet里的BottleNeck 3.4 Global Average Pooling 全局平均池化 3.5 Batch Normalization 学习语义分割理论&#x…

matlab编程实现k_means聚类(k均值聚类)
1. 聚类的定义 以下内容摘抄自周志华《机器学习》 根据训练数据是否拥有标记信息,机器学习任务可以大致分为两大类:“监督学习”(supervised learning)和“无监督学习”(unsupervised learning)。分类和回…

一目了然了解JAVA集合体系
在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需…

杭电1175简单搜索 连连看
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 34807 Accepted Submission(s): 8657 Problem Description “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则&#…

IOS专栏目录
IOS 专栏目录 iOS基础篇 iOS高级篇 ios架构篇-1 项目组织架构 ios架构篇-2 国际化多语言 iOS架构篇-3 网络接口封装 iOS架构篇-4 架构模式MVVM iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署) iOS专题1-蓝牙扫描、连接、读写 iOS 直播专题1-直播流程原理 iOS 直播专题2-…

CV03-双线性差值pytorch实现
一、双线性差值 1.1 公式 在理解双线性差值(Bilinear Interpolation)的含义基础上,参考pytorch差值的官方实现注释,自己实现了一遍。 差值就是利用已知点来估计未知点的值。一维上,可以用两点求出斜率,再…

matlab编程实现基于密度的聚类(DBSCAN)
1. DBSCAN聚类的基本原理 详细原理可以参考链接: https://www.cnblogs.com/pinard/p/6208966.html 这是找到的相对很详细的介绍了,此链接基本仍是周志华《机器学习》中的内容,不过这个链接更通俗一点,且算法流程感觉比《机器学习…

EAST 自然场景文本检测
自然场景文本检测是图像处理的核心模块,也是一直想要接触的一个方面。刚好看到国内的旷视今年在CVPR2017的一篇文章:EAST: An Efficient and Accurate Scene Text Detector。而且有开放的代码,学习和测试了下。 题目说的是比较高效࿰…

通过httpmodule获取webapi返回的信息
我写了一个webapi,想在module中获取请求的信息和返回的信息,写进log里,以方便以后查询。request信息很容易能拿到,但是返回信息得费一番周折。不多说,上代码 public class ResponseLoggerModule : IHttpModule {privat…

iOS SwiftUI篇-2 UI控件 Text Button Image List
iOS SwiftUI篇-2 UI控件 Text Button Image List Text 显示文本,相当于UILabel import SwiftUIstruct TextContentView: View {var body: some View {//VStack(垂直排列视图)可以将其内部的多个视图,在垂直方向进行等距排列,VStack最多可以容纳十个子视图,VStack(spacin…

numpy和torch数据操作对比
对numpy和torch数据操作进行对比,避免遗忘。 ndarray和tensor import torch import numpy as npnp_data np.arange(6).reshape((2, 3)) torch_data torch.arange(6) # 张量 tensor2array torch_data.numpy()print(\nnumpy array:\n, np_data,\ntorch tensor\n,…

ZooKeeper学习
一、ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过ZooKeeper对分布式系统进行Master选举,来解决分布式系统的单点故障,如图所示。 那么我们继续分析一下,ZooKeeper通过Master选举来帮助分布式系统解决单点故障, 保…

iOS SwiftUI篇-1 项目结构
iOS SwiftUI篇-1 项目结构 介绍Xcode新建的SwiftUI模版项目结构、跟普通Storyboard模版项目的差异、SwiftUI项目的app启动流程、UIScene概念介绍、AppDelegate.swift和Info.plist的差异 1.项目模版 Interface: SwiftUI Life Cycle: UIKit App Delegate Language: Swift Life…

js绑定事件和解绑事件
在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法 只支持IE678,不兼容其他浏览器addEventListener方法 兼容火狐谷歌,不兼容IE8及以下 addEventListener方法 div.addEventListener(click,fn); div.addEventLi…

基于三维点云数据的主成分分析方法(PCA)的python实现
主成分分析(PCA)获取三维点云的坐标轴方向和点云法向量 # 实现PCA分析和法向量计算,并加载数据集中的文件进行验证import open3d as o3d # import os import numpy as np from scipy.spatial import KDTree# from pyntcloud import PyntClo…

CV02-FCN笔记
目录 一、Convolutionalization 卷积化 二、Upsample 上采样 2.1 Unpool反池化 2.2 Interpolation差值 2.3 Transposed Convolution转置卷积 三、Skip Architecture 3.1 特征融合 3.2 裁剪 FCN原理及实践,记录一些自己认为重要的要点,以免日后遗…

python基础之常用模块
6、TEXT PROCESSING SERVICES :文本处理服务 6.1、re 8、DATA TYPES : 数据类型 8.1、datetime 8.2、collections 8.3、copy 9、 NUMERIC AND MATHEMATICAL MODULES : 数字和数学模块 9.1、random 10、FUNCTIONAL PROGRAMMING MODULES : 函数式编程模块 10.1、iter…

笔记本电脑摄像头实现光流跟踪
看实验室里的师兄在写CSDN,自己也写一个,记录自己的学习进程吧。 研究生从机械转到了毫无基础的SLAM领域。研一半年上课加自学,对SLAM也有一丢丢的了解。最近看光流法时,想到用笔记本电脑的摄像头实现一下,就简单的…

JSON字符串 拼接与解析
常用方式: json字符串拼接(目前使用过两种方式): 1.运用StringBuilder拼接 StringBuilder json new StringBuilder(); json.append("{"); json.append(""uuid":" """ uuid "",&q…

iOS SwiftUI篇-3 排版布局layout
iOS SwiftUI篇-3 排版布局layout swiftUI提供的layout有: ZStack、GeometryReader、HStack、LazyVGrid、LazyHStack、LazyHGrid、LazyVStack、VStack、Spacer、ScrollViewReader等 HStack 水平横向布局容器,子view按顺序水平排列 HStack(alignment: .center, spacing: 10)…

CV04-UNet笔记
目录 一、UNet模型 二、Encoder & Decoder 2.1 Encoder 2.2 Decoder 2.3 classifier 学习U-Net: Convolutional Networks for Biomedical Image Segmentation,记录一些自己认为重要的要点,以免日后遗忘。 代码:https://github.com/…