吴恩达深度学习笔记(三)05.31

结构化机器学习项目

机器学习策略(一)(待更新)

为什么是ML策略?

改善系统的想法(优化深度学习系统):

  1. Collect more data
  2. Collect more diverse training set
  3. Train algorithm longer with gradient descent
  4. Try Adam instead of gradient descent
  5. Try bigger/small network
  6. Try dropout/add L2 regularization
  7. Network architecture:
    (i)Activation functions
    (ii)#hidden units
    (iii)……

正交化

例子1:老式电视上的旋钮可以用来调整图像的各种性质,可能有一个旋钮用来调图像垂直方向的高度,另外有一个旋钮用来调图像宽度,也许还有一个旋钮用来调梯形角度,还有一个旋钮用来调整图像左右偏移,还有一个旋钮用来调图像旋转角度之类的。电视设计师花了大量时间设计电路,那时通常都是模拟电路来确保每个旋钮都有相对明确的功能。正交化指的是电视设计师设计这样的旋钮,使得每个旋钮都只调整一个性质。

例子2:开车的时候,方向盘决定往左右偏多少,控制方向,还有油门和刹车控制速度。正交化的概念是指,可以想出一个维度,这个维度想做的是控制转向角,还有另一个维度来控制速度,那么就需要一个旋钮尽量只控制转向角,另一个旋钮,在这个开车的例子里其实是油门和刹车控制了速度。

要弄好一个监督学习系统,你通常需要调你的系统的旋钮。确保四件事情:

  1. Fit training set well on cost function(训练集上的表现必须通过某种评估,达到能接受的程度,对于某些应用,这可能意味着达到人类水平的表现)方法:Bigger network、Adam、……
  2. Fit dev set well on cost function 方法:Regularization、Bigger training set……
  3. Fit test set well on cost function 方法:Bigger dev set
  4. Performs well in real world 方法:Change dev set or cost function

当训练神经网络时,一般不用Early stopping,用Early stopping有点难以分析,因为这个旋钮会同时影响训练集的拟合,因为如果早期停止,那么对训练集的拟合就不太好,但它同时也用来改善开发集的表现,所以这个旋钮没那么正交化。因为它同时影响两件事情,就像一个旋钮同时影响电视图像的宽度和高度。

必须弄清楚到底是什么地方出问题了,然后有对应的旋钮,或者一组对应的旋钮,刚好可以解决那个问题,那个限制了机器学习系统性能的问题。

单一数字评估指标

例子1:猫分类器,之前搭建了某个分类器A,通过改变超参数,还有改变训练集等手段,现在训练出来了一个新的分类器B,评估分类器的一个合理方式是观察它的查准率(Precision)和查全率(Recall)。

查准率:在分类器标记为猫的例子中,有多少真的是猫。
查全率:对于所有真猫的图片,你的分类器正确识别出了多少百分比。

ClassifierPrecisionRecallF1 Score
A95%90%92.4%
B98%85%91.0%

查准率和查全率之间往往需要折衷,两个指标都要顾及到。这时候需要找到一个新的评估指标,能够结合查准率和查全率。新的评估指标为:
F 1  S c o r e = 2 1 P + 1 R   调 和 平 均 数 F\text{1 }Score=\frac{2}{\frac{1}{P}+\frac{1}{R}}\,调和平均数 FScore=P1+R12

在这个例子中,马上可以看出,分类器A的F1分数更高。

有一个定义明确的开发集用来测量查准率和查全率,再加上这样一个单一数值评估指标或单实数评估指标,能快速判断分类器A或者分类器B更好。所以有这样一个开发集,加上单实数评估指标,迭代速度肯定会很快,它可以加速改进机器学习算法的迭代过程。

例子2:假设开发一个猫app来服务四个地理大区的爱猫人士,美国、中国、印度还有世界其他地区。假设两个分类器在来自四个地理大区的数据中得到了不同的错误率。

AlgorithmUSChinaIndiaOtherAverage
A3%7%5%9%6%
B5%6%5%10%6.5%
C2%3%4%5%3.5%
D5%8%7%2%5.25%
E4%5%2%4%3.75%
F7%11%8%12%9.5%

假设平均表现是一个合理的单实数评估指标,通过计算平均值,就可以快速判断。看起来算法C的平均错误率最低,然后可以继续用那个算法。

满足和优化指标

例子1:假设已经决定很看重猫分类器的分类准确度,这可以是F1分数或者用其他衡量准确度的指标。但除了准确度之外,还需要考虑运行时间,就是需要多长时间来分类一张图。

ClassifierAccuracyRunning time
A90%80ms
B92%95ms
C95%1500ms

将准确度和运行时间组合成一个整体评估指标。比如总体成本是 C o s t = A c c u r a c y − 0.5 × R u n n i n g   t i m e Cost=Accuracy-0.5\times Running\,time Cost=Accuracy0.5×Runningtime,只用这样的公式来组合准确度和运行时间,两个数值的线性加权求和,这种组合方式可能太刻意。

还可以做其他事情,就是可能选择一个分类器,能够最大限度提高准确度,但运行时间必须满足≤100ms。准确度是一个优化指标,运行时间是满足指标

在这种情况下分类器B最好,因为在所有的运行时间都≤100ms的分类器中,它的准确度最好。

所以更一般地说,如果要考虑 N N N个指标,有时候选择其中一个指标做为优化指标是合理的。所以想尽量优化那个指标,然后剩下 N − 1 N-1 N1个指标都是满足指标,意味着只要它们达到一定阈值,不在乎它超过那个门槛之后的表现,但它们必须达到这个门槛。

例子2:构建一个系统来检测唤醒语(触发词),这指的是语音控制设备。比如Echo:Alexa,谷歌设备:Okay Google,苹果设备:Hey Siri,百度设备:你好百度。

要考虑:Accuracy(触发字检测系统的准确性)和The number of false positives(假阳性的数量:没有人在说这个触发词时,它被随机唤醒的概率有多大)

  • 优化指标:Accuracy
  • 满足指标:≤1 false positive every 24 hours.

总结一下,如果需要顾及多个指标,比如说,有一个优化指标,想尽可能优化的,然后还有一个或多个满足指标,需要满足的,需要达到一定的门槛。

训练、开发、测试集划分

机器学习中的工作流程是,尝试很多思路,用训练集训练不同的模型,然后使用开发集来评估不同的思路,然后选择一个,然后不断迭代去改善开发集的性能,直到最后可以得到一个满意的成本,然后再用测试集去评估。

例子1:开发一个猫分类器,然后在这些区域里运营:美国、英国、其他欧洲国家、南美洲、印度、中国、其他亚洲国家和澳大利亚。

让开发集和测试集来自同一分布。设立开发集加上一个单实数评估指标,这就是定下目标,然后告诉团队,那就是要瞄准的靶心,因为一旦建立了这样的开发集和指标,团队就可以快速迭代,尝试不同的想法,跑实验,可以很快地使用开发集和指标去评估不同分类器,然后尝试选出最好的那个。

将所有数据随机洗牌,放入开发集和测试集,所以开发集和测试集都有来自八个地区的数据,并且开发集和测试集都来自同一分布。

例子2:有一个机器学习团队,花了好几个月在开发集上优化,开发集里面有中等收入邮政编码的贷款审批数据。输入 x x x为贷款申请,是否可以预测输出 y y y y y y是他们有没有还贷能力。所以这系统能帮助银行判断是否批准贷款。开发集来自贷款申请,这些贷款申请来自中等收入邮政编码。但是在这上面训练了几个月之后,团队突然决定要在低收入邮政编码数据上测试一下。花了大量时间针对前面那组数据优化分类器,导致系统在后面那组数据中效果很差。所以这个特定团队实际上浪费了3个月的时间,不得不退回去重新做很多工作。

Guideline:Choose a dev set and test set(come from same distribution)to reflect data you expect to get in the future and consider important to do well on.

数据都要随机分配到开发集和测试集上。因为这样才能瞄准想要的目标,让团队高效迭代来逼近同一个目标。

开发集和测试集的大小

Old way:训练集:测试集=70%:30%. 或者训练集:开发集:测试集=60%:20%:20%. 如果有100、1000、10000个样本,这些做法也还是合理的。

Now:1百万个训练样本,训练集:开发集:测试集=98%:1%:1%.

测试集的目的是完成系统开发之后,测试集可以评估投产系统的性能。方针就是,令测试集足够大,能够以高置信度评估系统整体性能。对于应用程序,有10000个例子就能给足够的置信度来评估性能了,这数目可能远远小于整体数据集的30%.

不单独分出一个测试集也是可以的。不建议在搭建系统时省略测试集,因为可以使用这组不带偏差的数据来测量系统的性能。

什么时候该改变开发/测试集和指标

为什么是人的表现?

可避免偏差

理解人的表现

超过人的表现

改善模型表现

机器学习策略(二)(待更新)

进行误差分析(Error Analysis)

假设正在调试猫分类器,然后取得了90%准确率,相当于10%错误(将一些狗分类为猫),如何针对狗的图片优化算法?试想一下,可以针对狗,收集更多的狗图,或者设计一些只处理狗的算法功能之类的,为了让猫分类器在狗图上做的更好,让算法不再将狗分类成猫。所以问题在于,是不是应该去开始做一个项目专门处理狗?这项目可能需要花费几个月的时间才能让算法在狗图片上犯更少的错误,这样做值得吗?

首先,收集一下,比如说100个错误标记的开发集样本,然后手动检查,一次只看一个,看看开发集里有多少错误标记的样本是狗。现在假设100个错误标记样本中只有5%是狗,这意味着在典型的100个出错样本中,即使完全解决了狗的问题,也只能修正这100个错误中的5个。那么最多只能希望错误率从10%=100/1000下降到9.5%=95/1000,错误率相对下降了5%(样本个数为1000),就可以确定这样花时间不好,或者也许应该花时间,但至少这个分析给出了一个上限。如果继续处理狗的问题,能够改善算法性能的上限,在机器学习中,有时称之为性能上限,就意味着,最好能到哪里,完全解决狗的问题可以对你有多少帮助。

假设我们观察一下这100个错误标记的开发集样本,发现实际有50张图都是狗,所以有50%都是狗的照片,现在花时间去解决狗的问题可能效果就很好。这种情况下,如果真的解决了狗的问题,那么错误率可能就从10%下降到5%了。然后可能觉得让错误率减半的方向值得一试,可以集中精力减少错误标记的狗图的问题。

有时在做错误分析时,也可以同时并行评估几个想法,比如,有几个改善猫检测器的想法:也许可以改善针对狗图的性能,或者有时候要注意,那些猫科动物,如狮子,豹,猎豹等等,它们经常被分类成小猫或者家猫,所以可以想办法解决这个错误。或者发现有些图像是模糊的,如果能设计出一些系统,能够更好地处理模糊(Blurry)图像。知道大概怎么处理这些问题,要进行错误分析来评估这三个想法。

ImageDogGreat CatsBlurryInstagram(滤镜)Comments
1Pit bull
2
3Rainy day at zoo
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots
% of total8%43%61%12%
性能提高的上限空间大

在错误分析过程中,就看看算法识别错误的开发集样本,如果发现第一张识别错误的图片是狗图,那么就在那里打个勾,在评论里注释,这是一张比特犬的图。如果第二张照片很模糊,也记一下。如果第三张是在下雨天动物园里的狮子,被识别成猫了,这是大型猫科动物,还有图片模糊,在评论部分写动物园下雨天,是雨天让图像模糊的之类的。最后,这组图像过了一遍之后,可以统计这些算法(错误)的百分比,或者这里每个错误类型的百分比,有多少是狗,大猫或模糊这些错误类型。所以也许检查的图像中8%是狗,可能43%属于大猫,61%属于模糊。这意味着扫过每一列,并统计那一列有多少百分比图像打了勾。

比如说不管对狗图片或者Instagram图片处理得有多好,在这些例子中,最多只能取得8%或者12%的性能提升。而在大型猫科图片这一类型,可以做得更好。或者模糊图像,这些类型有改进的潜力。这些类型里,性能提高的上限空间要大得多。这个快速统计的步骤,可以经常做,最多需要几小时,就可以真正帮你选出高优先级任务,并了解每种手段对性能有多大提升空间。

所以总结一下,进行错误分析,应该找一组错误样本,可能在开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中,可能会得到启发,归纳出新的错误类型。总之,通过统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。

清除标注错误的数据

2.2

快速搭建你的第一个系统,并进行迭代

如果正在开发全新的机器学习应用,建议应该尽快建立第一个系统原型,然后快速迭代。

如果正在考虑建立一个新的语音识别系统,其实可以走很多方向,可以优先考虑很多事情。比如,有一些特定的技术,可以让语音识别系统对嘈杂的背景更加健壮,嘈杂的背景可能是说咖啡店的噪音,背景里有很多人在聊天,或者车辆的噪音,高速上汽车的噪音或者其他类型的噪音。有一些方法可以让语音识别系统在处理带口音时更健壮,还有特定的问题和麦克风与说话人距离很远有关,就是所谓的远场语音识别。儿童的语音识别带来特殊的挑战,挑战来自单词发音方面,还有他们选择的词汇,他们倾向于使用的词汇。还有比如说,说话人口吃,或者说了很多无意义的短语,比如“哦”,“啊”之类的。可以选择很多不同的技术,让听写下来的文本可读性更强,所以可以做很多事情来改进语音识别系统。

如果想搭建全新的机器学习程序,就是快速搭好第一个系统,然后开始迭代。快速设立开发集和测试集还有指标,这样就决定了目标所在,如果目标定错了,之后改也是可以的。但一定要设立某个目标,然后马上搭好一个机器学习系统原型,然后找到训练集,训练一下,看看效果,开始理解算法表现如何,在开发集测试集,评估指标上表现如何。当建立第一个系统后,就可以马上用到之前说的偏差/方差分析,还有错误分析,来确定下一步优先做什么。特别是如果错误分析让你了解到大部分的错误的来源是说话人远离麦克风,这对语音识别构成特殊挑战,那么就有很好的理由去集中精力研究这些技术,所谓远场语音识别的技术。

建立这个初始系统的所有意义在于,它可以是一个快速和粗糙的实现,有一个学习过和训练过的系统,让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。

当这个领域有很多可以借鉴的学术文献,处理的问题和你要解决的几乎完全相同,比如说,人脸识别就有很多学术文献,如果你尝试搭建一个人脸识别设备,那么可以从现有大量学术文献为基础出发,一开始就搭建比较复杂的系统。

在不同的分布上的训练集和测试集

2.4

数据分布不匹配的偏差与方差分析

例子1:猫分类器
贝叶斯错误率或贝叶斯最优错误率,几乎是0%. 在这个样本中,训练集误差是1%,开发集误差是10%,如果开发集来自和训练集一样的分布,这里可能存在很大的方差问题,算法不能很好的从训练集出发泛化,它处理训练集很好,但处理开发集就突然间效果很差了。

但如果训练数据和开发数据来自不同的分布,特别是,也许算法在训练集上做得不错,可能因为训练集很容易识别,因为训练集都是高分辨率图片,很清晰的图像,但开发集要难以识别得多。首先算法只见过训练集数据,没见过开发集数据。其次,开发集数据来自不同的分布。很难确认这增加的9%误差率有多少是算法没看到开发集中的数据导致的,这是问题方差的部分,有多少是因为开发集数据就是不一样。

为了分辨清楚两个因素的影响,定义一组新的数据是有意义的,称之为训练-开发集,所以这是一个新的数据子集。从训练集的分布里挖出来,但不会用来训练网络。
图1
随机打散训练集,然后分出一部分训练集作为训练-开发集,就像开发集和测试集来自同一分布,训练集、训练-开发集也来自同一分布。只在训练集训练神经网络,不会让神经网络在训练-开发集上跑后向传播。

