反向传播Back Propagation
DNN中BP解决问题:
已知:m个训练样本:
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
\{(x_1,y_1), (x_2,y_2), ..., (x_m,y_m)\}
{(x1,y1),(x2,y2),...,(xm,ym)},
x
:
a
t
t
r
s
(
特
征
)
×
n
_
i
n
x: attrs(特征)\times n\_in
x:attrs(特征)×n_in,
y
:
a
t
t
r
s
(
特
征
)
×
n
_
o
u
t
y: attrs(特征)\times n\_out
y:attrs(特征)×n_out(特征维度)。
目标:
(
x
t
e
s
t
,
?
)
(x_{test},?)
(xtest,?)预测
y
t
e
s
t
y_{test}
ytest
过程:训练样本输入计算出的输出尽可能的等于或很接近样本输出。用一个合适的损失函数来度量训练样本的输出损失,损失函数进行优化求最小化的极值,使用梯度下降法迭代。
DNN反向传播算法过程
由于梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,这里我们以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。
输入: 总层数L,以及各隐藏层与输出层的神经元个数,激活函数,损失函数,迭代步长
α
α
α,最大迭代次数MAX与停止迭代阈值
ϵ
ϵ
ϵ,输入的m个训练样本
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
\{(x_1,y_1), (x_2,y_2), ..., (x_m,y_m)\}
{(x1,y1),(x2,y2),...,(xm,ym)}
输出:各隐藏层与输出层的线性关系系数矩阵
W
W
W和偏倚向量
b
b
b
1) 初始化各隐藏层与输出层的线性关系系数矩阵
W
W
W和偏倚向量
b
b
b的值为一个随机值。
2)for iter to 1 to MAX:
2-1) for i =1 to m:
a) 将DNN输入
a
1
a^1
a1设置为
x
i
x_i
xi
b) for
l
l
l=2 to L,进行前向传播算法计算
a
i
,
l
=
σ
(
z
i
,
l
)
=
σ
(
W
l
a
i
,
l
−
1
+
b
l
)
a^{i,l} = \sigma(z^{i,l}) = \sigma(W^la^{i,l-1} + b^l)
ai,l=σ(zi,l)=σ(Wlai,l−1+bl)
c) 通过损失函数计算输出层的
δ
i
L
δ_i^L
δiL
d) for
l
l
l= L-1 to 2, 进行反向传播算法计算
δ
i
,
l
=
(
W
l
+
1
)
T
δ
i
,
l
+
1
⊙
σ
′
(
z
i
,
l
)
\delta^{i,l} = (W^{l+1})^T\delta^{i,l+1}\odot \sigma^{'}(z^{i,l})
δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)
2-2) for
l
l
l = 2 to L,更新第
l
l
l层的
W
l
W_l
Wl,
b
l
b_l
bl:
W
l
=
W
l
−
α
∑
i
=
1
m
δ
i
,
l
(
a
i
,
l
−
1
)
T
W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T
Wl=Wl−αi=1∑mδi,l(ai,l−1)T ,
b
l
=
b
l
−
α
∑
i
=
1
m
δ
i
,
l
b^l = b^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}
bl=bl−αi=1∑mδi,l
2-3) 如果所有
W
W
W,
b
b
b的变化值都小于停止迭代阈值
ϵ
ϵ
ϵ,则跳出迭代循环到步骤3。
3) 输出各隐藏层与输出层的线性关系系数矩阵
W
W
W和偏倚向量
b
b
b。