一、梯度下降
我们之前介绍的的单层神经网络会有 W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] W^{[1]},b^{[1]}, W^{[2]},b^{[2]} W[1],b[1],W[2],b[2]这些参数,还有 n x n_{x} nx表示输入特征的个数, n [ 1 ] n_{[1]} n[1]表示隐藏单元个数, n [ 2 ] n^{[2]} n[2]表示输出单元个数。
矩阵 W [ 1 ] W^{[1]} W[1]的维度就是 ( n [ 1 ] , n [ 0 ] ) (n^{[1]}, n^{[0]}) (n[1],n[0]), b [ 1 ] b^{[1]} b[1]就是 n [ 1 ] n^{[1]} n[1]维列向量,可以写成 ( n [ 1 ] , 1 ) (n^{[1]}, 1) (n[1],1)。矩阵 W [ 2 ] W^{[2]} W[2]的维度就是 ( n [ 2 ] , n [ 1 ] ) (n^{[2]}, n^{[1]}) (n[2],n[1]), b [ 2 ] b^{[2]} b[2]的维度就是 ( n [ 2 ] , 1 ) (n^{[2]},1) (n[2],1)维。
神经网络还有一个成本函数,假设你在做二分类任务,那么你的成本函数等于
C
o
s
t
F
u
n
c
t
i
o
n
:
J
(
W
[
1
]
,
b
[
1
]
,
W
[
2
]
,
b
[
2
]
)
=
1
m
∑
i
=
1
m
L
(
y
^
,
y
)
Cost Function:J(W^{[1]}, b^{[1]}, W^{[2]}, b^{[2]})=\frac{1}{m}\sum_{i=1}^{m}L(\hat{y}, y)
CostFunction:J(W[1],b[1],W[2],b[2])=m1i=1∑mL(y^,y)
训练参数需要做梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是全部初始化为零。当你参数初始化完成后,每次梯度下降都会循环计算以下预测值:
y
^
[
i
]
,
(
i
=
1
,
2
,
⋯
,
m
)
d
W
[
1
]
=
d
J
d
W
[
1
]
,
d
b
[
1
]
=
d
J
d
b
[
1
]
d
W
[
2
]
=
d
J
d
W
[
2
]
,
d
b
[
1
]
=
d
J
d
b
[
2
]
\hat{y}^{[i]},(i = 1, 2, \cdots, m) \\ dW^{[1]} = \frac{dJ}{dW^{[1]}}, db^{[1]} = \frac{dJ}{db^{[1]}} \\ dW^{[2]} = \frac{dJ}{dW^{[2]}}, db^{[1]} = \frac{dJ}{db^{[2]}} \\
y^[i],(i=1,2,⋯,m)dW[1]=dW[1]dJ,db[1]=db[1]dJdW[2]=dW[2]dJ,db[1]=db[2]dJ
然后更新参数
W
[
1
]
=
W
[
1
]
−
α
d
W
[
1
]
,
b
[
1
]
=
b
[
1
]
−
α
d
b
[
1
]
W
[
2
]
=
W
[
2
]
−
α
d
W
[
2
]
,
b
[
2
]
=
b
[
2
]
−
α
d
b
[
2
]
W^{[1]} = W^{[1]} - \alpha dW^{[1]}, b^{[1]} = b^{[1]} - \alpha db^{[1]} \\ W^{[2]} = W^{[2]} - \alpha dW^{[2]}, b^{[2]} = b^{[2]} - \alpha db^{[2]}
W[1]=W[1]−αdW[1],b[1]=b[1]−αdb[1]W[2]=W[2]−αdW[2],b[2]=b[2]−αdb[2]
正向传播方程如下:
F
o
r
w
a
r
d
P
r
o
p
a
g
a
t
i
o
n
(
1
)
z
[
1
]
=
W
[
1
]
x
+
b
[
1
]
(
2
)
a
[
1
]
=
σ
(
z
[
1
]
)
(
3
)
z
[
2
]
=
W
[
2
]
a
[
1
]
+
b
[
2
]
(
4
)
a
[
2
]
=
g
[
2
]
(
z
[
2
]
)
=
σ
(
z
[
2
]
)
Forward Propagation \\ (1)z^{[1]} = W^{[1]}x+b^{[1]} \\ (2)a^{[1]} = \sigma(z^{[1]}) \\ (3)z^{[2]} = W^{[2]}a^{[1]} + b^{[2]} \\ (4)a^{[2]} = g^{[2]}(z^{[2]}) = \sigma(z^{[2]})
ForwardPropagation(1)z[1]=W[1]x+b[1](2)a[1]=σ(z[1])(3)z[2]=W[2]a[1]+b[2](4)a[2]=g[2](z[2])=σ(z[2])
反向传播方程如下:
(
1
)
d
z
[
2
]
=
A
[
2
]
−
Y
,
Y
=
[
y
[
1
]
,
y
[
2
]
,
.
.
.
,
y
[
m
]
]
(
2
)
d
W
[
2
]
=
1
m
d
z
[
2
]
A
[
1
]
T
(
3
)
d
b
[
2
]
=
1
m
n
p
.
s
u
m
(
d
z
[
2
]
,
a
x
i
s
=
1
,
k
e
e
p
d
i
m
s
=
T
u
r
e
)
(
4
)
d
z
[
1
]
=
W
[
2
]
T
d
z
[
2
]
∗
g
[
1
]
′
∗
z
[
1
]
(
5
)
d
W
[
1
]
=
1
m
d
z
[
1
]
x
T
(
6
)
d
b
[
1
]
=
1
m
n
p
.
s
u
m
(
d
z
[
1
]
,
a
x
i
s
=
1
,
k
e
e
p
d
i
m
s
=
T
r
u
e
)
(1)dz^{[2]} = A^{[2]} - Y, Y = [y^{[1]}, y^{[2]}, ..., y^{[m]}] \\ (2)dW^{[2]} = \frac{1}{m}dz^{[2]}A^{[1]T} \\ (3)db^{[2]} = \frac{1}{m}np.sum(dz[2], axis = 1, keepdims = Ture) \\ (4)dz^{[1]} = W^{[2]T}dz^{[2]} * g^{[1]'}*z^{[1]} \\ (5)dW^{[1]} = \frac{1}{m}dz^{[1]}x^T \\ (6)db^{[1]} = \frac{1}{m}np.sum(dz^{[1]}, axis = 1, keepdims = True)
(1)dz[2]=A[2]−Y,Y=[y[1],y[2],...,y[m]](2)dW[2]=m1dz[2]A[1]T(3)db[2]=m1np.sum(dz[2],axis=1,keepdims=Ture)(4)dz[1]=W[2]Tdz[2]∗g[1]′∗z[1](5)dW[1]=m1dz[1]xT(6)db[1]=m1np.sum(dz[1],axis=1,keepdims=True)
上述为反向传播的步骤。注:所有样本进行过向量化,
Y
Y
Y是
1
×
m
1 \times m
1×m的矩阵,这里 np.sum
是python的numpy命令,axis = 1
表示水平相加求和, keepdims
是防止python输出那些古怪的秩数
(
n
,
)
(n,)
(n,),加上这个确保矩阵
d
b
[
2
]
db^{[2]}
db[2]这个向量输出的维度为
(
n
,
1
)
(n, 1)
(n,1)这样标准的形式。
目前为止,我们计算的都和Logistic回归十分相似,但当你开始计算反向传播时,你需要计算隐藏层函数的导数,输出在使用sigmoid函数进行二元分类,这里是进行逐个元素乘积,因为 W [ 2 ] T d z [ 2 ] W^{[2]T}dz^{[2]} W[2]Tdz[2]和 ( z [ 1 ] ) (z^{[1]}) (z[1])这两个都为 ( n [ 1 ] , m ) (n^{[1]}, m) (n[1],m)矩阵。
以上便是正向传播的4个方程和反向传播的6个方程。