zoukankan      html  css  js  c++  java
  • Andrew Ng

    ===========第1周 机器学习的实用层面================

    ===1.1 训练/开发/测试===

    早期机器学习时代(数据规模较小),如果不需要dev set,常见的划分有 70%/30% 的训练/测试 划分,如果需要验证集,常见的是 60%/20%/20%划分

    在big data era,由于数据集非常大,test和dev的占比通常变得更小,因为dev set的目的就是检测哪个算法更有效,所以dev集只需要big enough for you to evaluate 不同算法,比如你有100million数据,使用1万data作为dev集is more than enough,test集也是一样。

    MAKE SURE the dev and test sets come from the same distribution

    In practice,有时没有/不需要test set,很多人会直接把train/dev划分称为 train/test划分,Andrew认为这是不严谨的

    ===1.2 偏差(Bias) / 方差(Variance)===

    High Bias:欠拟合

    High Variance: 过拟合

    举个例子,以错误率为例,train/dev:1%/11%(高方差,过拟合),15%/16%(高偏差,欠拟合),15%/30%(高偏差+高方差,欠拟合)

    ===1.3 机器学习基础===

    在现代的deep learning,只要bigger network & more data & 合适的其他设置如regulation等,在降低偏差的同时通常可以同时 降低/不伤害 方差,反之亦然。这也是为什么在深度学习中我们不用太关注Bias-Variance trade-off 的原因,Andrew认为这也是deep火起来的一个原因。

    ===1.4 正则化===

    以logistic regression为例,我通常只加对W的L2正则项,不加b的正则项目(加不加影响不大),因为W通常是很高维的,高偏差问题主要和它有关,we aren't fitting all the parameters well

    L1 norm可以使模型更sparse,有人认为这有利于降低存储模型的存储空间,但in practice,我发现L1 norm可以使模型稀疏,但其实并没有降低太多存储内存,所以我不认为L1的目的是为了压缩模型。我在实践中喜欢L2 norm。

    对矩阵的L2正则化叫做 Frobenious norm,而不叫 L2 norm,|| W ||^2

    在对于的BP过程中,dW要额外加一项,你可以看到这也是为什么L2 regularization 被称为i weight decay

    ===1.5 正则化为什么可以减少过拟合===

    直观上来感受,以一个多层神经网络和L2 正则化为例,通过控制正则化参数lambda,它相当于消除,实践中更准确的说是降低了许多神经元unit的影响,从而simpler the network。

    另一个直观例子,假设激活函数为tanh(),在靠近0周围的部分近似线性,而两边是非线性的,正则化使得W值变小,W乘以上一层输入得到的值也变小了,就会集中在线性区。

    ===1.6 dropout正则化===

    反向随机失活 inverted dropout,记得在 a = (a*mask) / keep_prop

     ===1.7 理解dropout===

    dropout相当于降低了模型复杂度

    Intuition: 依然以网络结构为例,不能依赖any one feature(也就是,给某一个输入节点赋予过大的权重),因为任何feature都有可能被drop,so have to spread the weights,利用绝大部分特征。

    类似L2正则化,dropout通常会产生一个效果,即 shrinking the squared norm of the weights,并且does some outer regularization。甚至更适用于不同scale的输入范围。

    根据不同层可能过拟合的程度,不同层可以设置不同的keep_prop,缺点是交叉验证选参数代价大。一直替代的方法是对所有层,keep_prop= 1 / a same number.

    除非网络过拟合了,否则我通常不会用dropout。它在其他领域应用得比较少,主要是在CV,因为通常我们没有足够的数据,导致过拟合。

    一个缺点是,此时代价函数 J is no longer well-defined,此时你很难监测迭代进行梯度下降时的J的性能,所以我们失去的debug工具绘制损失图。通常我会先关闭dropout,运行NN,确保J单调递减,然后再加入dropout。

    ===1.7 其他正则化方法===

    Data Augmentation. 比如对称图像,随机旋转和裁剪,OCR图像设置可以各种扭曲

    early stopping. 画出 training/dev error 随着 迭代次数的 曲线。

    缺点是,它couple了两个任务(最优化代价函数J,同时要降低过拟合风险),这使得我们无法独立地处理这两个任务。即,我们尝试用一种方式同时解决两个问题,这也使得我们的任务变得更复杂。提早停止梯度下降,在某种程度上我们breaking 了 降低J的任务,此时代价函数可能还不够小

    优点是,这个正则化方法不需要额外参数,在梯度下降的过程中就可以完成。但是如果负担得起 L2 正则化超参数搜索的计算开销的话,通常我们还是选择 L2。我发现 L2使得超参数的search space更容易分解(咸鱼对这句话的理解是,加了L2之后迭代过程相对固定,只要不断迭代就行了,最终比较不同超参数组合的J值,而early stopping看中间迭代值,不同超参数组合具体在哪次迭代停止都不一样,我们关注了中间值使得range search可能也不是那么容易锁定)。

    ===1.9 标准化输入===

    当不同特征scale相差较大时,可以看到 J 的等高图是一个扁长的椭圆(假设此时特征2维),此时直接使用SGD,会导致Z字形轨迹(不同方向梯度大小不一样,而学习率一样)。

    特征尺度相差不大就不需要做归一化,但即使做了归一化也不会有什么harm,所以当我不确定特征scale是否相差很大时,我都会选择做归一化。

    ===1.10 梯度消失和梯度爆炸===

    直观理解

    Andrew举了一个使用线性激活函数的例子,那就相当于不断乘以Wi,那么前向时,Wi略大于1激活值就会爆炸,偏小就会消失接近0,反向时梯度值类似。咸鱼觉得Relu会遇到这种情况。

    另外CS231n中Karpathy讲的以tanh为激活函数时,直接使用高斯随机产生权重*某较小的数,也会存在梯度消失问题,要么激活值接近0,要么激活值接近1,两者都导致梯度消失。

    ===1.11 神经网络的权重初始化===

    使用  标准高斯函数*一个较小的数  随机初始化权重,存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

    Xavier初始化,以tanh为激活函数,Wi = np.random.randn( Ni - 1 *  Ni ) / np.sqrt( Ni-1),这使得 Zi 和 Ai-1 有大致相同的范围(方差) 。

    In practice,我认为这些初始化公式只是给了你一个起始点,如果你愿意,W的方差参(Xavier将其调整为1/n)数可以作为你可以调整的一个超参数。有时这样调优的效果很微小,通常这不会是我想要调的首要超参,但在有些应用中调这个参数也能提升了一些性能。考虑到其他超参的重要性,我通常给这个超参低点的优先级。

    === 1.12 梯度的数值逼近===

    使用  双边的数值梯度  近似  解析梯度

    === 1.13 梯度检验===

     

    === 1.14 关于梯度检验实现的标注===

    1、不要再训练中使用梯度检验,它只用在调试中。因为梯度检验很费时

     2、如果检验失败,look at specific components to try to identify bug

    3、记住正则化项

    4、Doesn‘t work with dropout。梯度检验时先关闭dropout,设置keep_node=1

    5、Run at random intialization; perhaps again after some training. 这种情况很少发生,但是也有可能,small random initial values,运行梯度检验,有可能是对的,但随着训练进行权重away from zero,梯度检验将失败。虽然我不常这么做,但你可以选择的是,在初始化时跑梯度检验,然后让模型训练一段时间,权重away from 初始化值后,在进行梯度检验。

  • 相关阅读:
    Educational Codeforces Round 86 (Rated for Div. 2) D. Multiple Testcases
    Educational Codeforces Round 86 (Rated for Div. 2) C. Yet Another Counting Problem
    HDU
    HDU
    HDU
    HDU
    Good Bye 2019 C. Make Good (异或的使用)
    Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam
    codeforces 909C. Python Indentation
    codeforces1054 C. Candies Distribution
  • 原文地址:https://www.cnblogs.com/JesusAlone/p/8513487.html
Copyright © 2011-2022 走看看