zoukankan      html  css  js  c++  java
  • Machine Learning Yearning

    链接(1~12章): 
    https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_01.pdf
    链接(第13章): 
    https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_02.pdf
    链接(第14章): 
    https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_03.pdf 

    本文有转载:http://blog.csdn.net/u014380165/article/details/73611858

    MLY--1. Why Machine Learning Strategy

    这一章主要是抛砖引玉,指出在你的深度学习模型遇到问题的时候,你需要选择合适的方法解决,那么一般都有哪些方法呢?作者列举了以下几个: 
    1、获取更多的数据。 
    2、增加训练样本的多样性。 
    3、增加迭代次数。 
    4、试试更深、更宽的网络,比如增加层数,卷积核个数,参数等等。 
    5、试试更小的网络。 
    6、加正则项,比如L2正则项。 
    7、改变你的网络结构,比如激活方式,卷积核个数等。

    个人感悟增加训练样本的多样性可以这么理解:假如你要做猫狗分类,那么不同种类、不同姿势、睡觉的吃饭的等等的猫,各种各样都来一些,对提升你的算法效果是有帮助的。是否要增加迭代次数可以根据你的loss情况进行判断,当你的loss还没趋于平稳的时候,而且模型不太过拟合时,可以增加迭代次数。经验而言需要把你的全部数据跑几十遍才能达到不错的效果。更深的网络可以通过增加层数达到,比如像ResNet-152,当然原本简单增加层数的时候会遇到梯度衰减严重难以训练的情况,所以有了ResNet网络来解决这个问题。更宽的网络主要是通过增加某些层的卷积核的个数,一个卷积核相当于提取了一种特征,卷积核越多,特征越丰富,当然也增加了计算量。正则项一般是在过拟合的时候使用,简单讲就是限制权值的大小,L2是将权值的平方和加入到目标函数中,最后会使得权值趋于平滑,还有一种正则项是L1,可以使得权值趋于稀疏,即许多项为0。改变网络结构一般是比较细的调整,比如激活从ReLU改为pReLU,某层卷积核的大小的改变等等,一般小改的效果不会太明显。

    MLY--2. How to use this book to help your team

    MLY--3. Prerequisites and Notation 
    这一章也没什么重要内容,就是说如果你对机器学习不是很了解,可以看看这个链接http://ml-class.org

    MLY--4. Scale drives machine learning progress 
    其实深度学习(或者叫神经网络)在几十年前就有了,但是为什么现在才开始这么火?作者提到两个主要因素: 
    1、足够的数据 
    2、足够的计算能力 
    虽然现在数据有很多,但是传统的机器学习算法,比如逻辑回归,随着数据量的增加,其效果会遇到明显的瓶颈,此时如果采用不同深度的神经网络来训练,效果基本随着网络深度的增加而增加。如下图:

    这里写图片描述

    为什么会这样?因为在小数据上,可以人工构造特征,一般而言在小数据集上构造的特征还是十分有效的,但是随着数据集的增加,人工构造特征会愈加困难。

    MLY--5. Your development and test sets 
    一般而言,在开展深度学习项目的时候,都会将数据分成三部分:训练集,验证集,测试集。你的模型在训练集上训练,然后用验证集来验证其效果,根据验证集的结果进行模型优化。作者强调你的测试集一定要和真实的数据有相同分布。

    个人感悟:有些人可能觉得直接分成训练集和测试集就行了,为什么还要加一个验证集。其实应该这么理解,验证集也是一个测试集,用来测试你的模型的泛化能力。而测试集一般是指线上的环境。一般而言我们拿到数据,可以分成训练集和验证集,要随机分,这样训练集和验证集才能有相似的分布,然后就在这两个数据集上不断训练和优化我们的模型。最后将模型应用到实际场景中,这实际场景其实就是我们的测试集,因为实际场景中数据一般会比我们之前收集的数据更多样,所以模型表现不如线下验证集是正常的,因为你一开始拿到的数据不可能十全十美,这时需要将这些数据再加到我们的训练集和验证集中,再训练和优化,直到迭代到下一个版本。如此不断重复。总之记住:训练集,验证集,测试集要尽可能具有相同分布。

    MLY--6. Your dev and test sets should come from the same distribution 
    跟第五章类似,强调验证集和测试集要有相同的分布,否则你可能在验证集上训练出一个非常好的模型,但是在测试集上表现非常差。

    MLY--7. How large do the dev/test sets need to be? 
    这一章主要讲验证集和测试集需要多大比较合适?如果你的验证集只要100个样本,那么你的准确率提高的最小单位是1%,而不可能是0.1%,除非你的验证集增加到1000个样本。测试集样本也需要大到能足够表达你的模型效果才行,但是一般也不建议太大。

    个人感悟:我觉得对于验证集和测试集的划分没有硬性规定,一般我将数据集分成训练:验证=9:1。

    MLY--8. Establish a single-number evalution metric for your team to optimize 
    主要是讲模型的评价标准。最好能用一个评价标准(比如准确率)来判断模型优劣,而不是用多个标准(比如precision和recall)。主要是因为多个标准不好比较算法的效果。比如这个图:

    这里写图片描述

    其实如果要兼顾precision和recall,可以采用F1 score。

    MLY--9. Optimizing and satisficing metrics 
    在权衡算法效果和速度的时候,除了可以用类似Accuracy-0.5*RunningTime的方式来比较,还可以采用其他方式,比如:假如可以接受的运行时间是100ms,那么就在这个限制条件下寻找准确率最高的算法。当然,如果你有多个限制条件,比如模型大小,运行时间,算法效果等,那可以在挨个满足条件的前提下找到最好的。还有一个例子是false positive rate和false negative rate,比如你希望在false positive rate为0的前提下降低你的false negative rate。

    MLY--10. Having a dev set and metric speeds up iterations 
    当你拿到一个问题的时候,你要思考这个问题要用什么样的方式解决,然后把这个方式用代码表达出来,最后根据实验结果去思考之前的解决方式是否还有改进的地方,不断迭代。作者给出的这个图非常形象

    这里写图片描述

    MLY--11. When to change dev/test sets and metrics 
    作者提到在开始一个项目的时候,最好在一周内就能定义出验证集和测试集以及评价标准,而不是花太长的时间去制定和思考。后期当你发现你之前定义的验证集和测试集存在缺陷的时候,就应该尽快修改。这里有三个需要注意的点,如果你有这三种情况,那么就需要修改你的验证集了。 
    1、实际的数据分布和你验证集的数据分布不同。 
    2、在验证集上过拟合了。 
    3、你的评价标准和模型的优化方向不一致。比如你的一个图像分类算法,模型A的准确率比模型B的准确要高,但是有时候模型A容易漏判一些特殊图像,这是不能容忍的,而模型B不会,因此准确讲模型B的效果要比模型A要好。怎么改进呢?可以通过对漏判一些特殊图像做惩罚,而不仅仅用准确率来表征模型优劣。

    MLY--12. Takeaways: Setting up development and test sets 
    1、你的验证集和测试集要尽可能从你实际应用场景的数据中获取。验证集和测试集不一定要跟你的训练数据有相同分布。(这点我认为最好还是训练集和验证集有相似的分布,如果训练数据和验证数据分布太大,你可能训练多次都难以得到好的效果,)

    MLY--14. Evaluating multiple ideas in parallel during error analysis

    将错误分类的图像在一张表格里面列出了,并comments可能的原因,然后分析原因,改进算法及预处理或者便签问题。可以通过分析挑选出各个优化类别的优先训练,各个击破来提高模型效果;

    表格格式可以参考如下:

  • 相关阅读:
    Makefile笔记
    GUN详解
    学习SDL
    [翻译]在ASP.NET MVC中使用TDD与依赖注入
    ASP.NET MVC Preview 3 STEP BY STEP 文章管理实例(二)
    一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)
    一个小Forum Web程序示例,ASP.NET MVC Framework,总体结构介绍(Part 1)
    ASP.NET MVC Preview 4 源代码学习笔记 FilterAttribute
    在ASP.NET MVC Framework 中执行简单验证(翻的)
    一个小Forum Web程序示例,SqlForumRepository,LazyList和PagedList(Part 3)
  • 原文地址:https://www.cnblogs.com/hansjorn/p/7581315.html
Copyright © 2011-2022 走看看