第九章-反向传播算法 深度之眼_吴恩达机器学习作业训练营

 目录

 一,损失函数

二,后向传播算法

2.1 算法内容

2.2 实践技巧

三,完整的神经网络算法

四,神经网络算法用例--自动驾驶

五,总结


一,损失函数

设现在有N分类问题,训练数据集为 \{(x^{1},y^{1}), (x^{2},y^{2}),......,(x^{m},y^{m}) \},其中 x^{i} \epsilon R^{n+1}, y \epsilon R^{N}

       由之前的学习可知带正则项的逻辑回归的损失函数如下:

            J(\theta) = -\frac {1}{m} \sum_{i=1}^{m}[ y^{i} log(h_{\theta}(x^{i})) + (1-y^{i})log(1-h_{\theta(x^{i})}) ] + \frac{\lambda}{2m}\sum _{j=1}^{n}\theta_{j}^{2}             (公式9.1)

        逻辑回归中进行的是二分类问题,输出的变量y为一个标量,推广至N分类中的神经网络算法时需要讲输出扩展为一个维度为N的向量Y,其中Y_{(i)}表示对应样本是第 i 类的概率。设L为神经网络的总层数,S_{L}为第L层的神经元数量,则可将损失函数推广为:

          J(\theta) = -\frac{1}{m}[ \sum_{i = 1}^{m} \sum _{j=1}^{N}(y^{i}_{j}log(h_{\theta}(x^{i})) + (1-y^{i}_{j})log(1- h_{\theta}(x^{i}) ) ) ] + \frac{\lambda }{2m}\sum_{l = 1}^{L} \sum_{i=1}^{s^{l}} \sum_{j=1}^{S_{l}+1} (\theta^{l}_{ji})^{2}    (公式9.2)

总共m个样本,N种类别,前项将每个样本对应N给类别的对数损失进行的累加求平均,后向则是将神经网络每一层的每个参数都加入到了正则项中(偏置没有加入)。

二,后向传播算法

2.1 算法内容

后向传播算法是神经网络中最重要的学习算法,其实际上就是梯度下降法在神经网络中的运用,大体步骤为:

1. 由前向传播算法计算出网络的输出。

2. 由损失函数计算出输出与实际值的误差,根据链式求导法则,从后往前可计算出各个神经元参数权值对损失函数的梯度,并进行梯度下降训练。

第九章-反向传播算法 深度之眼_吴恩达机器学习作业训练营_第1张图片 图9-1 神经网络

        设第 i 层神经元输出为a^{l} = [{a^{i}_{0},a^{i}_{1},a^{i}_{2},......,a^{i}_{n} }] ,最后一层为 l(小写L)层,共有m个样本,N个类别,则反向传播的具体内容有(可以图为例,虚线表示与损失函数相连):

①对于每个输出单元,可以直接计算其梯度:

                                        \frac{\partial J}{\partial O_{k}} =-\frac{1}{m}[ \sum_{i = 1}^{m} (h_{\theta}(a^{l(i)}) - y_{k}^{i})]                          (公式9.3)

        ②倒数第二层与输出层之间的参数的梯度可直接由参数对损失函数求偏导得: 

                      \frac{\partial J}{\partial \theta^{k}_{(l+1)t}} =\frac{\partial J}{\partial O_{k} }\frac{\partial O_{k} }{\partial \theta^{k}_{(l+1)t}} + \frac{\lambda }{m}\theta^{k}_{(l+1)t} =-\frac{1}{m}[ \sum_{i = 1}^{m} \ (h_{\theta}(a^{l(i)}) - y_{k}^{i})a^{l(i)}_{t}] + \frac{\lambda }{m}\theta^{k}_{(l+1)t}                (公式9.4.1)

                      \frac{\partial J}{\partial \theta^{k}} =\frac{\partial J}{\partial O_{k} }\frac{\partial O_{k} }{\partial \theta^{k}} + \frac{\lambda }{m}\theta^{k}                                  (公式9.4.2)

        公式9.4中前项依据链式法则求出,后向是正则化项。引入正则化项后,可假象图中每个参数都和损失函数以虚线相连。以矩阵的方式计算该层所有参数的梯度可按公式(公式9.4.2)。

