9 神经网络参数的反向传播
9.1 代价函数
参数定义:
m:神经网络训练样本
L:神经网络层数
Sl:每层输出神经元个数
SL:最后一层中处理单元的个数
神经网络分类定义为:
二类分类:𝑆𝐿 = 0,𝑦 = 0 𝑜𝑟 1表示哪一类;
K类分类::𝑆𝐿 = 𝑘,𝑦𝑖 = 1表示分到第 i 类;(𝑘 > 2)
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),逻辑回归问题中我们的代价函数为:
在神经网络中,我们可以有很多输出变量,我们的ℎ𝜃(𝑥)是一个维度为𝐾的向量,因此代价函数为(其实我也不很理解他怎么来的,只知道多了维度):
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大。
不同的是,对于每一行特征,我们都会给出𝐾个预测,基本上我们可以利用循环,对每一行特征都预测𝐾个不同结果,然后在利用循环在𝐾个预测中选择可能性最高的一个,将其与𝑦中的实际数据进行比较。
正则化的那一项只是排除了每一层𝜃0后,每一层的𝜃 矩阵的和。最里层的循环𝑗循环所有的行(由𝑠𝑙 +1 层的激活单元数决定),循环𝑖则循环所有的列,由该层(𝑠𝑙层)的激活单元数所决定。
9.2 反向传播算法及其理解
之前计算神经网络预测结果的时候采用的是正向传播算法,一层一层计算知道最后一层的h(x)。
现在为了计算偏导数(后面还要用梯度下降等方法计算一个最符合的),我们要用反向传播算法,首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层(倒数第一层是我们给定的值,不用计算,我们并不想更改他)
下面是自己做的笔记,有的公式我也不懂怎么推出来的,还是写在纸上更加方便看公式之间的关系。
9.5 梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
当𝜃是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对𝜃1进行检验的示例:
9.6 随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。我们通常初始参数为正负e之间的随机值,e很小。
9.7 结合
步骤
- 参数随机初始化
- 正向传播计算 h(x)
- 编写计算代价函数 J 的代码
- 反向传播计算所有偏导数
- 梯度检验检验偏导数
- 用优化算法最小化代价函数 J
要做的
选择网络结构,有多少层、每层有多少单元。确保每个隐藏层单元个数相同,(越多越精确)
第一层单元数是训练集的特征数量,最后一层的单元数是训练集的结果的类的数量。