【吴恩达机器学习】第五周—神经网络反向传播算法

【吴恩达机器学习】第五周—神经网络反向传播算法_第1张图片
31.jpg

第五周—神经网络、反向传播算法和随机初始化

1.神经网络的损失函数

神经网络模型中损失函数/代价函数和之前的逻辑回归模型中的损失函数有什么区别?先回顾下正则化的逻辑回归模型:
损失函数:

1562925073373-a124c37c-96e4-4eea-b374-1d0d9f06eac2.png
1562925073373-a124c37c-96e4-4eea-b374-1d0d9f06eac2.png
梯度下降算法:
【吴恩达机器学习】第五周—神经网络反向传播算法_第2张图片
1562925085426-f5702e05-d74b-4baa-b12a-2bb254b2be2b.png
注意:这里样本点有m个,特征参数θ有n个
损失函数的核心就是求m个样本点的总误差,然后除以m,得到平均误差,即平均损失。那么在神经网络中的损失函数公式是怎样?其实,思想都一样,都是求平均损失,只是表现方式看上去复杂了一些。前半部分很好理解,就是将每个样本点的k类的交叉熵损失相加求期望,关键在于后面的正则化项,看上去不太好理解。
神经网络模型的损失函数公式如下:
【吴恩达机器学习】第五周—神经网络反向传播算法_第3张图片
11.png
后半部分的正则化项是如何得来?请看下面1.1节公式推导。

1.1公式推导

乍一看公式,一脸懵,下面,我们还是会结合一个例子推导一下。推导前,先明确下神经网络模型中的分类情况和一些参数的含义:
这里定义:


K:分类类别数\begin{cases} k = 2,输出层只需要一个激活单元即可,s_l = 1 \\[2ex] k >=3,输出层需要k个激活单元,s_l = k \end{cases}

然后,看下面的神经网络模型:
【吴恩达机器学习】第五周—神经网络反向传播算法_第4张图片
image.png

这是一个包含m个样本点,L = 4,k = 4的神经网络分类模型
第1~4层的激活单元数分别为:3,5,5,4


下面我们看一下每一layer的矩阵运算,重点看θ矩阵:
第一层:5x4矩阵
\theta^{(1)} = \begin{Bmatrix} \theta_{10} & \theta_{11} & \theta_{12} &\theta_{13} \\ \theta_{20} &..&..&.. \\ \theta_{30} &..&..&.. \\ \theta_{40} &..&..&.. \\ \theta_{50} &..&..& \theta_{53} \end{Bmatrix},

第二层:5x6矩阵
\theta^{(3)} = \begin{Bmatrix} \theta_{10} & \theta_{11} & \theta_{12} &\theta_{13}& \theta_{14} & \theta_{15} \\ \theta_{20} &..&..&..&..&.. \\ \theta_{30} &..&..&..&..&.. \\ \theta_{40} &..&..&..&..& \theta_{45} \end{Bmatrix},

第三层:4x6矩阵
\theta^{(3)} = \begin{Bmatrix} \theta_{10} & \theta_{11} & \theta_{12} &\theta_{13}& \theta_{14} & \theta_{15} \\ \theta_{20} &..&..&..&..&.. \\ \theta_{30} &..&..&..&..&.. \\ \theta_{40} &..&..&..&..& \theta_{45} \end{Bmatrix},

下面再看神经网络模型下的损失函数后半部分的正则化项:

在本例中 将正则化项展开:

+ +
注意:公式中最里面一项从j = 1开始到结束= 第(l+1)层激活单元数,而不是+1。第一项遍历每一行,第二项遍历每一列,最后遍历每一层layer,为什么 ?

最外面遍历每一层layer,这个比较好理解,因为每一层的参数矩阵都是不同的,为了求代价函数,必需加权每一层的参数矩阵;然后里面两层遍历行和列,也很好理解。因为每一层的参数矩阵,实际上影响了每一个输出的类别,所以对于这层参数矩阵,我们需要加权其中的每一个参数项,至于最后是从行遍历到列,还是从列遍历到行,其实都一样。
还有一点需要注意:i 为什么从1开始 ?因为和逻辑回归中的一样,神经网络模型中的正则化项也一般是从开始。故从i = 1开始是为了去除

2.反向传播Backpropagation

我们之前对神经网络模型的计算用的都是从layer = 1到2到....L的正向逐级计算,即正向传播算法,现在我们先回顾一下正向/前向传播算法:
还是用1.中的例子,假设神经网络模型中:训练集中只有一个数据实例神经网络模型和前向传播算法表示如下:

【吴恩达机器学习】第五周—神经网络反向传播算法_第5张图片
image.png
即最终的假设函数

2.1反向传播的意义?

