DeaplearningAI01.weak3
回顾 Logistic Regression
z = ω T x + b → a = σ ( z ) → L ( a , y ) z = \omega^Tx + b \to a=\sigma(z) \to \mathcal{L}(a,y) z=ωTx+b→a=σ(z)→L(a,y)
浅层神经网络(只有一层隐藏单元)
在本周的课程中,浅层神经网络的
W
W
W 均没有转置,也就是说,对于
m
m
m 个大小为
n
x
n_x
nx 的输入样本,
W
W
W 的大小为
m
∗
n
x
m*n_x
m∗nx
神经网络的命名中,输入层的下一层作为神经网络的第一层,输出层作为神经网络的最后一层。图中每一个节点进行线性和非线性变换,即
z
=
ω
T
x
+
b
z = \omega^Tx + b
z=ωTx+b 和
a
=
g
(
z
)
a = g(z)
a=g(z),
g
(
x
)
g(x)
g(x) 为激活函数。
要理解课程最重要的是分清每个符号的代表的意思
网络中每个符号的含义
以每个输入样本为照片拉成的向量为例,输入样本的大小为
n
x
∗
m
n_x * m
nx∗m,
n
x
=
w
∗
h
∗
c
h
a
n
n
e
l
s
n_x = w*h*channels
nx=w∗h∗channels
x
i
x_i
xi:单个输入向量的
i
i
i 位置上的值
a [ j ] a^{[j]} a[j]: 第j层的输入值
a i [ j ] a^{[j]}_i ai[j]: 第 j j j 层的第 i i i个输入值
n [ i ] n^{[i]} n[i]:第 i i i 层输入向量的维度, n [ 0 ] = n x n^{[0]} = n_x n[0]=nx
x ( i ) x^{(i)} x(i):第 i i i 个输入的样本
所以该浅层神经网络的第一层计算过程可以表示为
z
1
[
1
]
=
ω
1
[
1
]
T
x
(
i
)
+
b
1
[
1
]
,
a
1
[
1
]
=
g
(
z
1
[
1
]
)
z_1^{[1]} = \omega_1^{[1]T}x^{(i)} + b_1^{[1]}, a_1^{[1]} = g(z_1^{[1]})
z1[1]=ω1[1]Tx(i)+b1[1],a1[1]=g(z1[1])
z
2
[
1
]
=
ω
2
[
1
]
T
x
(
i
)
+
b
2
[
1
]
,
a
2
[
1
]
=
g
(
z
2
[
1
]
)
z_2^{[1]} = \omega_2^{[1]T}x^{(i)} + b_2^{[1]}, a_2^{[1]} = g(z_2^{[1]})
z2[1]=ω2[1]Tx(i)+b2[1],a2[1]=g(z2[1])
z
3
[
1
]
=
ω
3
[
1
]
T
x
(
i
)
+
b
3
[
1
]
,
a
3
[
1
]
=
g
(
z
3
[
1
]
)
z_3^{[1]} = \omega_3^{[1]T}x^{(i)} + b_3^{[1]}, a_3^{[1]} = g(z_3^{[1]})
z3[1]=ω3[1]Tx(i)+b3[1],a3[1]=g(z3[1])
z
4
[
1
]
=
ω
4
[
1
]
T
x
(
i
)
+
b
4
[
1
]
,
a
4
[
1
]
=
g
(
z
4
[
1
]
)
z_4^{[1]} = \omega_4^{[1]T}x^{(i)} + b_4^{[1]}, a_4^{[1]} = g(z_4^{[1]})
z4[1]=ω4[1]Tx(i)+b4[1],a4[1]=g(z4[1])
整个网络的计算过程可表示为
Z
[
1
]
=
W
[
1
]
A
[
0
]
+
b
[
1
]
,
A
[
0
]
∈
(
n
0
∗
m
)
,
W
∈
(
n
1
∗
n
0
)
,
b
1
∈
(
n
1
,
1
)
Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]},A^{[0]}\in (n_0*m), W\in(n_1*n_0),b_1\in(n_1,1)
Z[1]=W[1]A[0]+b[1],A[0]∈(n0∗m),W∈(n1∗n0),b1∈(n1,1)
A
[
1
]
=
g
(
Z
[
1
]
)
A^{[1]} = g(Z^{[1]})
A[1]=g(Z[1])
Z
[
2
]
=
W
[
2
]
A
[
1
]
+
b
[
2
]
,
A
[
1
]
∈
(
n
1
∗
m
)
,
W
∈
(
n
2
∗
n
1
)
,
b
1
∈
(
n
2
,
1
)
Z^{[2]}=W^{[2]}A^{[1]} + b^{[2]},A^{[1]}\in (n_1*m), W\in(n_2*n_1),b_1\in(n_2,1)
Z[2]=W[2]A[1]+b[2],A[1]∈(n1∗m),W∈(n2∗n1),b1∈(n2,1)
A
[
2
]
=
g
(
Z
[
2
]
)
A^{[2]}=g(Z^{[2]})
A[2]=g(Z[2])
W
[
1
]
W^{[1]}
W[1] 的直观表示为
[
—
—
ω
1
[
1
]
T
—
—
—
—
ω
2
[
1
]
T
—
—
—
—
ω
3
[
1
]
T
—
—
]
\left[ \begin{matrix} —— & \omega^{[1]T}_1 & —— \\ —— & \omega^{[1]T}_2 & —— \\ —— & \omega^{[1]T}_3 & —— \end{matrix} \right]
⎣⎢⎡——————ω1[1]Tω2[1]Tω3[1]T——————⎦⎥⎤
激活函数的选择
可选函数
S
i
g
m
o
i
d
:
a
=
1
1
+
e
−
z
Sigmoid: a = \frac{1}{1+e^{-z}}
Sigmoid:a=1+e−z1
T
a
n
h
:
a
=
e
z
−
e
−
z
e
z
+
e
−
z
Tanh: a = \frac{e^{z} - e^{-z}}{e^{z}+e{-z}}
Tanh:a=ez+e−zez−e−z
R
e
L
U
:
a
=
max
(
0
,
z
)
ReLU: a=\max(0,z)
ReLU:a=max(0,z)
l
e
a
k
y
  
