在数据集中原本就可能存在错误标记的样本,该怎么办呢?
首先,深度学习算法对于训练集中的随机错误是相当健壮的
,只要这些错误标记的例子离随机错误不太远,即不是有意而为之,那么放着这些错误不管可能也没问题。
但是深度学习对系统性的错误就没那么健壮了。例如将白色的狗狗一直分类成猫,那么在学习之后,分类器就会把所以白色的狗都分类为猫。
若担心开发集或者测试集中的错误样本带来的影响,可以通过错误分析列表格的方式来进行判断。如在表格中添加标签错误一栏:
若这些错误样本严重的影响了在开发集上评估算法的能力,那么就应该花时间修正错误的标签。
在修正开发集时,有下面几点建议:
(1)对测试集和验证集同时进行修正,确保dev和test来自相同的分布。
(2)考虑检查一下算法正确和错误的例子【不容易实施,分析错误样本不难,但分析正确样本很难】
(3)train和dev/test可以来自不同的分布。即对开发集修正后,可以不对训练集进行修正。
在搭建系统时,应该:
(1)先建立dev、test数据集和评估指标。【即使指标错了后面也可以改】
(2)快速的建立初始的机器学习系统
(3)使用Bias/Variance analysis & Error analysis来确定下一步要做什么。
即先构建快速和肮脏的系统,在逐步分析进行优化。
深度学习算法对训练数据的胃口很大,当你收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,甚至是大部分数据都来自和开发集、测试集不同的分布。如何处理训练集与开发集/测试集存在差异的问题呢?
假设存在两个数据集:20万份来自网上下载的高清的猫图片;1万份手机拍摄的低分辨率猫的图片。
(1)可以将两份数据合并在一起,再将数据随机分配到训练集、开发集和测试集中。
这么建立数据集的好处在于训练集、开发集和验证集均来自同一个分布;坏处在于开发集和测试集大部分图片都是来自网上的数据,但这些图片不是我们真正关心的数据分布。【所以这种方式不推荐使用】
(2)可以将手机拍摄的图片进行划分,一部分分到train里面,剩下的当作dev/test。
这样的好处是,我们在开发集瞄准(优化)的目标就是我们要处理的目标。坏处是训练集和dev/test的分布不同。
当train和dev/test的分布不一样时,bias和variance的分析会有所不同。
继续以猫分类器为例,假设人类水平错误率为0%。模型算法在train上有1%的错误率,dev上有10%的错误率。这个模型可能存在variance问题,不能够很好的泛化;但是如果train和dev/test的分布不一样时,就不能放心的下这个结论了。因为这9%的错误率可能来自算法本身,也可能是因为数据分布不同导致的。
为了判断是否是variance的问题,我们创造一个新的数据集:Train-dev set,训练-开发集。这是从train里划分出来的数据,与train有相同的分布,但是不会用于训练模型。
随机打散train,划分出train-dev,再用train去训练模型。为了确定是否是variance的问题,需要观察train、train-dev和开发集上的错误。
一般情况下,人类水平 error、training error、training-dev error、dev error以及test error的数值是递增的,但是也会出现dev error和test error下降的情况。这主要可能是因为训练样本比验证/测试样本更加复杂,难以训练。
如何解决数据不匹配:
(1)人工手动的做误差分析,尝试找出train set和dev/test set之间的差异。
(2)尝试使train set和dev/test set之间更加相似;或者收集更多相似的dev/test set数据。
人工合成数据需要注意:
假设我们在收集语言识别的数据样本,现在花6个消失收集了语音样本A,和花1个小时收集了噪音样本B。可以将A和B相互组合生成更多的样本,但是可能训练出来的模型对噪音B产生过拟合现象,因为A和B的组合可能只是所以样本中的一个子集。
深度学习最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。例如,也许你已经训练好一个神经网络,如识别猫的神经,我们可以使用这个神经网络的框架或者搭建过程中学到的知识去帮助更好地识别x射线扫描图,这就是所谓的迁移学习
。
例如,你训练了一个识别图片分类的神经网络;现在你想将这个神经网络投入到x射线扫描图中去使用,可以将原先的神经网络输出层去掉,加上新的输出层,之后再根据新的样本训练输入层和输出层的参数就可以识别x射线扫描图了。
经验规则是,如果你有一个小数据集,就只训练输出层前的最后一层,也许是最后一两层。但是如果你有很多数据,那么也许需要重新训练网络中的所有参数。
重新训练所有权重系数,初始始参数值由之前的模型训练得到,这一过程称为pre-training(预训练);之后,不断调试、优化的过程称为fine-tuning(微调)。
在迁移学习中,步骤是串行的,你从任务A里学习只是然后迁移到任务B。在多任务学习中,是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
例如假设我们在设计一个检测汽车图片的系统,可能需要检测出图片中的行人、汽车、交通灯和交通符号牌;
所以现在需要设计一个神经网络,输出一个思维向量,分布表示行人、汽车、交通灯和交通符号牌是否在图片中出现。
代价函数可以定义为下图的式子:
多任务学习和之前softmax 回归不同的是:softmax回归中只需要检测其中的一个是否会出现,而当前的任务四个物体会同时出现,即多任务学习的样本是multiple labels的,label中会出现多个1。
如果你训练了一个神经网络,试图最小化这个成本函数,做的就是多任务学习。因为现在做的是建立单个神经网络,观察每张图,然后解决四个问题,系统试图告诉你,每张图里面有没有这四个物体。另外也可以训练四个不同的神经网络,而不是训练一个网络做四件事情。但神经网络一些早期特征,在识别不同物体时都会用到,然后你发现,训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。
多任务学习也可以学习部分标签缺失的数据集,即只要部分label被标记的数据集,在计算代价函数时,忽略未标记的部分求和即可。
多任务学习何时有意义:
(1)训练的一组任务可以公用低层次特征
(2)通常:每个任务的数据量非常相似。
如有A1、A2……A100个任务,每个任务只有1000个样本,多任务学习可以通过A1-A99的99000个样本进行学习,从而来帮到第100个任务A100的完成。
(3)可以训练足够大的神经网络来完成所有任务
多任务学习的替代方法是为每个任务训练一个单独的神经网络,不是训练单个神经网络同时处理行人、汽车、停车标志和交通灯检测。
什么是端到端的深度学习呢?
简单来说,以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它
。
例如在语音识别任务中,先接收音频,然后使用MFCC来识别音频的一些低层次特征,再通过机器学习来找到一些音位从而识别出单词,再通过单词的组合对这段音频进行最后的翻译。
端到端的深度学习就是训练一个巨大的神经网络,输入一个音频直接输出翻译。端到端深度学习就只需要把训练集拿过来,直接学到了x和y之间的函数映射,直接绕过了其中很多步骤。
如果训练样本足够大,神经网络模型足够复杂,那么end-to-end模型性能比传统机器学习分块模型更好。当数据量不够大时,可以将端到端问题分解成几个子问题,若这几个子问题的数据量足够大,会比存粹的端到端深度学习方法表现得更好。
端到端深度学习的优点和缺点:
优点:
(1)仅让数据说话
【即不像传统流水线机器学习那样加入人的主观想法,如通过音位去识别单词】
(2)所需组件的手工设计更少
缺点:
(1)可能需要大量数据
(2)丢弃了潜在有用的手工设计
是否使用端到端的深度学习需要思考的问题是:
是否有足够的数据样本去学习一个x映射到y的复杂函数