调试(Tuning)
深度学习要处理很多参数, 从学习速率 α\alphaα 到 Momentum 的参数 β\betaβ, 若使用 Adam 优化算法,还得处理 β1\beta_1β1, β2\beta_2β2 和 ε\varepsilonε. 同时还得选择层数, 每一层隐藏单元的数量, mini-batch 大小, 甚至如果还要使用学习率衰减.
其中学习速率 α\alphaα 是最优先调试的超参数. mini-batch 大小与隐藏单元次之. 而 Momentum 的参数 β\betaβ 通常使用默认值 0.9, Adam 的参数 β1\beta_1β1, β2\beta_2β2 和 ε\varepsilonε 通常不进行调试, 使用默认的 0.9, 0.999 和 10−810^{-8}10−8.
参数选择有以下一些方法:
-
随机选择点. 例如现在有 α\alphaα 与 Adam 的 ε\varepsilonε 两个超参数要调试. 在更早的机器学习算法中, 常见的是在网格中等距离取样. 现在更推荐随机选择. 在参数取值范围内随机选择若干点, 可以发现哪个超参数更重要, 影响更大.
-
由粗糙到精细的策略. 由1, 发现在某个点效果最好, 可以预测在该点附近效果也很好, 于是放大这块区域, 更密集地取值.
-
随机选择点时, 有些参数不适合均匀(在线性轴上)的随机选择. 例如 α\alphaα, 我们希望其在对数轴上随机取点(0.0001, 0.001, 0.01, 0.1, 1), 我们可以
a = 10**(-4*np.random.rand())
, 即可得到 a∈[10−4,100]a \isin [10^{-4}, 10^0]a∈[10−4,100].
Batch 归一化(Batch Norm)
训练 Logistic 回归时, 归一化 X 可以加快学习过程. 现在我们希望对隐藏层的 A 行归一化. 吴恩达老师介绍的版本是归一化 Z, 也有学者认为应该归一化 A.
我们对每一层的z, a 做如下操作:
μ=1m∑iz(i)σ2=1m∑i(z(i)−μ)2znorm(i)=z(i)−μσ2+εz~(i)=γznorm(i)+β \mu = \frac{1}{m} \sum_i z^{(i)} \\ \sigma^2 = \frac{1}{m} \sum_i (z^{(i)} - \mu)^2 \\ z_{\text{norm}}^{(i)} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \varepsilon}} \\ \widetilde{z}^{(i)} = \gamma z_{\text{norm}}^{(i)} + \beta μ=m1i∑z(i)σ2=m1i∑(z(i)−μ)2znorm(i)=σ2+εz(i)−μz(i)=γznorm(i)+β
(ε\varepsilonε是为了防止分母为0.)
znormz_{\text{norm}}znorm 就是标准化的 zzz, 平均值为0, 方差为1. 当希望均值, 方差不是0和1时, 计算 z~\widetilde{z}z.
γ\gammaγ 与 β\betaβ 的作用是随意设置 z~(i)\widetilde{z}^{(i)}z(i) 的平均值. 当A=σ2+εA = \sqrt{\sigma^2+\varepsilon}A=σ2+ε 且 B=μB = \muB=μ 时, z~(i)=z(i)\widetilde{z}^{(i)} = z^{(i)}z(i)=z(i). γ\gammaγ 与 β\betaβ是模型的学习参数, 梯度下降时会像更新神经网络的权重一样更新 γ\gammaγ 和 β\betaβ.
使用该方法时, 参数 w 和 b 中的 b 可以不设立, 毕竟 b 总是会被归一化减去. 于是参数只剩下了 www, β\betaβ, γ\gammaγ.
Batch 归一化减少了输入值改变的问题, 它的确使这些值变得更稳定, 它减弱了前层参数的作用与后层参数的作用之间的联系, 它使得网络每层都可以自己学习, 稍稍独立于其它层, 有助于加速整个网络的学习.
另外, 每个 mini-batch 子数据集的均值和方差均有一些噪音, 而 Batch 归一化将 zzz 缩放到 z~\widetilde{z}z 的过程也有噪音, 因此有轻微的正则化效果.
在测试时, 我们很可能只想测一个样本, 此时均值 μ\muμ 和方差 σ\sigmaσ 没有意义. 因此我们要使用估算的 μ\muμ 和 σ\sigmaσ 进行测试. 估算方法很多, 通常运用指数加权平均来追踪在训练过程中的 μ\muμ 和 σ\sigmaσ. 还可以用指数加权平均.
Softmax 回归
类似 Logistic 回归, 但 Softmax 回归能识别多个分类. 因此 y^\hat{y}y^ 是 C×1 维的向量, 给出 C 个分类的概率,所有概率加起来应该为1.
在神经网络的最后一层, 我们像往常一样计算各层的线性部分, 当计算了 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] 之后, 使用 Softmax 激活函数.
ai[L]=ezi[L]∑j=14ezi[L] a^{[L]}_i = \frac{e^{z^{[L]}_i}}{\sum_{j=1}^{4} e^{z^{[L]}_i}} ai[L]=∑j=14ezi[L]ezi[L]
Softmax 分类中, 一般使用的损失函数及反向传播的导数是
L(y^,y)=−∑j=1nyjlog y^jJ(w[1],b[1],...)=1m∑i=1mL(y^(i),y(i))∂J∂z[L]=y^−y L(\hat{y}, y) = -\sum_{j=1}^{n}y_j \text{log } \hat{y}_j \\ J(w^{[1]}, b^{[1]}, ...) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)}) \\ \frac{\partial J}{\partial z^{[L]}} = \hat{y} - y L(y^,y)=−j=1∑nyjlog y^jJ(w[1],b[1],...)=m1i=1∑mL(y^(i),y(i))∂z[L]∂J=y^−y
Softmax 给出的是每个分类的概率. 而对应的 Hardmax 则是将最大的元素输出为 1, 其余元素置 0.