吴恩达.深度学习系列-C2神经网络进阶-W3超参数调优、批量归一与程序框架

11 篇文章 0 订阅
9 篇文章 0 订阅

单词

单词解释
covariate shift协变量变换
covariaten.协变量

学习目标

了解系统性进行超参数调优的技巧。

1. 超参数调优Hyperparameter tuning

超参数符号作用(☆越多越重要)
α学习率☆☆☆
β动量梯度下降法,参数☆☆
hidden units隐藏单元数☆☆
Mini-batch sizeMini-batch大小☆☆
L网络层数☆
learning rate decay学习衰减率☆
β1,β2,ϵ β 1 , β 2 , ϵ Adam梯度下降法,参数

以上是经验,并非一成不变。

1.1.调优过程Tuning process

Try random values:Don‘t use a grid.
即不要列出所有超参数可能性,然后一个个尝试。
如:在超参数1=a的情况下,超参数2分别取值a1,a2,….,a10;超参数1=b的情况下,超参数2分别取值b1,b2,….,b10。这样一种对全部情况枚举并逐一尝试。(这适用于参数量较少的情形)
因为神经网络的超参数太多,你没有办法去穷尽所有参数并逐一尝试。可以想象当上面例子中超参数增加一个,要尝试的参数量就会指数级增长。
神经网络推荐在超参数网格中进行随机取样测试。原因:你很难事先知道在你问题中,哪个超参数是最重要的。
区域定位抽样方案。如果你发现超参数在某个范围内表现不错,应该在这个范围周围划定出一个区域,然后进行密度更高的抽样,并测试。

1.2.在合适的尺度上选择超参数Using an appropriate scale to pick hyperparameters

α学习率适合的参数搜索范围,0.0001–0.001,0.001–0.01,0.01–0.1,0.1–1
这样的四个对数区间。而不是从0.0001到1的4个等分区间(0.0001–0.25,0.25–0.5,0.5–0.75,0.75–1).假设第一步测试12次,在这4个区间分别随机搜索3次。发现哪个区间效果最好,再继续细分这个区间并增加测试密度。
a=log0.000110,b=log0.00110=>[a,b]=[4,3] a = l o g 10 0.0001 , b = l o g 10 0.001 => [ a , b ] = [ − 4 , − 3 ]

r=-4*np.random.rand()
α=np.pow(10,r)

β是动量(momentum)法的参数,参数搜索范围是:0.9,…….,0.999
β=0.9相当于前10项均值,β=0.999相当于前1000项均值。
我们可以从(1-β)的取值入手,对应(1-β)的范围是0.1~0.001。这样与之前提到的学习率对数取值区间相似。
r[3,1],(1β)=10r,β=110r r ∈ [ − 3 , − 1 ] , ( 1 − β ) = 10 r , β = 1 − 10 r
并让我们在搜索 0.9–0.99,0.99–0.999这两个区间时,分配了相同的随机抽样。
有一种解释:β=0.900改变为β=0.905,对结果几乎没有什么影响。但如果β=0.9990改变为β=0.9995,对结果却有很大影响。

1.3.超参数调优的一些建议(Hyperparameters tuning in practice:Pandas vs. Caviar)

建议至少每隔几个月重新检测或重新评估一次超参数。
只能运行一个模型:在线观看模型训练的cost曲线,耐心的微调学习率。(类似pandas,一次只有一个孩子)
能并行运行多个模型:在一个Cost坐标系上对比不同参数取值之间的差异。(类似Caviar,一次能有很多孩子)

2.批量归一化Batch Normalization

由Sergey Ioffe 和 Christian Szegedy提出。可以让超参搜索变得很简单,让神经网络变得更加具有鲁棒性,可以让神经网络对于超参数的选择上不再那么敏感,而且可以让你更容易地训练非常深的网络。

2.1.Normalizing activation in a network

在任何一个隐藏层,对 Zl Z l 进行归一化,(比归一化 al a l 更普遍,这就是batch norm 简单的解释。

Z(i)BatchNormβ,γZ~(i) Z ( i ) → B a t c h N o r m β , γ Z ~ ( i )

Batch Norm的实现,均值为0,方差为1:
Given some intermediate values, In your neural net z(1),...,z(m) z ( 1 ) , . . . , z ( m ) (省略了l层的标识){
μ=1mmi=0Z(i) μ = 1 m ∑ i = 0 m Z ( i )
σ2=1mmi=0(Z(i)μ)2 σ 2 = 1 m ∑ i = 0 m ( Z ( i ) − μ ) 2
Z(i)norm=Z(i)μσ2+ϵ Z n o r m ( i ) = Z ( i ) − μ σ 2 + ϵ #ϵ设为很小常数,是为了防止分母为0
Z~(i)=γZ(i)norm+β Z ~ ( i ) = γ ⋅ Z n o r m ( i ) + β
}

γ,β的值是 Z~(i) Z ~ ( i ) 分布的均值与方差。可以从你的模型中学习,像更新神经网络的权重一样更新他们。【疑问:如何学习的?咋没说】
如果假设 γ=σ2+ϵ,β=μ γ = σ 2 + ϵ , β = μ ,那么就是均值为0,方差为1的分布。等同于 Z(i)norm=Z(i)μσ2+ϵ Z n o r m ( i ) = Z ( i ) − μ σ 2 + ϵ 。可以通过选择不同的γ,β的值让隐藏单元呈现不同区间的分布。

注意:隐藏层归一化后不一定必须是均值为0方差为1的正态分布。选择分布的区间,与激活函数的类型有关。因为不同激活函数的“高效区间”不一样,所以可以对应选择不同的分布区间。

2.2.Fitting Batch Norm into a neural network

如下图这样一个3×2×2×1的网络。每个神经元在做两件事,第一个是得出本神经元的z,再激活得出本神经元的a。加入Batch Normalization(简称:Batch Norm或BN)后整个计算过程如下
这里写图片描述

XW[1],b[1]Z[1]BatchNormβ[1],γ[1]Z~(1)a[1]=g[1](Z~(1))W[2],b[2]Z[2]BatchNormβ[2],γ[2]Z~(2)a[2]=g[2](Z~(2)) X → W [ 1 ] , b [ 1 ] Z [ 1 ] → B a t c h N o r m β [ 1 ] , γ [ 1 ] Z ~ ( 1 ) → a [ 1 ] = g [ 1 ] ( Z ~ ( 1 ) ) → W [ 2 ] , b [ 2 ] Z [ 2 ] → B a t c h N o r m β [ 2 ] , γ [ 2 ] Z ~ ( 2 ) → a [ 2 ] = g [ 2 ] ( Z ~ ( 2 ) )

这样在这个网络中,除了原本神经网络的参数 W[1],b[1],W[2],b[2] W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] ,还新增了一组参数 β[1],γ[1],β[2],γ[2] β [ 1 ] , γ [ 1 ] , β [ 2 ] , γ [ 2 ] 新增的参数一样能用反向传播与梯度下降法进行学习。 β[l]=β[l]αdβ[l],γ[l]=γ[l]αdγ[l] β [ l ] = β [ l ] − α ⋅ d β [ l ] , γ [ l ] = γ [ l ] − α ⋅ d γ [ l ]
吴大师曰,说了这么多,你其实不用自己去实现这些细节。
使用Tensorflow的程序框架,tf.nn.batch_normaliaziton函数就好。

由于每一个隐藏层的Z会被归一到均值为0的分布,同时 Z~(i)=γZ(i)norm+β Z ~ ( i ) = γ ⋅ Z n o r m ( i ) + β ,所以原本参数里 W[l]b[l] W [ l ] , b [ l ] b[l] b [ l ] 可以被省略。就算不被省略,极大的可能也是会被计算成0,而无任何意义。

加入BN算法后,实现梯度下降
for t=1 to num_Mini-Batches{
    计算前向传播 X{t} X { t } #t=1时,使用 γ=σ2+ϵ,β=μ γ = σ 2 + ϵ , β = μ 初始化β,γ
        在每一个隐藏层,使用BN算法将 Z[l] Z [ l ] 转化为 Z~[l] Z ~ [ l ]
    使用反向传播算法计算得到 dW[l]dβ[l]dγ[l] d W [ l ] , d β [ l ] , d γ [ l ]
    更新参数
         W[l]=W[l]αdW[l] W [ l ] = W [ l ] − α ⋅ d W [ l ]
         β[l]=β[l]αdβ[l] β [ l ] = β [ l ] − α ⋅ d β [ l ]
         γ[l]=γ[l]αdγ[l] γ [ l ] = γ [ l ] − α ⋅ d γ [ l ]
}
梯度下降的优化算法,如Momentum,Adam等同样适用于β,γ

2.3.Batch Norm原理 why does Batch Norm work

