单词 | 解释 |
---|---|
covariate shift | 协变量变换 |
covariate | n.协变量 |
了解系统性进行超参数调优的技巧。
超参数符号 | 作用(☆越多越重要) |
---|---|
α | 学习率☆☆☆ |
β | 动量梯度下降法,参数☆☆ |
hidden units | 隐藏单元数☆☆ |
Mini-batch size | Mini-batch大小☆☆ |
L | 网络层数☆ |
learning rate decay | 学习衰减率☆ |
β1,β2,ϵ β 1 , β 2 , ϵ | Adam梯度下降法,参数 |
以上是经验,并非一成不变。
Try random values:Don‘t use a grid.
即不要列出所有超参数可能性,然后一个个尝试。
如:在超参数1=a的情况下,超参数2分别取值a1,a2,….,a10;超参数1=b的情况下,超参数2分别取值b1,b2,….,b10。这样一种对全部情况枚举并逐一尝试。(这适用于参数量较少的情形)
因为神经网络的超参数太多,你没有办法去穷尽所有参数并逐一尝试。可以想象当上面例子中超参数增加一个,要尝试的参数量就会指数级增长。
神经网络推荐在超参数网格中进行随机取样测试。原因:你很难事先知道在你问题中,哪个超参数是最重要的。
区域定位抽样方案。如果你发现超参数在某个范围内表现不错,应该在这个范围周围划定出一个区域,然后进行密度更高的抽样,并测试。
α学习率适合的参数搜索范围,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,β=1−10r 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,对结果却有很大影响。
建议至少每隔几个月重新检测或重新评估一次超参数。
只能运行一个模型:在线观看模型训练的cost曲线,耐心的微调学习率。(类似pandas,一次只有一个孩子)
能并行运行多个模型:在一个Cost坐标系上对比不同参数取值之间的差异。(类似Caviar,一次能有很多孩子)
由Sergey Ioffe 和 Christian Szegedy提出。可以让超参搜索变得很简单,让神经网络变得更加具有鲁棒性,可以让神经网络对于超参数的选择上不再那么敏感,而且可以让你更容易地训练非常深的网络。
在任何一个隐藏层,对 Zl Z l 进行归一化,(比归一化 al a l 更普遍,这就是batch norm 简单的解释。
γ,β的值是 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的正态分布。选择分布的区间,与激活函数的类型有关。因为不同激活函数的“高效区间”不一样,所以可以对应选择不同的分布区间。
如下图这样一个3×2×2×1的网络。每个神经元在做两件事,第一个是得出本神经元的z,再激活得出本神经元的a。加入Batch Normalization(简称:Batch Norm或BN)后整个计算过程如下
由于每一个隐藏层的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等同样适用于β,γ
原理一:就如我们之前了解的,经过归一化的输入特征(用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
[参考csdn:【机器学习】covariate shift现象的解释]
[参考csdn:covariate shift现象以及解决方法]
训练集的每一个Mini-Batch上获得的β,γ,是基于训练集而得到的均值与方差。
在测试的时候我们只能一次测试一条样本,单条样本没有均值与方差,需要使用一个估算的均值与方差,对测试样本进行处理。
有时会使用指数加权均值法来获得估算的β,γ处理测试样本。
更多的时候是通过使用程序框架来自动处理这一过程。
【吴大师说的处理流程,我咋看不明白呢~~~,晕啊。比如每个Mini-Batch都会学习到一个β,γ,如何传递给下一个mini-batch使用的呢?用MCC(Matthews correlation coefficient)指标来评测 covariate shift问题也没有提到…..晕,暂时先留着这些问题吧】
softmax regression一般在输出层上使用。先回忆一下sigmoid的公式:
a[L]=11+e−z[L] a [ L ] = 1 1 + e − z [ L ]
再看看softmax的公式:
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=e−1176.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本身是线性的。如果要整个网络具备非线性特性,就增加更多的隐藏层,并在这些层上添加非线性激活函数。这样整个模型就能具备非线性特性。
损失函数:
softmax的反向传播:
常见的深度学习框架(全部开源):
框架名称 | 出品公司或组织 |
---|---|
Caffe/Caffe2 | 加州大学伯克利Ph.D贾扬清。caffe2,facebook |
CNTK | Microsoft |
DL4J | 商业支持机构Skymind |
Keras | 高级插件 |
Lasagne | 高级插件 |
Mxnet | 亚马逊 |
PaddlePaddle | 百度 |
TesorFlow | |
Theano | LISA集团(现MILA)在蒙特利尔大学开发 |
Torch |
选择深度学习框架的标准:
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?
After training a neural network with Batch Norm, at test time, to evaluate the neural network on a new example you should:
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几个函数: