背景:
介绍超参数调试和处理
1-超参数调试
相比于早期那种参数较少的情况,可以用网格状的数值划分来做数值的遍历,来获取最优参数。但是在深度学习领域,我们一般是采用随机化的方式进行参数的尝试。
如上图的网格状选取参数其实只能分别在固定在5个值范围内,在我们尚未知晓哪个参数更为重要的前提下是不明智的。此时,我们如果采用右图的随机取值方式,在取值都是25个的情况下,我们获取的是25个的参数1和25个的参数2。比如其中一个参数是学习率
α
,另一个是
ϵ
,左图仅仅尝试了5个
α
,而右图尝试了25个
α
值,更能找到最合适的
α
。
对于多更多的超参数,其参数的搜索空间是高纬度的,同理也是采用随机取值的方式,进而提高搜索效率。
另外一种方式是先粗糙再精细的搜索方式。在上述的随机取值后,我们会发现某些区域的取值效果更好,那么我们在这个区域进行细化取值,更加密集地取值。
2-选择合适范围的超参数
之前说的随机取值,并不是在有效值范围内的随机均匀取值,而是选择合适的标尺之后的均匀取值。
对于神经网络中某层中的神经元个数,我们可以在一定范围内,比如20~40进行均匀搜索;再或者对于神经网络的层数,我们同样可以在一定范围内,如2~5内进行均匀搜索。但是对于有些参数则不适用。
比如学习率
α
,假设我们设置其最小值0.0001,其最大值是1,即搜索范围(0.0001,1)。如果真的沿着这个轴向范围内的随机取值的化,那么其实有90%概率,这个值也是在(0.1,1)之间的,而在(0.0001, 0.1)之间只占用了10%的搜索资源。此时采用对数标尺搜索超参数会更加合理。分别在轴上设置点0.0001,0.001,0.01,0.1和1作,在对数轴上再均匀取点。
Python实现:
r=-4 * np.random.rand()#此时r取值范围是[-4,0]
alpha=np.power(10,r)#即alpha=10^r,所以alpha取值范围是[10^-4,10^0]
如果在10^a和10^b之间取值,对于上述例子,此时的
a=log10(0.0001)=−4,b=log10(1)=0
。那么我们就可以在[a,b]之间随机均匀取地给r取值,进而获得
α=10r
。我们是将在
10a
和
10b
区间的取值转为对数轴上a和b之间的随意均匀取r值。
对于计算指数加权平均值时用到的超参数
β
值,我们假设
β
在[0.9,0.999]之间,此时可以通过
1−β
进行转化,
1−β
的值域在[0.001, 0.1],就可以用上述的方式,转为在[-3,1]之间的随机均匀取r值问题。在通过
1−β=10r
取出
β
值。
当
β
接近1时,所得结果的敏感度会变化,即使
β
变化很微小。比如,
β
从0.9000变化为0.9005,那么其实结果上不会有什么变化,但是如果
β
是从0.999变成0.9995,则将对算法产生巨大影响。按照指数加权平均值的理解,前者是根据大概10个值的平均,后者则是从大概1000个值(相对于0.999)的平均,变化到大概2000个值(相对于0.9995)的平均。所依据的公式是1/(1-
β
)。所以,当
β
接近1,其结果值变化就很敏感。所以,在
@H_403_716@β
接近1的时候,需要更加密集地取值。对于
1−β
则是接近0的时候敏感,同理。
3 Batch归一化
Batch归一化是为了使参数的搜索简单化而提出的。
对于逻辑回归模型,我们对输入进行归一化处理:
@H_403_769@
μ=1m∑mi=1x(i)
X=X−μ
σ2=1m∑mi=1x(i)2
X=X/σ2
对于多层的神经网络的化:
除了输入层,还有每层的激活值
a[i]
。我们希望在前层输入到下一层,作为输入时候,能够做一次归一化处理,使得下层的参数W和b训练更有意义。所以,我们要做的是归一化隐藏层的
a[i]
。究竟是选择归一化
z[i]
还是归一化
a[i]
,在学界是有讨论的。但是在实际使用过程中,我们一般是归一化
z[i@H_247_1301@]
,而不是
a[i]
。
当有L个隐藏层时,隐藏单元分别是
z[1].@H_850_1404@....@H_404_1413@z[L]
,以
z[l](i)
表示l层的激活值。对于l层,我们简写为
z(1).....z(i)
,不再标注层号。
归一化方法:
μ=1m∑mi=1z(i)
σ2=1m∑mi=1(z(i)−μ)2
z(i)norm=z(i)−μσ2+ϵ√
为了使数值稳定,一般分母常常加一个
ϵ
,防止
@H_301_2028@σ=0
的情况。
归一化的结果是均值0,标准单位方差,所以z的每个分量均值是0,方差是1。
但是我们不想隐藏单元都是总是均值是0,方差是1,也许隐藏单元有了不同分布,会有意义。所以,我们计算:
z~(i)=γz(i)norm+β
这里的
γ
和
β
是模型的学习参数,所以在使用梯度下降的过程或者其他算法更新参数的时候,需要对
γ
和
β
进行更新。由于
γ
和
β
的作用,我们可以随意设置
z~
的平均值。如果
γ=σ2+ϵ@H_989_2403@−−−−−√,β=μ
那么
γz(i)@H_684_2502@norm+β
会精确转化方程:
z~(i)=z(i)
通过对
γ
和
β
的合理设定,实现归一化的时候,可以构造含有其他均值和方差的隐藏单元值。
用
z~(i)取代z(i)
做后续的运算。
batch归一化仅仅适用于输入层还适用于隐藏层。输入层和隐藏层的归一化区别是,对于隐藏层,我们不想其均值一定是0,方差是1。比如对于激活函数是sigmoid,我们不想值都集中在某个局部,而是希望它有更大的方差或者不是0的均值,以便更好地使用非线性的sigmoid函数。否则,0均值和1方差,则值都集中在sigmoid函数的线性部分。
γ
和
β
控制之后,就可以不用是0均值和1方差了。
原文链接:https://www.f2er.com/regex/357876.html