超参数调试、Batch归一化和程序框架

调试处理

不同的超参数,有不同的考虑优先等级,吴恩达的经验如下。
第一优先级的超参数:学习率 α α
第二优先级的超参数:Momentum的 β β ,神经网络每层的单元数(hidden units),mini-batch的子训练集大小(mini-batch size)。
第三优先级的超参数:神经网络的层数(layers),学习衰减率(learning rate decay)
第四优先集的超参数:Adam的超参数: β1 β 1 β2 β 2 ε ε ,使用缺省值就可以了( β1=0.9 β 1 = 0.9 β2=0.999 β 2 = 0.999 ε=108 ε = 10 − 8 )。

在对超参数取值时,要随机取值。在一定范围内等间隔地取值称为网格取值。假设我们只对两个超参数进行取值试验,左下图是网格取值,右下图是随机取值。
网格取值和随机取值
因为这两个超参数的重要性不一样,比如超参数2可以忽略不计,如果使用网格取值,那么取 nn n ∗ n 种值的效果和取n种值的效果一样,这会浪费时间。如果使用随机取值,就不会有这种影响。

为超参数取值要注意从粗略到精细。首先在一个大范围中进行随机取值试验,然后选取表现好的某块小区域再进行随机取值试验,从而一步步逼近最优的超参数值,提升搜索效率。

为超参数选择合适的范围

对于hidden units,如果取值范围是50-100,可以在这个范围内随机均匀取值。对于layers,如果取值范围是2-4,那么可以尝试取2、3和4。

但是对于学习率 α α ,它的最佳取值可能在0.0001附近,也可能在0.001,或者0.01,或者0.1,或者1。所以如果 α α 取值范围在0.0001-1,那么在这个区间中随机均匀取值是不可取了,会忽略许多可能有效的值。所以,把0.0001-1这个区间分为0.0001-0.001,0.001-0.01,0.01-0.1,0.1-1这几个区间,然后在这些区间内均匀取值。

对于 β β 也一样, β β 在0.9-0.9005这个区域学习效果相差不大,但是在0.999-0.9995这个区域灵敏度大,学习效果相差很大。

所以对于每个超参数,要在有效的取值范围内取不同学习效果的值来试验。

超参数训练的实践

训练超参数有两种类型,在课程中分别称为Pandas和Caviar。

如果缺少足够计算力(CPU和GPU),搜索超参数时就运行一个模型一段时间,观察学习曲线。如果代价函数值在下降,可以稍微调整一下超参数,比如增大学习率 α α ,然后继续训练,观察学习曲线。如果代价函数值上升,那么降低学习率 α α 。通过不断调整超参数,观察学习曲线,可以知道哪些超参数值的表现效果良好。这种超参数训练类型,精心保护一个训练模型,就像熊猫精心照顾自己的孩子,确保孩子会存活。

如果不缺少计算力,可以同时训练不同超参数的模型,观察每种模型的训练效果,选择学习效果最好的模型。这种超参数训练类型不需要关心训练的过程,只观察最后的表现效果,就像鱼子酱繁殖,鱼子酱产出1亿的卵子,不会照顾孩子,只是希望其中的一个或一群能够存活下来。

Batch归一化

除了对输入向量进行归一化处理,可以对神经网络中的内部变量进行归一化。对Z值进行归一化的操作称为Batch归一化。

假设神经网络的第l层的 Z[l] Z [ l ] 的行成员是 z(1),z(2),,z(m) z ( 1 ) , z ( 2 ) , ⋯ , z ( m ) 。Batch归一化的操作如下:
首先求出平均值和方差

μσ2=1mi=1mz(i)=1mi=1m(z(i)μ)2 μ = 1 m ∑ i = 1 m z ( i ) σ 2 = 1 m ∑ i = 1 m ( z ( i ) − μ ) 2

接着归一化处理
z(i)norm=z(i)μσ2+ε z norm ( i ) = z ( i ) − μ σ 2 + ε

