L1 深度学习概论
3 浅层神经网络
课程时长共94min40s
3.1 神经网络概览
一个两层简单的神经网络结构
- 使用W[1]表示第1层W,使用上标[1]表示第一层,且已经进行过转置
- 多次计算z和a
3.2 神经网络的表示
-
输入层 input layer
- a [ 0 ] = X a^{[0]} = X a[0]=X
- 称为第零层
-
隐藏层 hidden layer
-
隐藏层中间的值在训练集中无法得到
-
a [ 1 ] = [ a 1 [ 1 ] a 1 [ 2 ] ⋮ a 1 [ n l a y e r ] ] a^{[1]} = \begin{bmatrix} a_1^{[1]}\\ a_1^{[2]}\\ \vdots\\ a_1^{[n_{layer}]} \end{bmatrix} a[1]=⎣ ⎡a1[1]a1[2]⋮a1[nlayer]⎦ ⎤
-
-
输出层 output layer
- y ^ = a [ 2 ] \hat{y} = a^{[2]} y^=a[2]
-
约定为双层神经网络,不计算输入层
3.3 神经网络的计算
-
圆代表计算过程中的两步
- z = w T + b z=w^T+b z=wT+b
- a = σ ( z ) a=\sigma(z) a=σ(z)
-
进行多个神经元计算时候需要for循环,转化为向量形式
-
KaTeX parse error: Expected 'EOF', got '&' at position 39: …}x_1+b_1^{[1]},&̲a_1^{[1]}=\sigm…
-
转化为如下形式:
-
$$
z^{[1]}=\begin{bmatrix}
w{[1]T}_1\
w{[1]T}_2\
\vdots\
w{[1]T}_4\
\end{bmatrix}
\begin{bmatrix}
x_1\x_2\x_3
\end{bmatrix}
+
\begin{bmatrix}
b_1{[1]}\b_2{[1]}\b_3{[1]}\b_4{[1]}
\end{bmatrix}\begin{bmatrix}
z_1{[1]}\z_2{[1]}\z_3{[1]}\z_4{[1]}
\end{bmatrix}
$$ -
a [ 1 ] = [ a 1 [ 1 ] ⋮ a 4 [ 1 ] ] = σ ( z [ 1 ] ) a^{[1]} = \begin{bmatrix} a_1^{[1]}\\ \vdots\\ a_4^{[1]}\\ \end{bmatrix} = \sigma(z^{[1]}) a[1]=⎣ ⎡a1[1]⋮a4[1]⎦ ⎤=σ(z[1])
-
由此,对于单个训练样本,计算单隐藏层神经网络公式如下所示:
- 其中 x = a [ 0 ] x=a^{[0]} x=a[0]
- 其中标识了向量形状
-
3.4 多个样本的序列化
对于m个训练样本
-
非向量化:使用for循环循环单个训练样本方程
KaTeX parse error: Expected 'EOF', got '&' at position 92: …{(i)} + b^{[1]}&̲\\ a^{[1](i)}… -
向量化对于X、Z、A的表示:
W = [ w 1 [ 1 ] T w 2 [ 1 ] T ⋮ w 4 [ 1 ] T ] X = [ ⋮ ⋮ ⋮ ⋮ x ( 1 ) x ( 2 ) x ( 3 ) x ( 4 ) ⋮ ⋮ ⋮ ⋮ ] Z [ 1 ] = [ ⋮ ⋮ ⋮ ⋮ z [ 1 ] ( 1 ) z [ 1 ] ( 2 ) z [ 1 ] ( 3 ) z [ 1 ] ( 4 ) ⋮ ⋮ ⋮ ⋮ ] A [ 1 ] = [ ⋮ ⋮ ⋮ ⋮ a [ 1 ] ( 1 ) a [ 1 ] ( 2 ) a [ 1 ] ( 3 ) a [ 1 ] ( 4 ) ⋮ ⋮ ⋮ ⋮ ] W=\begin{bmatrix} w^{[1]^T}_1\\ w^{[1]^T}_2\\ \vdots\\ w^{[1]^T}_4\\ \end{bmatrix}\\ X= \begin{bmatrix} \vdots\qquad\vdots\qquad\vdots\qquad\vdots\\ x^{(1)}\quad x^{(2)}\quad x^{(3)}\quad x^{(4)}\\ \vdots\qquad\vdots\qquad\vdots\qquad\vdots\\ \end{bmatrix}\\ Z^{[1]}= \begin{bmatrix} \vdots\qquad\quad\vdots\qquad\quad\vdots\qquad\quad\vdots\\ z^{[1](1)}\quad z^{[1](2)}\quad z^{[1](3)}\quad z^{[1](4)}\\ \vdots\qquad\quad\vdots\qquad\quad\vdots\qquad\quad\vdots\\ \end{bmatrix}\\ A^{[1]}= \begin{bmatrix} \vdots\qquad\quad\vdots\qquad\quad\vdots\qquad\quad\vdots\\ a^{[1](1)}\quad a^{[1](2)}\quad a^{[1](3)}\quad a^{[1](4)}\\ \vdots\qquad\quad\vdots\qquad\quad\vdots\qquad\quad\vdots\\ \end{bmatrix} W=⎣ ⎡w1[1]Tw2[1]T⋮w4[1]T⎦ ⎤X=⎣ ⎡⋮⋮⋮⋮x(1)x(2)x(3)x(4)⋮⋮⋮⋮⎦ ⎤Z[1]=⎣ ⎡⋮⋮⋮⋮z[1](1)z[1](2)z[1](3)z[1](4)⋮⋮⋮⋮⎦ ⎤A[1]=⎣ ⎡⋮⋮⋮⋮a[1](1)a[1](2)a[1](3)a[1](4)⋮⋮⋮⋮⎦ ⎤ -
由此得到向量化的训练过程:
z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ] A [ 1 ] = σ ( Z [ 1 ] ) z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] A [ 2 ] = σ ( Z [ 2 ] ) z^{[1]}=W^{[1]}A^{[0]}+b^{[1]}\\ A^{[1]}=\sigma(Z^{[1]})\\ z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}\\ A^{[2]}=\sigma(Z^{[2]}) z[1]=W[1]A[0]+b[1]A[1]=σ(Z[1])z[2]=W[2]A[1]+b[2]A[2]=σ(Z[2])
其中 A [ 0 ] A^{[0]} A[0]即为 X X X
3.5 向量化实现的解释
下面图片不同颜色表示不同的输入样本数据及其计算数据
3.6 激活函数
选择隐藏层单元的激活函数
-
sigmoid函数
a = σ ( z ) = 1 1 + e − z a=\sigma(z)=\frac{1}{1+e^{-z}} a=σ(z)=1+e−z1除了二元分类输出层激活函数,其他时候避免使用,tanh函数在任何情况基本都会好于σ函数
-
g函数
-
不同隐藏层可能不同,因此可以使用 a [ 1 ] = g [ 1 ] ( z [ 1 ] ) a^{[1]}=g^{[1]}(z^{[1]}) a[1]=g[1](z[1])表示第一层的激活函数
-
tanh函数
a = t a n h ( z ) = e z − e − z e z + e − z a = tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} a=tanh(z)=ez+e−zez−e−z
图像如下所示: -
ReLU函数,修正线性单元,激活函数默认常规选择
a = m a x ( 0 , z ) a = max(0, z) a=max(0,z)
图像如下所示: -
带泄露的ReLU Leaky ReLU
a = m a x ( 0.01 z , z ) a = max(0.01z, z) a=max(0.01z,z)
-
-
二元分类,使用σ函数作为输出层激活函数,其他单元使用ReLU
3.7 为什么需要非线性激活函数
线性激活函数(恒等激活函数)导致输出
y
^
\hat{y}
y^是输入特征
x
x
x的线性组合,如下例子所示:
若激活函数
a
[
1
]
=
z
[
1
]
,
a
[
2
]
=
z
[
2
]
,
则
a
[
1
]
=
z
[
1
]
=
W
[
1
]
x
+
b
[
1
]
a
[
2
]
=
z
[
2
]
=
W
[
2
]
a
[
1
]
+
b
[
2
]
a
[
2
]
=
W
[
2
]
(
W
[
1
]
x
+
b
[
1
]
)
+
b
[
2
]
=
W
′
x
+
b
′
若激活函数a^{[1]}=z^{[1]},a^{[2]}=z^{[2]},则\\ a^{[1]}=z^{[1]}=W^{[1]}x+b^{[1]}\\ a^{[2]}=z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}\\ a^{[2]}=W^{[2]}(W^{[1]}x+b^{[1]})+b^{[2]}=W'x+b'
若激活函数a[1]=z[1],a[2]=z[2],则a[1]=z[1]=W[1]x+b[1]a[2]=z[2]=W[2]a[1]+b[2]a[2]=W[2](W[1]x+b[1])+b[2]=W′x+b′
3.8 激活函数的导数
sigmoid函数
-
g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
-
g ′ ( z ) = d d z g ( z ) = 1 1 + e − z ( 1 − 1 1 + e − z ) = g ( z ) ( 1 − g ( z ) ) = a ( 1 − a ) g'(z)=\frac{d}{dz}g(z)=\frac{1}{1+e^{-z}}(1-\frac{1}{1+e^{-z}})=g(z)(1-g(z))=a(1-a) g′(z)=dzdg(z)=1+e−z1(1−1+e−z1)=g(z)(1−g(z))=a(1−a)
- 计算出a,则能得到a导数
tanh函数
- g ( z ) = t a n h ( z ) = e z − e − z e z + e − z g(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} g(z)=tanh(z)=ez+e−zez−e−z
- g ′ ( z ) = d d z g ( z ) = 1 − ( t a n h ( z ) ) 2 g'(z)=\frac{d}{dz}g(z)=1-(tanh(z))^2 g′(z)=dzdg(z)=1−(tanh(z))2
ReLU函数
- g ( z ) = m a x ( 0 , z ) g(z)=max(0,z) g(z)=max(0,z)
-
g
′
(
z
)
=
{
0
z
<
0
1
z
>
0
u
n
d
e
f
i
n
e
d
z
=
0
g'(z)=\left\{\begin{matrix}0&z<0\\1&z>0\\undefined&z=0\end{matrix}\right.
g′(z)=⎩
⎨
⎧01undefinedz<0z>0z=0
- 实际使用中,z=0常设置导数为1或0,对算法没有影响
泄露的ReLU函数
- g ( z ) = m a x ( 0.01 z , z ) g(z)=max(0.01z,z) g(z)=max(0.01z,z)
-
g
′
(
z
)
=
{
0.01
z
<
0
1
z
>
0
u
n
d
e
f
i
n
e
d
z
=
0
g'(z)=\left\{\begin{matrix}0.01&z<0\\1&z>0\\undefined&z=0\end{matrix}\right.
g′(z)=⎩
⎨
⎧0.011undefinedz<0z>0z=0
- 实际使用中,z=0常设置导数为1或0.01,对算法没有影响
3.9 神经网络的梯度下降法
各个参数设置
- 参数: 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 [ 0 ] = 3 , n [ 1 ] = 4 , n [ 2 ] = 1 n^{[0]}=3,n^{[1]}=4,n^{[2]}=1 n[0]=3,n[1]=4,n[2]=1
- 成本函数: J ( w [ 1 ] , b [ 1 ] , w [ 2 ] , b [ 2 ] ) = 1 m ∑ i = 1 m L ( y ^ , y ) J(w^{[1]},b^{[1]},w^{[2]},b^{[2]})=\frac{1}{m}\sum_{i=1}^mL(\hat{y},y) J(w[1],b[1],w[2],b[2])=m1∑i=1mL(y^,y)
- 梯度下降法,重复如下步骤:
- graph predict y ^ ( i ) , i = 1 … m \hat{y}^{(i)},i=1\dots m y^(i),i=1…m
- d w [ 1 ] = d J d w [ 2 ] , d b [ 1 ] = d J d b [ 1 ] , … dw^{[1]}=\frac{dJ}{dw^{[2]}},db^{[1]}=\frac{dJ}{db^{[1]}},\dots dw[1]=dw[2]dJ,db[1]=db[1]dJ,…
- w [ 1 ] : = w [ 1 ] − α d w [ 1 ] w^{[1]}:=w^{[1]}-\alpha dw^{[1]} w[1]:=w[1]−αdw[1]
- b [ 1 ] : = b [ 1 ] − α d b [ 1 ] b^{[1]}:=b^{[1]}-\alpha db^{[1]} b[1]:=b[1]−αdb[1]
- ⋮ \vdots ⋮
对于计算梯度
-
正向传播
- KaTeX parse error: Expected 'EOF', got '&' at position 12: Z^{[1]}=&̲W^{[1]}X + b^{[…
-
反向传播
- KaTeX parse error: Expected 'EOF', got '&' at position 6: Y=&̲\begin{bmatrix}…
课件笔记如下所示
3.10 理解反向传播
主要使用链式法则求导
下图展示了一个双层神经网络,对于样本集大小m=1的正向传播过程:
对于反向传播算法,计算:
-
d a [ 2 ] , d z [ 2 ] , d w [ 2 ] , d b [ 2 ] da^{[2]},dz^{[2]},dw^{[2]}, db^{[2]} da[2],dz[2],dw[2],db[2]
-
d a [ 1 ] , d z [ 1 ] , d w [ 1 ] , d b [ 1 ] da^{[1]},dz^{[1]},dw^{[1]},db^{[1]} da[1],dz[1],dw[1],db[1]
-
按照如下顺序计算,得到反向传播第一层的梯度
L ( a [ 2 ] , y ) = − ( y l o g a [ 2 ] + ( 1 − y ) l o g ( 1 − a [ 2 ] ) ) d a [ 2 ] = d d a [ 2 ] L ( a [ 2 ] , y ) = y − a [ 2 ] a [ 2 ] ( a [ 2 ] − 1 ) d z [ 2 ] = d d a [ 2 ] L ( a [ 2 ] , y ) d a [ 2 ] d z [ 2 ] = y − a [ 2 ] a [ 2 ] ( a [ 2 ] − 1 ) ⋅ a [ 2 ] ( 1 − a [ 2 ] ) = a [ 2 ] − y d W [ 2 ] = d z [ 2 ] ⋅ d z [ 2 ] d W [ 2 ] = d z [ 2 ] a [ 1 ] T d b [ 2 ] = d z [ 2 ] L(a^{[2]},y)=-(yloga^{[2]}+(1-y)log(1-a^{[2]}))\\ da^{[2]}=\frac{d}{da^{[2]}}L(a^{[2]},y)=\frac{y-a^{[2]}}{a^{[2]}(a^{[2]}-1)}\\ dz^{[2]}=\frac{d}{da^{[2]}}L(a^{[2]},y)\frac{da^{[2]}}{dz^{[2]}}=\frac{y-a^{[2]}}{a^{[2]}(a^{[2]}-1)}\cdot a^{[2]}(1-a^{[2]})=a^{[2]}-y\\ dW^{[2]}=dz^{[2]}\cdot \frac{dz^{[2]}}{dW^{[2]}}=dz^{[2]}a^{[1]^T}\\ db^{[2]}=dz^{[2]} L(a[2],y)=−(yloga[2]+(1−y)log(1−a[2]))da[2]=da[2]dL(a[2],y)=a[2](a[2]−1)y−a[2]dz[2]=da[2]dL(a[2],y)dz[2]da[2]=a[2](a[2]−1)y−a[2]⋅a[2](1−a[2])=a[2]−ydW[2]=dz[2]⋅dW[2]dz[2]=dz[2]a[1]Tdb[2]=dz[2]
-
同理得到反向传播第二层梯度
d z [ 1 ] = W [ 2 ] T d z [ 2 ] ∗ g [ 1 ] ′ ( z [ 1 ] ) d W [ 1 ] = d z [ 1 ] x T d b [ 1 ] = d z [ 1 ] dz^{[1]}=W^{[2]^T}dz^{[2]}*g^{[1]'}(z^{[1]})\\ dW^{[1]}=dz^{[1]}x^T\\ db^{[1]}=dz^{[1]} dz[1]=W[2]Tdz[2]∗g[1]′(z[1])dW[1]=dz[1]xTdb[1]=dz[1] -
小知识:对于矩阵求导,有如下求导公式:
∂ A x ∂ x = A T ∂ A x ∂ x T = A ∂ x T A ∂ x = A ∂ x T A x ∂ x T = ( A + A T ) x \frac{\partial Ax}{\partial x}=A^T\\ \frac{\partial Ax}{\partial x^T}=A\\ \frac{\partial x^TA}{\partial x}=A\\ \frac{\partial x^TAx}{\partial x^T}=(A+A^T)x\\ ∂x∂Ax=AT∂xT∂Ax=A∂x∂xTA=A∂xT∂xTAx=(A+AT)x -
因此对于m=1,得到如下反向传播公式
d z [ 2 ] = a [ 2 ] − y d W [ 2 ] = d z [ 2 ] a [ 1 ] T d b [ 2 ] = d z [ 2 ] d z [ 1 ] = W [ 2 ] T d z [ 2 ] ∗ g [ 1 ] ′ ( z [ 1 ] ) d W [ 1 ] = d z [ 1 ] x T d b [ 1 ] = d z [ 1 ] dz^{[2]}=a^{[2]}-y\\ dW^{[2]}=dz^{[2]}a^{[1]^T}\\ db^{[2]}=dz^{[2]} dz^{[1]}=W^{[2]^T}dz^{[2]}*g^{[1]'}(z^{[1]})\\ dW^{[1]}=dz^{[1]}x^T\\ db^{[1]}=dz^{[1]} dz[2]=a[2]−ydW[2]=dz[2]a[1]Tdb[2]=dz[2]dz[1]=W[2]Tdz[2]∗g[1]′(z[1])dW[1]=dz[1]xTdb[1]=dz[1] -
同理,对于m个样本的输入,得到如下反向传播向量化公式
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 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 ) dZ^{[2]}=A^{[2]}-Y\\ dW^{[2]}=\frac1m dZ^{[2]}A^{[1]^T}\\ db^{[2]}=\frac1m np.sum(dZ^{[2]},axis=1,keepdims=True)\\\\ dZ^{[1]}=W^{[2]^T}dZ^{[2]}*g^{[1]'}(Z^{[1]})\\ dW^{[1]}=\frac1m dZ^{[1]}X^T\\ db^{[1]}=\frac1m np.sum(dZ^{[1]},axis=1,keepdims=True) 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]XTdb[1]=m1np.sum(dZ[1],axis=1,keepdims=True)
3.11 随机初始化
对于logistic回归,可以将权重初始化为0
对于神经网络,权重初始化为0使得梯度下降法无效化
考虑下面的例子:
-
- n[0]=2
- n[1]=1,有两个隐藏单元
- 若初始化
w
[
1
]
=
[
0
0
0
0
]
w^{[1]} = \begin{bmatrix}0\ 0\\0\ 0\end{bmatrix}
w[1]=[0 00 0]
- 对于任意输入样本,两个隐藏单元在做同样的计算,导致 a 1 [ 1 ] = a 2 [ 1 ] a^{[1]}_1=a^{[1]}_2 a1[1]=a2[1], d z 1 [ 1 ] = d z 2 [ 1 ] dz^{[1]}_1=dz^{[1]}_2 dz1[1]=dz2[1],称之为完全对称
- 多次迭代之后仍然是对称的
- 对于多个输入特征情况,同样的,隐藏层单元具有对称性
随机初始化参数
-
w
[
1
]
=
n
p
.
r
a
n
d
o
m
.
r
a
n
d
n
(
2
,
2
)
∗
0.01
w^{[1]}=np.random.randn(2,2)*0.01
w[1]=np.random.randn(2,2)∗0.01
- 生成随机高斯分布
- 权重矩阵初始化为较小数,因为对于sigmoid或tanh激活函数,数值过大或过小,函数斜率较小,梯度下降较慢,学习较慢
- 训练较深网络时候,参数设置为其他较小数字而非0.01
- b可以初始化为0