结构化机器学习策略

结构化机器学习策略

1.1 ML策略

课程的动机:如何采取有效的手段提高机器学习系统的性能

  • more data
  • more diverse training set
  • train algorithm longer with sgd
  • try adam optimization instead of sgd
  • try bigger/smaller network
  • try dropout/L2 regularization
  • network architecture.1: activation functions,2:hidden units ….
  • 判断哪些idea 有效?

 

1.2 正交化(Orthogonalization

  • 作者以两个例子来说明正交化的含义:

电视:电视旋钮调节图像,每一个旋钮只调整一个功能

车:每个组件负责一个功能;

 

  • 机器学习算法性能调节的步骤:

fit training set (拟合训练集)

-> fit dev set (调整开发集)

-> fit test set(调整测试集)

  • 如果训练集上拟合效果不好,调整网络结构,采取更好的优化算法(比如adam)
  • 如果在训练集上你和效果很好,开发集不好,需要有一组正则化的按钮可以调节(比如增大训练集)
  • 如果在训练集和开发集上效果很好,在测试集不好,需要使用更大的开发集(在开发集上出现了过拟合)
  • 如果在测试集上拟合效果很好,但是实际场景中的识别效果不好,此时需要改变开发集和成本函数;因为如果根据某个成本函数,系统在测试集上表现很好,但无法反应你的算法在真实世界的表现,要么开发集数据的分布设置的不对,要么损失成本函数衡量的指标不对;
  • 不太建议使用early stopping(提前停止训练)。stop early会影响训练集的拟合,也会影响测试集上的表现

 

1.3 单一数值评估指标

单一的数值评估指标可以很方便地用于评估某个策略的有效性;

  • trade off of precision and recall 、F1 score

1.4 满足和优化指标

  • accuracy optimizing, running time satisfied(<1000 ms)。
  • 一个优化指标 一个或多个满足指标

1.5 训练开发测试

  • workflow: try many ideas->train different models->use dev set to evaluate and pick one
  • randomly shuffled data into the dev and test set.From same distribution.

1.6 开发集和测试集的大小

  • old way <10000 data :
    0.7 train,0.3 test.0.6 train ,0.2 dev,0.2 test.
  • now large data sets 10e6:
    0.01dev,0.01 test
  • some cases。train and dev set.no test might be ok.not recommend

1.7 改变开发、测试的指标

  • 猫分类例子:算法A在评价指标上做得更好,但是会如(将色情图片分类为猫)。B评价指标并不如A,但是不会发生上述错误。评价指标无法衡量算法之间的优劣排序
  • 改变error metric:把色情图片分类成猫这一错误的惩罚权重加大10倍。
  • define a metric to evaluate classifiers->worry separately about how to do well on this metric

1.8 人的表现
1.9 可避免偏差

  • 如果训练误差和验证误差 远大于人类或state of art:focus on bias
  • 如果接近 focus on variance
  • humans error 7.5,train 8,test 10:
    贝叶斯误差估计。0.5 可避免偏差,2是方差。减小方差相对容易。

1.12 改善模型

  • fit train set:bias
  • generalizes well to dev/test: variance
  • reducing
  • human level(state of art)avoid bias:

train bigger model

train longer/better optim

  • nn architecture/ hyperparameters search
  • training error avoid variance
  • more data
  • regularization L2,dropout,data augmentation
  • nn architecture/ hyperparameters search
  • dev error

2.1 进行误差分析

  • look as dev examples to evaluate ideas
  • get 100 mislabeled dev set examples,count up error types and analysis.Decide solve it is necessary?决定在哪个错误类型有改进的必要。
  • evaluate multiple ideas in parallel
  • 进行误差分析,应该找一组开发集的错误例子,观察错误标记例子,看看假阳性和假阴性,启发归纳出新的误差类型。

2.2 清楚标注错误的数据

  • 深度学习算法对随机误差是鲁棒的,但对系统误差(标记的人把白色的狗标记成猫)是不鲁棒的。

2.3 快速搭建系统

  • 设置
  • 机器学习程序-> 快速搭建第一个程序->使用偏差、方差分析,错误分析,找到改善系统要优先处理的方向,迭代。 如果这个问题很熟悉或有几乎完全相同的参考文献可以不这么做。

2.4 不同分布的训练集和测试集

  • 在构建机器学习系统的过程中,会遇到训练集和测试集不同分布的情况,此时如何处理?

  • 以一个猫识别app为例,假设训练数据来源有两个,一部分是从web上获取的数据,另一部分是app内用户上传的数据,而且web数据要远多于app用户上传数据;app内用户上传的数据是最终需要识别的数据。

   此外两个数据源的数据分布也有比较大的差异,web数据更多是专业人士拍摄,app上用户上传数据受手机拍照本身和用户水平限制,图片质量显著低于web数据,此时该怎样设置开发、测试、训练集?

    常见有两种方案:

 

a.第一种方案:

1)合并web和app数据;