我们得到了平均值为0,方差为1的 z[l]norm z norm [ l ] 。但是,我们可能不需要平均值为0,方差为1,可能需要其他值。因此,进行下面操作
z~(i)=γz(i)norm+β z ~ ( i ) = γ z norm ( i ) + β

这样我们可以获得任何想要的平均值和方差。

把Batch归一化应用到梯度下降中的如下图所示
Adding batch norm to a network
每层的参数为 W[l],b[l],γ[l],β[l] W [ l ] , b [ l ] , γ [ l ] , β [ l ] 。因为 z[l]=W[l]a[l1]+b[l] z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] ,而 z~[l]=γ[l]z[l]norm+β[l] z ~ [ l ] = γ [ l ] z norm [ l ] + β [ l ] ,所以参数 β[l] β [ l ] 包括参数 b[l] b [ l ] 的功能,参数 b[l] b [ l ] 可以去掉。

加入Batch归一化的梯度下降每次迭代的流程如下:
首先前向传播,计算出 Z,Znorm,Z~,A Z , Z norm , Z ~ , A 的值。
接着计算代价函数J。
接着反向传播,计算 dW,dγ,dβ d W , d γ , d β db d b 已经删除)。
接着更新参数,可以应用优化算法,比如Momentum,RMSprop和Adam。

已经训练好的x到y映射模型,如果x的分布改变了,映射模型也需要重新训练,这个叫covariate shift。对于一个神经网络的中后层来说,如果前一层了 a[l1] a [ l − 1 ] 的值有很大的变化,那么该层之后的参数 W[l],W[l+1],,W[L] W [ l ] , W [ l + 1 ] , ⋯ , W [ L ] 都会发生剧烈的变动。通过Batch归一化,前中层的参数发生变化,中后层的参数不会发生太大的变动。Batch归一化减少了输入值改变的问题,减弱了前层参数的作用与后层的作用之间的联系,这有助于加速整个网络的学习。

Batch归一化在Mini-batch中会加入一些噪声,因为Mini-batch每次使用一部分数据进行训练,从而 Z[l] Z [ l ] 产生了误差,而之后计算的平均值和方差都有一些误差,这样导致每个隐藏单元都带有噪声,使得后面的单元都不太相信前面的隐藏单元,每个隐藏单元都相对独立。这就好像dropout,dropout给每个单元带来了噪声(每个单元有一定的概率乘以0),Batch归一化在Mini-batch中产生了轻微了正则化效果,而且mini-batch size越小,正则化效果越大。

在测试时,Batch归一化对于单一的样本不起作用,因为一个样本的平均值和方差没有什么意义,这时需要通过其他方法求出平均值和方差。在Mini-batch中,有子训练集 X{1},X{2},,X{T} X { 1 } , X { 2 } , ⋯ , X { T } 。对于每个子训练集,可以计算平均值 μ[l] μ [ l ] 和方差 σ[l] σ [ l ] 。这样可以获得一系列 μ{1}[l],μ{2}[l],,μ{T}[l] μ { 1 } [ l ] , μ { 2 } [ l ] , ⋯ , μ { T } [ l ] σ{1}[l],σ{2}[l],,σ{T}[l] σ { 1 } [ l ] , σ { 2 } [ l ] , ⋯ , σ { T } [ l ] ,使用指数加权的思想计算各自的平均值,用最新的平均值作为测试时使用的参数。

softmax回归

softmax可以用于多分类问题。

假设需要一个识别猫(1),狗(2),小鸡(3)和其他动物(0)的分类器,这里一共有4种类别,用 C={0,1,2,3} C = { 0 , 1 , 2 , 3 } 表示。设计一个神经网络如下图所示:
softmax神经网络
最后一层不再是只有一个神经元,而是4个神经元,分别表示是其他动物的概率,是猫的概率,是狗的概率,是小鸡的概率。

对于最后一层,激活函数与其他激活函数不一样。激活函数的公式是

ta[L]=ez[L]=tn[L]j=1ti t = e z [ L ] a [ L ] = t ∑ j = 1 n [ L ] t i

