神经网络的学习
1. 代价函数和反向传播
1.1 代价函数
- 标记方法:m为训练样本个数,每组样本包括一组输入x和一组输出y;L表示神经网络层数;Sl表示第l层的神经元个数;K表示输出单元的个数。
- 神经网络的分类:二分类和多分类
- 在神经网络中,我们可能有许多输出节点。我们把 hΘ(x)k表示为导致第k个输出的假设。我们的神经网络的成本函数将会是我们用于逻辑回归的一个综合泛化。神经网络的代价函数为:
1.2 反向传播算法
- 正向传播方法:我们从第一层开始正向一层一层进行计算,直到最后一层的 hθ(x)。
- 反向传播:从最后一层误差开始计算,误差是预测值与真实值的误差。我们用𝛿来表示误差,则:𝛿(4) = 𝑎(4) − 𝑦
我们利用这个误差值来计算前一层的误差:𝛿(3) = (𝛩(3))𝑇𝛿(4) ∗ 𝑔′(𝑧(3)) 其中 𝑔′(𝑧(3)) 是 𝑆 形函数的导数,𝑔′(𝑧(3)) = 𝑎(3) ∗ (1 − 𝑎(3))。而(𝜃(3))𝑇𝛿(4)则是权重导致的误差的和。
下一步是继续计算第二层的误差: 𝛿(2) = (𝛩(2))𝑇𝛿(3) ∗ 𝑔′(𝑧(2))
因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设 λ=0,即我们不做任何归一化处理时有:
重要的是清楚地知道上面式子中上下标的含义:
l 代表目前所计算的是第几层
j 代表目前计算层中的激活单元的下标,也将是下一层的第 j 个输入变量的下标。
i 代表下一层中误差单元的下标,是受到权重矩阵中第 i 行影响的下一层中的误差单元的下标。
如果我们考虑 归一化 处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中, 我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用 来表示这个误差矩阵 , 第 l 层的第 i 个激活单元受到第 j 个参数影响而导致的误差。
算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。在求出误差之后,我们可以计算代价函数的偏导数:
- 反向传播算法总结:
1.3 反向传播算法的直观理解
如果我们考虑简单的非多类分类(k = 1)并且忽视正则化,则成本计算如下:
误差值实际上是代价函数的偏导数
2. 神经网络算法技巧
2.1 参数展开技巧
- 为了使用诸如“fminunc()”这样的优化函数,我们将要“展开”所有元素,并将它们放入一个长向量中,我们可以使用命令[]
- 如果Theta1的尺寸是10x11,Theta2是10x11,Theta3是1x11,那么我们可以从“展开”版本中取回我们的原始矩阵,如下所示:
Theta1 = reshape(thetaVector(1:110),10,11)
Theta2 = reshape(thetaVector(111:220),10,11)
Theta3 = reshape(thetaVector(221:231),1,11)
2.2 梯度检验
梯度检验将确保我们的反向传播按预期工作。我们可以用下式近似我们的成本函数的导数:
为保证数学运算正确ε(ε)的一个很小的值
算法如下:
epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;
记住一旦验证了反向传播算法是正确的,就不需要再次计算梯度检验。因为计算梯度检验的代码可能非常慢。
2.3 随机初始化参数
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的。我们通常初始参数为正负𝜀之间的随机值,假设我们要随机初始一个尺寸为 10×11 的参数矩阵,代码如下:
Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
3. 神经网络算法步骤
3.1 选择网络结构
首先,选择一个网络体系结构;选择你的神经网络的布局,包括每层中有多少个隐藏单元,以及你想要的总共有多少层。
- 输入单元的数量=特征的维度x(i)
- 输出单元的数量=类的数量y
- 每层隐藏单元的数量=通常越多越好(必须与计算成本平衡,因为随着更多隐藏单元的增加而增加)
- 默认值:1个隐藏层。如果您有多个隐藏层,则建议您在每个隐藏层中具有相同数量的单元。
3.2 训练神经网络模型
- 参数的随机初始化
- 利用正向传播方法计算所有的ℎ𝜃(𝑥)
- 编写计算代价函数 𝐽 的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数,然后禁用梯度检查。
- 使用优化算法来最小化代价函数
4. 神经网络应用于无人驾驶的实例
一个人驾驶汽车 然后让ALVINN观看 。ALVINN每两秒 将前方的路况图生成一张数字化图片 并且记录驾驶者的驾驶方向 。得到的训练集图片 被压缩为30x32像素 并且作为输入 提供给ALVINN的三层神经网络。 通过使用反向传播学习算法, ALVINN会训练得到一个 与人类驾驶员操纵方向 基本相近的结果。
一开始 我们的网络选择出的方向是随机的 ,大约经过两分钟的训练后 ,我们的神经网络便能够准确地模拟人类驾驶者的驾驶方向。