Backpropagation
接着神经网络模型,我们开始讲讲神经网络是怎么训练参数的,那么首先就需要知道神经网络的代价函数是什么。
cost function
对于分类任务来说,神经网络的代价函数和逻辑回归的代价函数非常相似,神经网络前一项多的
∑
k
=
1
K
\sum_{k=1}^K
∑k=1K是因为多分类的关系,神经神经网络的输出是一个向量,那么有多少个分类,K就是多少。后一项是正则项,是对所有参数的惩罚,那么神经网络自然需要把每一层的权重矩阵的每一项都囊括进来,所以有了复杂的第二项,但其实本质都是一样的。
Backpropagation Algorithm
反向传递算法是神经网络更新参数,最小化代价函数的算法,这就类似于我们在线性回归和逻辑回归中用到的梯度下降算法一样。我们的目标是:
min
θ
J
(
θ
)
\min_\theta J(\theta)
θminJ(θ)
参数更新方程是 :
θ
i
j
(
l
)
:
=
θ
i
j
(
l
)
−
α
∂
J
(
θ
)
∂
θ
i
j
(
l
)
\theta_{ij}^{(l)} := \theta_{ij}^{(l)} - \alpha\frac{\partial J(\theta)}{\partial\theta_{ij}^{(l)}}
θij(l):=θij(l)−α∂θij(l)∂J(θ)
对于偏导数,我们运用链式法则,进行展开
∂
J
(
θ
)
∂
θ
i
j
(
l
)
=
∂
J
(
θ
)
∂
z
i
(
l
+
1
)
∂
z
i
(
l
+
1
)
∂
θ
i
j
(
l
)
=
∂
J
(
θ
)
∂
z
i
(
l
+
1
)
a
j
(
l
)
\frac{\partial J(\theta)}{\partial\theta_{ij}^{(l)}}= \frac{\partial J(\theta)}{\partial z_{i}^{(l+1)}} \frac{\partial z_{i}^{(l+1)}}{\partial\theta_{ij}^{(l)}}= \frac{\partial J(\theta)}{\partial z_{i}^{(l+1)}}a_j^{(l)}
∂θij(l)∂J(θ)=∂zi(l+1)∂J(θ)∂θij(l)∂zi(l+1)=∂zi(l+1)∂J(θ)aj(l)
a
j
(
l
)
a_j^{(l)}
aj(l)是我们已知的参数,而
∂
J
(
θ
)
∂
z
i
(
l
+
1
)
\frac{\partial J(\theta)}{\partial z_{i}^{(l+1)}}
∂zi(l+1)∂J(θ)我们并不知道,于是对于这个未知参数,我们引入一个所谓的error变量
δ
\delta
δ(残差)来表示,对于神经网络中除了输入层和bias,其余所有的神经元都有自己残差,表示为
δ
i
l
\delta_{i}^{l}
δil(第
l
l
l 层的第
i
i
i 个元)。
输出层的残差,我们定义为:
δ
i
(
L
)
=
a
i
(
L
)
−
y
i
\delta_i^{(L)} = a_i^{(L)}-y_i
δi(L)=ai(L)−yi
对于隐藏层的每一层每一个节点,都有:
KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ \delta_i^{(l)}…
这个残差的计算方程就很好的体现了“反向”,我们需要先从输出层开始,然后利用上面的方程依次求得前一层每个节点的残差。求得了残差,我们就能进行参数更新了。
θ
i
j
(
l
)
:
=
θ
i
j
(
l
)
−
α
⋅
δ
i
(
l
)
⋅
a
j
(
l
)
\theta_{ij}^{(l)} := \theta_{ij}^{(l)} - \alpha \cdot \delta_i^{(l)} \cdot a_j^{(l)}
θij(l):=θij(l)−α⋅δi(l)⋅aj(l)
这个结论没有考虑正则项,考虑正则项的情况就不去具体分析了,下面算法步骤是考虑了正则项的。