代价函数(Cost function)

  • 神经网络(Neural network):分类(Classification)
    先建立一个抽象模型对之前的二元分类和多元分类问题进行总结

    章节10 神经网络参数的反向传播法 - 图1%7D%2C%20y%5E%7B(i)%7D)#card=math&code=%28x%5E%7B%28i%29%7D%2C%20y%5E%7B%28i%29%7D%29) 表示训练集中的第 章节10 神经网络参数的反向传播法 - 图2样例输入输出

章节10 神经网络参数的反向传播法 - 图3 表示神经网络的总层数,

章节10 神经网络参数的反向传播法 - 图4 表示第 章节10 神经网络参数的反向传播法 - 图5 层神经元的数量, 其中不包含偏置单元(bias unit)

章节10 神经网络参数的反向传播法 - 图6 表示输出向量的维数, 也即 章节10 神经网络参数的反向传播法 - 图7 的值

二元分类(Binary classification)问题中, 章节10 神经网络参数的反向传播法 - 图8, 输出结果 章节10 神经网络参数的反向传播法 - 图9 非 0 即 1

多元分类问题(Multi-class classification)中, 章节10 神经网络参数的反向传播法 - 图10, 输出结果 章节10 神经网络参数的反向传播法 - 图11 是一个 章节10 神经网络参数的反向传播法 - 图12 维向量, 元素值非 0 即 1


