Neural Networks: Backpropagation in Practice
本节内容:神经网络算法实现的注意事项
1. 展开参数(unrolling parameters)
2. 梯度检验(gradient checking)
3. 随机初始化(random initialization)
1. Unrolling Parameters
神经网络算法需要处理一系列的矩阵:
Θ(1),Θ(2),Θ(3),...
Θ
(
1
)
,
Θ
(
2
)
,
Θ
(
3
)
,
.
.
.
D(1),D(2),D(3),...
D
(
1
)
,
D
(
2
)
,
D
(
3
)
,
.
.
.
为了能够使用现有的优化函数,如matlab中的fminunc(),我们需要将矩阵中的元素“铺开”,使其变成一个长向量。下图提供了matlab中元素铺开和还原的代码。
总结:
2. Gradient Checking
梯度检验(gradient checking)就是一种验证算法是否存在问题的方法。它是对梯度的数值估计,它的原理是,对于连续函数
J(θ)
J
(
θ
)
和一个很小的
ϵ
ϵ
,有
对于含有多个参数的
J(θ)
J
(
θ
)
,可分别对每个参数进行如下梯度检验:
总结:
在实现过程中尤其需要注意的一点是,在训练分类器之前一定要关闭梯度调试,否则会导致训练极其缓慢。
3. Random Initialization
使用梯度下降算法或者其他高级优化算法都需要初始化参数 Θ Θ 。如果将所有参数全部初始化为0,会导致在每一层训练得到的激励值和误差值都相同,更新之后的参数值也都相同。这意味着我们只学习到了一种特征,这样的训练结果是没有意义的。
因此,我们需要随机初始化(random initialization)参数,其目的是打破对称。我们在某一特定范围内生成参数值,如
[−ϵ,ϵ]
[
−
ϵ
,
ϵ
]
. 这里的
ϵ
ϵ
和梯度检验的
ϵ
ϵ
无关。
具体用代码表示如下。Theta1生成一个10x11的矩阵,Theta2生成一个1x11的向量。