2)将全部的数据随机打乱重排;

3)按比例划分训练集、开发集和测试集;

这样做好处是训练集、开发集和测试集数据分布是一致的;

不足之处是开发集和测试集中大量的都是web数据,而算法的目标是识别app用户上传图片,这样就和算法设计的优化目标不同。

b.第二种方案

1)训练集:全部的web数据和部分的app数据;

2)开发集和测试集:全部都是app用户上传数据;

这样做的好处是模型的优化目标与实际要处理的数据是一致的;

  • 另一个语音识别的例子,假设正在开发一个语音识别的产品(语音激活后视镜),那么如何收集数据去训练语音识别算法?

训练集:可以是从其他语音识别项目上搜集的数据(买来的数据或者其他);

开发集和测试集:基于实际项目的激活后视镜的语音数据;

当然如果实际的激活后视镜的语音数据比较多,也可以将一部分数据放到训练集中;

 

2.5 不同分布数据划分下的偏差和方差

  • 偏差和方差分析可以帮助确定算法下一步的优化方向,但是当训练集与开发集、测试集不同分布时,偏差和方差的分析会有所不同。

比如:对于同分布的数据,如果算法在训练集上的误差为1%,而在开发集上的误差为10%,可以认为算法的泛化能力不好;对于不同分布的数据,就很难确定是否真的是因为算法没有学习到训练样本而引起的误差。

因为此时有两个因素可能导致这种误差,无法确定哪种因素影响更大;

1)算法没有在开发集上进行训练;

2)开发集和训练集数据分布不一致;

 

  • 解决方法

在原有的训练集中在拆分出来一部分数据作为train-dev集,train-dev和train集是同分布的;

如果模型在train-dev上的误差为1.5%,而在dev集上的误差为10%,可以确定算法的误差是由于数据分布不一致导致的;

如果模型在train-dev上的误差为9%,而在dev集上的误差为10%,可以确定算法存在偏差问题,可以采用降低偏差的方法优化模型;

  • 对于训练集与开发集、测试集数据分布不一致的情况,采取下面分析方法:

 

2.6 解决数据不匹配问题

如果确定训练集与开发集、测试集的数据分布不一致,一般采取下面的方法:

  • 人工分析训练集与开发、测试集数据的不同的原因;

比如,在语音识别系统中,分析数据发现,开发集数据中含有更多的汽车噪音;

  • 减小训练集与开发、测试集的数据差异,或者收集更多同分布的数据;

比如,根据上面的分析,你可以模拟汽车噪音去合成数据;

 

  • 人工合成数据的例子,在车辆识别系统中,假设可以采用图片合成技术来生成车辆的图片,但是这样做存在一个问题:你无法合成所有种类车辆的图片,这样会导致模型在一个车辆的子集上进行训练,会导致过拟合情况的发生;

2.7 迁移学习

深度学习中最强大的理念之一就是,有的时候神经网络可以从一个任务中学习知识,并将这些知识应用到另一个独立的任务中,这就是迁移学习。
例如:基于100万张图片训练了如下网络模型,现在需要做医学图像的识别的任务,由于医学图像数据较少,那么可以基于已经训练好的网络模型训练新的模型;

具体做法:

1)修改网络模型的最后一层的结构;

2)将网络模型的最后一层参数初始化为随机数值;

3)基于医学图像数据和已有的网络模型(称为pre-training模型)参数进行训练;如果数据量比较小,可以只调整最后一层的参数;如果数据量比较大,可以调整所有层的参数;

    

 

 

  • 为什么可以这么做?

低层次的特征,比如图像的边缘特征、纹理、线条等,这些在这两个任务中都是通用的;

  • 什么时候使用迁移学习更有意义?

1)两个机器学习任务有相同的输入;

比如,上面的例子中,模型的输入都是图像;

2)任务A的低阶特征对任务B是有用的,比如图像的色调、纹理等等。

3)任务A的数据量比任务B的数据量更大,那么可以将任务上的模型作为任务B的预训练模型,以此来优化模型在任务B上的性能;

2.8 多任务学习

迁移学习中,学习的过程是串行的过程,而多任务学习则是并行学习的过程,训练一个神经网络同时处理多个任务(如分类中样本有多个标签)。多任务学习是让单个神经网络同时做多件事情。比如在无人驾驶系统中,需要同时检测一张图片里是否有行人、车辆、红绿灯、停车标识等等,这样网络将会多个输出;