原理一:就如我们之前了解的,经过归一化的输入特征(用X表示) 它们的均值为0,方差为1,能大幅加速学习过程。BN算法有效的一个原因是它同样如此。只不过它应用于隐藏层的值,而不是这里输入特征。

paper《Batch Normalization》中反复提到了一个概念“covariate shift”,而batch-Normalization的提出就是为了解决神经网络中(尤其是比较深的网络中的covariate shift现象)。covariate shift现象,指的是训练集的数据分布和预测集的数据分布不一致,导致模型鲁棒性下降的情况。

如果我们在A分布的训练集上训练出一个分类器,肯定在B分布(不同于A)的预测集上不会取得比较好的效果。这种训练集和预测集样本分布不一致的问题就叫做“covariate shift”现象。

比方说,我想训练一个模型根据人的血液样本来判断其有没有得血液病,对于负样本肯定就是收集一些血液病人的血液,但是对于正样本来说的话,其采样一定要合理,所采样例一定要满足整个人群中的分布。如果只采特定领域人群(比方说学校的学生)的血液作为正样本,那么我最终训练得到的模型,很难在所有人群中取得不错的效果,因为真实的预测集中学生只是正常人群中很少的一部分。(这个现象在迁移学习中也很常见)

这里写图片描述
如上图,我们对第4层进行batch-norm,可以削弱前两层在学习后产生不同分布的 A[2] A [ 2 ] 对本层计算的影响。使其能更好适应,验证集与训练集间的可能存在的不同分布,同样能被Batch-Norm操作后正确的预测。因此能够使模型具备更强的鲁棒性。

Batch Norm as regularization

  • Batch-Norm的归一化是基于mini-batch( X[t] X [ t ] ),而不是基于整个数据集,因此这个均值和方差包含有噪声(因为mini-batch的分布一般不会与训练集一样)。
  • 相同的从 Z[l] Z [ l ] Z[l]~ Z [ l ] ~ 也会传递这个噪音,因为它是用带有一定噪声的均值和方差来计算的。类似的情况还发生在dropout操作上,它随机将部分神经元输出 A[l] A [ l ] 变成了0,也传递了这一噪声。
  • 这些会产生 轻微 的正则化效果。使单个神经元更加不依赖其他神经元。
  • 如果将mini-batch size增加,比如从64增加到512,会减少这种噪声。

[参考csdn:【机器学习】covariate shift现象的解释]
[参考csdn:covariate shift现象以及解决方法]

2.4.Batch Norm at test time

训练集的每一个Mini-Batch上获得的β,γ,是基于训练集而得到的均值与方差。
在测试的时候我们只能一次测试一条样本,单条样本没有均值与方差,需要使用一个估算的均值与方差,对测试样本进行处理。
有时会使用指数加权均值法来获得估算的β,γ处理测试样本。
更多的时候是通过使用程序框架来自动处理这一过程。
【吴大师说的处理流程,我咋看不明白呢~~~,晕啊。比如每个Mini-Batch都会学习到一个β,γ,如何传递给下一个mini-batch使用的呢?用MCC(Matthews correlation coefficient)指标来评测 covariate shift问题也没有提到…..晕,暂时先留着这些问题吧】

3.Multi-class classification

3.1.Softmax Regression

softmax regression一般在输出层上使用。先回忆一下sigmoid的公式:
a[L]=11+ez[L] a [ L ] = 1 1 + e − z [ L ]
再看看softmax的公式:

a[L]=ez[L]jjz[L]j,j a [ L ] = e z j [ L ] ∑ j z j [ L ] , j 是 输 出 层 神 经 元 个 数

tj=ez[L]j t j = e z j [ L ] 有:
a[L]=tjjtj a [ L ] = t j ∑ j t j

a[l]1,a[l]2,...,a[l]j a 1 [ l ] , a 2 [ l ] , . . . , a j [ l ] 的和是1,而每一个神经元的输出变成了一个概率值。Softmax可以看作是一种对输出的归一化。
假设softmax 的输出层有4个神经元。 Z[L]=5213 Z [ L ] = [ 5 2 − 1 3 ] , t=e5e2e1e3=148.47.40.420.1,jtj=176.3 t = [ e 5 e 2 e − 1 e 3 ] = [ 148.4 7.4 0.4 20.1 ] , ∑ j t j = 176.3

