0%

Coursera Deep Learning笔记 超参数调试 Batch归一化 Softmax

调试(Tuning)

深度学习要处理很多参数, 从学习速率 \(\alpha\) 到 Momentum 的参数 \(\beta\), 若使用 Adam 优化算法,还得处理 \(\beta_1\), \(\beta_2\)\(\varepsilon\). 同时还得选择层数, 每一层隐藏单元的数量, mini-batch 大小, 甚至如果还要使用学习率衰减.

其中学习速率 \(\alpha\) 是最优先调试的超参数. mini-batch 大小与隐藏单元次之. 而 Momentum 的参数 \(\beta\) 通常使用默认值 0.9, Adam 的参数 \(\beta_1\), \(\beta_2\)\(\varepsilon\) 通常不进行调试, 使用默认的 0.9, 0.999 和 \(10^{-8}\).

参数选择有以下一些方法: 1. 随机选择点. 例如现在有 \(\alpha\) 与 Adam 的 \(\varepsilon\) 两个超参数要调试. 在更早的机器学习算法中, 常见的是在网格中等距离取样. 现在更推荐随机选择. 在参数取值范围内随机选择若干点, 可以发现哪个超参数更重要, 影响更大.

  1. 由粗糙到精细的策略. 由1, 发现在某个点效果最好, 可以预测在该点附近效果也很好, 于是放大这块区域, 更密集地取值.

  2. 随机选择点时, 有些参数不适合均匀(在线性轴上)的随机选择. 例如 \(\alpha\), 我们希望其在对数轴上随机取点(0.0001, 0.001, 0.01, 0.1, 1), 我们可以 a = 10**(-4*np.random.rand()), 即可得到 \(a \isin [10^{-4}, 10^0]\).

Batch 归一化(Batch Norm)

训练 Logistic 回归时, 归一化 X 可以加快学习过程. 现在我们希望对隐藏层的 A 行归一化. 吴恩达老师介绍的版本是归一化 Z, 也有学者认为应该归一化 A.

我们对每一层的z, a 做如下操作:

\[ \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 \]

(\(\varepsilon\)是为了防止分母为0.)

\(z_{\text{norm}}\) 就是标准化的 \(z\), 平均值为0, 方差为1. 当希望均值, 方差不是0和1时, 计算 \(\widetilde{z}\).

\(\gamma\)\(\beta\) 的作用是随意设置 \(\widetilde{z}^{(i)}\) 的平均值. 当\(A = \sqrt{\sigma^2+\varepsilon}\)\(B = \mu\) 时, \(\widetilde{z}^{(i)} = z^{(i)}\). \(\gamma\)\(\beta\)是模型的学习参数, 梯度下降时会像更新神经网络的权重一样更新 \(\gamma\)\(\beta\).

使用该方法时, 参数 w 和 b 中的 b 可以不设立, 毕竟 b 总是会被归一化减去. 于是参数只剩下了 \(w\), \(\beta\), \(\gamma\).

Batch 归一化减少了输入值改变的问题, 它的确使这些值变得更稳定, 它减弱了前层参数的作用与后层参数的作用之间的联系, 它使得网络每层都可以自己学习, 稍稍独立于其它层, 有助于加速整个网络的学习.

另外, 每个 mini-batch 子数据集的均值和方差均有一些噪音, 而 Batch 归一化将 \(z\) 缩放到 \(\widetilde{z}\) 的过程也有噪音, 因此有轻微的正则化效果.

在测试时, 我们很可能只想测一个样本, 此时均值 \(\mu\) 和方差 \(\sigma\) 没有意义. 因此我们要使用估算的 \(\mu\)\(\sigma\) 进行测试. 估算方法很多, 通常运用指数加权平均来追踪在训练过程中的 \(\mu\)\(\sigma\). 还可以用指数加权平均.

Softmax 回归

类似 Logistic 回归, 但 Softmax 回归能识别多个分类. 因此 \(\hat{y}\) 是 C×1 维的向量, 给出 C 个分类的概率,所有概率加起来应该为1.

在神经网络的最后一层, 我们像往常一样计算各层的线性部分, 当计算了 \(z^{[L]} = W^{[L]}a^{[L-1]}+b^{[L]}\) 之后, 使用 Softmax 激活函数.

\[ a^{[L]}_i = \frac{e^{z^{[L]}_i}}{\sum_{j=1}^{4} e^{z^{[L]}_i}} \]

Softmax 分类中, 一般使用的损失函数及反向传播的导数是

\[ 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 \]

Softmax 给出的是每个分类的概率. 而对应的 Hardmax 则是将最大的元素输出为 1, 其余元素置 0.