1. 超参数调试处理
- 在机器学习领域,超参数比较少的情况下,我们之前利用设置网格点的方式来调试超参数;
- 但在深度学习领域,超参数较多的情况下,不是设置规则的网格点,而是随机选择点进行调试。这样做是因为在我们处理问题的时候,是无法知道哪个超参数是更重要的,所以随机的方式去测试超参数点的性能,更为合理,这样可以探究更超参数的潜在价值。
2. 为超参数选择合适的标尺
上节讲到在超参数范围中随机取值可以提升搜索效率,但随机取值并不是说在有效值范围内的随机均匀取值,而是为超参数选择合适的标尺。
在考虑范围内随机均匀取值的例子:要选取隐藏单元的数量
n
[
l
]
n^{[l]}
n[l],在[50, 100]的范围内随机取值;比如要选取神经网络的层数L,在[2, 4]范围内随机均匀取值。
但这种方式对某些参数不合理。
比如超参数 学习速率 α \alpha α,取值范围[0.0001, 1],在其中随机均匀取值,那么90%的数值将会落在 0.1 到 1 之间,而0.001 到 0.1 之间只有10%。相比较,用对数标尺搜索超参数的方式更合理,在对数轴上均匀随机取点,在0.001到0.1之间就会有更多的搜索资源可用。
通常如果你在
1
0
a
10^a
10a和
1
0
b
10^b
10b之间取值,那么在[a, b]区间随机均匀取值r,设置
α
=
1
0
r
\alpha=10^r
α=10r。
最后以指数加权平均的超参数
β
\beta
β为例,假设取值范围是[0.999, 0.9],如果在该区间内随机均匀取值也是不合理的。考虑
1
−
β
∈
[
0.001
,
0.1
]
1-\beta∈[0.001, 0.1]
1−β∈[0.001,0.1],在[-3, -1]范围里随机均匀的取值
r
r
r,则
1
−
β
=
1
0
r
⇒
β
=
1
−
1
0
r
1-\beta=10^r \Rightarrow\beta=1-10^r
1−β=10r⇒β=1−10r。
为什么在上个例子中用线性轴取值不合理?因为当
β
\beta
β接近于1时,即使
β
\beta
β有微小的变化,所得结果的灵敏度也会变化。如果
β
\beta
β在0.9000到0.9005之间取值, 对结果几乎没有影响。但如果
β
\beta
β在0.999到0.9995之间取值,会对结果产生巨大影响。因为第一种情况是根据大概10个值取平均,第二种是1000或2000个值取平均(根据公式
1
1
−
β
\frac{1}{1-\beta}
1−β1)。
β
\beta
β接近1时,细微的变化会影响结果,因此需要更加密集地在该区间内取值。
3. 超参数调试实践:Pandas vs. Caviar
在超参数调试的实际操作中,我们需要根据我们现有的计算资源来决定以什么样的方式去调试超参数,进而对模型进行改进。下面是不同情况下的两种方式:
- 在计算资源有限的情况下,使用第一种,仅调试一个模型,每天不断优化;
- 在计算资源充足的情况下,使用第二种,同时并行调试多个模型,选取其中最好的模型。
4. 网络中激活值的归一化
在Logistic Regression 中,将输入特征进行归一化,可以加速模型的训练。那么对于更深层次的神经网络,我们是否可以归一化隐藏层的输出 a [ l ] a^{[l]} a[l] 或者经过激活函数前的 z [ l ] z^{[l]} z[l] ,以便加速神经网络的训练过程?答案是肯定的。
常用的方式是将隐藏层的经过激活函数前的 z [ l ] z^{[l]} z[l] 进行归一化。
Batch Norm 的实现
以神经网络中某一隐藏层的中间值为例: z ( 1 ) , z ( 2 ) , … , z ( m ) z^{(1)},z^{(2)},\ldots,z^{(m)} z(1),z(2),…,z(m) :
μ = 1 m ∑ i z ( i ) \mu = \dfrac{1}{m}\sum\limits_{i}z^{(i)} μ=m1i∑z(i)
σ 2 = 1 m ∑ i ( z ( i ) − μ ) 2 \sigma^{2}=\dfrac{1}{m}\sum\limits_{i}(z^{(i)}-\mu)^{2} σ2=m1i∑(z(i)−μ)2
z n o r m ( i ) = z ( i ) − μ σ 2 + ε z^{(i)}_{\rm norm} = \dfrac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}} znorm(i)=σ2+εz(i)−μ
这里加上 ε \varepsilon ε 是为了保证数值的稳定。
到这里所有 z 的分量都是平均值为0和方差为1的分布,但是我们不希望隐藏层的单元总是如此,也许不同的分布会更有意义,所以我们再进行计算:
z ~ ( i ) = γ z n o r m ( i ) + β \widetilde z^{(i)} = \gamma z^{(i)}_{\rm norm}+\beta z (i)=γznorm(i)+β
这里 γ \gamma γ 和 β \beta β 是可以更新学习的参数,如神经网络的权重 w 一样,两个参数的值来确定 z ~ ( i ) \widetilde z^{(i)} z (i) 所属的分布。
5. 将Batch Norm拟合进神经网络
在深度神经网络中应用Batch Norm,这里以一个简单的神经网络为例,前向传播的计算流程如下图所示:
实现梯度下降
- for t = 1 … num (这里num 为Mini Batch 的数量):
- 在每一个
X
t
X^{t}
Xt上进行前向传播(forward prop)的计算:
- 在每个隐藏层都用 Batch Norm 将 z [ l ] z^{[l]} z[l] 替换为 z ~ [ l ] \widetilde z^{[l]} z [l]
- 使用反向传播(Back prop)计算各个参数的梯度: d w [ l ] 、 d γ [ l ] 、 d β [ l ] dw^{[l]}、d\gamma^{[l]}、d\beta^{[l]} dw[l]、dγ[l]、dβ[l]
- 更新参数:
- w [ l ] : = w [ l ] − α d w [ l ] w^{[l]}:=w^{[l]}-\alpha dw^{[l]} w[l]:=w[l]−αdw[l]
- γ [ l ] : = γ [ l ] − α d γ [ l ] \gamma^{[l]}:=\gamma^{[l]}-\alpha d\gamma^{[l]} γ[l]:=γ[l]−αdγ[l]
- β [ l ] : = β [ l ] − α d β [ l ] \beta^{[l]}:=\beta^{[l]}-\alpha d\beta^{[l]} β[l]:=β[l]−αdβ[l]
- 在每一个
X
t
X^{t}
Xt上进行前向传播(forward prop)的计算:
同样与Mini-batch 梯度下降法相同,Batch Norm同样适用于momentum、RMSprop、Adam的梯度下降法来进行参数更新。
Notation
这里没有写出偏置参数 b [ l ] b^{[l]} b[l] 是因为 z [ l ] = w [ l ] a [ l − 1 ] + b [ l ] z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]} z[l]=w[l]a[l−1]+b[l] ,而Batch Norm 要做的就是将 z [ l ] z^{[l]} z[l] 归一化,结果成为均值为0,标准差为1的分布,再由 β \beta β 和 γ \gamma γ 进行重新的分布缩放,那就是意味着,无论 b [ l ] b^{[l]} b[l] 值为多少,在这个过程中都会被减去,不会再起作用。所以如果在神经网络中应用Batch Norm 的话,就直接将偏置参数 b [ l ] b^{[l]} b[l] 去掉,或者将其置零。
6. Batch Norm 起作用的原因
-
和归一化输入特征 x x x 获得类似范围的值来加速学习的原理相同,Batch Norm不仅对输入值,还有隐藏单元的值。
-
使权重比网络更滞后或更深层。
covariate shift:已经学习到 x x x到 y y y的映射,如果 x x x的分布改变了,即使映射函数没有改变,也需要重新训练学习算法。
以下图神经网络第三层隐藏层为例,它从第二层中取得输入 a 1 [ 2 ] , a 2 [ 2 ] , a 3 [ 2 ] , a 4 [ 2 ] , a^{[2]}_{1},a^{[2]}_{2},a^{[2]}_{3},a^{[2]}_{4}, a1[2],a2[2],a3[2],a4[2], 学习参数 w [ 3 ] , b [ 3 ] , w [ 4 ] , b [ 4 ] w^{[3]},b^{[3]},w^{[4]},b^{[4]} w[3],b[3],w[4],b[4],把输入映射到输出 y ^ \hat{y} y^,尽量接近真实值 y y y。但是输入 a [ 2 ] a^{[2]} a[2]会随着前边参数 w [ 1 ] , b [ 1 ] , w [ 2 ] , b [ 2 ] w^{[1]},b^{[1]},w^{[2]},b^{[2]} w[1],b[1],w[2],b[2]的改变而变化,即这些隐藏单元的值在不断改变,所以这个神经网络就有covariate shift的问题。
Batch归一化减少了隐藏值分布变化的数量,确保这些参数无论怎样变化,均值和方差不变( β [ 2 ] 、 γ [ 2 ] \beta^{[2]}、\gamma^{[2]} β[2]、γ[2]决定),限制了前层参数更新对后面数值分布的影响程度,使输入值变得更稳定。减弱了前层参数和后层参数的作用之间的联系,使得网络每层都可以自己学习,稍稍独立于其它层,有助于加速整个网络的学习。
Batch Norm正则化效果
因为Batch Norm归一化在mini-batch上计算均值和方差,而不是在整个数据集上,均值和方差有些噪音。缩放过程也有些噪音,因为是用有噪音的均值和方差计算的。和dropout相似,往每个隐藏层的激活值上增加了噪音。所以Batch Norm有些正则化效果,因为给隐藏单元增加了噪音,迫使后部单元不过分依赖任何一个隐藏单元。Batch归一化和dropout可以一起使用。Note,如果你用了较大的mini-batch,如512而不是64,会减少噪音,从而减少正则化效果,这也是dropout的一个性质。
7. 在测试数据上使用 Batch Norm
训练过程中,我们是在每个Mini-batch使用Batch Norm,来计算所需要的均值 \mu 和方差 σ 2 \sigma^{2} σ2 。但是在测试的时候,我们需要对每一个测试样本进行预测,无法计算均值和方差。
此时,我们需要单独进行估算均值
μ
\mu
μ 和方差
σ
2
\sigma^{2}
σ2 。通常的方法就是在我们训练的过程中,对于训练集的Mini-batch,使用指数加权平均,当训练结束的时候,得到指数加权平均后的均值
μ
\mu
μ 和方差
σ
2
\sigma^{2}
σ2 ,而这些值直接用于Batch Norm公式的计算,用以对测试样本进行预测。
看了两遍视频没明白为什么测试集上就不能直接计算一个mini-batch的均值和方差了。zZ
8. Softmax 回归
在多分类问题中,有一种 logistic regression的一般形式,叫做Softmax regression。Softmax回归可以将多分类任务的输出转换为各个类别可能的概率,从而将最大的概率值所对应的类别作为输入样本的输出类别。
计算公式
下图是Softmax的公式以及一个简单的例子:
可以看出Softmax通过向量
z
[
L
]
z^{[L]}
z[L] 计算出总和为1的四个概率。
在没有隐藏隐藏层的时候,直接对Softmax层输入样本的特点,则在不同数量的类别下,Sotfmax层的作用:
Ng提到和别的激活函数的区别之一,如Relu、Sigmoid函数输入一个实数输出一个实数,softmax输入和输出都是向量。没太懂。难道指的是最后一层的输出,每个样本的输出,之前接触的都是实数,这里是向量。
9. 训练softmax分类器
理解 Sotfmax
为什么叫做Softmax?我们以前面的例子为例,由
z
[
L
]
到
a
[
L
]
z^{[L]} 到 a^{[L]}
z[L]到a[L] 的计算过程如下:
通常我们判定模型的输出类别,是将输出的最大值对应的类别判定为该模型的类别,也就是说最大值为的位置1,其余位置为0,这也就是所谓的“hardmax”。而Sotfmax将模型判定的类别由原来的最大数字5,变为了一个最大的概率0.842,这相对于“hardmax”而言,输出更加“soft”而没有那么“hard”。
Sotfmax回归 将 logistic回归 从二分类问题推广到了多分类问题上。
Softmax 的 Loss function
在使用Sotfmax层时,对应的目标值 y y y 以及训练结束前某次的输出的概率值 y ^ \hat y y^ 分别为:
y = [ 0 1 0 0 ] , y ^ = [ 0.3 0.2 0.1 0.4 ] y=\left[ \begin{array}{l} 0\\1\\0\\0 \end{array} \right] , \ \hat y=\left[ \begin{array}{l} 0.3\\0.2\\0.1\\0.4 \end{array} \right] y=⎣⎢⎢⎡0100⎦⎥⎥⎤, y^=⎣⎢⎢⎡0.30.20.10.4⎦⎥⎥⎤
Sotfmax使用的 Loss function 为:
L ( y ^ , y ) = − ∑ j = 1 4 y j log y ^ j L(\hat y,y)=-\sum\limits_{j=1}^{4}y_{j}\log \hat y_{j} L(y^,y)=−j=1∑4yjlogy^j
在训练过程中,我们的目标是最小化Loss function,由目标值我们可以知道, y 1 = y 3 = y 4 = 0 , y 2 = 1 y_{1}=y_{3}=y_{4}=0,y_{2}=1 y1=y3=y4=0,y2=1 ,所以代入 L ( y ^ , y ) L(\hat y,y) L(y^,y) 中,有:
L ( y ^ , y ) = − ∑ j = 1 4 y j log y ^ j = − y 2 log y ^ 2 = − log y ^ 2 L(\hat y,y)=-\sum\limits_{j=1}^{4}y_{j}\log \hat y_{j}=-y_{2}\log \hat y_{2}=-\log \hat y_{2} L(y^,y)=−j=1∑4yjlogy^j=−y2logy^2=−logy^2
所以为了最小化Loss function,我们的目标就变成了使得 y ^ 2 \hat y_{2} y^2 的概率尽可能的大。
也就是说,这里的损失函数的作用就是找到你训练集中的真实的类别,然后使得该类别相应的概率尽可能地高,这其实是最大似然估计的一种形式。
对应的Cost function如下:
J ( w [ 1 ] , b [ 1 ] , … ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J(w^{[1]},b^{[1]},\ldots)=\dfrac{1}{m}\sum\limits_{i=1}^{m}L(\hat y^{(i)},y^{(i)}) J(w[1],b[1],…)=m1i=1∑mL(y^(i),y(i))
Softmax 的梯度下降
在Softmax层的梯度计算公式为:
∂ J ∂ z [ L ] = d z [ L ] = y ^ − y \dfrac{\partial J}{\partial z^{[L]}}=dz^{[L]} = \hat y -y ∂z[L]∂J=dz[L]=y^−y
参考资料:
[1] 吴恩达深度学习视频教程中文笔记连载:https://zhuanlan.zhihu.com/p/30146018
[2] 吴恩达深度学习视频课
以上内容全部来自参考资料。