【深度学习-吴恩达】L2-3 超参数调试
L2 改善深层神经网络
3 超参数调试
课程时长104min33s
3.1 调试过程
-
需要调整的超参数较多
- α,β,β1,β2,ξ,#layers,#hidden units,mini_batch size,learning rate declay\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]
μ=1m∑iz(i)σ2=1m∑i(z(i)−μ)znorm(i)=z(i)−μσ2+ξz~(i)=γznorm(i)+βif γ=σ2+ξ,β=μ thenz~(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]…
-
Parameters: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:
- compute forward pop on 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)
- use back pop to compute dw[l],db[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]
- 更新参数
- compute forward pop on 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标准化公式:
μ=1m∑iz(i)σ2=1m∑i(z(i)−μ)znorm(i)=z(i)−μσ2+ξz~(i)=γznorm(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]=ez[L]∑i=1Cti,ai[L]=ti∑i=1Cti 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]=[52−13]t=[e5e2e−1e3]a[L]=g[L](z[L])=[0.8430.0430.0020.114]hard_max=[1000]
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=[0100]a[L]=y^=[0.30.20.10.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=14yjlog y^j l(\hat y,y)=-\sum_{j=1}^4 y_jlog\ \hat y_j l(y^,y)=−j=1∑4yjlog y^j -
也就为−y2log y^2=−log y^2-y_2log\ \hat y_2=-log\ \hat y_2−y2log y^2=−log y^2
- 若要损失减小,也就是使得y2增大
-
对于多个训练样本
J(w[1],b[1],… )=1m∑i=1ml(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的梯度下降法
- 反向传播公式
dz[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是一个之后会赋值的变量,方便把数据加入到损失方程中
更多推荐



所有评论(0)