代价函数
变量定义
:神经网络的总层数
:第
层的单元(神经元)数量
:输出层的单元数量
逻辑回归的代价函数(正则化)
神经网络的代价函数
第一部分是将输出层K个单元的逻辑回归代价函数进行累加,第二部分是正则化部分,类比与逻辑回归,不含偏置项的正则化。
反向传播算法
我们的目标是最小化代价函数,即
,需要计算
反向传播算法用来计算
反复使用链式求导
表示
层第
个神经元连接到
层第
个神经元的权重;
表示第
层第
个神经元的输出
表示第
层第
个神经元的输入
层第
个神经元产生的误差定义为
对输入的一个样本,输出层代价函数
输出层第 个神经元的误差为
由后向前计算隐层产生的误差
权值的梯度计算
给出一个训练集,设
;
对从t=1到m的样本作如下操作:
- 令
执行前向传播计算
使用实际值 ,计算误差
-
反向传递误差,计算各层的误差
不考虑输入层的误差 -
计算更新
矩阵D累加所有样本的误差值得到最终的偏导数为 的偏导数,具有相同矩阵尺寸
的计算
我们简化考虑不是多类别分类的情况,即只有两种类别的情况,代价函数可以简化为
是
(即第
层第
个神经元输出的误差),实际上是代价函数的偏导数,即
类似于前向传播,
的计算由右向左传递误差
,左边一层的
由右面一层的
乘以传递路线的权重值得到,比如计算Layer2的
,由Layer3的
f分别乘以各自的权重
再相加得到,即
再比如
梯度检验
反向传播算法在计算梯度时可能会出现错误,需要使用梯度检测来检测算法的正确性。
神经网络中的 是矩阵形式,在变成计算时通常展开成向量形式
近似计算导数
取非常小的值,比如
。当
趋向0的时候,其实就是导数的定义。
多类别的情况,可以类似近似计算
代码计算
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;
若反向传播算法计算正确,反向传播得到的结果deltaVector与梯度检验得到的结果应大致相等,即
一旦检测完反向传播算法正确,在训练分类器之前应该关闭梯度检验。
梯度检验的计算过程非常慢,会占用大量时间。
随机初始化
在神经网络中使用权值全零的初始化,在运行反向传播时会使所有的节点反复更新相同的值
权重矩阵的初始化应该打破对称性,采用随机数进行初始化,即对每一个
,有
代码
% If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.
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;
训练神经网络的过程
只有一层隐藏层的神经网络是比较普遍的,在使用多个隐藏层的神经网络时默认的规则是每个隐藏层包含的单元数量相同,通常情况下,隐藏单元越多效果越好,但计算量也会很大。
训练过程:
1. 随机初始化权重矩阵
2. 执行前向传播算法得到
3. 计算代价函数
4. 执行反向传播计算偏导数
5. 使用数值计算进行梯度检验,确保反向传播算法正确后关闭梯度检验
6. 使用梯度下降或其他优化方法最小化代价函数
,求得最优参数
首次执行前向传播(FP)和后向传播(BP),建议采用for循环的形式对没一个样本进行FP和BP,得到 ,
循环完累加 值,得到偏导数