Training error1%1%
Train-dev error9%1.5%
Dev error10%10%
Variancedata mismatch

第一种情况,从训练数据变到训练-开发集数据时,错误率上升了很多。而训练数据和训练-开发数据的差异在于,神经网络能看到第一部分数据并直接在上面做了训练,但没有在训练-开发集上直接训练,这就说明,算法存在方差问题,因为训练-开发集和训练集来自同一分布。尽管神经网络在训练集中表现良好,但无法泛化到来自相同分布的训练-开发集里,无法很好地泛化推广到来自同一分布,但以前没见过的数据中,所以在这个样本中确实有一个方差问题。

第二种情况,现在方差问题就很小了,因为从见过的训练数据转到训练-开发集数据,神经网络还没有看到的数据,错误率只上升了一点点。但当转到开发集时,错误率就大大上升了,所以这是数据不匹配的问题。因为学习算法没有直接在训练-开发集或者开发集训练过,但是这两个数据集来自不同的分布。

Human error0%
Training error10%10%
Train-dev error11%11%
Dev error12%20%
Avoidable biasAvoidable bias + Data mismatch

第三种情况存在可避免偏差问题,因为算法做的比人类水平差很多,所以这里的偏差真的很高。

第四种情况,有两个问题。第一,可避免偏差相当高,因为在训练集上都没有做得很好。这里方差似乎很小,但数据不匹配问题很大。

总结:

Human level4%4%
↕ \updownarrow Avoidable bias
Training set error7%7%
↕ \updownarrow Variance
Train-dev set error10%10%
↕ \updownarrow Data mismatch
Dev error12%6%
↕ \updownarrow Degree of overfit to dev set
Test error12%6%

表格最右边还有个例子,原因可能是训练数据比开发集和测试集难识别得多(语音识别任务)。

例子2:语音激活后视镜

General speech recognitionRearview mirror speech data
Human level“Human level” 4% ⟷ \longleftrightarrow 6%
↕ \updownarrow ↕ \updownarrow Avoidable bias
Error on examples trained on“Training error” 7% ⟷ \longleftrightarrow 6%
↕ \updownarrow ↕ \updownarrow Variance
Error on examples not trained on“Training-dev error” 10% ⟷ \longleftrightarrow “Dev/Test error” 6%
Data mismatch

这个差距(Human level 4%和Training error 7%)衡量了可避免偏差大小,这个差距(Training error 7%和Training-dev error 10%)衡量了方差大小,而这个差距(Training-dev error 10%和Dev/Test dev 6%)衡量了数据不匹配问题的大小。

事实证明,把剩下的两个数字(Rearview mirror speech data 6%和Error on examples trained on 6%),也放到这个表格里也是有用的。那么获得这个数字(6%)的方式是让一些人自己标记他们的后视镜语音识别数据,看看人类在这个任务里能做多好。收集一些后视镜语音识别数据,把它放在训练集中,让神经网络去学习,然后测量那个数据子集上的错误率,但如果得到这样的结果(6%),那就是说已经在后视镜语音数据上达到人类水平了,对那个数据分布做的已经不错了。

比较这两个数字(General speech recognition Human level 4%和Rearview mirror speech data 6%),告诉我们对于人类来说,后视镜的语音数据实际上比一般语音识别更难,因为人类都有6%的错误,而不是4%的错误。有时候填满整个表格,可能会洞察到更多特征。

处理数据不匹配问题

  • Carry out manual error analysis to try to understand difference between training and dev/test sets.
  • Make training data more similar; or collect more data similar to dev/test sets.

如果发现有严重的数据不匹配问题,通常要亲自做误差分析,尝试了解训练集和开发测试集的具体差异。技术上,为了避免对测试集过拟合,要做误差分析,应该人工去看开发集而不是测试集。

比如开发一个语音激活的后视镜应用,可能会发现很多开发集样本噪音很多,有很多汽车噪音,这是开发集和训练集差异之一。也许还会发现其他错误,比如在车子里的语言激活后视镜,发现它可能经常识别错误街道号码,因为那里有很多导航请求都有街道地址,所以得到正确的街道号码真的很重要。

开发集有可能跟训练集不同或者更难识别,那么可以尝试把训练数据变得更像开发集一点,或者,也可以收集更多类似开发集和测试集的数据。所以,如果发现车辆背景噪音是主要的误差来源,那么可以模拟车辆噪声数据。或者发现很难识别街道号码,也许可以有意识地收集更多人们说数字的音频数据,加到训练集里。

这种人工见解,可以一起尝试收集更多和真正重要的场合相似的数据,这通常有助于解决很多问题。

人工合成数据例子1:假设录制了大量清晰的音频,不带车辆背景噪音的音频,“The quick brown fox jumps over the lazy dog”,这可能是训练集里的一段音频。也可以收集一段汽车噪音,这就是汽车内部的背景噪音。如果把两个音频片段放到一起,就可以合成出"the quick brown fox jumps over the lazy dog"(带有汽车噪声),这是一个相对简单的音频合成例子。在实践中,可能会合成其他音频效果,比如混响,就是声音从汽车内壁上反弹叠加的效果。

