L2 改善深层神经网络
3 超参数调试
课程时长104min33s
3.1 调试过程
-
需要调整的超参数较多
- α , β , β 1 , β 2 , ξ , # l a y e r s , # h i d d e n u n i t s , m i n i _ b a t c h s i z e , l e a r n i n g r a t e d e c l a y \alpha,\beta,\beta_1,\beta_2,\xi,\#layers,\#hidden\ units,mini\_batch\ size,learning\ rate\ declay α,β,β1,β2,ξ,#layers,#hidden units,mini_batch size,learning rate declay
- α:最重要的参数
- β、#hidden units、mini-batch size:次重要参数
- #layers、learning rate declay:次次重要参数
- β1,β2, ξ \xi ξ:不重要参数
-
不要使用网格选择参数,而是随机选取
-
粗略搜索后,进行更小区域的选择
3.2 为超参数选择合适的范围
均匀随机取值
-
n[l]=50,…,100
-
#layers L=2,3,4
非均匀随机取直
- α:0.0001,…,1
- 使用非线性轴
- 使用指数函数
- β:0.9,…,0.999
- 使用1-β后使用指数函数
3.3 超参数训练的实践:Pandas VS Caviar
不同领域超参数可能可以通用
- 自然语言处理、计算机视觉、语音、广告、逻辑
超参数需要随着时间、数据变化进行调整
模型训练方法
-
训练一个模型调整参数
- Panda方式
- 计算资源较少
-
同时训练多个模型,设定不同参数
- 鱼子酱方式
- 计算资源较多
3.4 正则化网络的激活函数
batch normalization batch标准化
对于一个隐藏层,归一化a值
对于某层的隐藏值 z[l][1], z[l][2],…, z[l][m]
μ
=
1
m
∑
i
z
(
i
)
σ
2
=
1
m
∑
i
(
z
(
i
)
−
μ
)
z
n
o
r
m
(
i
)
=
z
(
i
)
−
μ
σ
2
+
ξ
z
~
(
i
)
=
γ
z
n
o
r
m
(
i
)
+
β
i
f
γ
=
σ
2
+
ξ
,
β
=
μ
t
h
e
n
z
~
(
i
)
=
z
(
i
)
\mu = \frac 1m\sum_iz^{(i)}\\ \sigma^2=\frac 1m\sum_i(z^{(i)}-\mu)\\ z^{(i)}_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\xi}}\\ \tilde z^{(i)}=\gamma z^{(i)}_{norm}+\beta\\ if\ \gamma=\sqrt{\sigma^2+\xi},\beta=\mu\ then\\ \tilde z^{(i)}= z^{(i)}
μ=m1i∑z(i)σ2=m1i∑(z(i)−μ)znorm(i)=σ2+ξz(i)−μz~(i)=γznorm(i)+βif γ=σ2+ξ,β=μ thenz~(i)=z(i)
- 保证隐藏的单元进行均值和方差标准化
- 使用γ和β可以控制均值和方差
3.5 将Batch Norm拟合进神经网络
Batch归一化发生在计算z和a之间
-
x → w [ 1 ] , b [ 1 ] z [ 1 ] → β [ 1 ] , γ [ 1 ] z ~ ( 1 ) → a [ 1 ] = g [ 1 ] ( z ~ ( 1 ) ) → w [ 2 ] , b [ 2 ] z [ 2 ] … x \xrightarrow{w^{[1]},b^{[1]}}z^{[1]} \xrightarrow{\beta^{[1]},\gamma^{[1]}}\tilde z^{(1)}\rightarrow a^{[1]}=g^{[1]}(\tilde z^{(1)}) \xrightarrow{w^{[2]},b^{[2]}}z^{[2]} \dots xw[1],b[1]z[1]β[1],γ[1]z~(1)→a[1]=g[1](z~(1))w[2],b[2]z[2]…
-
P a r a m e t e r s : w [ 1 ] , b [ 1 ] , β [ 1 ] , γ [ 1 ] , w [ 2 ] , b [ 2 ] , β [ 2 ] , γ [ 2 ] … β [ l ] = β [ l ] − α d β [ l ] Parameters:w^{[1]},b^{[1]},\beta^{[1]},\gamma^{[1]},w^{[2]},b^{[2]},\beta^{[2]},\gamma^{[2]}\dots\\ \beta^{[l]}=\beta^{[l]}-\alpha d\beta^{[l]} Parameters:w[1],b[1],β[1],γ[1],w[2],b[2],β[2],γ[2]…β[l]=β[l]−αdβ[l]
和Mini-batch一起应用
-
X { 1 } → w [ 1 ] , b [ 1 ] z [ 1 ] → β [ 1 ] , γ [ 1 ] z ~ ( 1 ) → a [ 1 ] = g [ 1 ] ( z ~ ( 1 ) ) → w [ 2 ] , b [ 2 ] z [ 2 ] … X { 2 } → w [ 1 ] , b [ 1 ] z [ 1 ] … ⋮ X^{\{1\}} \xrightarrow{w^{[1]},b^{[1]}}z^{[1]} \xrightarrow{\beta^{[1]},\gamma^{[1]}}\tilde z^{(1)}\rightarrow a^{[1]}=g^{[1]}(\tilde z^{(1)}) \xrightarrow{w^{[2]},b^{[2]}}z^{[2]} \dots\\ X^{\{2\}} \xrightarrow{w^{[1]},b^{[1]}}z^{[1]} \dots\\ \vdots X{1}w[1],b[1]z[1]β[1],γ[1]z~(1)→a[1]=g[1](z~(1))w[2],b[2]z[2]…X{2}w[1],b[1]z[1]…⋮
-
使用batch norm时候,由于β[l]可以控制平均值的偏差,因此偏移值b[l]实际不起作用
-
实现过程
-
for t = 1 to mini-batch num:
-
c
o
m
p
u
t
e
f
o
r
w
a
r
d
p
o
p
o
n
X
{
t
}
compute\ forward\ pop\ on\ X^{\{t\}}
compute forward pop on X{t}
- 在每层隐藏层中,使用batch norm,将 z [ l ] z^{[l]} z[l]替换为 z ~ ( l ) \tilde z^{(l)} z~(l)
- u s e b a c k p o p t o c o m p u t e d w [ l ] , d b [ l ] , d β [ l ] , d γ [ l ] use\ back\ pop\ to\ compute\ dw^{[l]},db^{[l]},d\beta^{[l]},d\gamma^{[l]} use back pop to compute dw[l],db[l],dβ[l],dγ[l]
- 更新参数
-
c
o
m
p
u
t
e
f
o
r
w
a
r
d
p
o
p
o
n
X
{
t
}
compute\ forward\ pop\ on\ X^{\{t\}}
compute forward pop on X{t}
同样可以使用momentum、Adam、RMSprop
3.6 Batch Norm的解释
Batch标准化的作用
- 加速训练
- 类似将数据集从1-1000处理到0-1范围
- 使得权重相比网络网络更滞后或者更深层
- covariate shift
- 减少隐藏值分布变化的数量,使得每层输入更加稳定
- 一定的正则化作用
- 向隐藏单元添加了噪音
batch归一化一次智能处理一个mini-batch数据
3.7 测试时的Batch Norm
batch标准化公式:
μ
=
1
m
∑
i
z
(
i
)
σ
2
=
1
m
∑
i
(
z
(
i
)
−
μ
)
z
n
o
r
m
(
i
)
=
z
(
i
)
−
μ
σ
2
+
ξ
z
~
(
i
)
=
γ
z
n
o
r
m
(
i
)
+
β
\mu = \frac 1m\sum_iz^{(i)}\\ \sigma^2=\frac 1m\sum_i(z^{(i)}-\mu)\\ z^{(i)}_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\xi}}\\ \tilde z^{(i)}=\gamma z^{(i)}_{norm}+\beta\\
μ=m1i∑z(i)σ2=m1i∑(z(i)−μ)znorm(i)=σ2+ξz(i)−μz~(i)=γznorm(i)+β
- 对μ和σ2使用指数加权平均进行计算
3.8 Softmax回归
多分类而非单分类
- C:分类的类别数目
- n[L]=C,输出层单元数目为C,每个输出代表概率
Softmax层使用不同的激活函数
-
Z [ L ] = W [ L ] a [ L − 1 ] + b [ L ] Z^{[L]}=W^{[L]}a^{[L-1]}+b^{[L]} Z[L]=W[L]a[L−1]+b[L]
-
激活函数
- t = e ( z [ L ] ) a [ L ] = e z [ L ] ∑ i = 1 C t i , a i [ L ] = t i ∑ i = 1 C t i t = e^{(z^{[L]})}\\ a^{[L]}=\frac{e^{z^{[L]}}}{\sum_{i=1}^{C}t_i},a_i^{[L]}=\frac{t_i}{\sum_{i=1}^{C}t_i} t=e(z[L])a[L]=∑i=1Ctiez[L],ai[L]=∑i=1Ctiti
-
输出归一化,输出一个向量
3.9 训练一个Softmax分类器
Softmax <=> Hard max:只在最大值设为1
z
[
L
]
=
[
5
2
−
1
3
]
t
=
[
e
5
e
2
e
−
1
e
3
]
a
[
L
]
=
g
[
L
]
(
z
[
L
]
)
=
[
0.843
0.043
0.002
0.114
]
h
a
r
d
_
m
a
x
=
[
1
0
0
0
]
z^{[L]}=\left[\begin{matrix}5\\2\\-1\\3\\ \end{matrix}\right]\qquad t = \left[\begin{matrix}e^5\\e^2\\e^{-1}\\e^3 \end{matrix}\right] \qquad \\ a^{[L]}=g^{[L]}(z^{[L]}) = \left[\begin{matrix}0.843\\0.043\\0.002\\0.114\\ \end{matrix}\right]\\ hard\_max=\left[\begin{matrix}1\\0\\0\\0\\ \end{matrix}\right]
z[L]=⎣
⎡52−13⎦
⎤t=⎣
⎡e5e2e−1e3⎦
⎤a[L]=g[L](z[L])=⎣
⎡0.8430.0430.0020.114⎦
⎤hard_max=⎣
⎡1000⎦
⎤
- C=2,则退化成logistic回归
损失函数对于单个训练样本
-
若
y = [ 0 1 0 0 ] a [ L ] = y ^ = [ 0.3 0.2 0.1 0.4 ] y=\left[\begin{matrix}0\\1\\0\\0\\ \end{matrix}\right]\qquad \\ a^{[L]}= \hat y=\left[\begin{matrix}0.3\\0.2\\0.1\\0.4\\ \end{matrix}\right]\\ y=⎣ ⎡0100⎦ ⎤a[L]=y^=⎣ ⎡0.30.20.10.4⎦ ⎤ -
则损失函数
l ( y ^ , y ) = − ∑ j = 1 4 y j l o g y ^ j l(\hat y,y)=-\sum_{j=1}^4 y_jlog\ \hat y_j l(y^,y)=−j=1∑4yjlog y^j -
也就为 − y 2 l o g y ^ 2 = − l o g y ^ 2 -y_2log\ \hat y_2=-log\ \hat y_2 −y2log y^2=−log y^2
- 若要损失减小,也就是使得y2增大
-
对于多个训练样本
J ( w [ 1 ] , b [ 1 ] , … ) = 1 m ∑ i = 1 m l ( y ^ ( i ) , y ( i ) ) J(w^{[1]},b^{[1]},\dots)=\frac 1m\sum_{i=1}^ml(\hat y^{(i)},y^{(i)}) J(w[1],b[1],…)=m1i=1∑ml(y^(i),y(i))- 使用梯度下降法
Y = [ y ( 1 ) , y ( 2 ) , … , y ( m ) ] = [ 0 1 0 … 1 0 0 … 0 0 1 … 0 0 0 … ] , Y : ( 4 , m ) Y ^ = [ y ^ ( 1 ) , y ^ ( 2 ) , … , y ^ ( m ) ] = [ 0.3 … 0.2 … 0.1 … 0.4 … ] , Y ^ : ( 4 , m ) Y =[y^{(1)}, y^{(2)},\dots,y^{(m)}] = \left[\begin{matrix}0\ 1\ 0\ \dots\\1\ 0\ 0\ \dots\\0\ 0\ 1\ \dots\\0\ 0\ 0\ \dots\\ \end{matrix}\right],Y:(4,m)\\ \hat Y=[\hat y^{(1)}, \hat y^{(2)},\dots,\hat y^{(m)}] = \left[\begin{matrix}0.3\dots\\0.2\dots\\0.1\dots\\0.4\ \dots\\ \end{matrix}\right],\hat Y:(4,m) Y=[y(1),y(2),…,y(m)]=⎣ ⎡0 1 0 …1 0 0 …0 0 1 …0 0 0 …⎦ ⎤,Y:(4,m)Y^=[y^(1),y^(2),…,y^(m)]=⎣ ⎡0.3…0.2…0.1…0.4 …⎦ ⎤,Y^:(4,m)
- 使用梯度下降法
使用Softmax的梯度下降法
- 反向传播公式
d z [ L ] = ∂ J ∂ z [ L ] = y ^ − y dz^{[L]} = \frac{\partial J}{\partial z^{[L]}}=\hat y-y dz[L]=∂z[L]∂J=y^−y
使用深度学习框架,能够自动实现反向传播
3.10 深度学习框架
深度学习框架
- Caffe/Caffe2
- CNTK
- DL4J
- Keras
- Lasagne
- mxnet
- PaddlePaddle
- TensorFlow
- Theano
- Torch
选择框架的标准
- 易于编程,使用人数较多
- 运算速度较快
- 框架是否开源
3.11 TensorFlow
-
使用tf.Variable定义参数
import numpy as np import tensorflow as tf # w是想要优化的参数,cost是损失函数 # cost也可以写作: # cost = w**2 - 10*w + 25 w = tf.Variable(0, dtype=tf.float32) cost = tf.add(tf.add(w**2, tf.multiply(-10, w)), 25) train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) init = tf.global_variables_initializer() session = tf.Session() session.run(init) for i in range(1000): session.run(train) print(session.run(w))
-
如何把数据集加入训练中
import numpy as np import tensorflow as tf # w是想要优化的参数,cost是损失函数 coefficients = np.array([[1.],[-10.],[25.]]) w = tf.Variable(0, dtype=tf.float32) x = tf.placeholder(tf.float32, [3,1]) cost = x[0][0]*w**2 + x[1][0]*w + x[2][0] train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) init = tf.global_variables_initializer() session = tf.Session() session.run(init) for i in range(1000): session.run(train, feed_dict={x:coefficients}) print(session.run(w))
- tf.placeholder是一个之后会赋值的变量,方便把数据加入到损失方程中