a[L]1=e5176.3=0.842 a 1 [ L ] = e 5 176.3 = 0.842
a[L]2=e2176.3=0.042 a 2 [ L ] = e 2 176.3 = 0.042
a[L]3=e1176.3=0.002 a 3 [ L ] = e − 1 176.3 = 0.002
a[L]4=e3176.3=0.114 a 4 [ L ] = e 3 176.3 = 0.114
y^=0.8420.0420.0020.114 y ^ = [ 0.842 0.042 0.002 0.114 ] ,数值最大项即为预测的类别。

a[L]=1 ∑ a [ L ] = 1

softmax regress方法的样本标签通常使用onthot码,比如: y=1000 y = [ 1 0 0 0 ] ,并使用交叉熵计算与 y^ y ^ 之间的损失。

one-hot编码的益处:对于离散值one-hot编码后的欧氏距离是一样的。比如4与5之间的距离,与4与9之间的距离。

softmax regression本身是线性的。
在一个只有Softmax Regrssion的网络中。(没有其他的隐藏层,sigmoid,relu,tanh等等),网络的决策界面如下:
这里写图片描述
从图中可以看出决策界面都是线性的,证实了softmax regression本身是线性的。如果要整个网络具备非线性特性,就增加更多的隐藏层,并在这些层上添加非线性激活函数。这样整个模型就能具备非线性特性。

3.2.Training a Softmax classifier

损失函数:

L(y^,y)=j=1cyjlog(y^j) L ( y ^ , y ) = − ∑ j = 1 c y j ⋅ l o g ( y ^ j )
,log是e为底数,c是分类数。
J(W[1],b[1],...,W[L],b[L])=1mi=1mL(y^(i),y(i)) J ( W [ 1 ] , b [ 1 ] , . . . , W [ L ] , b [ L ] ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) )
,整个样本集的损失表达公式
softmax regression是logistic regression的扩展,从二分类扩展到多分类。可以证明c=2时,它们两是一样的。
yj y j 是one-hot编码,错误分类的项是0,正确的分类项是1。即损失函数与反向传播会不断提高正确分类 y^ y ^ 的值。这一点也 可以通过最大似然估计法进行验证

softmax的反向传播:

JZ[L]=dZ[L]=y^y ∂ J ∂ Z [ L ] = d Z [ L ] = y ^ − y

4.Introduction to programming frameworks

4.1.Deep learning frameworks

常见的深度学习框架(全部开源):

框架名称出品公司或组织
Caffe/Caffe2加州大学伯克利Ph.D贾扬清。caffe2,facebook
CNTKMicrosoft
DL4J商业支持机构Skymind
Keras高级插件
Lasagne高级插件
Mxnet亚马逊
PaddlePaddle百度
TesorFlowgoogle
TheanoLISA集团(现MILA)在蒙特利尔大学开发
Torch

选择深度学习框架的标准:

  • 编程的简便性,易于开发与部署
  • 运行效率高
  • 开放,开源并被很好的管理

4.2.TensorFlow

import numpy as np
import tensorflow as tf

coefficients = np.array([[1.],[-20.],[100.]])

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)
print(session.run(w))

for i in range(1000):
    session.run(train,feed_dict={x:coefficients})
print(session.run(w))

小测

Which of the following statements about γ and β in Batch Norm are true?

  • They set the mean and variance of linear variance z[l] z [ l ] of a given layer.
  • They can be learned using Adam,Gradient descent with momentum,or RMSprop,not just with gradient descent.
    【not just with gradient descent:解释为“而不仅仅是梯度下降法
    ”】

After training a neural network with Batch Norm, at test time, to evaluate the neural network on a new example you should:

  • Perform the needed normalizations,use μ and σ2 σ 2 estimated using an exponentially weithted average across mini-batches seen during training.
    【对于单个测试样本,对训练中 mini-batches所得出的 μ 与 σ2 σ 2 用指数加权平均这样的算法来估测μ 与 σ2 σ 2

编程作业

What you should remember:
Tensorflow is a programming framework used in deep learning
The two main object classes in tensorflow are Tensors and Operators.
When you code in tensorflow you have to take the following steps:
Create a graph containing Tensors (Variables, Placeholders …) and Operations (tf.matmul, tf.add, …)
Create a session
Initialize the session
Run the session to execute the graph
You can execute the graph multiple times as you’ve seen in model()
The backpropagation and optimization is automatically done when running the session on the “optimizer” object.

涉及的TF几个函数:

  • optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)
  • _ , c = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y})
  • cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels))
  • W1 = tf.get_variable(“W1”, [25,12288], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  • tf.one_hot(labels, depth, axis) #depth,one_hot位数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值