人工数据合成有一个潜在问题,比如说,在安静的背景里录得10000小时音频数据,然后,只录了一小时车辆背景噪音,那么将这1小时汽车噪音回放10000次,并叠加到在安静的背景下录得的10000小时数据。这么做人听起来这个音频没什么问题。但是有一个风险,有可能学习算法对这1小时汽车噪音过拟合。在所有汽车噪音背景的集合里,如果只录了一小时汽车噪音,那可能只模拟了全部数据空间的一小部分,可能只从汽车噪音的很小的子集来合成数据。从这整个空间很小的一个子集出发合成数据,神经网络最后可能对这一小时汽车噪音过拟合。

人工合成数据例子2:假设在研发无人驾驶汽车,可能希望检测出这样的车,然后用这样的框包住它(见上图)。事实上,这里有几张车辆照片(上图后两张图片),其实是用计算机合成的,通过这样合成图片,可以训练出一个相当不错的计算机视觉系统来检测车子。

不幸的是,比如这是所有车的集合,如果只合成这些车中很小的子集,对于人眼来说也许这样合成图像没什么问题,但学习算法可能会对合成的这一个小子集过拟合。特别是一旦找到一个电脑游戏,里面车辆渲染的画面很逼真,那么就可以截图,得到数量巨大的汽车图片数据集。事实证明,如果仔细观察一个视频游戏,若这个游戏只有20辆独立的车,那么这游戏看起来还行。因为是在游戏里开车,只看到这20辆车,这个模拟看起来相当逼真。但现实世界里车辆的设计可不只20种,如果用这20量独特的车合成的照片去训练系统,那么你的神经网络很可能对这20辆车过拟合,但人类很难分辨出来。

总之,如果存在数据不匹配问题,可以做误差分析,看看训练集或者开发集,试图找出和了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。

其中一种办法是人工数据合成,人工数据合成确实有效。在语音识别中,已经看到人工数据合成显著提升了语音识别系统的表现,所以这是可行的。但使用人工数据合成时,一定要谨慎,要记住有可能从所有可能性的空间只选了很小一部分去模拟数据。

迁移学习

深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中学得知识,并将这些知识应用到另一个独立的任务中。这就是迁移学习。

例子1:假设已经训练好一个图像识别神经网络,首先用一个神经网络,并在 ( x , y ) (x,y) (x,y)对上训练,其中是 x x x图像, y y y是某些对象,图像是猫、狗、鸟或其他东西。如果把这个神经网络拿来,然后让它适应或者说迁移,在不同任务中学到的知识,比如放射科诊断,就是说阅读 X X X射线扫描图。可以把神经网络最后的输出层拿走或删掉,还有进入到最后一层的权重删掉,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。

当进行图像识别任务训练时,可以训练神经网络的所有常用参数,所有的权重,所有的层,然后就得到了一个能够做图像识别预测的网络。在训练了这个神经网络后,要实现迁移学习,把数据集换成新的 ( x , y ) (x,y) (x,y)对,现在 x x x变成放射科图像, y y y是想要预测的诊断,随机初始化最后一层的权重 W [ L ] W^{[L]} W[L] b [ L ] b^{[L]} b[L].

如果放射科数据集很小,可能只需要重新训练最后一层的权重(或者最后一两层),就是 W [ L ] W^{[L]} W[L] b [ L ] b^{[L]} b[L]并保持其他参数不变。如果有足够多的数据,可以重新训练神经网络中剩下的所有层(网络中的所有参数)。如果重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练 (pre-training),因为在用图像识别数据去预先初始化,或者预训练神经网络的权重。然后,如果以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调 (fine tuning)。

在这个例子中,把图像识别中学到的知识应用或迁移到放射科诊断上来,为什么这样做有效果呢?有很多低层次特征,比如说边缘检测、曲线检测、阳性对象检测(positive objects),从非常大的图像识别数据库中学得这些能力可能有助于学习算法在放射科诊断中做得更好,算法学到了很多结构信息,图像形状的信息,其中一些知识可能会很有用,所以学会了图像识别,它就可能学到足够多的信息,可以了解不同图像的组成部分是怎样的,学到线条、点、曲线这些知识,也许对象的一小部分,这些知识有可能帮助放射科诊断网络学习更快一些,或者需要更少的学习数据。

例子2:假设已经训练出一个语音识别系统,现在 x x x是音频或音频片段输入,而 y y y是听写文本。现在想搭建一个“唤醒词”或“触发词”检测系统,唤醒词或触发词就是我们说的一句话,可以唤醒家里的语音控制设备。要做到这点,可能需要去掉神经网络的最后一层,然后加入新的输出节点,但有时可以不止加入一个新节点,或者甚至往神经网络加入几个新层,然后把唤醒词检测问题的标签 y y y喂进去训练。

假设图像识别任务中有1000000个样本,可以学习低层次特征,可以在神经网络的前面几层学到如何识别很多有用的特征。但是对于放射科任务,也许只有100个样本(100次 X X X射线扫描),所以从图像识别训练中学到的很多知识可以迁移,并且真正加强放射科识别任务的性能,即使放射科数据很少。

对于语音识别,也许已经用10000小时数据训练过语言识别系统,从这10000小时数据学到了很多人类声音的特征。但对于触发字检测,也许只有1小时数据,不能用来拟合很多参数。在这种情况下,预先学到很多人类声音的特征、人类语言的组成部分等知识,可以建立一个很好的唤醒字检测器,即使数据集相对较小。

