目录
复习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 , computeCompute
最终结论,
,由此得到代价函数的偏导数。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的导数具有这样的性质,
来源:CSDN
作者:苦行僧(csdn)
链接:https://blog.csdn.net/qpeity/article/details/104039416