分享一些指导原则,一些关于如何系统地组织超参调试过程的技巧。 从下到上越来越参数重要 纵横轴分别为一个超级参数,这里是为了探究俩个超级参数哪个影响更大;,假设超参数 1 是𝑎(学习速率),取一个极端的例子,假设超参数 2 是 Adam算法中,分母中的𝜀。在这种情况下,𝑎的取值很重要,而𝜀取值则无关紧要。如果你在网格中取点,接着,你试验了𝑎的 5 个取值,那你会发现,无论𝜀取何值,结果基本上都是一样的。所以,你知道共有 25 种模型,但进行试验的𝑎值只有 5 个,我认为这是很重要的。 而如果是三个超级参数,那就是一个立方体了。实践中,你搜索的可能不止三个超参数有时很难预知,哪个是最重要的超参数,对于你的具体应用而言,随机取值而不是网格取值表明,你探究了更多重要超参数的潜在值,无论结果是什么。 当你给超参数取值时,另一个惯例是采用由粗糙到精细的策略。 比如在二维的那个例子中,你进行了取值,也许你会发现效果最好的某个点,也许这个点周围的其他一些点效果也很好,那在接下来要做的是放大这块小区域(小蓝色方框内),然后在其中更密集得取值或随机取值,聚集更多的资源,在这个蓝色的方格中搜索,如果你怀疑这些超参数在这个区域的最优结果,那在整个的方格中进行粗略搜索后,你会知道接下来应该聚焦到更小的方格中。在更小的方格中,你可以更密集得取点。所以这种从粗到细的搜索也经常使用。 通过试验超参数的不同取值,你可以选择对训练集目标而言的最优值,或对于开发集而言的最优值,或在超参搜索过程中你最想优化的东西。 另一个关键点是随机取值和精确搜索,考虑使用由粗糙到精细的搜索过程。
随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺,用于探究这些超参数,这很重要。 ,假设你在搜索超参数α,因为对于其如果最小为0.00001到1中间找合适值,这个时候用对数坐标更好,不然有90%的落在了0.1到1,看上去资源不太对。更常见的情况是,如果你在10𝑎和10𝑏之间取值,你要做的就是在[𝑎, 𝑏]区间随机均匀地给𝑟取值,这个例子中𝑟 ∈ [−4,0],然后你可以设置𝑎的值,基于随机取样的超参数𝑎 = 10^r. 另一个棘手的例子是给𝛽 取值,用于计算指数的加权平均值。假设你认为𝛽是 0.9到 0.999 之间的某个值,也许这就是你想搜索的范围。考虑这个问题最好的方法就是,我们要探 究的是1 − 𝛽,此值在 0.1 到 0.001 区间内,所以我们会给1 − 𝛽取值,大概是从 0.1 到 0.001,这里我们把大值写在了前面,小值写在了后面,与前面的不同,所以你要做的就是在[−3, −1]里随机均匀的给 r 取值。你设定了1 − 𝛽 = 10𝑟,所以𝛽 = 1 − 10𝑟,然后这就变成了在特定的选择范围内超参数随机取值。希望用这种方式得到想要的结果,你在 0.9 到 0.99 区间探究的资源,和在 0.99 到0.999 区间探究的一样多。 对于β,当他越接近于1越敏感;在0.9-0.9005之间取值,无关紧要,结果基本不发生变化;但𝛽值如果在 0.999 到 0.9995 之间,这会对你的算法产生巨大影响,因为 希望能帮助你选择合适的标尺,来给超参数取值。
关于如何组织你的超参数搜索过程。 深度学习领域中,发展很好的一点是,不同应用领域的人们会阅读越来越多其它研究领域的文章,跨领域去寻找灵感。 假如你只研究一个问题,并且得到了很好的参数,但是几个月后,最好还是再重新测试或评估一下参数,因为可能你的数据变多了,什么的。 关于如何搜索超参数的问题,大概两种重要的思想流派或人们通常采用的两种重要但不同的方式: 一种是你照看一个模型,通常是有庞大的数据组,但没有许多计算资源或足够的 CPU 和GPU 的前提下,基本而言,你只可以一次负担起试验一个模型或一小批模型,在这种情况下,即使当它在试验时,你也可以逐渐改良。像这样,但你可以说是在每天花时间照看此模型,即使是它在许多天或许多星期的试验过程中。所以这是一个人们照料一个模型的方法,观察它的表现, 耐心地调试学习率,但那通常是因为你没有足够的计算能力,不能在同一时间试验大量模型时才采取的办法。 另一种方法则是同时试验多种模型,你设置了一些超参数,尽管让它自己运行,或者是 一天甚至多天,然后你会获得像这样的学习曲线,这可以是损失函数 J 或实验误差或损失或数据误差的损失,但都是你曲线轨迹的度量。用这种方式你可以试 验许多不同的参数设定,然后只是最后快速选择工作效果最好的那个。在这个例子中,也许 这条看起来是最好的(下方绿色曲线)。这两种方式的选择,是由你拥有的计算资源决定的,如果你拥有足够的计算机去平行试验许多模型,那绝对采用鱼子酱方式。
Batch归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好,也会是你的训练更加容易,甚至是深层网络。 Batch归一化的作用是,对a值归一化,但严格来说是对z归一化。你应用 Batch 归一化了一些隐藏单元值中的平均值和方差,不过训练输入和这些隐藏单元值的一个区别是,你也许不想隐藏单元值必须是平均值 0 和方差 1,即通过控制γ、β的值可以控制平均值和方差,使隐藏单元值的均值和方差标准化。
但 Batch 归一化的做法是将𝑧[1]值进行 Batch 归一化,简称 BN 之后a=g(z~),BN发生在z和a之间,它的引入的β与超参没有关系,β和γ可用优化算法来优化,在BN与mini-batch一起使用时并二者通常一起使用,可先减去b或置0不影响。 所以现在,引入的β和γ这是你算法的新参数,接下来你可以使用想用的任何一种优化算法,比如使用梯度下降法来执行它。举个例子,对于给定层,你会计算𝑑𝛽[𝑙],接着更新参数𝛽为𝛽[𝑙] = 𝛽[𝑙] − 𝛼𝑑𝛽[𝑙]。你也可以使用 Adam 或 RMSprop 或 Momentum,以更新参数𝛽和𝛾,并不是只应用梯度下降法。
与mini-batch一起使用时细节:它要看这个 mini-batch,先将𝑧[𝑙]归一化,结果为均值 0 和标准方差,再由𝛽和𝛾重缩放,但这意味着,无论𝑏[𝑙]的值是多少,都是要被减去的,因为在 Batch 归一化的过程中,你要计算𝑧[𝑙]的均值,再减去平均值,在此例中的 mini-batch 中增加任何常数,数值都不会改变,因为加上的任何常数都将会被均值减去所抵消。所以,如果你在使用 Batch 归一化,其实你可以消除这个参数(𝑏[𝑙]),或者你也可以, 暂时把它设置为 0总结一下,因为 Batch 归一化超过了此层𝑧[𝑙]的均值,𝑏[𝑙]这个参数没有意义,所以,你必须去掉它,由𝛽[𝑙]代替,这是个控制参数,会影响转移或偏置条件。
第一: 正如前面解释的为什么输入归一化加速学习,BN对隐藏层的也是如此。 第二: 它可以使权重比你的网络更滞后或更深层。(不是太懂这个好处。)Batch 归一化做的,是它减少了这些隐藏值分布变化的数量。减少了输入值改变的问题,它的确使这些值变得更稳定。,重点是 Batch 归一化的意思是,尤其从神经网络后层之一的角度而言,前层不会左右移动的那么多,因为它们被同样的均值和方差所限制,所以,这会使得后层的学习工作变得更容易些。 第三: 它有轻微的正则化效果。 也许另一个轻微非直观的效果是,如果你应用了较大的 mini-batch,因此减少了噪声,也减少了正则化的效果。这是 dropout 的一个奇怪的性质,就是应用较大的 mini-batch 可以减少正则化效果。 第四: Batch 归一化一次只能处理一个 mini-batch 数据,它在 mini-batch 上计算均值和方差。所以测试时,你试图做出预测,试着评估神经网络,你也许没有mini-batch 的例子,你也许一次只能进行一个简单的例子,所以测试时,你需要做一些不同的东西以确保你的预测有意义。
Batch 归一化将你的数据以 mini-batch 的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理。
我们将建立一个神经网络,输出层有 4 个,或者说𝐶个输出单元,因 此𝑛,即输出层也就是𝐿层的单元数量,等于 4,或者一般而言等于𝐶,因此这里y^是一个4*1的向量。 根据图的输出层,就是第一个的可能为84.2%,第二个为4.2%…等归一化,就需要输入一个向量,最后输出一个向量。
下面是 Softmax 分类器可以代表的决策边界的例子。
Softmax 这个名称的来源是与所谓 hardmax 对比,hardmax会使输出变量变为只有一个1,其他都是0的输出,而相反,Softmax 所做的从𝑧到这些概率的映射更为温和,使输出推广到C类,当C=2时,就变回了logistic回归。 Softmax分类器常用的损失函数:
损失函数所做的就是它找到你的训练集中的真实类别,然后试图使该类别相 应的概率尽可能地高。 整体训练集损失: 最后的一个细节: 因为C=4,对m个样本: 最后,梯度下降法的实现: 然后就可以开始反向传播的过程了。