反过来的话,迁移学习可能就没有意义了。

所以总结一下,什么时候迁移学习是有意义的?

  • Task A and B have the same input x.
  • You have a lot more data for Task A than Task B.
  • Low level features from A could be helpful for learning B.

在第一个例子中,A和B的输入都是图像,在第二个例子中,两者输入都是音频。所有这些假设的前提都是,希望提高任务B的性能,因为任务B每个数据更有价值。然后如果觉得任务A的低层次特征,可以帮助任务B的学习,那迁移学习更有意义一些。在这两个前面的例子中,也许学习图像识别教给系统足够多图像相关的知识,让它可以进行放射科诊断,也许学习语音识别教给系统足够多人类语言信息,能帮助开发触发字或唤醒字检测器。

所以迁移学习最有用的场合是,如果尝试优化任务B的性能,通常这个任务B数据相对较少,但有些场合使用迁移学习时,任务A实际上数据量比任务B要少,这种情况下增益可能不多。

多任务学习

例子:假设在研发无人驾驶车辆,那么无人驾驶车可能需要同时检测不同的物体,比如检测行人、车辆、停车标志,还有交通灯各种其他东西。比如在下面这个例子中,图像里有个停车标志,然后图像中有辆车,但没有行人,也没有交通灯。

如果这是输入图像 x ( i ) x^{(i)} x(i),那么这里不再是一个标签 y ( i ) y^{(i)} y(i),而是有4个标签。 y ( i ) = [ 0 1 1  0 ] T y^{(i)}=\left[ \text{0 1 1 }0 \right] ^T y(i)=[0 1 1 0]T是个4×1向量。从整体来看这个训练集:
Y = [ y ( 1 )    y ( 2 )    ⋯    y ( m ) ] 维 度 为 4 × m . Y=\left[ y^{\left( 1 \right)}\,\,y^{\left( 2 \right)}\,\,\cdots \,\,y^{\left( m \right)} \right] 维度为4×m. Y=[y(1)y(2)y(m)]4×m.

这里输出 y ∧ \overset{\land}{y} y有四个节点,第一个节点就是想预测图中有没有行人,然后第二个输出节点预测的是有没有车,第三个预测有没有停车标志,第四个预测有没有交通灯。

要训练这个神经网络,需要定义神经网络的损失函数,对于整个训练集的平均损失如下:
1 m ∑ i = 1 m ∑ j = 1 4 L ( y ∧ j ( i ) , y j ( i ) ) \frac{1}{m}\sum_{i=1}^m{\sum_{j=1}^4{\mathscr{L}\left( \overset{\land}{y}_{j}^{\left( i \right)},y_{j}^{\left( i \right)} \right)}} m1i=1mj=14L(yj(i),yj(i))

∑ j = 1 4 L ( y ∧ j ( i ) , y j ( i ) ) \sum_{j=1}^4{\mathscr{L}\left( \overset{\land}{y}_{j}^{\left( i \right)},y_{j}^{\left( i \right)} \right)} j=14L(yj(i),yj(i))这些单个预测的损失,这就是对四个分量的求和,行人、车、停车标志、交通灯,而 L \mathscr{L} L指的是logistic损失:
− y j ( i ) log ⁡ y ∧ j ( i ) − ( 1 − y j ( i ) ) log ⁡ ( 1 − y ∧ j ( i ) ) -y_{j}^{\left( i \right)}\log \overset{\land}{y}_{j}^{\left( i \right)}-\left( 1-y_{j}^{\left( i \right)} \right) \log \left( 1-\overset{\land}{y}_{j}^{\left( i \right)} \right) yj(i)logyj(i)(1yj(i))log(1yj(i))

这与Softmax回归的主要区别在于,Softmax将单个标签分配给单个样本。而这张图可以有很多不同的标签,并不是说每张图都只是一张行人图片,汽车图片、停车标志图片或者交通灯图片。多个物体可能同时出现在一张图里。不是只给图片一个标签,而是需要遍历不同类型,然后看看每个类型,那类物体有没有出现在图中。

如果训练了一个神经网络,试图最小化这个成本函数,要做的就是多任务学习。因为现在做的是建立单个神经网络,观察每张图,然后解决四个问题,每张图里面有没有这四个物体。训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。

多任务学习也可以处理图像只有部分物体被标记的情况。对于第一个训练样本,给数据贴标签的人告诉你里面有一个行人,没有车,但他们没有标记是否有停车标志,或者是否有交通灯(打上"?"号)。
Y = [ 1 1 0 ⋯ 0 1 1 ⋯ ? ? 1 ⋯ ? ? 0 ⋯ ] Y=\left[ \begin{matrix} 1& 1& 0& \cdots\\ 0& 1& 1& \cdots\\ ?& ?& 1& \cdots\\ ?& ?& 0& \cdots\\ \end{matrix} \right] Y=10??11??0110

即使一些图像只有一小部分标签,其他是问号或者不管是什么。然后训练算法的方式,对 j j j从1到4求和,就只对带0和1标签的 j j j值求和,所以当有问号的时候,就在求和时忽略那个项。

那么多任务学习什么时候有意义呢?

  • Training on a set of tasks that could benefit from having shared lower-level features.
  • Usually: Amount of data you have for each task is quite similar.
  • Can train a big enough neural network to do well on all the tasks.

