CS224N lecture03-04
lecture3、4主要介绍了神经网络组成、如何被训练、反向传播等.
梯度基础
标量对向量求导
f ( x ) = f ( x 1 , x 2 , . . . x n ) f(x) = f(x_1, x_2, ... x_n) f(x)=f(x1,x2,...xn) 那么令 f(x) 对输入向量求导 ∂ f ∂ x = [ ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . ∂ f ∂ x n ] \frac{\partial f}{\partial x}=[\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},...\frac{\partial f}{\partial x_n}] ∂x∂f=[∂x1∂f,∂x2∂f,...∂xn∂f]
向量对向量求导
给定 Z = WX,求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z , 其中 W ∈ R n × m W \in R^{n \times m} W∈Rn×m
由于 z i = ∑ j m W i j x j z_i = \sum_j^m{W_{ij}x_j} zi=∑jmWijxj
所以:
(
∂
z
∂
x
)
i
j
=
∂
z
i
∂
x
j
=
∂
∂
x
∑
k
m
W
i
k
x
k
=
W
i
j
(\frac{\partial z}{\partial x})_{ij} = \frac{\partial z_i}{\partial x_j} = \frac{\partial }{\partial x} \sum_k^m{W_{ik}x_k} = W_{ij}
(∂x∂z)ij=∂xj∂zi=∂x∂k∑mWikxk=Wij
进而可以拓展为
∂
z
∂
x
=
∂
W
x
∂
x
=
W
\frac{\partial z}{\partial x} =\frac{\partial Wx}{\partial x} = W
∂x∂z=∂x∂Wx=W
神经网络
神经网络是受到生物神经元的启发而构建的模型,所以也称之为人工神经网络, 神经网络基础知识这里就不再赘述
反向传播
在更新神经网络模型中的参数之后,我们需要知道模型参数的梯度:
θ
(
t
+
1
)
=
θ
(
t
)
−
α
∇
θ
(
t
)
J
\theta^{(t+1)} = \theta^{(t)} - \alpha \nabla_{\theta ^{(t)}} J
θ(t+1)=θ(t)−α∇θ(t)J反向传播是一种利用微分链式法则来计算模型上任意参数的损失梯度的方法.利用链式法则通过下一层的误差梯度进而推出上一层的误差梯度.
[
d
o
w
n
s
t
r
e
a
m
g
r
a
d
i
e
n
t
]
=
[
u
p
s
t
r
e
a
m
g
r
a
d
i
e
n
t
]
∗
[
l
o
c
a
l
g
r
a
d
i
e
n
t
]
[downstream \, gradient] = [upstream \, gradient] * [local \, gradient]
[downstreamgradient]=[upstreamgradient]∗[localgradient]
现在来计算误差从第 k 层传递到第 k - 1 层.
其中:
- δ i ( k ) \delta_i^{(k)} δi(k) 为第 K 层第 i 个神经元输入处的误差,即在 z i k z_i^{k} zik 出计算得出的反向传播误差
- 将 δ i ( k ) \delta_i^{(k)} δi(k) 与路径上的权重 W i j k − 1 W_{ij}^{k-1} Wijk−1 相乘,即将误差传播到上层神经元的输出位置 a j ( k − 1 ) a_j^{(k-1)} aj(k−1),所以在该位置的接受的误差为 δ i ( k ) W i j k − 1 \delta_i^{(k)} W_{ij}^{k-1} δi(k)Wijk−1 ,其值代表着它对最终误差结果的产生影响大小
- a j ( k − 1 ) a_j^{(k-1)} aj(k−1) 位置的神经元会参与下一层多个神经元计算,那么将会有多个下一层的神经元将误差反向传播过来所以要进行求和即 ∑ i δ i ( k ) W i j k − 1 \sum_i\delta_i^{(k)} W_{ij}^{k-1} ∑iδi(k)Wijk−1
- 现在得到了 a j ( k − 1 ) a_j^{(k-1)} aj(k−1) 位置处的误差,那么与其局部梯度相乘 f ′ ( z j k − 1 ) f'(z_j^{k-1}) f′(zjk−1) 将误差传递至 z i k − 1 z_i^{k-1} zik−1处即 f ′ ( z j k − 1 ) ∑ i δ i ( k ) W i j k − 1 f'(z_j^{k-1})\sum_i\delta_i^{(k)} W_{ij}^{k-1} f′(zjk−1)∑iδi(k)Wijk−1
以向量话的方式可以表示为 δ ( k ) = f ′ ( z k − 1 ) ∘ ( W k ) T δ ( k + 1 ) \delta^{(k)} = f'(z^{k-1})\circ(W^k)^T\delta^{(k+1)} δ(k)=f′(zk−1)∘(Wk)Tδ(k+1) 其中 ∘ \circ ∘ 代表着 R N × R N → R N R^N \times R^N \to R^N RN×RN→RN
对于路径权重 W i j k W^k_{ij} Wijk ,其误差梯度为 δ i ( k + 1 ) a j k \delta_i^{(k+1)} a_j^{k} δi(k+1)ajk 对于 $\nabla W^{k} =\delta^{k+1} {a{(k)T}} $
我们从最后面一层层的往前传递,当计算第 k 层时候只用使用第 k + 1 层的梯度进行相乘即可得到,而不用重新从损失函数处进行计算,避免了重复计算.
Gradient Check 梯度检查
反向传播是基于微分的方式进行误差梯度计算与更新,而梯度检查是采用数值近似的方式计算每个参数的梯度.针对模型中的参数
θ
\theta
θ 和损失函数J我们可已使用以下公式计算梯度:
f
′
(
θ
)
=
J
(
θ
i
+
h
)
+
J
(
θ
i
−
h
)
2
h
f'(\theta) = \frac{J(\theta^{i+h}) + J(\theta^{i-h})}{2h}
f′(θ)=2hJ(θi+h)+J(θi−h)
其中 h 非常小一般取
1
e
−
5
1e^{-5}
1e−5 左右,这里对参数的两个方向都进行参数的扰动,从而更好的逼近一个参数当前的斜率.
梯度检查可以比较准确的估计任何参数的导数,但是对每个神经元都采用这种方式进行更新参数的话,计算量过大,因为每一个参数的梯度都要进行两次反向传播,所以无法应用该方法进行参数的更新,只用作梯度检查.
不过现在也无需进行梯度检查了,因为使用框架 tensoflow pytorch 等人家帮你计算梯度,基本不会出错.
正则化
机器学习算法很容易过拟合,即对输入微小改变会产生输出较大的差异,这意味训练出来的机器学习模型在训练集上表现的非常好,但是在测试集上表现的很差,泛化能力差. 一个解决的方法是引入正则化.
J
R
=
J
+
λ
∑
i
=
1
L
∣
∣
W
(
i
)
∣
∣
F
J_R = J + \lambda \sum_{i=1}^{L}{|| W^{(i)}||_F}
JR=J+λi=1∑L∣∣W(i)∣∣F
其中
λ
\lambda
λ 为超参数惩罚系数,控制着正则项的权重大小. 引入正则项可以有效降低模型的灵活性,因此减少过拟合的可能性.
λ
\lambda
λ 值太大会让很参数都接近于0,那么参数就很难在数据集上学习到有意义的东西,这将导致在测试集和训练集上表现的都很差,而
λ
\lambda
λ 值太小会让模型出现过拟合现象.
使用正则项也可以采用L1,但是其会将让全职参数变得稀疏.
Dropout
Dropout 也是一种解决过拟合十分有效的方法,他是说在训练过程中,每次前向传播以及反向传播时以一定概率(1-p)让一些神经元 drop 即关闭,不进行传播,保证概率为p的神经元是激活的可以传播.实现时就是每个神经元有 p 的概率是被激活的,1-p的概率是关闭的输出为 0 . 在反向传播的时候我们只对前向传播中活着的结点及进行参数更新.在测试过程中,不在进行 dropout ,即全部的神经元都是激活的.
Dropout 非常有效,其可以让模型学习到更多的信息,直观上可以理解为 dropout 训练了多个小网络,并且对他们的输出结果进行平均.
激活函数
这里不再多做解释.
数据预处理
数据预处理对机器学习模型十分常见以及关键的步骤.
Mean Substraction
其目的在与通过让数据特征向量值减去平均值,从而使其0中心化. 注意平均值是从训练集上计算得来,并在训练集、验证集、测试集减去同一平均值.
Normalization
标准化,将每个特征向量维度具有相同的规模,以方便训练.
Whitening
白化是说将数据转化后特征之间相关性低,协方差阵为1.其通过利用SVD方法进行处理.
参数初始化
-
通常将权重初始化为较小的随机值
这是为了能让激活函数在有效的范围内,让梯度可以更新呢
-
初始化隐藏层 bias 为 0
-
初始化所有其它权重为 Uniform(-r, r) r 的值很小
-
Xavier初始化,方差与前一层和后一层的尺寸成反比 V a r ( W i ) = 2 n i n + n o u t Var(W_i) = \frac{2}{n_{in} + n_{out}} Var(Wi)=nin+nout2
学习率
以一个简单的梯度下降公式为例子:
θ
n
e
w
=
θ
o
l
d
−
α
∇
J
t
(
θ
)
\theta ^{new} = \theta^{old} - \alpha \nabla J_t(\theta)
θnew=θold−α∇Jt(θ)
其中 a 为学习率, 训练过程中模型更新的速度受学习率值大小的影响.
- a 的值过大,那么尽管学习率很快,模型参数更新的幅度很大,但是并无法保证模型收敛,其可能在最小值左右来回振荡.
- a 的值过小,可以保证模型的收敛,但是这让模型更新幅度小,学习慢,在有限的学习步数下不一定能够收敛.
一种合理解决方法是学习率随着迭代次数的增加而降低,这可以让模型以一个较大的学习率开始,迅速的向最小值靠近,然后降低学习率让其收敛.
参考资料
- a 的值过小,可以保证模型的收敛,但是这让模型更新幅度小,学习慢,在有限的学习步数下不一定能够收敛.
一种合理解决方法是学习率随着迭代次数的增加而降低,这可以让模型以一个较大的学习率开始,迅速的向最小值靠近,然后降低学习率让其收敛.