③倒数第二层各个神经元{a^{l}_{0},a^{l}_{1},a^{l}_{2},......,a^{l}_{n} }的“误差”(即梯度)可定义为:

                        \frac{\partial J}{\partial \sigma^{l}_{t}}=\sum_{k=1}^{N} \frac{\partial J}{\partial O_{k}}\frac{\partial O_{k}}{\partial \sigma^{l}_{t}}=\sum_{k=1}^{N} \theta^{k}_{(l+1)t} \frac{\partial J}{\partial O_{k}}                                                                            (公式9.5.1)

           以矩阵的方式表达改层的梯度即为:

                      \frac{\partial J}{\partial \sigma^{l}}=\frac{\partial J}{\partial O_{k}}\frac{\partial O_{k}}{\partial \sigma^{l}_{t}}=\theta^{k} \frac{\partial J}{\partial O_{k}}                                        (公式9.5.2)

        ④假设已经求出了第 j + 1 层的误差,对第 j 层 与 第 j + 1 之间参数矩阵为 \theta^{j+1},

                        \frac{\partial J}{\partial \theta^{j}} =\frac{\partial J}{\partial \sigma^{j+1}} \frac{\partial \sigma^{j+1}}{\partial \theta^{j}} =\frac{\partial J}{\partial \sigma^{j+1}} g^{ ' }(a^{j}\theta^{j+1})\theta^{j+1}                                    (公式9.6)

          其中g(a^{j}\theta^{j+1})为第 j + 1层的激活函数。激活函数不同,则求导规则不同,常见激活函数及其倒数可参考第八章。

       3.反复进行1,2两步不断的前向和后向传播直到迭代到一定次数或者损失低于一定阈值为止。

       注:本章矩阵表示中为了简洁,略去了转置操作以及没有考虑计算乘法的顺序。

2.2 实践技巧

          1. 参数矩阵向量化。由于一般高级的优化算法只接受向量参数,所以需要将参数矩阵转化为一维的列向量才能使用。

          2.梯度检查。运用导数的定义,取任意小的增量 \varepsilon,可求得梯度的估计量为\frac{\partial J}{\partial \theta}\approx \frac{J(\theta +\epsilon ) + J(\theta -\epsilon ) )}{2\varepsilon },在正式训练之前,可现使用已经写好的求梯度算法与该估计量相比较,当两者差距较小时,可确保求梯度算法的正确性。

          3.随机初始化参数,当所有参数都有相同的初始化参数时,在后续的学习过程中可能存在相似性,甚至使得所有神经元的参数均相同,只能学到相同的特征。

 

三,完整的神经网络算法

        1.根据训练数据设计网络架构。

        2.随机初始化网络参数。

        3. 运用前向传播算法计算出各个训练样本的预计输出

        4.由损失函数计算出损失值。

        5.根据损失函数计算出各个参数的偏导数。

        6.运用梯度检查严重求梯度的算法是否正确,如果不正确则修改并重复上述步骤,直到正确为止。

        7. 使用反向传播算法训练网络,直到满足一定的迭代次数或者误差小于一定阈值为止,训练结束。

四,神经网络算法用例--自动驾驶

        训练目标:训练出一个能根据道路信息自动调整汽车行驶方向的神经网络。

        训练样本: 特征为汽车前向摄像头拍摄的道路信息,目标输出为汽车方向盘的旋转幅度。

模型选择: 三层神经网络,输入为30X32像素的图片

训练过程:驾驶员开车行驶,前向摄像头每秒生成12次数字图片作为输入,同时提取方向盘的旋转角度作为输出训练网络。

五,总结

本章介绍了反省传播算法,以及一些实用的训练技巧,由此得出了完整的神经网络算法,并举了一个神经网络算法的运用实例。算法推导过程如果有误,有望指出,可以一同讨论修正。

你可能感兴趣的:(吴恩达机器学习,机器学习)