3.1 调试处理
在训练神经网络模型时,超参数的选取是一个非常麻烦且费时的过程。主要的超参数包括:
1.α
1.
α
学习率
2.β1 momentum
2.
β
1
m
o
m
e
n
t
u
m
梯度下降法参数
3.#hiddien units
3.
#
h
i
d
d
i
e
n
u
n
i
t
s
隐藏层单元数
4.mini−batch size
4.
m
i
n
i
−
b
a
t
c
h
s
i
z
e
5.#layers
5.
#
l
a
y
e
r
s
模型层数
6.learning rate decay
6.
l
e
a
r
n
i
n
g
r
a
t
e
d
e
c
a
y
学习率衰减指数
7.β1,β2,ϵ Adam
7.
β
1
,
β
2
,
ϵ
A
d
a
m
参数
其中
α
α
学习率是最重要的超参数,其次是
β1 momentum
β
1
m
o
m
e
n
t
u
m
、
#hiddien units
#
h
i
d
d
i
e
n
u
n
i
t
s
和
mini−batch size
m
i
n
i
−
b
a
t
c
h
s
i
z
e
,然后是
#layers
#
l
a
y
e
r
s
和
learning rate decay
l
e
a
r
n
i
n
g
r
a
t
e
d
e
c
a
y
。而
β1,β2,ϵ
β
1
,
β
2
,
ϵ
参数设置为
0.9,0.99,10−8
0.9
,
0.99
,
10
−
8
就可以了。
那么在选取超参数组合时,该如何确定最佳值呢?
在机器学习的早期,是使用网格法来确定,假设有2个超参数,可以汇出5×5的网格,然后测试这25个超参数组合的效果,看组超参数最优,如图1左图所示。
图1 超参数选取方法对比
现在推荐的做法是随机取点,如图1右图所示。这是因为在取点的时候,事先不知道哪种超参数对模型影响较大,哪种超参数影响较小。以学习率 α α 和adam模型的 ϵ ϵ 为例,采用网格法测试的25个超参数中,由于 ϵ ϵ 参数的影响效果很小,实际上只相当于测试了5个 α α 参数。而使用随机取点,更有可能快速确定合适的参数。
超参数选取的另一个策略是由粗到细进行筛选。
图2 由粗到细筛选超参数
如图2所示,当确定了几个点的超参数组合效果最优时,可以再以这几个点为起点,重新画出区域,并在该区域随机撒点,继续精细地寻找最优的参数组合值。
3.2 为超参数选择合适的范围
上节讲到在选取超参数时需要随机撒点。例如在确定隐藏层的层数或者某一层的节点数时可以采用均匀随机撒点的方法。但是,并不是所有的超参数都适合随机撒点,例如学习率在0.0001到1之间选取时,如果采用均匀随机撒点时,90%的选择都将落在0.1到1之间,实际上0.0001到0.1之间的微调对于模型训练结果非常重要,而均匀随机撒点将会忽略这种影响。
因此,可以使用指数随机撒点的方法。
r=−4∗np.random.randn() →r∈[−4,0]
r
=
−
4
∗
n
p
.
r
a
n
d
o
m
.
r
a
n
d
n
(
)
→
r
∈
[
−
4
,
0
]
α∈10r →r∈[10−4,100]
α
∈
10
r
→
r
∈
[
10
−
4
,
10
0
]
3.3 超参数训练的实践:Panda VS Caviar
不同领域的模型,比如NLP,Vision,Speech,logistics有时候可以相互借鉴。此外,一个训练好的模型的超参数在经过一段时间后可能会因为更换了服务器等各种原因而性能恶化,需要重新调整超参数。
对于庞大的训练数据集,当计算资源CPU或GPU不足时,一次只能训练一个或一批模型时,可以在训练的过程中进行改良,如第一天随机初始化参数,然后观察代价函数的变化,第二天增大学习率试一试,第三天增加momentum等。
另一种方法是,当计算资源充裕时,可以同时训练多个模型,然后找出最优的参数。
3.4 正则化网络的激活
batch正则化能够使神经网络的参数搜索问题变得更容易,能够使得神经网络对参数的选择更加容易,超参数的范围更大,工作效果也更好。
前面讲到在logistic模型中,正则化输入能够使得输入空间更加对称,有利于梯度下降效率的提高。
在深度神经网络模型中,每层的输出都有激活值
a[l]
a
[
l
]
,那么是否可以类似地正则化
a[l]
a
[
l
]
来加速训练
w[l+1]
w
[
l
+
1
]
和
b[l+1]
b
[
l
+
1
]
呢?这就时batch正则化。在实际操作时,更常见的做法是正则化
z[l]
z
[
l
]
。
batch正则化的过程如下:
在每个迭代过程中计算每一层的
zl
z
l
。
μ=1m∑miz(i)
μ
=
1
m
∑
i
m
z
(
i
)
σ2=1m∑mi(z(i)−μ)
σ
2
=
1
m
∑
i
m
(
z
(
i
)
−
μ
)
z(i)norm=z(i)−μσ2+ϵ√
z
n
o
r
m
(
i
)
=
z
(
i
)
−
μ
σ
2
+
ϵ
在实际使用时,用
z^(i)norm
z
^
n
o
r
m
(
i
)
而不是
z(i)norm
z
n
o
r
m
(
i
)
,表达式如下:
z^(i)norm=γz(i)norm+β
z
^
n
o
r
m
(
i
)
=
γ
z
n
o
r
m
(
i
)
+
β
其中
γ
γ
和
β
β
都是需要模型的学习参数,可以使用梯度下降法或Momentum,Nesterov,Adam等方法来更新
γ
γ
和
β
β
,就像更新
w
w
和一样。
γ
γ
和
β
β
能够按照你的意愿设置的
z^(i)norm
z
^
n
o
r
m
(
i
)
平均值和方差。比如在logistic回归分析中,如果
z
z
值集中在0点附近的话,将不能充分利用sigmoid函数的非线性,则batch正则化可以使得的范围更大。
3.5 将batch norm拟合进神经网络
略
3.6 batch norm为什么奏效
归一化输入可以将不同纬度的输入向量变为为相同范围的输入,能够提高梯度下降的效率。 batch norm有类似的效果,只不过 batch norm归一化的不仅仅是输入向量,还包括隐藏层的值。
此外,batch norm还有更深层的影响机制。batch norm能够使得较为靠后的隐藏层对靠前的隐藏层依赖性降低。
图3所示的是一个根据左图黑猫图片集训练出神经网络模型,这个模型有很好的判断图片是否是黑猫的能力。然而当把这个训练好的模型应用到右边彩色猫的判断时,判断效果则会大打折扣。即使存在这样一个判断所有类型的猫的模型,单单根据左侧的黑猫集很难得到这样的函数。样本集从左侧变到右侧的这个行为就叫做“covariate shift”,即输入变量分布发生了变化。
batch norm的作用机理见图4。以第3层隐藏层为例,对于训练好的模型 w[3] w [ 3 ] 和 b[3] b [ 3 ] ,当输入 X X 发生变化时,相应的、 b[1] b [ 1 ] 、 w[2] w [ 2 ] 和 b[2] b [ 2 ] 也会发生变化。batch norm能够通过调整 β β 和 γ γ 来保持均值和方差在一个稳定的范围内,从而减小输入变量分布对后续层内隐藏单元的影响。
图4 batch norm作用机理
batch norm还有正则化的作用。由于batch norm在mini-batch上计算均值和方差,使得均值和方差都有噪音,多重噪音的存在能够降低网络结果对特定节点的依赖,从而实现和dropout类似的效果。不过正则化的效果并不是batch norm的主要功能。
3.7 测试时的batch norm
在进行batch norm的时候,可以计算整体训练集均值
μ
μ
和方差
σ2
σ
2
,也可以通过指数加权平均的方法来计算。
3.8 Softmax回归
前面讲到的分类问题都是二分类问题,比如判断图片是不是猫的问题。还有一些多分类问题,如图5所示。
图5 判别猫,狗和小鸡的问题
对于多分类问题可以用softmax回归来解决。softmax回归是在原有的输出层上施加一个新的函数softmax激活函数:
其中 a[L]i a i [ L ] 为softmax的输出结果,n为L层的节点数,也就是多分类问题的类别数,这样的话,输出层上每个节点的输出量就变成每个节点的概率,节点概率最大的点代表的类型就是最后的判别结果。
3.9 训练一个softmax分类器
上节讲到的softmax激活函数计算如下图所示。
与softmax对应的时“hard max”,hard max将每层的 z[L] z [ L ] 向量最大值设为1,其余值设置为0,相比之下softmax函数更为缓和。
softmax激活函数的损失函数为:
L(y^,y)=−∑ni=1yilogy^j
L
(
y
^
,
y
)
=
−
∑
i
=
1
n
y
i
l
o
g
y
^
j
代价函数为:
J(w,b)=1m∑mi=1L(y^,y)
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
,
y
)
3.10 深度学习框架
当构建神经网络时,完全依靠自己编程来一点一点地实现所有的功能是不现实的,现在有很多深度学习框架能够帮助你高效地搭建神经网络模型。
- Caffe/Caffe2
- CNTK
- DL4J
- Keras
- Lasagne
- mxnet
- PaddlePaddle
- Tensorflow
- Theano
Torch
在选择这些神经网络的时候主要考虑以下几点:
1.易于编程,既容易开发也容易在产品上部署。
2.运行速度快
3.完全开源,且有良好的维护。
3.11 Tensorflow
略