对于无人驾驶的例子,同时识别交通灯、汽车和行人,这些物体有相似的特征,也许能帮助识别停车标志,因为这些都是道路上的特征。

在多任务学习中,通常有更多任务而不仅仅是两个,比如要完成100个任务,尝试同时识别100种不同类型的物体,每个任务大概有1000个样本。所以如果专注加强单个任务的性能,比如专注加强第100个任务的表现,用A100表示,如果试图单独去做这个最后的任务,你只有1000个样本去训练这个任务,这是100项任务之一,而通过在其他99项任务的训练,这些加起来可以一共有99000个样本,这可能大幅提升算法性能,可以提供很多知识来增强这个任务的性能。不然对于A100任务,只有1000个样本的训练集,效果可能会很差。如果对于单个任务已经有1000个样本了,那么对于所有其他任务,最好有超过1000个样本,这样其他任务的知识才能帮你改善这个任务的性能。

多任务学习和训练单个神经网络相比性能更低的情况就是神经网络还不够大。

在物体检测中,我们看到更多使用多任务学习的应用,其中一个神经网络尝试检测一大堆物体,比分别训练不同的神经网络检测物体更好。

多任务学习能训练一个神经网络来执行许多任务,这可以提供比单独完成各个任务更高的性能。多任务学习,使用频率比迁移学习要少得多,也许其中一个例外是计算机视觉,物体检测。

什么是端到端的深度学习?

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

例子1:语音识别,目标是输入 x x x,比如说一段音频,然后把它映射到一个输出 y y y,就是这段音频的听写文本。传统上,语音识别需要很多阶段的处理。首先提取一些特征,一些手工设计的音频特征,MFCC这种算法是用来从音频中提取一组特定的人工设计的特征。在提取出一些低层次特征之后,可以应用机器学习算法在音频片段中找到音位,所以音位是声音的基本单位,比如说“Cat”这个词是三个音位构成的,Cu-、Ah-和Tu-,算法就把这三个音位提取出来,然后将音位串在一起构成独立的词,然后将词串起来构成音频片段的听写文本。
a u d i o x ⟶ M F C C f e a t u r e s ⟶ M L p h o n e m e s ⟶ w o r d s ⟶ t r a n s c r i p t y \overset{x}{audio}\overset{MFCC}{\longrightarrow}features\overset{ML}{\longrightarrow}phonemes\longrightarrow words\longrightarrow \overset{y}{transcript} audioxMFCCfeaturesMLphonemeswordstranscripty

端到端深度学习做的是,训练一个巨大的神经网络,输入就是一段音频,输出直接是听写文本。端到端深度学习就只需要把训练集拿过来,直接学到了 x x x y y y之间的函数映射,直接绕过了其中很多步骤。
a u d i o x ⟶ t r a n s c r i p t y \overset{x}{audio}\longrightarrow \overset{y}{transcript} audioxtranscripty

端到端深度学习的挑战之一是,可能需要大量数据才能让系统表现良好,比如,只有3000小时数据去训练语音识别系统,那么传统的流水线效果真的很好。但当拥有非常大的数据集时,比如10000小时数据或者100000小时数据,这样端到端方法突然开始很厉害了。如果数据量适中,那么也可以用中间件方法,可能输入还是音频,然后绕过特征提取,直接尝试从神经网络输出音位,然后也可以在其他阶段用,所以这是往端到端学习迈出的一小步,但还没有到那里。
a u d i o x ⟶ p h o n e m e s ⟶ ⋯ ⟶ t r a n s c r i p t y \overset{x}{audio}\overset{}{\longrightarrow}phonemes\longrightarrow \cdots \longrightarrow \overset{y}{transcript} audioxphonemestranscripty

例子2:下面这张图是一个研究员做的人脸识别门禁,是百度的林元庆研究员做的。这是一个相机,它会拍下接近门禁的人,如果它认出了那个人,门禁系统就自动打开,让他通过,所以不需要刷一个RFID工卡就能进入这个设施。

看看相机拍到的照片,尝试直接学习图像 x x x到人物身份 y y y的函数映射,事实证明这不是最好的方法。其中一个问题是,人可以从很多不同的角度接近门禁,他们可能在绿色位置,可能在蓝色位置。有时他们更靠近相机,所以他们看起来更大。在实际研制这些门禁系统时,不是直接将原始照片喂到一个神经网络,试图找出一个人的身份。

相反,迄今为止最好的方法似乎是一个多步方法,首先,运行一个软件来检测人脸,所以第一个检测器找的是人脸位置,检测到人脸,然后放大图像的那部分,并裁剪图像,使人脸居中显示,然后就是这里红线框起来的照片,再喂到神经网络里,让网络去学习,或估计那人的身份。其中训练(网络)第二步的方式就是输入两张图片,然后将输入的两张图比较一下,判断是否是同一个人。

比起一步到位,一步学习,把这个问题分解成两个更简单的步骤。这个方法让学习算法,或者说两个学习算法分别解决两个更简单的任务,并在整体上得到更好的表现。

为什么两步法更好呢?一是,解决的两个问题,每个问题实际上要简单得多。第二,两个子任务的训练数据都很多。相比之下,如果想一步到位,这样的数据对 ( x , y ) (x,y) (x,y)就少得多,其中 x x x是门禁系统拍摄的图像, y y y是那人的身份。