章节10 神经网络参数的反向传播法 - 图13

  • 神经网络的代价函数
    我们回顾逻辑回归问题中我们的代价函数为

    $ J\left(\theta \right)=-\frac{1}{m}\left[\sum\limits{i=1}{(i)}\log{h\theta({x}{(i)}\right)log\left(1-h_\theta\left({x}{n}{\theta_j}^{2} $


逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量 章节10 神经网络参数的反向传播法 - 图14
但是在神经网络中,我们可以有很多输出变量,我们的章节10 神经网络参数的反向传播法 - 图15#card=math&code=h_%5Ctheta%28x%29)是一个维度为章节10 神经网络参数的反向传播法 - 图16的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些
我们需要对 章节10 神经网络参数的反向传播法 - 图17 个输出单元求和, 同时正如在逻辑回归中我们对 章节10 神经网络参数的反向传播法 - 图18 不加正则项, 在神经网络中我们对偏置单元也不加正则项(当然加了也不有多大区别, 这只是一种约定)

章节10 神经网络参数的反向传播法 - 图19%5Cin%20%5Cmathbb%7BR%7D%5E%7BK%7D#card=math&code=h%5Ctheta%5Cleft%28x%5Cright%29%5Cin%20%5Cmathbb%7BR%7D%5E%7BK%7D) ![](https://g.yuque.com/gr/latex?%7B%5Cleft(%7Bh%5Ctheta%7D%5Cleft(x%5Cright)%5Cright)%7D%7Bi%7D%3D%7Bi%7D%5E%7Bth%7D%20%5Ctext%7Boutput%7D#card=math&code=%7B%5Cleft%28%7Bh%5Ctheta%7D%5Cleft%28x%5Cright%29%5Cright%29%7D_%7Bi%7D%3D%7Bi%7D%5E%7Bth%7D%20%5Ctext%7Boutput%7D)

章节10 神经网络参数的反向传播法 - 图20%20%3D%20-%5Cfrac%7B1%7D%7Bm%7D%20%5Cleft%5B%20%5Csum%5Climits%7Bi%3D1%7D%5E%7Bm%7D%20%5Csum%5Climits%7Bk%3D1%7D%5E%7Bk%7D%20%7Byk%7D%5E%7B(i)%7D%20%5Clog%5Csubk%7B(h%5CTheta(x%5E%7B(i)%7D))%7D%20%2B%20%5Cleft(%201%20-%20yk%5E%7B(i)%7D%20%5Cright)%20%5Clog%20%5Cleft(%201-%20%5Csubk%7B%5Cleft(%20h%5CTheta%20%5Cleft(%20x%5E%7B(i)%7D%20%5Cright)%20%5Cright)%7D%20%5Cright)%20%5Cright%5D%20%2B%20%5Cfrac%7B%5Clambda%7D%7B2m%7D%20%5Csum%5Climits%7Bl%3D1%7D%5E%7BL-1%7D%20%5Csum%5Climits%7Bi%3D1%7D%5E%7Bsl%7D%20%5Csum%5Climits%7Bj%3D1%7D%5E%7Bs%7Bl%2B1%7D%7D%20%5Cleft(%20%5CTheta%7Bji%7D%5E%7B(l)%7D%20%5Cright)%5E2#card=math&code=J%28%5CTheta%29%20%3D%20-%5Cfrac%7B1%7D%7Bm%7D%20%5Cleft%5B%20%5Csum%5Climits%7Bi%3D1%7D%5E%7Bm%7D%20%5Csum%5Climits%7Bk%3D1%7D%5E%7Bk%7D%20%7Byk%7D%5E%7B%28i%29%7D%20%5Clog%5Csubk%7B%28h%5CTheta%28x%5E%7B%28i%29%7D%29%29%7D%20%2B%20%5Cleft%28%201%20-%20yk%5E%7B%28i%29%7D%20%5Cright%29%20%5Clog%20%5Cleft%28%201-%20%5Csubk%7B%5Cleft%28%20h%5CTheta%20%5Cleft%28%20x%5E%7B%28i%29%7D%20%5Cright%29%20%5Cright%29%7D%20%5Cright%29%20%5Cright%5D%20%2B%20%5Cfrac%7B%5Clambda%7D%7B2m%7D%20%5Csum%5Climits%7Bl%3D1%7D%5E%7BL-1%7D%20%5Csum%5Climits%7Bi%3D1%7D%5E%7Bsl%7D%20%5Csum%5Climits%7Bj%3D1%7D%5E%7Bs%7Bl%2B1%7D%7D%20%5Cleft%28%20%5CTheta%7Bji%7D%5E%7B%28l%29%7D%20%5Cright%29%5E2)


章节10 神经网络参数的反向传播法 - 图21

反向传播算法(Backpropagation algorithm)

我们将研究让神经网络的代价函数最小化的方法

我们需要计算代价函数 章节10 神经网络参数的反向传播法 - 图22#card=math&code=J%28%5CTheta%29) 和偏导项 章节10 神经网络参数的反向传播法 - 图23#card=math&code=%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%5CTheta_%7Bji%7D%5E%7Bl%7D%7DJ%28%5CTheta%29)

章节10 神经网络参数的反向传播法 - 图24

  • 前项传播算法(Forward propagation algorithm)计算代价函数
    之前我们用前向传播的方法计算出所有神经元的激活值
    章节10 神经网络参数的反向传播法 - 图25

  • 反向传播算法(Backpropagation algorithm)计算偏导项在单一样本条件下的示范

    章节10 神经网络参数的反向传播法 - 图26%7D#card=math&code=%5Cdelta_j%5E%7B%28l%29%7D) 表示第 章节10 神经网络参数的反向传播法 - 图27 层第 章节10 神经网络参数的反向传播法 - 图28 个结点的误差

章节10 神经网络参数的反向传播法 - 图29%7D#card=math&code=a_j%5E%7B%28l%29%7D) 表示第 章节10 神经网络参数的反向传播法 - 图30 层第 章节10 神经网络参数的反向传播法 - 图31 个结点的激活值(这和之前是一样的)


显然对于输出层, 我们是立刻就知道误差为多大(假设我们的训练集非常简单, 只有一个样本)

章节10 神经网络参数的反向传播法 - 图32%7D%20%3D%20a_j%5E%7B(4)%7D-y_j#card=math&code=%5Cdelta_j%5E%7B%284%29%7D%20%3D%20a_j%5E%7B%284%29%7D-y_j)


已知这一层的误差值, 我们从右向左传递误差值就可以用于纠正参数值 章节10 神经网络参数的反向传播法 - 图33 从而优化我们的神经网络
这种思想和前项传播从左向右传递原始特征值来计算代价函数 章节10 神经网络参数的反向传播法 - 图34#card=math&code=J%28%5CTheta%29) 是类似的
注意 .* 是矩阵点乘, 先不考虑正则项
章节10 神经网络参数的反向传播法 - 图35

  • 多样本下的反向传播算法
    显然我们的训练集不可能只含有一个样本, 当我们要将大量样本用于反向传播时, 我们就需要把输出层和各个样本的误差值进行累加, 当然在编程实现的时候要记得在每次执行反向传播算法前误差累加器清零, 毕竟保留上一次参数的误差对于本次更新并没有什么意义
    下面通过一套伪代码来总结一下回顾一下我们为了最小化代价函数 章节10 神经网络参数的反向传播法 - 图36#card=math&code=J%28%5CTheta%29) 的过程
    章节10 神经网络参数的反向传播法 - 图37

理解反向传播

章节10 神经网络参数的反向传播法 - 图38#card=math&code=cost%28i%29) 表示了输出层结果的准确性, 误差值 章节10 神经网络参数的反向传播法 - 图39%7D%3D%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%7Bz_j%5E%7B(i)%7D%7D%7Dcost(i)#card=math&code=%5Cdelta_j%5E%7B%28i%29%7D%3D%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%7Bz_j%5E%7B%28i%29%7D%7D%7Dcost%28i%29)

章节10 神经网络参数的反向传播法 - 图40

章节10 神经网络参数的反向传播法 - 图41

关于反向传播相关公式的证明

使用注意: 展开参数(Unrolling parameters)

将参数从矩阵展开成向量, 主要是 Octave 代码实现(略)

章节10 神经网络参数的反向传播法 - 图42

章节10 神经网络参数的反向传播法 - 图43

梯度检验(Gradient checking)

反向传播在具体代码实现的过程中, 比如和梯度下降算法一起工作时容易出现一些 bug 导致最终训练的模型可靠性降低, 做梯度检验是一种非常行之有效的解决办法

对于一个函数来说,通常有两种计算梯度的方式:

解析梯度(analytic gradient), 对应于反向传播法

数值梯度(numerical gradient), 对应于梯度检验法

  • 章节10 神经网络参数的反向传播法 - 图44 为实数的简单情况
    通过极限法来计算某点的梯度, 采用双侧差分, 精度比单侧差分高
    章节10 神经网络参数的反向传播法 - 图45

  • 章节10 神经网络参数的反向传播法 - 图46 为向量的一般情况
    章节10 神经网络参数的反向传播法 - 图47 , 且 章节10 神经网络参数的反向传播法 - 图48 是形如 章节10 神经网络参数的反向传播法 - 图49%7D%2C%20%5CTheta%5E%7B(2)%7D%2C%20%5CTheta%5E%7B(3)%7D#card=math&code=%5CTheta%5E%7B%281%29%7D%2C%20%5CTheta%5E%7B%282%29%7D%2C%20%5CTheta%5E%7B%283%29%7D) 的未展开形式
    章节10 神经网络参数的反向传播法 - 图50
    求偏导数时, 对于章节10 神经网络参数的反向传播法 - 图51 来说, 和实数时的情况是一样的
    章节10 神经网络参数的反向传播法 - 图52

下图展示了梯度检验算法在 Octave 中的实现代码

章节10 神经网络参数的反向传播法 - 图53

当通过这种数值计算得到的近似值gradApprox 章节10 神经网络参数的反向传播法 - 图54 反向传播法得到的偏导数向量DCVec, 可以认为反向传播法的代码实现是正确的.

梯度检测方法的开销是非常大的, 比反向传播算法的开销都大,所以一旦用梯度检测方法确认了梯度下降算法算出的梯度(导数)值是正确的, 那么就及时关闭它.

章节10 神经网络参数的反向传播法 - 图55

随机初始化(Random initialization)

现在我们已经学习了如何优化神经网络中的参数 章节10 神经网络参数的反向传播法 - 图56, 但是任何优化算法都需要一个初始值, 之前训练逻辑回归时, 我们用的初始参数都是 0, 这没有什么影响, 但是这对于神经网络来说是不可行的

  • 初始化为 0 (Zero initialization) 或相同的值
    这意味着下一层的激活项将会有相同的值, 相同的偏导项, 即使经过数次迭代更新, 依然都是相等的. 这样一来, 即使每一层有许多神经元, 实际上每个神经元都在计算同一个特征, 这显然没有什么意义
    章节10 神经网络参数的反向传播法 - 图57

  • 随机初始化(Random initialization): 对称性破坏(Symmetry breaking)
    章节10 神经网络参数的反向传播法 - 图58%7D#card=math&code=%5CTheta_%7Bij%7D%5E%7B%28l%29%7D) 初始化为一个正负 章节10 神经网络参数的反向传播法 - 图59 之间的随机值
    章节10 神经网络参数的反向传播法 - 图60

组合到一起(Putting it together)

将之前学过的组合成一个训练神经网络的完整过程

  1. 选择一种网络架构(Pick a network architecture)
    简单来说就是决定神经元之间的连接关系(connectivity pattern between neurons)

    输入单元的数量: 取决于特征 章节10 神经网络参数的反向传播法 - 图61%7D#card=math&code=x%5E%7B%28i%29%7D) 的维数

输出单元的数量: 取决于分类的数量

隐藏层: 默认 1 层, 或者多于 1 层且每层含有相同数量的神经元, 通常越多越好, 但这也意味着更大的计算量, 最好要和输入特征的数量匹配, 比如在 1 倍到若干倍之间

  1. 参数的随机初始化

  2. 用前项传播算法计算输出单元 章节10 神经网络参数的反向传播法 - 图62%7D)#card=math&code=h_%5CTheta%28x%5E%7B%28i%29%7D%29)

  3. 编写代码计算代价函数 章节10 神经网络参数的反向传播法 - 图63#card=math&code=J%28%5CTheta%29)

  4. 用反向传播法计算偏导项章节10 神经网络参数的反向传播法 - 图64%7D%7DJ(%5CTheta)#card=math&code=%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%5CTheta_%7Bjk%7D%5E%7B%28l%29%7D%7DJ%28%5CTheta%29)

  5. 用梯度检测计算梯度来检验反向传播算法是否正确实现, 正确后停用梯度检测

  6. 使用优化算法 (比如梯度下降法) 来求使得 章节10 神经网络参数的反向传播法 - 图65#card=math&code=J%28%5CTheta%29) 最小的参数 章节10 神经网络参数的反向传播法 - 图66

章节10 神经网络参数的反向传播法 - 图67

章节10 神经网络参数的反向传播法 - 图68

虽然最终得到的是通常是局部最小值而非全局最小值, 但梯度下降算法以及其他高级的优化算法通常可以确保这个局部最优解有不错的表现

无人驾驶(Autonomous driving example)

关于ALVINN