a[L] a [ L ] 各个概率加起来等于1。

如果神经网络没有隐藏层,输入特征只有两个,那么softmax分类器的一些例子如下图所示:
softmax分类器例子
没有隐藏层的分类器都是线性分类。有隐藏层的神经网络可以训练非线性的分类器。

对于多元分类,样本的标签y是一个 C×1 C × 1 的矩阵。使用上面的分类例子,假设一个样本是猫,那么标签 y=0100 y = [ 0 1 0 0 ] 。对于softmax最后计算得到的 y^=P(other|x)P(cat|x)P(dog|x)P(baby chicks|x) y ^ = [ P ( other | x ) P ( cat | x ) P ( dog | x ) P ( baby chicks | x ) ] ,哪一类的概率最大,比如狗的概率最大,那么预测结果是 ypredict=0010 y predict = [ 0 0 1 0 ] 。如果根据 Z[L] Z [ L ] 直接判断得出 ypredict y predict ,这叫做hard max。

softmax的损失函数是:

l(y^,y)=i=1Cyilog(y^i) l ( y ^ , y ) = − ∑ i = 1 C y i l o g ( y ^ i )

这和logistic回归相似。如果C=2,那么softmax和logistic就一模一样了。当C=2时,只需要计算其中一个类的概率P,另外一个类的概率等于1-P。softmax的梯度 dz[L]=y^y d z [ L ] = y ^ − y ,这和logistic一样。

深度学习框架

目前已经有许多深度学习框架。

  • Caffe/Caffe2
  • CNTK
  • DL4J
  • Keras
  • Lasagne
  • mxnet
  • PaddlePaddle
  • TensorFlow
  • Theano
  • Torch

选择深度学习框架有几个标准:

  • 便于编程。
  • 运行快速。
  • 开源并长期维护。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个windows脚本调试程序。 绿色:只需复制文件到同一目录下就可以了。 纯净:基本不使用注册表,只是在注册文件类型图标和文件关联时才使用了注册表。 无毒:绝对没有任何恶意代码,但是由于程序会自动产生临时的批处理文件,可能会被杀毒软件误报。 注意:如果不能启动,下载vcredist_x86.exe安装VC运行库,然后再试。 已经实现的功能: 设置断点; 在断点命中时在代码编辑器指示哪个断点被命中。 在断点命中时可以观察现场状态【变量、ErrorLevel、当前目录】; 如果批处理没有调用Exit退出,那么可以观察到批处理执行完的现场状态; 调试暂停时会自动打开/切换文件并滚动代码窗口,使当前断点可见; 可以预设批处理执行前的环境变量和当前目录。 工程管理,也就是管理批处理文件、断点、观察变量、初始环境变量、初始当前目录、批处理入口文件、批处理文件命令行参数的信息。 支持用户自定义界面,使用标签多文档界面和停靠栏。 双击.bdc文件,会启动windows脚本调试器。 附带使用手册和批处理指南。 准备实现的功能: 在断点命中时修改环境变量或者当前目录; 语法分析【代码着色、语法检查的基础】; 语法检查; 代码着色; 内置命令帮助; 不打算实现的功能: 我感觉批处理编程并不能提供多少智能提示,所以就不做了。 局限性: 代码编辑器暂时不支持中文,这个是最大的限制了,我会在下个版本解决这个问题; 只可以在批处理语句之前加断点,不可以在空行、标签行和右括号)开头的行加断点,不可以在非批处理代码处加断点; 不支持单步调试; 必须在调试之前加断点,在调试之后加的断点,只能在以后的调试会话中起作用。 启动批处理脚本只能接受10个参数,这个限制好像问题不大。 目前可能还有bug。 注意: 不要调试程序所在目录下的那三个批处理程序,否则会出现无法预料的行为。为了保险,请把他们设为只读隐藏文件。 可以把halt.exe也设为只读隐藏文件。 我会持续改进本程序。 email: cdp97531@sina.com blog: http://hi.baidu.com/chendeping/home
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值