美文网首页工作生活
《改善深层神经网络:超参数调试、正则化以及优化》笔记(3)

《改善深层神经网络:超参数调试、正则化以及优化》笔记(3)

作者: wipping的技术小栈 | 来源:发表于2019-07-07 20:48 被阅读0次

    前言

    这一课主要讲述简单的超参搜索和batch normolize的使用方法及其作用,接着会介绍另外一种激活函数softmax。内容不多,如果笔者所言有错之初,还请各位读者海涵指正

    一、超参搜索

    1.1、搜索方式

    超参搜索有网络所有和随机搜索

    网格搜索是指在所有候选的参数选择中,通过循环遍历尝试每一种可能性,表现最好的参数就是最终的结果。

    举个例子,加入中有两个超参数,每个超参数有 3 个待探索的值,对它们进行笛卡尔积后得到 9 个超参数组合,通过网格搜索使用每种组合来训练模型,并在验证集上挑选出最好的超参数。如图所示,这种方法往往根据不同种类列出表格,并在表格内循环遍历搜索,因此称为网格搜索。

    网格搜索算法思路及实现方式都很简单,但经过笛卡尔积组合后会扩大搜索空间,并且在存在某种不重要的超参数的情况下,网格搜索会浪费大量的时间及空间做无用功,因此它只适用于超参数数量小的情况。

    网络搜索简单来说就是排列组合所有可能的超参值,逐个逐个去试,找出最优的情况

    随机搜索:随机选择超参的数值,对不同的数值训练出来的性能进行比较,选出优质的数值。一般我们会选粗略地找出一个区域是比较好的,然后在这个区域内详细的查找那个最优的超参值,也就是先粗选后精选

    1.2、参数范围

    参数的范围选择有几种方式:

    • 线性尺度(网络):也就是比较普通的递增,这类参数比较均匀分布,比如隐藏单元数量,隐藏层数量等
    • 对数尺度:如果超参的分布有数量级的差别,需要考虑使用对数来降低超参的范围,比如动量梯度下降的\beta值、学习率等

    1.3、超参搜索思路

    搜索超参的思路:

    • 手动观察模型并调参,pandas方法
    • 同时实验多个模型,对比不同的模型参数:caviar方法

    二、batch归一化

    batch归一化有利于我们学习出更好、更稳健的参数

    2.1、步骤

    1. 计算平均值
      u = \frac{1}{m}\sum_{i}z_i
    2. 计算方差
      \sigma^2 = \frac{1}{m}\sum_{i}(z_i - u)^2
    3. Z值标准化
      z_{norm}^{(i)} = \frac{z_i - u}{\sqrt{\sigma^2 + \epsilon}}
    4. 计算\tilde{z}
      \tilde{z} = \gamma*z_{norm}^{(i)} + \beta

    其中\gamma \beta为超参,\gamma相当于\sqrt{\sigma^2 + \epsilon},而u相当于\beta\beta\gamma的维度也是(n^i, 1),也就是和对应层输出 Z 的维度一样

    为什么我们要加入\beta\gamma这2个参数呢?
    如果我们将z直接归一化,那么z会在很小的区间范围内,比如[0, 1],这样的区间会使你使用sigmoid函数时,激活函数在线性区间,这样会降低模型的拟合程度,那么我们加入\beta\gamma是为了能够更好的控制归一化后,也就是\tilde z的区间,即避免让数据聚堆。我们可以通过控制\beta\gamma来控制输入数据的分布,我们通过学习\beta\gamma后,可以将\tilde z控制在我们的学习效果最好的区间内

    总结batch归一化的过程:
    x \Rightarrow z_i \Rightarrow \tilde{z_i} \Rightarrow a_i

    batch归一化通常和mini-batch一起使用
    l在使用batch归一化后,参数 b 可以去掉,因为参数 b 可以被归纳进归一化参数\beta中进行学习

    加入batch归一化的训练步骤:

    1. 前向计算出
      z_i = w_i * x \\ z_{norm}^{(i)} = \frac{z_i - u}{\sqrt{\sigma^2 + \epsilon}} \\ \tilde{z_i} =z_{norm}^{(i)} * γ + β \\

    2. 使用\tilde{z_i}计算a_i,在后向计算出dw,d\beta,d \gamma

    3. 使用学习率更新参数

    2.2 batch归一化理解:

    训练集和测试集的X样本分布发生改变,但标签Y不变称为Covariate shift

    数据集

    在上图左边训练好模型,应用于上图右边的数据集,可能不会有很好的效果,因为发生了Covariate shift。对于这种情况,如果实际应用的样本与训练样本分布不同,即发生了covariate shift,则一般是要对模型重新进行训练的

    视频中说:从第三层看来,输入数据发生了Covariate shift,这是为什么呢?
    我们观察前面Covariate shift的定义,就知道是测试集和训练集的数据分布不同,但标签一样,说的抽象一点,就是数据X的分布不同,但映射到的输出Y是一样的,那么在第三层看来。假设我们在2轮迭代中输入了同一个X_i,那么输入Y_i都是一样。假设有参数w_2,b_2,w_1,b_1,这些参数在 2 轮迭代会变化,导致第三层的输入a_2在2轮的迭代中的数值不一样,但是我们的标签Y都是一样,所以发生了Covariate shift了

    batch normolize可以有效解决Covariate shift

    为什么batch normolize可以优化Covariate shift呢?

    1. 第一层的输入数据通过BN,我们的数据集分布更加均匀,接着我们对每一层的输出进行BN,可以让每一层输入数据控制在一定的区间内,不会进行大幅度的"漂移"
    2. 这样做可以让对应层独立于其他层次的输入,降低前一层的影响,对应层的参数也就更加稳健,不会因Covariate shift而产生无法拟合的情况。

    总结:batch归一化限制了 前面层的参数更新 影响 输入数据数值分布 的程度

    拿上面黑猫和彩色猫的例子,通过BN,我们可以将图片的像素值控制在一个更加广泛的区间以内,而通过学习这个区间内的参数,让模型可以更加好的适应其他的数据。笔者感性的认识是我们假定有一种颜色x色(暂且理解为另一种颜色空间的表达),那么我们是将黑色跟彩色映射到这个x色上,然后听过学习这种颜色的像素值分布来改变参数。因为加入只学习黑色,那么像素值的区间会非常的小,因为黑色的像素值是0,如果我们能过将黑色像素值给扩展到更大的范围,那么我们对其他颜色的图片拟合程度就会更大一点。当然这是笔者的粗浅理解,如果有错误还请指正

    BN的正则化效果:对于每一个mini-batch,BN只是计算该mini-batch的方差和均值,所以带有一定的噪声。在缩放z的过程中也会给隐藏单元带入一定的噪声,降低隐藏单元之间的依赖性,这样就带有轻微的正则化效果,防止过拟合

    dropout可以通过增大mini-batch的大小来降低正则化效果

    测试集是如何进行BN?
    我们在进行测试的时候一次性进行多个数据的计算,比如我们的训练集有2048个数据,我们测试时是对每一个数据进行计算的。且对每一层我们都需要计算 u\sigma,那么在计算测试集数据 的时候需要将每个数据的u\sigma进行一次平均,那么我们可以使用加权指数平均数来进行迭代,从而得到我们想要的平均数。

    总结一下:在训练时,u\sigma都是在mini-batch上训练出来的,但在测试时,我们需要对每个样本进行逐一处理,这样对u\sigma的计算方式就和训练时不同,所以我们使用指数加权平均来计算测试集的u\sigma

    三、softmax

    softmax是一种激活函数,可以将二分类模型推广到多分类模型

    3.1、softmax计算方式

    1. 计算Z^{[l]}
      Z^{[l]} = W^{[l]}a^{[L-1]} + b^{[l]}
    2. 计算临时变量 t
      t = e^{Z^{[l]}}
    3. 计算a^{[l]}
      a^{[l]} = \frac{e^{Z^{[l]}}}{\sum_{i=1}^{C}t_i} = \frac{t_i}{\sum_{i=1}^{C}t_i}
      其中 C 表示类的数量,视频中一共是有 4 个类,大写L代表的是最后一层的,Z^{[l]}ta^{[l]}的维度是一样的。

    一般在网络的输出层我们会使用softmax激活函数,其输出的是某个类的概率

    3.2、softmax后向传播

    使用softmax后输出不再的一个,而是多个输出,那么此时我们需要使用另外一个损失函数,称之为交叉熵
    L(\hat y, y) = a\sum^{C}_{j=1}y_j \log(\hat y_j) \\ J(w^{[1]},b^{[1]},\cdots) = \frac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)}, y^{(i)})

    因为对数logx的性质,当x小于1时是负数,再用上负号就变成了正数,当概率x越小的时候,损失越大。所以梯度下降需要减小损失就会把模型往概率搞的方向学习

    在使用softmax后,我们需要对最后一层的 z 值导数进行求导,而这里我们直接给出公式,有需要的朋友可以在链接中找到推导方法,推导过程不难,各位读者可以一试
    \frac{dL(\hat y, y)}{dz^{[L]}} = \hat y - y

    参考附录

    吴恩达《优化深度神经网络》课程笔记:http://redstonewill.com/1101/
    softmax函数以及相关求导过程:https://www.jianshu.com/p/ffa51250ba2e
    batch归一化:https://blog.csdn.net/u010132497/article/details/79793059
    Batch Normalization:https://www.cnblogs.com/cloud-ken/p/7751413.html

    相关文章

      网友评论

        本文标题:《改善深层神经网络:超参数调试、正则化以及优化》笔记(3)

        本文链接:https://www.haomeiwen.com/subject/zfedhctx.html