美文网首页
Andrew Ng深度学习课程笔记阅读记录(3):结构化机器学习

Andrew Ng深度学习课程笔记阅读记录(3):结构化机器学习

作者: yumiii_ | 来源:发表于2018-11-28 21:08 被阅读0次

    1.正交化:


    如果在cost function上不能很好的拟合训练集,那么可以训练更大的网络,或者切换到更好的优化算法(如Adam优化算法)
    如果算法对dev的拟合差,那么可以尝试正则化,或者增大训练集(可能对训练集过拟合了)
    如果算法在测试集上很差,那么可以尝试更大的dev集(可能过拟合了dev集)
    如果以上都很好,但无法提供良好的用户体验,说明要么dev集设置不正确,要么cost function测量的指标不对。

    2.单实数评估指标

    查准率Precision,查全率Recall,F1 score


    image.png

    precision查准率 = TP/(TP+FP)意味着所有模型预测为猫的图片中,确实为猫的概率。
    Recall查全率=TP/(TP+FN) 意味着真实为猫的图片中预测正确的概率。

    F1是P和R的调和平均
    F1-Socre = \dfrac {2} {\dfrac{1}{p}+\dfrac{1}{r}}
    一般的,如果要考虑N个指标,则选择一个指标为优化指标,其他N-1个指标都是满足指标:
    N_{metric}:\left\{ \begin{array}{l} 1\qquad \qquad \qquad Optimizing\ metric\\ N_{metric}-1\qquad Satisificing\ metric \end{array} \right.

    3.划分训练集/验证集/测试集

    1.流程:使用训练集训练不同的模型,然后使用dev来评估不同的思路,选择一个,不断迭代去改善dev的性能,最后得到一个比较满意的cost后,再用测试集去评估。
    2.验证集和测试集的分布要来自同一个分布(可以把所有的数据shuffle放入验证集和测试集)
    3.假设样本数特别大,那么可以使用小于20%的比例或小于30%比例的数据作为验证集和测试集。
    4.何时应该改变验证集/测试集和指标?
    ①假设有两个算法和一个评估指标,实验表明算法A在评估指标上做的更好,但是它可能会引入别的问题,而这个问题是不能容忍的,这种情况下的分类错误率(评估指标)可以表示成以下式子:
    Error = \dfrac{1}{m_{dev}}\sum\limits_{i=1}^{m_{dev}}I\{y^{(i)}_{pred}\neq y^{(i)}\}
    那么针对不能容忍的问题,我们可以给它一个惩罚项,也就是一个权重,并归一化。
    Error = \dfrac{1}{\sum w^{(i)}}\sum\limits_{i=1}^{m_{dev}} w^{(i)}I\{y^{(i)}_{pred}\neq y^{(i)}\}
    ②如果在训练开发测试的过程中得到的模型效果比较好,但是在实际应用中自己所真正关心的问题效果却不好的时候,就需要改变开发、测试集或者评估指标.

    4.可避免偏差

    image.png

    针对以上两个问题,人类的误差是1%和7.5%,接近于贝叶斯错误率(理论上能达到的最优错误率),那么针对左边的问题,我们要做的是减小偏差(训练一个更大的模型,或者跑久一点梯度下降),也就是减少训练集误差和人类水平误差之间的差距(贝叶斯误差和训练集误差之间的差值叫做可避免偏差);针对右边的问题,我们要做到的是减小方差(试试正则化,或者使用一个更大的训练集),即减小验证集误差和训练集误差之间的差距(避免方差策略)。

    对人类水平有个大概的估计可以让我们做出对贝叶斯错误率的估计,这样可以更快的做出决定是应该专注于减小偏差还是减小方差。


    image.png

    5.错误分析

    收集错误样例:在dev集或测试集中,获取100个错误标记的例子,并统计真实的类别。
    并行分析:建立表格,以单个错误分类样本为对象,分析每个样本错误分类的原因,最后统计错误类型的百分比,大致确定是否值得去处理每个不同的错误类型。

    6.使用来自不同分布的数据进行训练和测试

    假设有20w条数据是来自一个分布,然而我们想要处理的问题只有1w条数据,那么为了比较好的拟合我们想要处理的问题,你可能会有这样的思路:
    ①将20w+1w的数据进行shuffle,分成train set,dev set, test set。这样做的风险是,我们的dev set中我们实际关心的数据很少,相当于不能很好的瞄准目标,而花了很多时间在优化20w条数据的模型上。
    所以推荐采用以下方式:
    ②20w+1w(可选)的数据作为train set, 1w/2的数据作为sev set,1w/2的数据作为test set。因为dev就是我们瞄准的目标。
    如果按照第②种方式,我们在train set上训练完后再在dev上进行tune时,如果这两个的差距很大,那么在分析模型的偏差和方差时不好下结论,因为现在train的数据是一个分布,而dev和test的数据是另外一个分布。因此我们随机打乱train set,再将train set划分为train set和train-dev set,这样train set和train-dev set。只在train set训练神经网络,再进行分析。见下图:




    数据不匹配问题怎么解决?==>进行人工误差分析,尝试去了解训练集和开发测试集的具体差异在哪里;把训练数据变得像dev set(可能会涉及到人工数据合成)

    7.迁移学习

    1.什么是迁移学习?
    将神经网络从一个任务中学到的知识应用到另一个独立的任务中。如:已经训练好了一个图片识别的神经网络,将最后的输出层删掉,进入到最后一层的权重删掉,为最后一层重新赋予随机权重,然后在另一个数据集上训练。
    2.预训练(pre-training)和微调(fine tuning):预训练前人为了解决类似问题所创造出来的模型;微调是指我们在这个模型的基础上根据目标任务训练进行的权重调整。
    3.迁移学习有意义的场合:
    ①任务A和任务B有着相同的输入;
    ②任务A所拥有的数据要远远大于任务B(对于更有价值的任务B,任务A所拥有的数据要比B大很多);
    ③任务A的低层特征学习对任务B有一定的帮助;

    8.多任务学习

    1.什么是多任务学习?
    同时开始学习,训练一个神经网络让它同时解决多个问题,如计算机视觉方面,识别一张照片中是否有车、人、路标等等。这时它的输出不再是一维的,而是使用softmax进行归一化后出现每一类物体的概率。它的损失函数:
    loss = \dfrac{1}{m}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{4}L(\hat y^{(i)}_{j},y^{(i)}_{j})=\dfrac{1}{m}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{4}(y^{(i)}_{j}\log (\hat y^{(i)}_{j})+(1-y^{(i)}_{j})\log(1-\hat y^{(i)}_{j}))
    2.多任务学习有意义的情况:
    ①如果训练的一组任务可以共用低层特征;
    ②通常,对于每个任务大量的数据具有很大的相似性;(如,在迁移学习中由任务A“100万数据”迁移到任务B“1000数据”;多任务学习中,任务A1,...,AnA1,...,An,每个任务均有1000个数据,合起来就有1000n个数据,共同帮助任务的训练)

    9.端到端学习

    1.相比于以前的学习系统,需要进行流水线处理(如提取特征等),端到端深度学习就是忽略掉这些流水线,用单个神经网络代替它。
    2.优点:
    ①端到端学习可以直接让数据“说话”;
    ②所需手工设计的组件更少。
    缺点:
    ①需要大量的数据;
    ②排除了可能有用的手工设计组件。

    相关文章

      网友评论

          本文标题:Andrew Ng深度学习课程笔记阅读记录(3):结构化机器学习

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