对标记不完整的数据集也可以用来训练,比如不包含行人的图片,或只对图片中的行人进行了标记,在计算损失函数的时候,可以只对标记的项(其值为0或1)进行计算;

 

  • 与softmax的区别

softmax中每个标签分配给单个样本,而多任务学习中的样本有多个标签,如在上图中的场景中,图片中有“停用牌”、“汽车”,没有“行人”和“交通灯”。
 

  • 多任务学习的应用场景

1)不同任务中可以共用底层次的特征,如无人驾驶中,同时识别出汽车、行人和交通灯都是可行的,因为他们具有类似的图像特征;

2)如果每个任务的样本数据量不大且相似,那么利用其他任务的数据来增强单个任务的效果;

比如,每个任务有1000张图片,有100个任务,如果单独完成任务A的训练,那么只有1000张图片;但是如果采用多任务的方法,你可以采用其他任务的99000张图片用以训练,以增强任务A的识别效果;

通常采用多任务学习比单独训练神经网络单独完成各个任务的性能要好;目前所能知道的,出现违背这个规律的情况的原因是网络模型不够大;

3)一般而言,神经网络足够大时,多任务的效果要比单个任务的表现好。

2.9 端到端的深度学习(end-to-end deep learning)

   以前有一些数据处理系统或深度学习系统,需要多个阶段的处理,端到端深度学习就是忽略这些不同的阶段,用单个网络代替它。

 
示例1.语音识别

 

  • 目标:输入一段音频x,输出对应的音频的文本
  • 非端到端:音频x→→提取特征→→音位→→单词→→音频文本

这中间包含了许多人工设计的组件,比如音位,是人工构造的,用以表示发音单元;

  • 端到端:音频x→→音频文本

  端到端的学习忽略了非端到端的中间步骤,而是直接从音频通过神经网络得到音频文本。

如果你只有1000h的样本数据,那么通过非端到端的做法可能能够得到更好的结果;如果你有10000h或更充足的数据时,端到端的做法通常能得到不错的结果。

端到端的深度学习系统,往往需要大数据集才能让系统表现的更好。

 

示例2.基于人脸识别的门禁系统

  • 目标:输入人脸图像x,输出识别结果
  • 非端到端:人脸图像→→人脸检测→→检测到的人脸图像居中→→检测结果
  • 端到端:人脸图像→→检测结果

在这个示例中,事实证明端到端并不是最好的做法,问题在于:

1)人可以从不同的角度出现在图像中,增加识别的难度;

2)没有足够的数据用于端到端学习系统的训练;数据集[图片,身份)不容易获取;

所以在实际的人脸识别中并不是将原始的图像作为神经网络的输入,而是采用非端到端的做法,具体分成两步:

第一步:先检测出人脸,构建人脸检测的深度学习模型;

第二步:将检测出的人脸进行放大居中处理后输入到神经网络中。具体做法是与数据库里面员工人脸照片进行匹配,以确定该员工是否有权限进入;

这种做法的好处是这两步都有大量的数据可以用以训练模型,不依赖于公司员工人脸照片数据库中的数据。

 

示例3.机器翻译

采用端到端深度学习效果更好,因为有大量的数据可以利用;

示例4.通过x射线图像估计小孩的年龄

采用非端到端的深度学习系统较好,因为没有足够的数据集([骨骼图像,年龄])可以利用;反而分成两步更容易处理,第一步从图像中分割出每一部分的骨骼关节,第二步根据骨骼关节长度等信息去判断年龄;

2.10 是否要使用端到端的深度学习

  • 端到端学习的优点:

1)如果有足够的数据,就让算法从数据中自动学习可能的统计信息,而不是引入人为构造的特征,这样会让算法学到更全面的知识;

例如子早期的语音识别系统中,引入了音位的概念,即基本的发音单元,这是人构造出来的特征,但不要强迫算法用音位进行表示;

2)需要手工设计的组件更少,简化了系统设计流程;

  • 缺点:

1)要学习到x到y的映射通常需要大量的训练数据;

2)它排除了可能有用的手工设计组件,机器学习工作人工员通常都比较鄙视手工设计组件,如果你没有足够多的数据,手工设计组件能够将人的先验知识加入到算法中;

  通过以上的对比,可以看出,决定是否使用端到端学习的关键问题是是否有足够的数据,以学习到x到y映射的足够复杂的函数。

  • 一个复杂非端到端学习的例子:自动驾驶系统

简化来说,该系统的输入是车周围的环境图片、雷达等传感器数据,输出是方向盘角度,发动机转速等信息;

显然很难获取这样的数据集,用于端到端深度学习系统的学习;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值