反向传播就是和之前正向传播算法相对应的,从神经网络模型的最后一层误差开始,逐层往前推导的,反向传播求误差,其实时求模型代价函数偏导的一种手段,意义就在于比正向传播算法更快速更高效地求出代价函数偏导,在实际模型训练过程中,能大大降低计算时间,使模型更快收敛。关于反向传播算法,更详细的了解请看以下几篇文章:
https://zhuanlan.zhihu.com/p/25081671
https://zhuanlan.zhihu.com/p/21407711

2.2反向传播示例

沿用上图的神经网络模型,我们要计算代价函数偏导:

【吴恩达机器学习】第五周—神经网络反向传播算法_第6张图片
11.png
不考虑正则项,假设有m个样本,k项输出,我们从最后一层(输出层)的误差开始计算,假设误差用 表示。我们以最后一层第k项为例:误差 = 预测值 - 实际值 =

第4层整体误差用向量表示:

第3层的误差:
其中左半部分表示权重导致的误差的和;右半部分 是激活函数Sigmod函数的导数。具体的解析和推导见下面。

第2层的误差: 第1层误差:由于第一层为输入层,输入层输入的是实际的训练集实例,不存在误差。

2.2.1误差公式解析

公式解析:表示第4层误差(4 x 1)
表示第3层的误差矩阵(5 x 1);
表示第3层权重/参数,形态为:4 x 5(不考虑bias);
第3层的误差: 是怎么来的 ?第3层误差和第4层误差的关系是怎么样的?

为了方便理解,举个不是很严谨的小例子:
这里假设求第单层第一个激活单元的误差,已知到第4层4个激活单元的权重分别为:0.1,0.2,0.3,0.4
则的误差 = 0.11000 + 0.22000 + 0.33000 + 0.44000 = 100+400+900+1600 = 3000

如果不考虑到误差的变化情况(即不考虑其导数项),就可以表示第3层的损失了,为什么加上后面的 考虑到误差和预测值的导数项相同,故 中误差的偏导项可以用预测值的导数项来表示,即式子里右半边表示

2.2.2误差公式推导

公式推导:
令 ,则:

2.3反向传播算法

2.3.1偏导公式

上面2.1小结,我们得出了每一层的误差,通过公式推导,我们可以将代价函数的偏导用这些误差表示。此处,不考虑正则化项,即 我们可以得到代价函数的偏导:

式中:
表示的是神经网络层数;
表示在当前层下,激活单元的下标;
有点特殊,代表下一层中误差单元的下标,是受到权重矩阵中第行影响的下一层中的误差单元的下标

我们获取了所有误差以后,通过这个偏导公式,我们可以计算出每一个激活单元的偏导。

具体推导过程可以参考知乎文章:
https://zhuanlan.zhihu.com/p/58068618

2.3.2算法公式

【吴恩达机器学习】第五周—神经网络反向传播算法_第7张图片
image.png

当我们训练集有m个样本点时,我们会遍历每个样本**For i = 1 to m **第一层激活单元的输入值我们先用正向传播算法,计算出每一层的 然后用反向传播计算出每一层的误差矩阵,最后我们会对每一个节点的误差做迭代:

注:这里的是的大写形式。迭代求出后,我们就可以计算代价函数的偏导数了,计算方法如下:

【吴恩达机器学习】第五周—神经网络反向传播算法_第8张图片
2.png
得到的即得到了偏导,即:

2.3.3进一步理解

先看一个例子:
【吴恩达机器学习】第五周—神经网络反向传播算法_第9张图片
image.png

假设已知,求
是第二层中第二个激活单元的误差(+1项不看),可见这个激活单元向第3层传递有两条路径:蓝色线和红色线,蓝线权重用表示,红线权重用表示
则:

然后,我们思考一下和的关系,这里先看一下代价函数:

【吴恩达机器学习】第五周—神经网络反向传播算法_第10张图片
11.png
我们简化一下,先不考虑正则化项,且数据集样本点只有一个(x,y)则函数变成:
s

更进一步,可以想象下代价函数描述的是假设和真实值之间的偏差(用方差表示):

在之前,我们对代价函数求权重的偏导可得出:

这里 故有:

从公式可知误差 = 损失函数对假设函数的偏导。

【吴恩达机器学习】第五周—神经网络反向传播算法_第11张图片
4.png

3.梯度检验

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。

4.随机初始化

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的。
我们通常初始参数为正负 之间的随机值。通常是一个非常小的值,如0.001

5.总结概述

总结一下使用神经网络时的步骤:

网络结构:
第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

我们真正要决定的是隐藏层的层数和每个中间层的单元数。

训练神经网络:

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的
  3. 编写计算代价函数的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数

你可能感兴趣的:(【吴恩达机器学习】第五周—神经网络反向传播算法)