例子3:机器翻译。传统上,机器翻译系统也有一个很复杂的流水线,比如英语机翻得到文本,然后做文本分析,基本上要从文本中提取一些特征之类的,经过很多步骤,最后会将英文文本翻译成法文。因为对于机器翻译来说的确有很多(英文, 法文)的数据对,在今天可以收集 ( x , y ) (x,y) (x,y)对的大数据集,就是英文句子和对应的法语翻译。所以在这个例子中,端到端深度学习效果很好。
E n g l i s h ⟶ t e x t    a n a l y s i s ⟶ ⋯ ⟶ F r e n c h E n g l i s h ⟶ F r e n c h \overset{}{English}\overset{}{\longrightarrow}text\,\,analysis\longrightarrow \cdots \longrightarrow \overset{}{French}\\ \overset{}{English}\longrightarrow \overset{}{French} EnglishtextanalysisFrenchEnglishFrench

例子4:希望观察一个孩子手部的X光照片,估计一个孩子的年龄。这是儿科医生用来判断一个孩子的发育是否正常。

处理这个例子的一个非端到端方法,就是照一张图,然后分割出每一块骨头。然后,知道不同骨骼的长度,可以去查表,查到儿童手中骨头的平均长度,然后用它来估计孩子的年龄,所以这种方法实际上很好。
I m a g e ⟶ b o n e s ⟶ a g e \overset{}{Image}\overset{}{\longrightarrow}bones\longrightarrow \overset{}{age} Imagebonesage

相比之下,如果直接从图像去判断孩子的年龄,那么需要大量的数据去直接训练。这种做法今天还是不行的,因为没有足够的数据来用端到端的方式来训练这个任务。
I m a g e ⟶ a g e \overset{}{Image}\overset{}\longrightarrow \overset{}{age} Imageage

将这个问题分解成两个步骤,第一步是一个比较简单的问题,也许不需要那么多数据,也不需要许多X射线图像来切分骨骼。而任务二,收集儿童手部的骨头长度的统计数据,不需要太多数据也能做出相当准确的估计,所以这个多步方法看起来很有希望。

所以端到端深度学习系统是可行的,它表现可以很好,也可以简化系统架构,不需要搭建那么多手工设计的单独组件,但它也不是灵丹妙药,并不是每次都能成功。

是否使用端到端的深度学习方法

端到端的深度学习的优缺点:
优点:

  • Let the data speak
  • Less hand-designing of components needed

缺点:

  • May need large amount of data
  • Excludes potentially useful hand-designed components

在语音识别领域,早期的识别系统有这个音位概念,这个音位也许是人类语言学家生造出来的,音位其实是语音学家的幻想,用音位描述语言也还算合理。但是不要强迫学习算法以音位为单位思考。如果让学习算法学习它想要的任意表示方式,而不是强迫学习算法使用音位作为表示方式,那么其整体表现可能会更好。

端到端深度学习所需手工设计的组件更少,所以这也许能够简化设计工作流程,不需要花太多时间去手工设计功能和这些中间表示方式。

但是,端到端的深度学习排除了可能有用的手工设计组件。学习算法有两个主要的知识来源,一个是数据,另一个是手工设计的任何东西,可能是组件,功能,或者其他东西。所以当没有太多的数据时,构造一个精心设计的系统,实际上可以将人类对这个问题的很多认识直接注入到问题里,进入算法里应该挺有帮助的。手工设计的组件往往在训练集更小的时候帮助更大。

在尝试决定是否使用端到端深度学习,关键的问题是,是否有足够的数据能够直接学到从x映射到y足够复杂的函数吗?Do you have sufficient data to learn a function of the complexity needed to map x to y?

例子:无人驾驶技术,可以把车前方的雷达、激光雷达或者其他传感器的读数看成是输入图像x。拍一张车前方或者周围的照片,然后驾驶要安全的话,必须能检测到附近的车,也需要检测到行人和其他的东西。

当看到其他车子在哪,行人在哪里,需要决定如何摆方向盘在接下来的几秒钟内引导车子的路径。从传感器或图像输入到检测行人和车辆,深度学习可以做得很好,但一旦知道其他车辆和行人的位置或者动向,选择一条车要走的路,这通常用的不是深度学习,而是用所谓的运动规划软件完成的。决定了车子要走的路径之后,还会有一些其他算法如控制算法,可以产生精确的决策确定方向盘应该精确地转多少度,油门或刹车上应该用多少力。
i m a g e ( r a d a r , l i d a r ) ⟶ D L c a r s , p e d e s t r i a n s ⟶ m o t i o n    p l a n n i n g r o u t e ⟶ c o n t r o l s t e e r i n g image\left( radar,lidar \right) \overset{DL}{\longrightarrow}cars,pedestrians\overset{motion\,\,planning}{\longrightarrow}route\overset{control}{\longrightarrow}steering image(radar,lidar)DLcarspedestriansmotionplanningroutecontrolsteering

  • Use DL to learn individual component.
  • Carefully choose X → \rightarrow Y depending on what tasks you can get data for.

相比之下,谈论纯端到端深度学习方法是很激动人心的,输入图像x,直接得出方向盘转角,但是就目前能收集到的数据而言,还有我们今天能够用神经网络学习的数据类型而言,这实际上不是最有希望的方法,或者说这个方法并不是团队想出的最好用的方法。
i m a g e ⟶ s t e e r i n g image\overset{}{\longrightarrow}steering imagesteering

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值