DeepAI

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

2020-03-09  本文已影响0人  Sunflow007
31.jpg

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

1.神经网络的损失函数

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

image.png

这是一个包含m个样本点,L = 4,k = 4的神经网络分类模型
第1~4层的激活单元数分别为:3,5,5,4 s_l = 3,5,5,4(for l = 1,2,3,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}, X^{(1)} = \begin{Bmatrix} x_0(bias)\\ x_1\\ x_2\\ x_3\\ \end{Bmatrix} \Longrightarrow \theta^{(1)}X^{(1)} = \alpha^{(2)} = \begin{Bmatrix} \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \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},\alpha^{(1)} = \begin{Bmatrix} \alpha_0(bias)\\ \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \end{Bmatrix}
\Longrightarrow
\theta^{(2)}\alpha^{(2)} = \alpha^{(3)}= \begin{Bmatrix} \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \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},
\alpha^{(2)} = \begin{Bmatrix} \alpha_0()\\ \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \end{Bmatrix} \Longrightarrow \theta^{(3)}\alpha^{(3)} = \alpha^{(4)}=\begin{Bmatrix} \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4 \end{Bmatrix}

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

\frac{\lambda}{2m} \sum^{L-1}_{l=1} \sum^{s_l}_{i=1} \sum^{s_l+1}_{j=1} (\Theta^{(l)}_{ji})^2

在本例中L = 4,s_l = 3,5,5,4 ( l = 1,2,3,4) 将正则化项展开:
\frac{\lambda}{2m} \sum^{L-1}_{l=1} \sum^{s_l}_{i=1} \sum^{s_{l+1}}_{j=1} (\Theta^{(l)}_{ji})^2 \Longleftrightarrow
\frac{\lambda}{2m} \sum^{3}_{i=1} \sum^{5}_{j=1} (\theta^{(1)}_{ji})^2 + \frac{\lambda}{2m} \sum^{5}_{i=1} \sum^{5}_{j=1} (\theta^{(2)}_{ji})^2 + \frac{\lambda}{2m} \sum^{5}_{i=1} \sum^{4}_{j=1} (\theta^{(3)}_{ji})^2
注意:公式中最里面一项\sum^{s_{l+1}}_{j=1}从j = 1开始到s_{l+1}结束s_{l+1}= 第(l+1)层激活单元数,而不是s_{l}+1。第一项\sum^{s_{l+1}}_{j=1}遍历每一行,第二项\sum^{s_{l}}_{i=1}遍历每一列,最后\sum^{L-1}_{l=1}遍历每一层layer,为什么 ?

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

2.反向传播Backpropagation

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

image.png 即最终的假设函数

2.1反向传播的意义?

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

2.2反向传播示例

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

image.png

当我们训练集有m个样本点时,我们会遍历每个样本**For i = 1 to m **第一层激活单元的输入值a^{(1)} = x^{(1)}我们先用正向传播算法,计算出每一层的a^{(l)} 然后用反向传播计算出每一层\delta^{(L-1)},\delta^{(L-2)}...\delta^{(2)}的误差矩阵,最后我们会对每一个节点的误差做迭代:
\Delta^{(l)}_{(ij)} := \Delta^{(l)}_{(ij)} + a_j^{(l)}\delta^{(l+1)}_i
注:这里的\Delta\delta的大写形式。迭代求出\Delta^{(l)}_{(ij)}后,我们就可以计算代价函数的偏导数了,计算方法如下:

image.png

假设\delta^{(3)}已知,求\delta^{(2)}_2
\delta^{(2)}_2是第二层中第二个激活单元的误差(+1项不看),可见这个激活单元向第3层传递有两条路径:蓝色线和红色线,蓝线权重用\theta^{(2)}_{12}表示,红线权重用\theta^{(2)}_{22}表示
则:\delta^{(2)}_2=\theta^{(2)}_{12}\delta^{(3)}_1+\theta^{(2)}_{22}\delta^{(3)}_2

然后,我们思考一下\delta^{(l)}_jJ(\theta)的关系,这里先看一下代价函数:

11.png11.png 我们简化一下,先不考虑正则化项,且数据集样本点只有一个(x,y)则函数变成:
s

更进一步,可以想象下代价函数描述的是假设和真实值之间的偏差(用方差表示):
J(\theta)= Cost(h_\theta(x) , y) \approx \frac{(h_\theta(x)-y)^2}{2}

在之前,我们对代价函数求权重的偏导可得出:
\frac{\vartheta}{\vartheta\theta^{(l)}_{ij}} J(\Theta) = a_j^{(l)}\delta^{(l+1)}_i
这里z = h_\theta(x) = \Theta a 故有:
\frac{\vartheta J(\Theta)}{\vartheta z} = \frac{\vartheta J(\Theta)}{\vartheta \theta}* \frac{\vartheta \theta}{\vartheta z} = a\delta*\frac{\vartheta \theta}{\vartheta z} = a\delta*(1/a) = \delta
从公式可知误差 = 损失函数对假设函数的偏导。

4.png4.png

3.梯度检验

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

4.随机初始化

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

5.总结概述

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

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

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

训练神经网络:

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

猜你喜欢

热点阅读