正交化:一种系统设计属性,可确保修改指令或算法的组件不会产生或传播到系统的其他组件。可以更轻松地相互独立地验证算法,从而减少测试和开发时间。
训练集中表现不佳:更大的神经网络、更好的优化算法
验证集中表现不佳:实施正则化、增大训练集
测试集中表现不佳:更大的验证集
实际应用表现不佳:验证集不够合理、成本函数不合理
“ 当我训练神经网络时,我一般不用early stopping,这个技巧也还不错,很多人都这么干。但个人而言,我觉得用early stopping有点难以分析,因为这个旋钮会同时影响你对训练集的拟合,因为如果你早期停止,那么对训练集的拟合就不太好,但它同时也用来改善开发集的表现,所以这个旋钮没那么正交化。因为它同时影响两件事情,就像一个旋钮同时影响电视图像的宽度和高度。” ——吴恩达
选择分类器、定义良好的开发集和评估指标可加快迭代过程。
注:true表识别为真猫,Positive表示确实为真猫
注:精确度和查全率往往难以两全,此时可取其调和平均数: 2 1 p + 1 r \frac{2}{{\frac{1}{p} + \frac{1}{r}}} p1+r12进行比较
有不同的指标来评估分类器的性能,它们被称为评估矩阵。它们可以分为满足矩阵和优化矩阵。需要注意的是,这些评估矩阵必须在训练集、开发集或测试集上进行评估。
假阳性:不为真却误判为真。
开发(dev)集也叫做开发集(development set),有时称为保留交叉验证集(hold out cross validation set)
训练/开发/测试集划分:
对于某些应用,你也许不需要对系统性能有置信度很高的评估,也许你只需要训练集和开发集。我认为,不单独分出一个测试集也是可以的。事实上,有时在实践中有些人会只分成训练集和测试集,他们实际上在测试集上迭代,所以这里没有测试集,他们有的是训练集和开发集,但没有测试集。如果你真的在调试这个集,这个开发集或这个测试集,这最好称为开发集。
指导方针:
评估算法好坏时,错误率并非唯一标准,因此,在传统的错误率 E r r o r = 1 m d e v ∑ i = 1 m d e v I { y p r e d ( i ) ≠ y ( i ) } Error = \frac{1}{m_{{dev}}}\sum_{i = 1}^{m_{{dev}}}{I\{ y_{{pred}}^{(i)} \neq y^{(i)}\}} Error=mdev1∑i=1mdevI{ypred(i)=y(i)}的基础上,可以加一个权重 w ( i ) {w^{(i)}} w(i)(公式如下),对于不同的 i i i,可调整 w ( i ) {w^{(i)}} w(i)以增强评估效果。
E r r o r = 1 m d e v ∑ i = 1 m d e v w ( i ) I { y p r e d ( i ) ≠ y ( i ) } Error = \frac{1}{m_{{dev}}}\sum_{i = 1}^{m_{{dev}}}{w^{(i)}I\{ y_{{pred}}^{(i)} \neq y^{(i)}\}} Error=mdev1i=1∑mdevw(i)I{ypred(i)=y(i)}
如果你希望得到归一化常数,在技术上,就是 w ( i ) w^{(i)} w(i)对所有 i i i求和,这样错误率仍然在0和1之间,即:
E r r o r = 1 ∑ w ( i ) ∑ i = 1 m d e v w ( i ) I { y p r e d ( i ) ≠ y ( i ) } Error = \frac{1}{\sum_{}^{}w^{(i)}}\sum_{i = 1}^{m_{{dev}}}{w^{(i)}I\{ y_{{pred}}^{(i)} \neq y^{(i)}\}} Error=∑w(i)1i=1∑mdevw(i)I{ypred(i)=y(i)}
“ 对于大多数团队,我建议最好不要在没有评估指标和开发集时跑太久,因为那样可能会减慢你的团队迭代和改善算法的速度。” ——吴恩达
下图显示了人类和机器学习在一段时间内的表现:
贝叶斯最优错误率(Bayes optimal error):性能无法超过的某个理论上限。贝叶斯最优错误率一般认为是理论上可能达到的最优错误率,就是说没有任何办法设计出一个 x x x到 y y y的函数,让它能够超过一定的准确度。
机器学习表现超过人类后进展缓慢的原因之一是人类水平的性能可以接近贝叶斯最优误差,特别是对于自然感知问题。此外,当机器学习的性能比人类的性能差时,您可以使用不同的工具(如获取带标签数据、分析偏差/方差)对其进行改进。一旦超过人类水平的性能,它们就不大好用了。
三个误差:人类误差 ⟷ a \overset a \longleftrightarrow ⟷a训练集误差 ⟷ b \overset b \longleftrightarrow ⟷b开发集误差
可避免偏差:贝叶斯错误率或者对贝叶斯错误率的估计和训练错误率之间的差值,及上述误差中 a a a。
上述误差中 a a a可视为可避免偏差的指标, b b b可视为方差的指标。
判断接下来的行动时,不必过分纠结于后两个误差是否足够接近 0 0 0,应比较指标 a a a和指标 b b b,判断是着重优化偏差还是方差。
如何定义人的表现:取决于目标。若只想超过单个人类,其应用对精度要求不高,可将普通人的表现视为“人的表现”;若想用它代替贝叶斯错误率,则需将专家等人的表现视为“人的表现”。
人类水平表现的偏差/差异总结:
算法表现超过人的表现后,进一步优化变得十分困难。例如:上文提到的可避免偏差的指标将变为负数,我们无法判断应优先优化偏差还是方差
错误类型 | 狗 | 狮子 | 模糊 | 滤镜 | 备注 |
---|---|---|---|---|---|
1 | √ | √ | …… | ||
2 | √ | …… | |||
… | …… | ||||
100 | √ | √ | …… | ||
…… |
优势:
深度学习算法对于训练集中的随机错误是相当健壮的(robust),除非存在系统性的错误,否则不必花时间纠正训练集错误
开发集或测试集中的错误:看错误标记引起的错误的数量或者百分比,及时纠正开发集错误可以更可信地判断算法优劣
应集中精力修正开发集、测试集错误,不必纠结于训练集错误
例外情况:
一般而言,开发集、测试集的数据尽量真实(如使用实际会用到的数据),其余真实数据放入训练集(训练集中最贴近实际场景的数据占比可以少些)
目的:有更多的训练数据
定义一组新的数据:训练-开发集(training-dev set),这是一个新的数据子集。我们应该随机打散训练集,从训练集的分布里挖出来,但不会用来训练神经网络。
其他数据集 | 实际数据集 | |
---|---|---|
人类表现误差 | a a a | d d d |
训练数据误差 | (training) b b b | e e e |
未训练数据误差 | (train-dev) c c c | (dev&test) f f f |
a − b a-b a−b:评估偏差
b − c b-c b−c:评估方差
c − f c-f c−f:评估数据不匹配
t e s t S e t − d e v S e t testSet-devSet testSet−devSet:对开发集的过拟合程度
有时候如果你的开发测试集分布比你应用实际处理的数据要容易得多,那么实际数据集中错误率可能比train-dev还要低
总而言之,如果你认为存在数据不匹配问题,建议做错误分析,或者看看训练集,或者看看开发集,试图找出,试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。
我们谈到其中一种办法是人工数据合成,人工数据合成确实有效。在语音识别中。我已经看到人工数据合成显著提升了已经非常好的语音识别系统的表现,所以这是可行的。但当你使用人工数据合成时,一定要谨慎,要记住你有可能从所有可能性的空间只选了很小一部分去模拟数据,容易导致学习算法对这一小部分数据过拟合。
有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。
方法:
预训练(pre-training):在用迁移前的数据去预先初始化,或者预训练神经网络的权重。
微调(fine tuning):以后更新所有权重,然后在新的数据上训练
迁移学习何时有意义:在迁移来源问题(相关但不同的任务)中有很多数据,但迁移目标问题你没有那么多数据
意义:让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
输出 y y y有多个标签,
Y = [ ∣ ∣ ∣ … ∣ y ( 1 ) y ( 2 ) y ( 3 ) … y ( m ) ∣ ∣ ∣ … ∣ ] Y = \begin{bmatrix} | & | & | & \ldots & | \\ y^{(1)} & y^{(2)} & y^{(3)} & \ldots & y^{(m)} \\ | & | & | & \ldots & | \\ \end{bmatrix} Y=⎣⎡∣y(1)∣∣y(2)∣∣y(3)∣………∣y(m)∣⎦⎤
要训练这个神经网络,你现在需要定义神经网络的损失函数,对于一个输出 y ^ \hat y y^,是个4维向量,对于整个训练集的平均损失:
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}{L(\hat y_{j}^{(i)},y_{j}^{(i)})}} m1i=1∑mj=1∑4L(y^j(i),yj(i))
∑ j = 1 4 L ( y ^ j ( i ) , y j ( i ) ) \sum_{j = 1}^{4}{L(\hat y_{j}^{(i)},y_{j}^{(i)})} ∑j=14L(y^j(i),yj(i))是这些单个预测的损失,所以这就是对四个分量的求和,行人、车、停车标志、交通灯,而这个标志L指的是logistic损失。
与softmax区别:与softmax回归不同,softmax将单个标签分配给单个样本。
事实证明,多任务学习也可以处理图像只有部分物体被标记的情况,在求和时忽略那个项,只对有标签的值求和即可
多任务学习有意义的情况:
训练的一组任务可以共用低层次特征
每个任务的数据量很接近,所有任务数据加起来远大于单个任务的(此条件不那么绝对)
足够大的神经网络(否则性能不如每个任务单独设计一个神经网络)
多任务学习应用不多,一个例外是计算机视觉,物体检测
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它,可简化系统架构。
训练一个巨大的神经网络,用巨大的数据进行训练方能发挥端到端深度学习的能力。
数据不足时:可以分步骤,手动设计模块。优点:
每个问题要简单得多
两个子任务的训练数据都很多
例:人脸识别可以先识别人脸的存在,裁切图片,然后进行识别
优势:
缺点:
有时候深度学习只是作为完整流程的一部分,比如,自动驾驶中,深度学习识别物体,另找算法确定路线。