机器学习03-神经网络

情到浓时终转凉″ 提交于 2020-01-30 18:58:16

目录

一、非线性估值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类层次

  1. 输入层input layer;一般记作layer1;
  2. 隐(含)层hidden layer;可以有多层,一般记作layer2、layer3……
  3. 输出层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的导数具有这样的性质,

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!