http://www.ai-start.com/dl2017/html/lesson2-week3.html
超参数调试、Batch正则化和程序框架(Hyperparameter tuning)
调试处理(Tuning process)
关于训练深度最难的事情之一是你要处理的参数的数量,从学习速率
a
a
a到Momentum(动量梯度下降法)的参数
β
\beta
β。如果使用Momentum或Adam优化算法的参数,
β
1
\beta_{1}
β1,
β
2
{\beta}_{2}
β2和
ε
\varepsilon
ε,也许你还得选择层数,也许你还得选择不同层中隐藏单元的数量,也许你还想使用学习率衰减。所以,你使用的不是单一的学习率
a
a
a。接着,当然你可能还需要选择mini-batch的大小。
结果证实一些超参数比其它的更为重要,我认为,最为广泛的学习应用是 a a a,学习速率是需要调试的最重要的超参数。
除了 a a a,还有一些参数需要调试,例如Momentum参数 β \beta β,0.9就是个很好的默认值。我还会调试mini-batch的大小,以确保最优算法运行有效。我还会经常调试隐藏单元,我用橙色圈住的这些,这三个是我觉得其次比较重要的,相对于 a a a而言。重要性排第三位的是其他因素,层数有时会产生很大的影响,学习率衰减也是如此。当应用Adam算法时,事实上,我从不调试 β 1 \beta_{1} β1, β 2 {\beta}_{2} β2和 ε \varepsilon ε,我总是选定其分别为0.9,0.999和 1 0 − 8 10^{-8} 10−8,如果你想的话也可以调试它们。
但希望你粗略了解到哪些超参数较为重要, a a a无疑是最重要的,接下来是我用橙色圈住的那些,然后是我用紫色圈住的那些,但这不是严格且快速的标准,我认为,其它深度学习的研究者可能会很不同意我的观点或有着不同的直觉。
为超参数选择合适的范围(Using an appropriate scale to pick hyperparameters)
超参数调试的实践:Pandas VS Caviar(Hyperparameters tuning in practice: Pandas vs. Caviar)
归一化网络的激活函数(Normalizing activations in a network)
在深度学习兴起后,最重要的一个思想是它的一种算法,叫做Batch归一化,由Sergey loffe和Christian Szegedy两位研究者创造。Batch归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好,也会是你的训练更加容易,甚至是深层网络。让我们来看看Batch归一化是怎么起作用的吧。
训练一个模型,比如logistic回归时,你也许会记得,归一化输入特征可以加快学习过程。你计算了平均值,从训练集中减去平均值,计算了方差,接着根据方差归一化你的数据集,在之前的视频中我们看到,这是如何把学习问题的轮廓,从很长的东西,变成更圆的东西,更易于算法优化。所以这是有效的,对logistic回归和神经网络的归一化输入特征值而言。
那么更深的模型呢?你不仅输入了特征值
x
x
x,而且这层有激活值
a
[
1
]
a^{[1]}
a[1],这层有激活值
a
[
2
]
a^{[2]}
a[2]等等。如果你想训练这些参数,比如
w
[
3
]
w^{[3]}
w[3],
b
[
3
]
b^{[3]}
b[3],那归一化
a
[
2
]
a^{[2]}
a[2]的平均值和方差岂不是很好?以便使
w
[
3
]
w^{[3]}
w[3],
b
[
3
]
b^{[3]}
b[3]的训练更有效率。在logistic回归的例子中,我们看到了如何归一化
x
1
x_{1}
x1,
x
2
x_{2}
x2,
x
3
x_{3}
x3,会帮助你更有效的训练
w
w
w和
b
b
b。
所以问题来了,对任何一个隐藏层而言,我们能否归一化 a a a值,在此例中,比如说 a [ 2 ] a^{[2]} a[2]的值,但可以是任何隐藏层的,以更快的速度训练 w [ 3 ] w^{[3]} w[3], b [ 3 ] b^{[3]} b[3],因为 a [ 2 ] a^{[2]} a[2]是下一层的输入值,所以就会影响 w [ 3 ] w^{[3]} w[3], b [ 3 ] b^{[3]} b[3]的训练。简单来说,这就是Batch归一化的作用。尽管严格来说,我们真正归一化的不是 a [ 2 ] a^{[2]} a[2],而是 z [ 2 ] z^{[2]} z[2],深度学习文献中有一些争论,关于在激活函数之前是否应该将值 z [ 2 ] z^{[2]} z[2]归一化,或是否应该在应用激活函数 a [ 2 ] a^{[2]} a[2]后再规范值。实践中,经常做的是归一化 z [ 2 ] z^{[2]} z[2],所以这就是我介绍的版本,我推荐其为默认选择,那下面就是Batch归一化的使用方法。
将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a neural network)
你已经看到那些等式,它可以在单一隐藏层进行Batch归一化,接下来,让我们看看它是怎样在深度网络训练中拟合的吧。
假设你有一个这样的神经网络,我之前说过,你可以认为每个单元负责计算两件事。第一,它先计算z,然后应用其到激活函数中再计算a,所以我可以认为,每个圆圈代表着两步的计算过程。同样的,对于下一层而言,那就是
z
1
[
2
]
z_{1}^{[2]}
z1[2]和
a
1
[
2
]
a_{1}^{[2]}
a1[2]等。所以如果你没有应用Batch归一化,你会把输入
X
X
X拟合到第一隐藏层,然后首先计算
z
[
1
]
z^{[1]}
z[1],这是由
w
[
1
]
w^{[1]}
w[1]和
b
[
1
]
b^{[1]}
b[1]两个参数控制的。接着,通常而言,你会把
z
[
1
]
z^{[1]}
z[1]拟合到激活函数以计算
a
[
1
]
a^{[1]}
a[1]。
但Batch归一化的做法是将
z
[
1
]
z^{[1]}
z[1]值进行Batch归一化,简称BN**,此过程将由
β
[
1
]
{\beta}^{[1]}
β[1]和
γ
[
1
]
\gamma^{[1]}
γ[1]两参数控制,这一操作会给你一个新的规范化的
z
[
1
]
z^{[1]}
z[1]值(
z
~
[
1
]
{\tilde{z}}^{[1]}
z~[1]),然后将其输入激活函数中得到
a
[
1
]
a^{[1]}
a[1],即
a
[
1
]
=
g
[
1
]
(
z
~
[
l
]
)
a^{[1]} = g^{[1]}({\tilde{z}}^{[ l]})
a[1]=g[1](z~[l])。
现在,你已在第一层进行了计算,此时Batch归一化发生在z的计算和 a a a之间,接下来,你需要应用 a [ 1 ] a^{[1]} a[1]值来计算 z [ 2 ] z^{[2]} z[2],此过程是由 w [ 2 ] w^{[2]} w[2]和 b [ 2 ] b^{[2]} b[2]控制的。与你在第一层所做的类似,你会将 z [ 2 ] z^{[2]} z[2]进行Batch归一化,现在我们简称BN,这是由下一层的Batch归一化参数所管制的,即 β [ 2 ] {\beta}^{[2]} β[2]和 γ [ 2 ] \gamma^{[2]} γ[2],现在你得到 z ~ [ 2 ] {\tilde{z}}^{[2]} z~[2],再通过激活函数计算出 a [ 2 ] a^{[2]} a[2]等等。
Batch Norm 为什么奏效?(Why does Batch Norm work?)
测试时的 Batch Norm(Batch Norm at test time)
Softmax 回归(Softmax regression)
训练一个 Softmax 分类器(Training a Softmax classifier)
上一个视频中我们学习了Softmax层和Softmax激活函数,在这个视频中,你将更深入地了解Softmax分类,并学习如何训练一个使用了Softmax层的模型。
回忆一下我们之前举的的例子,输出层计算出的
z
[
l
]
z^{[l]}
z[l]如下,
z
[
l
]
=
[
5
2
−
1
3
]
z^{[l]} = \begin{bmatrix} 5 \ 2 \ - 1 \ 3 \ \end{bmatrix}
z[l]=[5 2 −1 3 ]我们有四个分类
C
=
4
C=4
C=4,
z
[
l
]
z^{[l]}
z[l]可以是4×1维向量,我们计算了临时变量
t
t
t,
t
=
[
e
5
e
2
e
−
1
e
3
]
t = \begin{bmatrix} e^{5} \ e^{2} \ e^{- 1} \ e^{3} \ \end{bmatrix}
t=[e5 e2 e−1 e3 ],对元素进行幂运算,最后,如果你的输出层的激活函数
g
[
L
]
(
)
g^{[L]}()
g[L]()是Softmax激活函数,那么输出就会是这样的:
简单来说就是用临时变量
t
t
t将它归一化,使总和为1,于是这就变成了
a
[
L
]
a^{[L]}
a[L],你注意到向量
z
z
z中,最大的元素是5,而最大的概率也就是第一种概率。
Softmax这个名称的来源是与所谓hardmax对比,hardmax会把向量
z
z
z变成这个向量
[
1
0
0
0
]
\begin{bmatrix} 1 \ 0 \ 0 \ 0 \ \end{bmatrix}
[1 0 0 0 ],hardmax函数会观察
z
z
z的元素,然后在
z
z
z中最大元素的位置放上1,其它位置放上0,所这是一个hard max,也就是最大的元素的输出为1,其它的输出都为0。与之相反,Softmax所做的从
z
z
z到这些概率的映射更为温和,我不知道这是不是一个好名字,但至少这就是softmax这一名称背后所包含的想法,与hardmax正好相反。