调试处理
不同的超参数,有不同的考虑优先等级,吴恩达的经验如下。
第一优先级的超参数:学习率
α
α
。
第二优先级的超参数: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
和
ε=10−8
ε
=
10
−
8
)。
在对超参数取值时,要随机取值。在一定范围内等间隔地取值称为网格取值。假设我们只对两个超参数进行取值试验,左下图是网格取值,右下图是随机取值。
因为这两个超参数的重要性不一样,比如超参数2可以忽略不计,如果使用网格取值,那么取
n∗n
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归一化的操作如下:
首先求出平均值和方差
接着归一化处理
我们得到了平均值为0,方差为1的 z[l]norm z norm [ l ] 。但是,我们可能不需要平均值为0,方差为1,可能需要其他值。因此,进行下面操作
这样我们可以获得任何想要的平均值和方差。
把Batch归一化应用到梯度下降中的如下图所示
每层的参数为
W[l],b[l],γ[l],β[l]
W
[
l
]
,
b
[
l
]
,
γ
[
l
]
,
β
[
l
]
。因为
z[l]=W[l]a[l−1]+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[l−1] 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
}
表示。设计一个神经网络如下图所示:
最后一层不再是只有一个神经元,而是4个神经元,分别表示是其他动物的概率,是猫的概率,是狗的概率,是小鸡的概率。
对于最后一层,激活函数与其他激活函数不一样。激活函数的公式是
a[L] a [ L ] 各个概率加起来等于1。
如果神经网络没有隐藏层,输入特征只有两个,那么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的损失函数是:
这和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
选择深度学习框架有几个标准:
- 便于编程。
- 运行快速。
- 开源并长期维护。