lesson3 结构化机器学习项目
文章目录
- lesson3 结构化机器学习项目
- Week 1 机器学习(ML策略)(1)
- 3.1.1 为什么是ML策略?(Why ML Strategy?)
- 3.1.2 正交化(Orthogonalization)
- 3.1.3 单一数字评估指标(Single number evaluation metric)
- 3.1.4 满足和优化指标(Satisficing and optimizing metrics)
- 3.1.5 训练/开发/测试集划分(Train/dev/test distributions)
- 3.1.6 开发集和测试集的大小(Size of dev and test sets)
- 3.1.7 什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)
- 3.1.8 为什么是人的表现?(Why human-level performance?)
- 3.1.9 可避免偏差(Avoidable bias)
- 3.1.10 理解人的表现(Understanding human-level performance)
- 3.1.11 超过人的表现(Surpassing human- level performance)
- 3.1.12 改善你的模型的表现(Improving your model performance)
- Week 2 机器学习(ML策略)(2)
- 3.2.1 进行误差分析(Carrying out error analysis)
- 3.2.2 清除标注错误的数据(Cleaning up Incorrectly labeled data)
- 3.2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)
- 3.2.4 使用来自不同分布的数据,进行训练和测试(Training and testing on different distributions)
- 3.2.5 数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)
- 3.2.6 处理数据不匹配问题(Addressing data mismatch)
- 3.2.7 迁移学习(Transfer learning)
- 3.2.8 多任务学习(Multi-task learning)
- 3.2.9 什么是端到端的深度学习?(What is end-to-end deep learning?)
- 3.2.10 是否要使用端到端的深度学习?(Whether to use end-to-end learning?)
Week 1 机器学习(ML策略)(1)
3.1.1 为什么是ML策略?(Why ML Strategy?)
- 提高效率,让深度学习系统更快投入实用
- 使产品朝着最有希望的方向
- 前进搭建和部署大量深度学习产品
3.1.2 正交化(Orthogonalization)
正交化:一种系统设计属性,可确保修改指令或算法的组件不会产生或传播到系统的其他组件。可以更轻松地相互独立地验证算法,从而减少测试和开发时间。
-
训练集中表现不佳:更大的神经网络、更好的优化算法
-
验证集中表现不佳:实施正则化、增大训练集
-
测试集中表现不佳:更大的验证集
-
实际应用表现不佳:验证集不够合理、成本函数不合理
“ 当我训练神经网络时,我一般不用early stopping,这个技巧也还不错,很多人都这么干。但个人而言,我觉得用early stopping有点难以分析,因为这个旋钮会同时影响你对训练集的拟合,因为如果你早期停止,那么对训练集的拟合就不太好,但它同时也用来改善开发集的表现,所以这个旋钮没那么正交化。因为它同时影响两件事情,就像一个旋钮同时影响电视图像的宽度和高度。” ——吴恩达
3.1.3 单一数字评估指标(Single number evaluation metric)
选择分类器、定义良好的开发集和评估指标可加快迭代过程。
- 精确度:(算法预测的真猫中,有多少比例是真的真猫)
P r e c i s i o n ( % ) = t r u e P o s i t i v e t r u e P o s i t i v e + f a l s e P o s i t i v e × 100 % {\rm{Precision}}(\% ) = \frac{{truePositive}}{{truePositive + falsePositive}} \times 100\% Precision(%)=truePositive+falsePositivetruePositive×100%
注:true表识别为真猫,Positive表示确实为真猫
- 查全率:(所有真猫中,有多少被算法正确识别为真猫)
R e c a l l ( % ) = t r u e P o s i t i v e t r u e P o s i t i v e + t r u e N e g a t i v e × 100 % {\rm{Recall}}(\% ) = \frac{{truePositive}}{{truePositive + trueNegative}} \times 100\% Recall(%)=truePositive+trueNegativetruePositive×100%
注:精确度和查全率往往难以两全,此时可取其调和平均数: 2 1 p + 1 r \frac{2}{{\frac{1}{p} + \frac{1}{r}}} p1+r12进行比较
3.1.4 满足和优化指标(Satisficing and optimizing metrics)
- 线性评估: c o s t = 1 × a c c u r a c y − 0.5 × r u n t i m e {\rm{cost}} = 1 \times accuracy - 0.5 \times runtime cost=1×accuracy−0.5×runtime
有不同的指标来评估分类器的性能,它们被称为评估矩阵。它们可以分为满足矩阵和优化矩阵。需要注意的是,这些评估矩阵必须在训练集、开发集或测试集上进行评估。
- 满足矩阵:满足即可,不满足整个方案一票否决
- 优化矩阵:尽量最优
假阳性:不为真却误判为真。
3.1.5 训练/开发/测试集划分(Train/dev/test distributions)
开发(dev)集也叫做开发集(development set),有时称为保留交叉验证集(hold out cross validation set)
训练/开发/测试集划分:
- 来自同一分布
- 随机选择
- 能够反映你未来会得到的数据
3.1.6 开发集和测试集的大小(Size of dev and test sets)
对于某些应用,你也许不需要对系统性能有置信度很高的评估,也许你只需要训练集和开发集。我认为,不单独分出一个测试集也是可以的。事实上,有时在实践中有些人会只分成训练集和测试集,他们实际上在测试集上迭代,所以这里没有测试集,他们有的是训练集和开发集,但没有测试集。如果你真的在调试这个集,这个开发集或这个测试集,这最好称为开发集。
指导方针:
- 设置测试集的大小以提高系统的整体性能的可信度
- 测试集有助于评估最终分类器的性能,可能不到整体的 30% 数据集
- 开发集必须足够大以评估不同的想法。
3.1.7 什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)
评估算法好坏时,错误率并非唯一标准,因此,在传统的错误率 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)}
“ 对于大多数团队,我建议最好不要在没有评估指标和开发集时跑太久,因为那样可能会减慢你的团队迭代和改善算法的速度。” ——吴恩达
3.1.8 为什么是人的表现?(Why human-level performance?)
下图显示了人类和机器学习在一段时间内的表现:
贝叶斯最优错误率(Bayes optimal error):性能无法超过的某个理论上限。贝叶斯最优错误率一般认为是理论上可能达到的最优错误率,就是说没有任何办法设计出一个 x x x到 y y y的函数,让它能够超过一定的准确度。
机器学习表现超过人类后进展缓慢的原因之一是人类水平的性能可以接近贝叶斯最优误差,特别是对于自然感知问题。此外,当机器学习的性能比人类的性能差时,您可以使用不同的工具(如获取带标签数据、分析偏差/方差)对其进行改进。一旦超过人类水平的性能,它们就不大好用了。
3.1.9 可避免偏差(Avoidable bias)
三个误差:人类误差 ⟷ 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,判断是着重优化偏差还是方差。
3.1.10 理解人的表现(Understanding human-level performance)
如何定义人的表现:取决于目标。若只想超过单个人类,其应用对精度要求不高,可将普通人的表现视为“人的表现”;若想用它代替贝叶斯错误率,则需将专家等人的表现视为“人的表现”。
人类水平表现的偏差/差异总结:
- 用人类错误率代替贝叶斯错误率
- 如果人为误差与训练误差之间的差异大于训练误差与开发误差之间的差异,重点应该是减少偏差
- 如果训练误差和开发误差之间的差异大于人为误差和训练误差之间的差异,重点应该是减少方差
3.1.11 超过人的表现(Surpassing human- level performance)
算法表现超过人的表现后,进一步优化变得十分困难。例如:上文提到的可避免偏差的指标将变为负数,我们无法判断应优先优化偏差还是方差
3.1.12 改善你的模型的表现(Improving your model performance)
- 监督学习有2个基本假设。第一个是具有低可避免的偏差,这意味着训练集非常适合。第二个是具有低或可接受的方差,这意味着训练集性能基因与开发集和测试集很好地结合。
- 如果人为水平误差和训练误差之间的差异大于训练误差和开发误差之间的差异,则重点应放在偏差减少技术上,这些技术正在训练更大的模型,训练时间更长或改变神经网络架构或尝试各种超参数搜索。
- 如果训练误差和开发误差之间的差异大于人为水平误差与训练误差之间的差异,则重点应放在方差减少技术上,这些技术是更大的数据集,正则化或改变神经网络架构或尝试各种超参数搜索。
Week 2 机器学习(ML策略)(2)
3.2.1 进行误差分析(Carrying out error analysis)
- 不必排斥手工检查
错误类型 | 狗 | 狮子 | 模糊 | 滤镜 | 备注 |
---|---|---|---|---|---|
1 | √ | √ | …… | ||
2 | √ | …… | |||
… | …… | ||||
100 | √ | √ | …… | ||
…… |
优势:
- 快速判断优化方向
- 获知可优化的空间大小
3.2.2 清除标注错误的数据(Cleaning up Incorrectly labeled data)
深度学习算法对于训练集中的随机错误是相当健壮的(robust),除非存在系统性的错误,否则不必花时间纠正训练集错误
开发集或测试集中的错误:看错误标记引起的错误的数量或者百分比,及时纠正开发集错误可以更可信地判断算法优劣
应集中精力修正开发集、测试集错误,不必纠结于训练集错误
3.2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)
- 快速设立开发集和测试集还有指标
↓ - 搭好一个机器学习系统原型,然后找到训练集,训练一下
↓ - 理解你的算法表现如何,在开发集测试集,你的评估指标上表现如何
例外情况:
- 在这个应用程序领域有很多经验
- 这个领域有很多可以借鉴的学术文献,处理的问题和你要解决的几乎完全相同
3.2.4 使用来自不同分布的数据,进行训练和测试(Training and testing on different distributions)
一般而言,开发集、测试集的数据尽量真实(如使用实际会用到的数据),其余真实数据放入训练集(训练集中最贴近实际场景的数据占比可以少些)
目的:有更多的训练数据
3.2.5 数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)
定义一组新的数据:训练-开发集(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还要低
3.2.6 处理数据不匹配问题(Addressing data mismatch)
总而言之,如果你认为存在数据不匹配问题,建议做错误分析,或者看看训练集,或者看看开发集,试图找出,试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。
我们谈到其中一种办法是人工数据合成,人工数据合成确实有效。在语音识别中。我已经看到人工数据合成显著提升了已经非常好的语音识别系统的表现,所以这是可行的。但当你使用人工数据合成时,一定要谨慎,要记住你有可能从所有可能性的空间只选了很小一部分去模拟数据,容易导致学习算法对这一小部分数据过拟合。
3.2.7 迁移学习(Transfer learning)
有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。
方法:
- 将最后一层拿掉,可以替换成一个或多个隐藏层
- 重新训练最后一层或多层( w [ L ] w^{[L]} w[L]和 b [ L ] b^{[L]} b[L]随机初始化),如果你有足够多的数据,你可以重新训练神经网络中剩下的所有层
预训练(pre-training):在用迁移前的数据去预先初始化,或者预训练神经网络的权重。
微调(fine tuning):以后更新所有权重,然后在新的数据上训练
迁移学习何时有意义:在迁移来源问题(相关但不同的任务)中有很多数据,但迁移目标问题你没有那么多数据
3.2.8 多任务学习(Multi-task learning)
意义:让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
输出
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将单个标签分配给单个样本。
事实证明,多任务学习也可以处理图像只有部分物体被标记的情况,在求和时忽略那个项,只对有标签的值求和即可
多任务学习有意义的情况:
-
训练的一组任务可以共用低层次特征
-
每个任务的数据量很接近,所有任务数据加起来远大于单个任务的(此条件不那么绝对)
-
足够大的神经网络(否则性能不如每个任务单独设计一个神经网络)
多任务学习应用不多,一个例外是计算机视觉,物体检测
3.2.9 什么是端到端的深度学习?(What is end-to-end deep learning?)
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它,可简化系统架构。
训练一个巨大的神经网络,用巨大的数据进行训练方能发挥端到端深度学习的能力。
数据不足时:可以分步骤,手动设计模块。优点:
-
每个问题要简单得多
-
两个子任务的训练数据都很多
例:人脸识别可以先识别人脸的存在,裁切图片,然后进行识别
3.2.10 是否要使用端到端的深度学习?(Whether to use end-to-end learning?)
优势:
- 让数据说话,无人类的成见
- 所需手工设计的组件更少,简化设计工作流程
缺点:
- 需要大量的数据
- 排除了可能有用的手工设计组件
有时候深度学习只是作为完整流程的一部分,比如,自动驾驶中,深度学习识别物体,另找算法确定路线。