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)−