梯度下降法在神经网络中的应用
事先规定:
用 n n n 表示个数(维度):
n [ 0 ] = n x n^{[0]}=n_x n[0]=nx ,表示单个训练样本 x x x 的元素个数;
n [ 1 ] n^{[1]} n[1] 表示隐藏层 1 1 1 的单元(节点)个数;
n [ 1 ] n^{[1]} n[1] 表示……
梯度下降法公式:
① w w w 和 b b b 参数随机初始化;
②计算预测值
③求导: d w [ 1 ] dw^{[1]} dw[1] 、 d b [ 1 ] db^{[1]} db[1] 、 d w [ 2 ] dw^{[2]} dw[2] 、 d b [ 2 ] db^{[2]} db[2] 。
④更新参数:
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
]
\begin{align*} &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]} \end{align*}
W[1]=W[1]−α⋅dW[1]b[1]=b[1]−α⋅db[1]W[2]=W[2]−α⋅dW[2]b[2]=b[2]−α⋅db[2]
第三步反向传播求导的详细步骤:
d
Z
[
2
]
=
A
[
2
]
−
Y
d
W
[
2
]
=
1
m
d
Z
[
2
]
A
[
1
]
T
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
r
u
e
)
d
Z
[
1
]
=
W
[
2
]
T
d
Z
[
2
]
∗
g
[
1
]
′
(
Z
[
1
]
)
/
/
这里的
∗
是元素对应相乘
d
W
[
1
]
=
1
m
d
Z
[
1
]
X
T
/
/
这里的转置是因为
W
[
1
]
是由
w
i
[
1
]
T
组成的
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
)
\begin{align*} &dZ^{[2]}=A^{[2]}-Y\\ &dW^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T}\\ &db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]},axis=1,keepdims=True)\\ &dZ^{[1]}=W^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]})//这里的*是元素对应相乘\\ &dW^{[1]}=\frac{1}{m}dZ^{[1]}X^{T}//这里的转置是因为W^{[1]}是由w_i^{[1]T}组成的\\ &db^{[1]}=\frac{1}{m}np.sum(dZ^{[1]},axis=1,keepdims=True)\\ \end{align*}
dZ[2]=A[2]−YdW[2]=m1dZ[2]A[1]Tdb[2]=m1np.sum(dZ[2],axis=1,keepdims=True)dZ[1]=W[2]TdZ[2]∗g[1]′(Z[1])//这里的∗是元素对应相乘dW[1]=m1dZ[1]XT//这里的转置是因为W[1]是由wi[1]T组成的db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)
参数随机初始化
神经网络的参数 w i [ l ] w_i^{[l]} wi[l] 和不能像逻辑回归一样,初始化为零,否则梯度下降算法就会无效。
也不要将隐藏层中的所有节点参数都初始化成一样的,否则每个节点都在做相同的运算,毫无意义。
W [ 1 ] = n p . r a n d o m . r a n d n ( ( n [ 1 ] , n [ 0 ] ) ) ⋅ 0.01 / / 高斯分布随机变量再乘以 0.01 b [ 1 ] = n p . z e r o s ( ( n [ 1 ] , 1 ) ) W [ 2 ] = . . . b [ 2 ] = . . . \begin{align*} &W^{[1]}=np.random.randn((n^{[1]},n^{[0]}))·0.01~//高斯分布随机变量再乘以0.01\\ &b^{[1]}=np.zeros((n^{[1]},1))\\ &W^{[2]}=...\\ &b^{[2]}=... \end{align*} W[1]=np.random.randn((n[1],n[0]))⋅0.01 //高斯分布随机变量再乘以0.01b[1]=np.zeros((n[1],1))W[2]=...b[2]=...
通常情况下,会把参数随机初始化成很小很小的值,这也是乘以 0.01 0.01 0.01 的原因。
因为参数大的话, z z z 计算出来就会大, a a a 也会大,就会落在激活函数 σ ( z ) \sigma(z) σ(z) 或 t a n h ( z ) tanh(z) tanh(z) 的平缓区域,就会降低梯度下降法的速度,甚至形成梯度消失问题。