R
e
L
U
:
a
=
max
(
0.01
z
,
z
)
leaky\;ReLU: a=\max(0.01z, z)
leakyReLU:a=max(0.01z,z)
激活函数的选择
s i g m o i d sigmoid sigmoid 函数在二分类具有很好的表现性能;除了该场景 t a n h tanh tanh 函数几乎在其他所有场合比 s i g m o i d sigmoid sigmoid 函数有更好的表现性能; s i g m o i d sigmoid sigmoid 和 t a n h tanh tanh 通常只在输出层使用,其余层的激活函数通常选择 R e L U ReLU ReLU,因为 s i g m o i d sigmoid sigmoid 或 t a n h tanh tanh 在 z z z 较大或者较小时的梯度较小,使用梯度下降法速率变化较慢,而 R e L U ReLU ReLU 在大多数 z z z 空间内的激活函数的导数比0大很多,从而使梯度下降很快,当 z < 0 z < 0 z<0 时,尽管梯度为0,但只要隐藏单元足够多就可以保证训练的速率; l e a k y    R e L U leaky\;ReLU leakyReLU 的表现性能略优于 R e L U ReLU ReLU,但没有很广泛的应用
使用非线性激活函数
如果使用线性激活函数,多个隐藏层的激活函数经线性变换后可以变为一个式子,多个隐藏层没有意义,因此只能使用非线性激活函数
神经网络的梯度下降
最后一层激活函数为
s
i
g
m
o
i
d
sigmoid
sigmoid 函数
d
Z
[
2
]
=
A
[
2
]
−
Y
dZ^{[2]}=A^{[2]}-Y
dZ[2]=A[2]−Y
d
W
[
2
]
=
1
m
d
Z
[
2
]
A
[
1
]
T
dW^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T}
dW[2]=m1dZ[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
)
db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]},axis = 1, keepdims = True)
db[2]=m1np.sum(dZ[2],axis=1,keepdims=True)
d
Z
[
1
]
=
W
[
2
]
T
d
Z
[
2
]
∗
g
[
1
]
′
(
Z
[
1
]
)
dZ^{[1]}=W^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]})
dZ[1]=W[2]TdZ[2]∗g[1]′(Z[1])
d
W
[
1
]
=
1
m
d
Z
[
1
]
X
T
dW^{[1]}=\frac{1}{m}dZ^{[1]}X^T
dW[1]=m1dZ[1]XT
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
)
db^{[1]}=\frac{1}{m}np.sum(dZ^{[1]}, axis=1, keepdims=True)
db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)
注意
d
Z
[
1
]
dZ^{[1]}
dZ[1] 的求解是两个矩阵对应位置相乘,使用
n
p
.
s
u
m
(
)
np.sum()
np.sum() 时注意
k
e
e
p
d
i
m
s
keepdims
keepdims 保证矩阵加法不会使矩阵维度减少,避免不必要的错误
梯度下降详解
n
[
i
]
n^{[i]}
n[i] 为每一个层的节点个数
L
(
A
[
2
]
,
y
)
=
1
m
∑
i
=
1
m
J
(
A
[
2
]
,
y
)
,
L
∈
(
1
∗
1
)
\mathcal{L}(A^{[2]},y) = \frac{1}{m}\sum_{i=1}^{m}J(A^{[2]},y),\mathcal{L} \in(1*1)
L(A[2],y)=m1i=1∑mJ(A[2],y),L∈(1∗1)
J
(
A
[
2
]
,
y
)
=
−
(
y
log
A
[
2
]
+
(
1
−
y
)
log
(
1
−
A
[
2
]
)
)
,
J
∈
(
1
∗
m
)
J(A^{[2]},y)=-(y\log A^{[2]}+(1-y)\log(1-A^{[2]})), J \in (1*m)
J(A[2],y)=−(ylogA[2]+(1−y)log(1−A[2])),J∈(1∗m)
d
A
[
2
]
=
−
(
y
A
[
2
]
−
1
−
y
1
−
A
[
2
]
)
,
d
A
[
2
]
∈
(
1
∗
m
)
dA^{[2]}=-(\frac{y}{A^{[2]}}-\frac{1-y}{1-A^{[2]}}),dA^{[2]} \in (1*m)
dA[2]=−(A[2]y−1−A[2]1−y),dA[2]∈(1∗m)
d
Z
[
2
]
=
(
A
[
2
]
∗
(
1
−
A
[
2
]
)
d
A
[
2
]
=
A
[
2
]
−
Y
,
d
Z
[
2
]
∈
(
1
∗
m
)
dZ^{[2]}=(A^{[2]}*(1-A^{[2]})dA^{[2]}=A^{[2]}-Y,dZ^{[2]} \in (1*m)
dZ[2]=(A[2]∗(1−A[2])dA[2]=A[2]−Y,dZ[2]∈(1∗m)
d
W
[
2
]
=
1
m
d
Z
[
2
]
A
[
1
]
T
,
d
W
[
2
]
∈
(
1
∗
n
[
1
]
)
这
里
乘
1
m
是
因
为
通
过
m
个
样
本
的
求
和
求
得
d
W
[
2
]
dW^{[2]} = \frac{1}{m}dZ^{[2]}A^{[1]T} ,dW^{[2]} \in (1*n^{[1]})这里乘 \frac{1}{m} 是因为通过 m 个样本的求和求得dW^{[2]}
dW[2]=m1dZ[2]A[1]T,dW[2]∈(1∗n[1])这里乘m1是因为通过m个样本的求和求得dW[2]
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
b
[
2
]
∈
(
1
∗
1
)
db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]}, axis =1, keepdims=True),db^{[2]} \in (1*1)
db[2]=m1np.sum(dZ[2],axis=1,keepdims=True),db[2]∈(1∗1)
d
Z
[
1
]
=
W
[
2
]
T
d
Z
[
2
]
∗
g
[
1
]
′
(
Z
[
1
]
)
,
d
Z
[
1
]
∈
(
n
[
1
]
∗
m
)
,
根
据
维
度
对
比
,
这
两
个
矩
阵
只
能
点
乘
dZ^{[1]} = W^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]}),dZ^{[1]} \in(n^{[1]}*m),根据维度对比,这两个矩阵只能点乘
dZ[1]=W[2]TdZ[2]∗g[1]′(Z[1]),dZ[1]∈(n[1]∗m),根据维度对比,这两个矩阵只能点乘
d
W
[
1
]
=
1
m
d
Z
[
1
]
X
T
,
d
W
[
1
]
∈
(
n
[
1
]
,
n
[
0
]
dW^{[1]} = \frac{1}{m}dZ^{[1]}X^T,dW^{[1]} \in(n^{[1]},n^{[0]}
dW[1]=m1dZ[1]XT,dW[1]∈(n[1],n[0]
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
)
,
d
b
∈
(
n
[
1
]
,
1
)
db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis =1, keepdims = True),db \in(n^{[1]},1)
db[1]=m1np.sum(dZ[1],axis=1,keepdims=True),db∈(n[1],1)
对矩阵求导,最好是根据输出矩阵的维度确定矩阵转置和相乘的位置
初始化
对logistic来说,可以将
ω
\omega
ω 初始化为0;但对于浅层神经网络而言,如果将
W
W
W 初始为0,那么两个节点完全对称,节点计算一样的函数,在迭代之后的计算仍然相同;也就是说无论如何迭代计算两个节点的权重都相同。
在实际应用时用
n
p
.
r
a
n
d
o
m
.
r
a
n
d
n
(
(
)
)
∗
0.01
np.random.randn(())*0.01
np.random.randn(())∗0.01 初始化 ,选择乘0.01是为了使
W
W
W 变小,那么激活函数就不会落在函数平缓的地方,加快迭代速率。当训练浅层网络时,0.01满足要求,对于深层网络则需要选择其他的数值。