美文网首页神经网络
【第二周笔记】正则化及深度学习的应用

【第二周笔记】正则化及深度学习的应用

作者: 慎独墨写 | 来源:发表于2019-02-27 19:49 被阅读0次

    第一节 深度学习的实用层面

    一、训练开发测试集

    应用机器学习是一个高度迭代的过程

    Data 数据一般被分成以下三类:

    • 训练集 -

    • 交叉验证集

    • 测试集

    在训练集上训练数据,在交叉验证集检验选出效果最好的模型,在测试集上进行无偏评估。

    当数据不多的时候,一般把数据按照70/0/30分或者60/20/20分。

    但是数据过多的时候,dev集和test集有10000条左右就可以了,所以98/1/1的分配或者99.5/0.4/0.1的分配也是可以的。

    交叉验证集和测试集要来自于同一个分布

    二、偏差和方差

    1.偏差:bias && 方差:variance

    欠拟合和过拟合

    以上三种是欠拟合适度、和过拟合的情况。

    假设人眼辨别的错误率0% 或贝叶斯误差趋近于0%

    贝叶斯误差(bayes error rate) 是指在现有特征集上,任意可以基于特征输入进行随机输出的分类器所能达到最小误差。也可以叫做最小误差。

    理解偏差和方差

    在上图的情况下,train set error低而dev set error高,就是高方差现象,通常意味着过拟合。如果train set error和dev set error高,但是数值趋近,那么意味着偏差比较高,欠拟合的情况可能会出现。最糟糕的情况是高方差+高偏差,这意味着数据拟合程度不高,而在特殊的位置因为曲线过于灵活而出现了过拟合。

    如果贝叶斯误差接近15%而train set error 也在15%左右,那么相比而言偏差和方差都不高。

    2.如何解决机器学习中高偏差和高方差的问题:

    解决高偏差和高方差问题

    三、正则化Regularization

    1.逻辑回归的正则化

    以逻辑回归的cost function函数为例:
    J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) = - \frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

    我们通过调整w,b以寻找​的最小值,其中​在逻辑回归的cost function中加入正则化

    J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) + \frac{\lambda}{2m} \|w\|_{2}^{2}

    其中​\|w\|_{2}^{2}=w^{\top}w

    上述方法叫做L2正则化,因为用到了二阶范数。

    为什么只对w做正则化,而不对b正则化呢?

    原因:也可以对b做正则化,因为w通常是一个高维参数矢量,已经可以表达高偏差问题,w几乎涵盖所有参数而b只是一个变量,因此b的影响不大。

    J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) + \frac{\lambda}{m} \|w\|_{1}
    上述是L1正则化,使用了一阶范数。如果使用L1正则化,则w最终是稀疏的(有很多0),据说可以压缩模型(实际影响不大)。

    λ是正则化参数,一般使用dev set或者交叉验证集来调整λ。

    2.神经网络的正则化
    J(w^{[1]},b^{[1]},\dots,w^{[l]},b^{[l]}) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) + \frac{\lambda}{2m} \sum_{l=1}^{L} \|w^{[l]}\|_{F}^{2}
    \|w^{[l]}\|_{F}^{2}被称作Frobenius norm
    \|w^{[l]}\|_{F}^{2} = \sum_{i=1}^{n^{[l-1]}} \sum_{i=1}^{n^{[l]}} (w_{ij}^{[l]})^2
    其中w的维度是​分别指各层隐藏单元的数量。

    我们将正则化的使用折射到是算法中,当我们通过反向传播算出\mathbf{d}w^{[l]}后,将\mathbf{d}w^{[l]} := \mathbf{d}w^{[l]} + \frac{\lambda}{m} w^{[l]},再对w^{[l]}通过学习率进行更新。L2正则化通常被称作“weight decay权重衰减,因为在更新w^{[l]}的过程中,相当于对w^{[l]}乘以了1-\alpha \frac {\lambda}{m}的权重。

    3.L2正则化的原理

    减少隐藏单元的影响

    如果正则化参数λ增大,则激活函数的参数w^{[l]}会相对小,因为代价函数中的参数变大了。由于z^{[l]}= w^{[l]} a^{[l-1]}+b^{[l]}, z^{[l]} 也会很小,而在接近于0的区间内,激活函数基本呈线性,神经网络会被简化,不易发生过拟合。

    4.Dropout随机失活

    反向随机失活(Inverted Dropout)

    dropout

    以一个三层的神经网络为例:

    定义向量d d3表示一个三层的dropout向量

    d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep-prob

    keep-prob 表示保留某个隐藏单元的概率

    如果keep-prob=0.8的话,意味着每个隐藏单元在d3中对应值为1的概率都是0.8,为0的概率为0.2

    从第三层中获取激活函数,a3包含激活函数

    a3 = np.mulitply(a3,d3),过滤d3中所有等于0的元素,乘法运算把d3中相应元素置0

    a3 /= keep-prob 确保a3的期望值不变

    Dropout的原理:压缩权重+完成一些预防过拟合的外层正则化

    在使用中,如果某一层不必考虑过拟合的问题,那么可以设置keep-prob为1,这意味着在本层不筛除任何节点。

    Dropout一般在计算机视觉领域使用较多,因为缺乏数据等原因,更易出现过拟合。在不出现过拟合的情况下,并没有使用dropout的必要。

    5.其他正则化方法

    图片:水平翻转图片+裁剪图片

    光学字符识别(OCR):旋转或扭曲数字

    Early Stopping :

    在绘制train set error的同时绘制dev set error,dev set error通常先减少后递增。early stopping要做的是在中间点停止迭代过程。它的缺点是:提早停止迭代有可能会使代价函数的优化不彻底。

    四、归一化输入

    零均值化:

    \mu = \frac {1}{m} \sum_{i=1}^mx^{(i)}

    x := x - \mu

    归一化方差:

    \sigma^2 = \frac{1}{m} \sum_{i=1}^m x^{(i)} **2 (**表示结点y的平方)

    x/= \sigma^2

    当特征在相似的范围内,便于优化

    归一化

    五、梯度爆炸和梯度消失

    1.梯度爆炸和梯度消失

    为什么会出现梯度消失的现象呢?因为通常神经网络所用的激活函数是sigmoid函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是f′(x)=f(x)(1−f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失

    那么什么是梯度爆炸呢?梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。

    解决方式:我们要保证将权重的初始值赋值近似于1。例如对各个权重矩阵赋值时乘以一个超参数进行调节。

    例如:对于ReLU函数 每个权重矩阵* \sqrt{\frac{2}{n^{[l-1]}}}

    对于tanh函数 每个权重矩阵* \sqrt{\frac{1}{n^{[l-1]}}} (Xavier Initiation)或者 * \sqrt{\frac{2}{n^{[l-1]}+n^{[l]}}}

    2.梯度检验 :采取双边检测

    将所有参数reshape成一个大的向量

    for each i:

    \mathbb{d}\theta_{appor}[i] = \frac{J(\theta_{1},\theta_{2},\dots,\theta_{i}+\epsilon,\dots)-J(\theta_{1},\theta_{2},\dots,\theta_{i}-\epsilon,\dots)}{2\epsilon}

    check \frac {\|\mathbb{d}\theta_{appor}-\mathbb{d}\theta\|_{2}}{\|\mathbb{d}\theta_{appor}\|_{2}+ {\|\mathbb{d}\theta\|}_{2}} \approx 10^{-7} -great

    其中\epsilon = 10^{-7}

    梯度检测的使用:

    • 用于debug而不是训练

    • 如果差距大,检查各个元素来看bug在哪里

    • 正则化

    • 不可与dropout一起使用

    • (随机初始化)

    Reference:
    梯度消失和梯度爆炸部分参考了下列文章。如果想要更详细地了解的话推荐阅读。
    [1]https://blog.csdn.net/qq_25737169/article/details/78847691
    [2]https://blog.csdn.net/weixin_37933986/article/details/69255863

    相关文章

      网友评论

        本文标题:【第二周笔记】正则化及深度学习的应用

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