非线性问题
对于一张汽车图片,如何将其识别为汽车呢?我们人可能看一眼就能识别出来,但是如何让计算机也拥有同样的技能呢?我们知道,一张图片在计算机中都是以像素矩阵的形式存储的,无论是一辆汽车,还是一辆飞机,在计算机中都是一个个矩阵,并无法直观地感受到这个矩阵代表是汽车还是飞机。用逻辑回归似乎也无法分出一个很好的决策边界。为了尝试解决这种问题,学者们模仿人的大脑,提出了神经元模型的概念。
神经元模型
输入特征x1,x2,x3,……到若干个神经元中,神经元记过计算后输出结果,这个结果再经过非线性函数 h θ ( x ) = a c t i v a t i o n ( x ) h_\theta(x)=activation(x) hθ(x)=activation(x)。这里的激活函数可以是 s i g m o i d ( x ) = 1 1 + e − θ T x sigmoid(x)=\frac{1}{1+e^{-\theta^Tx}} sigmoid(x)=1+e−θTx1,也可以是其他。
激活函数
对于非线性函数g(z)的一个学术称呼。如之前学习过的 h ( x ) = 1 1 + e − x h(x)=\frac{1}{1+e^{-x}} h(x)=1+e−x1就是一个激活函数,也叫做Sigmoid函数。它的作用是让整个模型可以适应非线性的情况。
BP模型介绍
- 输入层的每一个神经元对应一个样本特征的输入,比如 x 0 , x 1 , x 2 , x 3 x0,x1,x2,x3 x0,x1,x2,x3等特征。
- 输出层的神经元输出模型的输出结果,通常只有一个神经元。
- 隐藏层的神经元并不存在于模型中,通常用来学习隐藏的特征。
对于输入层的神经元,接受特征输入后直接输出到所有隐含层神经元,不做任何处理。
对于每个隐藏层的神经元,接受所有的特征输入后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。
对于输出层的神经元,接受所有来自隐藏层的输出后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。
前向传播算法
其实就是一步一步计算的过程。
类似逻辑回归,但是逻辑回归的输入是特征,而这里的输入是隐藏元的输出。而隐藏元的输出是通过特征进行学习得到的。
a
i
(
j
)
a_i^{(j)}
ai(j)表示第j层的第i个神经元,
θ
(
j
)
\theta^{(j)}
θ(j)表示从第j到第j+1层的权重矩阵.
对于输入层有4个神经元,隐藏层有4个神经元,输出层有1个神经元,兵并且层与层之间是全连接的情况,有如下的公式
a
1
(
2
)
=
g
(
θ
10
(
1
)
x
0
+
θ
11
(
1
)
x
1
+
θ
12
(
1
)
x
2
+
θ
13
(
1
)
x
3
)
a
2
(
2
)
=
g
(
θ
20
(
1
)
x
0
+
θ
21
(
1
)
x
1
+
θ
22
(
1
)
x
2
+
θ
23
(
1
)
x
3
)
a
3
(
2
)
=
g
(
θ
30
(
1
)
x
0
+
θ
31
(
1
)
x
1
+
θ
32
(
1
)
x
2
+
θ
33
(
1
)
x
3
)
h
θ
(
x
)
=
a
1
(
3
)
=
g
(
θ
10
(
2
)
a
0
(
2
)
+
θ
11
(
2
)
a
1
(
2
)
+
θ
12
(
2
)
a
2
(
2
)
+
θ
13
(
2
)
a
3
(
2
)
)
\begin{aligned} &a_1^{(2)}=g(\theta_{10}^{(1)}x_0+\theta_{11}^{(1)}x_1+\theta_{12}^{(1)}x_2+\theta_{13}^{(1)}x_3)\\ &a_2^{(2)}=g(\theta_{20}^{(1)}x_0+\theta_{21}^{(1)}x_1+\theta_{22}^{(1)}x_2+\theta_{23}^{(1)}x_3)\\ &a_3^{(2)}=g(\theta_{30}^{(1)}x_0+\theta_{31}^{(1)}x_1+\theta_{32}^{(1)}x_2+\theta_{33}^{(1)}x_3)\\ &h_\theta(x)=a_1^{(3)}=g(\theta_{10}^{(2)}a_0^{(2)}+\theta_{11}^{(2)}a_1^{(2)}+\theta_{12}^{(2)}a_2^{(2)}+\theta_{13}^{(2)}a_3^{(2)}) \end{aligned}
a1(2)=g(θ10(1)x0+θ11(1)x1+θ12(1)x2+θ13(1)x3)a2(2)=g(θ20(1)x0+θ21(1)x1+θ22(1)x2+θ23(1)x3)a3(2)=g(θ30(1)x0+θ31(1)x1+θ32(1)x2+θ33(1)x3)hθ(x)=a1(3)=g(θ10(2)a0(2)+θ11(2)a1(2)+θ12(2)a2(2)+θ13(2)a3(2))
算法推导
s
l
s_l
sl表示神经网络第l层的神经元个数,
h
θ
(
x
)
h_\theta(x)
hθ(x)是K维列向量,令
(
h
θ
(
x
)
)
k
(h_\theta(x))_k
(hθ(x))k表示第k个输出,则神经网络的损失函数如下:
J
(
W
,
b
;
x
,
y
)
=
1
m
∑
i
=
1
m
(
1
2
∣
∣
h
W
,
b
(
x
(
i
)
−
y
(
i
)
)
∣
∣
2
)
+
λ
2
∑
l
=
1
L
−
1
∑
i
=
1
s
l
∑
j
=
1
s
l
+
1
(
W
j
i
(
l
)
)
2
J(W,b;x,y)=\frac{1}{m}\sum_{i=1}^m\left(\frac{1}{2}||h_{W,b}(x^{(i)}-y^{(i)})||^2\right)+\frac{\lambda}{2}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(W{ji}^{(l)})^2
J(W,b;x,y)=m1i=1∑m(21∣∣hW,b(x(i)−y(i))∣∣2)+2λl=1∑L−1i=1∑slj=1∑sl+1(Wji(l))2
梯度下降法中每一次迭代都按照如下公式对W和b进行更新:
W
i
j
(
l
)
=
W
i
j
(
l
)
−
α
∂
∂
W
i
j
(
l
)
J
(
W
,
b
)
W_{ij}^{(l)}=W_{ij}^{(l)}-\alpha\frac{∂}{∂W_{ij}^{(l)}}J(W,b)
Wij(l)=Wij(l)−α∂Wij(l)∂J(W,b)
b
i
(
l
)
=
b
i
(
l
)
−
α
∂
∂
b
i
(
l
)
J
(
W
,
b
)
b_{i}^{(l)}=b_{i}^{(l)}-\alpha\frac{∂}{∂b_{i}^{(l)}}J(W,b)
bi(l)=bi(l)−α∂bi(l)∂J(W,b)
其中的关键步骤是计算偏导数。
∂
∂
W
i
j
(
l
)
J
(
W
,
b
)
=
[
1
m
∑
i
=
1
m
∂
∂
W
i
j
(
l
)
J
(
W
,
b
;
x
(
i
)
,
y
(
i
)
)
]
+
λ
W
i
j
(
l
)
\frac{∂}{∂W_{ij}^{(l)}}J(W,b)=\left[\frac{1}{m}\sum_{i=1}^m\frac{∂}{∂W_{ij}^{(l)}}J(W,b;x^{(i)},y^{(i)})\right]+\lambda W_{ij}^{(l)}
∂Wij(l)∂J(W,b)=[m1i=1∑m∂Wij(l)∂J(W,b;x(i),y(i))]+λWij(l)
∂
∂
b
i
(
l
)
J
(
W
,
b
)
=
[
1
m
∑
i
=
1
m
∂
∂
b
i
(
l
)
J
(
W
,
b
;
x
(
i
)
,
y
(
i
)
)
]
\frac{∂}{∂b_{i}^{(l)}}J(W,b)=\left[\frac{1}{m}\sum_{i=1}^m\frac{∂}{∂b_{i}^{(l)}}J(W,b;x^{(i)},y^{(i)})\right]
∂bi(l)∂J(W,b)=[m1i=1∑m∂bi(l)∂J(W,b;x(i),y(i))]
这里需要使用反向传播算法,它是计算偏导数的有效方法。
反向传播算法
给定一个样本,我们首先对它进行前向传播,算出网络中所有的激活值以及最后的预测值。令
L
a
y
e
r
i
Layer_i
Layeri表示神经网络的第i层,no表示输出层,
δ
i
(
l
)
\delta_i^{(l)}
δi(l)表示第l层的第i个节点的误差(也称为“残差”),
α
i
(
l
)
\alpha_i^{(l)}
αi(l)表示第
l
l
l层第i个节点的激励值。
反向传播算法的流程如下:
- 对样本 < x ( i ) , y ( i ) > <x^{(i)},y^{(i)}> <x(i),y(i)>输入到网络中,进行前向传播,得到 L a y e r 2 , L a y e r 3 , . . . Layer_2,Layer_3,... Layer2,Layer3,...直到输出层 L a y e r n o Layer_{no} Layerno的激活值。
- 对于最后一层,我们使用 δ n o = ∂ ∂ z i ( n o ) 1 2 ∣ ∣ y − h θ ( x ) ∣ ∣ 2 = − ( y i − a i ( n o ) ) ⋅ f ′ ( z i ( n o ) ) \delta^{no}=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}||y-h_\theta(x)||^2=-(y_i-a_i^{(no)})·f'(z_i^{(no)}) δno=∂zi(no)∂21∣∣y−hθ(x)∣∣2=−(yi−ai(no))⋅f′(zi(no))
- 对于 l = n o − 1 , n o − 2 , n o − 3... l=no-1,no-2,no-3... l=no−1,no−2,no−3...的每一层,有 δ i ( l ) = ( ∑ j = 1 s l + 1 θ j i l δ j ( l + 1 ) ) f ′ ( z i ( l ) ) \delta_i^{(l)}=(\sum\limits_{j=1}^{s_{l+1}}\theta_{ji}^{l}\delta_j^{(l+1)})f'(z_i^{(l)}) δi(l)=(j=1∑sl+1θjilδj(l+1))f′(zi(l))
- 计算偏导数, ∂ ∂ θ i j l J ( θ ) = a j ( l − 1 ) δ i ( l ) \frac{∂}{∂\theta_{ij}^l}J(\theta)=a_j^{(l-1)}\delta_i^{(l)} ∂θijl∂J(θ)=aj(l−1)δi(l), ∂ J ( W , b ) ∂ b j l = δ j ( l ) \frac{\partial J(W,b)}{\partial b_{j}^l}=\delta_j^{(l)} ∂bjl∂J(W,b)=δj(l)
对于上面第二步的公式,推导如下:
δ
i
n
o
=
∂
∂
z
i
(
n
o
)
1
2
∣
∣
y
−
h
θ
(
x
)
∣
∣
2
=
∂
∂
z
i
(
n
o
)
1
2
∑
j
=
1
S
n
o
(
y
j
−
a
j
n
o
)
2
=
∂
∂
z
i
(
n
o
)
1
2
∑
j
=
1
S
n
o
(
y
j
−
f
(
z
j
n
o
)
)
2
=
−
(
y
i
−
f
(
z
i
n
o
)
)
⋅
f
′
(
z
i
n
o
)
=
−
(
y
i
−
a
i
n
o
)
)
⋅
f
′
(
z
i
n
o
)
\begin{aligned} \delta_i^{no} &=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}||y-h_\theta(x)||^2\\ &=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-a_j^{no})^2\\ &=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-f(z_j^{no}))^2\\ &=-(y_i-f(z_i^{no}))·f'(z_i^{no})\\ &=-(y_i-a_i^{no}))·f'(z_i^{no}) \end{aligned}
δino=∂zi(no)∂21∣∣y−hθ(x)∣∣2=∂zi(no)∂21j=1∑Sno(yj−ajno)2=∂zi(no)∂21j=1∑Sno(yj−f(zjno))2=−(yi−f(zino))⋅f′(zino)=−(yi−aino))⋅f′(zino)
对于上面第三步的公式,推导如下:
δ
i
(
n
o
−
1
)
=
∂
∂
z
i
(
n
o
−
1
)
1
2
∣
∣
y
−
h
θ
(
x
)
∣
∣
2
=
∂
∂
z
i
(
n
o
−
1
)
1
2
∑
j
=
1
S
n
o
(
y
j
−
a
j
n
o
)
2
=
1
2
∑
j
=
1
S
n
o
∂
∂
z
i
(
n
o
−
1
)
(
y
j
−
f
(
z
j
n
o
)
)
2
=
∑
j
=
1
S
n
o
−
(
y
j
−
f
(
z
j
n
o
)
)
⋅
f
′
(
z
j
n
o
)
∂
z
j
(
n
o
)
∂
z
i
(
n
o
−
1
)
=
∑
j
=
1
S
n
o
δ
j
n
o
∂
z
j
(
n
o
)
∂
z
i
(
n
o
−
1
)
=
∑
j
=
1
S
n
o
(
δ
j
n
o
⋅
∂
∂
z
i
(
n
o
−
1
)
∑
k
=
1
S
n
o
−
1
f
(
z
k
n
o
−
1
)
⋅
θ
k
j
n
o
−
1
)
=
∑
j
=
1
S
n
o
δ
j
n
o
⋅
θ
i
j
n
o
−
1
⋅
f
′
(
z
i
n
o
−
1
)
=
(
∑
j
=
1
S
n
o
θ
i
j
n
o
−
1
δ
j
n
o
)
⋅
f
′
(
z
i
n
o
−
1
)
\begin{aligned} \delta_i^{(no-1)} &=\frac{∂}{∂_{z_i^{(no-1)}}}\frac{1}{2}||y-h_\theta(x)||^2\\ &=\frac{∂}{∂_{z_i^{(no-1)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-a_j^{no})^2\\ &=\frac{1}{2}\sum_{j=1}^{S_{no}}\frac{∂}{∂_{z_i^{(no-1)}}}(y_j-f(z_j^{no}))^2\\ &=\sum_{j=1}^{S_{no}}-(y_j-f(z_j^{no}))·f'(z_j^{no})\frac{∂_{z_j^{(no)}}}{∂_{z_i^{(no-1)}}}\\ &=\sum_{j=1}^{S_{no}}\delta_j^{no}\frac{∂_{z_j^{(no)}}}{∂_{z_i^{(no-1)}}}\\ &=\sum_{j=1}^{S_{no}}\left(\delta_j^{no}·\frac{∂}{∂_{z_i^{(no-1)}}}\sum_{k=1}^{S_{no-1}}f(z_k^{no-1})·\theta_{kj}^{no-1}\right)\\ &=\sum_{j=1}^{S_{no}}\delta_j^{no}·\theta_{ij}^{no-1}·f'(z_i^{no-1})\\ &=\left(\sum_{j=1}^{S_{no}}\theta_{ij}^{no-1}\delta_j^{no}\right)·f'(z_i^{no-1})\\ \end{aligned}
δi(no−1)=∂zi(no−1)∂21∣∣y−hθ(x)∣∣2=∂zi(no−1)∂21j=1∑Sno(yj−ajno)2=21j=1∑Sno∂zi(no−1)∂(yj−f(zjno))2=j=1∑Sno−(yj−f(zjno))⋅f′(zjno)∂zi(no−1)∂zj(no)=j=1∑Snoδjno∂zi(no−1)∂zj(no)=j=1∑Sno(δjno⋅∂zi(no−1)∂k=1∑Sno−1f(zkno−1)⋅θkjno−1)=j=1∑Snoδjno⋅θijno−1⋅f′(zino−1)=(j=1∑Snoθijno−1δjno)⋅f′(zino−1)
将no和no-1的关系换为l和l+1的关系得
δ
i
(
l
)
=
(
∑
j
=
1
S
l
+
1
θ
i
j
(
l
)
δ
j
(
l
+
1
)
)
⋅
f
′
(
z
i
(
l
)
)
\delta_i^{(l)}=\left(\sum_{j=1}^{S_{l+1}}\theta_{ij}^{(l)}\delta_j^{(l+1)}\right)·f'(z_i^{(l)})
δi(l)=(j=1∑Sl+1θij(l)δj(l+1))⋅f′(zi(l))
最终,损失对参数函数的梯度可以写为
∂
J
(
W
,
b
)
∂
θ
i
j
l
=
∂
J
(
W
,
b
)
∂
z
i
(
l
)
∂
z
i
(
l
)
∂
θ
i
j
(
l
)
=
δ
i
(
l
)
x
j
(
l
)
=
δ
i
(
l
)
a
j
(
l
−
1
)
∂
J
(
W
,
b
)
∂
b
j
l
=
δ
j
(
l
)
\begin{aligned} &\frac{\partial J(W,b)}{\partial \theta_{ij}^l}=\frac{\partial J(W,b)}{\partial z_i^{(l)}}\frac{\partial z_i^{(l)}}{\partial \theta_{ij}^{(l)}}=\delta_i^{(l)}x_j^{(l)}=\delta_i^{(l)}a_j^{(l-1)} \\ &\frac{\partial J(W,b)}{\partial b_{j}^l}=\delta_j^{(l)} \end{aligned}
∂θijl∂J(W,b)=∂zi(l)∂J(W,b)∂θij(l)∂zi(l)=δi(l)xj(l)=δi(l)aj(l−1)∂bjl∂J(W,b)=δj(l)
在上述流程中,令激活函数f(x)=Sigmoid(x)函数,那么 f ′ ( z i ( l ) ) = a i ( l ) ( 1 − a i ( l ) ) f'(z_i^{(l)})=a_i^{(l)}(1-a_i^{(l)}) f′(zi(l))=ai(l)(1−ai(l)),而其中的 a i ( l ) a_i^{(l)} ai(l)是在前向传播的过程中就计算出来了的。可以很方便地直接得到。最终我们将利用残差计算出了偏导数,更新了权重矩阵里面的每个权重的值,从而完成了一次反向传播。最终我们通过梯度下降算法不停迭代,降低代价函数的值,从而得到最终的神经网络。