本周的内容比较多,一些概念还是很重要的,需要好好去理解。
Structuring Maching Learning Projects - Week 2
1. Error Analysis
核心问题:怎样判断一个改善效果的方向是否值得尝试的?
更核心的问题:你能坚持人工错误分析吗?
1.1 坚持使用错误分析表格
在Dev Set验证集中做错误采样分析,比如下面是一个自动驾驶图像识别的错误分析:
Error | %Percent | Comment |
---|---|---|
Overall dev set error | 14.3% | |
4.1% | ||
Errors due to foggy pictures | 8.0% | |
Errors due to rain drops stuck on your car’s front-facing camera | 2.2% | |
Errors due to other causes | 1.0% |
做完错误比例分析,优先改善什么就非常明显了。难点在于反复坚持用这种方式来指导工作,毕竟人工标注还是很烦的。
1.2 清理错误标注数据
一般地,在数据量足够的情况下,神经网络对随机错误并不敏感。
严谨做法是仍然使用1.1中的方法来分析错误,增加标注错误类的分析,这样就能明确地知道错误标注的影响了。
个人以为在样本比较少的时候,这个问题还是需要关注的,错误标注会让分类边界变得模糊,会让分类边界附近的一些样本被错误分类。在这种情况下,高质量的样本还是很重要的。
如果要纠正样本:
- dev/test集合都需要进行同样的纠正(否则就出现了dev/test分布不一致,training的目标是让dev error更低,这样就出现了分歧);
- 检查样本时,一般只会仔细检查错误样本,正确分类的样本也需要查看。可能能发现一些碰巧被分对的,但是一般分对的要远远多于分错的,所以并不会总是去看正确分类的样本;
- 纠正后training set与dev/test set分布上会有一些差异,一般来说影响不大(自然是建立在大数据的基础上的)。
1.3 快速原型,快速迭代
现在应该大家都接受了这种“快糙猛”的模式:
- Set up dev/test set and (single) metric
- Build initial system quickly
- Use Bias/Variance analysis & Error analysis to prioritize next step.
看完了这三步就明白了,快糙的目标是为了迅速找到最有价值的优化方向。
2. Mismatched Training and Dev/Test set
有种很常见的情况是已经拥有或者很容易获取的训练集并不是来自于目标场景,目标场景只有很少的样本,这个时候在建立任务的时候需要一些改变。
2.1 如何切分Train/Dev/Test集
假定要做面向mobile场景(比如用户上传)下的图像识别,但是有200K来自web的清晰图片样本(相对容易收集)和10K来自mobile场景下的。
- 混合再随机切割traning/dev/test集:此时由于dev中mobile场景图片的比例非常低,分类器会倾向于忽略来自mobile场景的图片。注意,这里应用在mobile场景是目标,目标被忽略了。
- dev/test集设置为只来自mobile的,比如:dev/test各5K mobile样本,training有200k web + 5k mobile。简单说就是只让目标成为检验的目标。
2.2 错误分析
首先,额外划分出training-dev集,此时分析应该遵循以下表格:
向上比较 | 误差类型 |
---|---|
Bayes Error | - |
Human Error | - |
Training Error | Avoidable Bias |
Training-dev Error | Varinace |
Dev Error | Data Mismatch |
Test Error | Overfitting |
2.3 解决数据不匹配
没有系统解决方案,但是在不同问题下可以有变通。
- 进行人工错误分析,理解dev与training集之间的分布差异;
- 为training集增加与dev集更相近的数据(收集或者合成),比如:
- 合成:汽车噪声+人声 ≈ \approx ≈汽车上说话
3. Learning from Multiple Tasks
分为两种:
- 迁移学习 先学习一个任务,然后再迁移到另外一个任务上,有先后顺序关系;
- 多任务学习 多个任务同时学习。
迁移学习用得比多任务学习要多得多,但是在图像的多目标检测上,多任务学习是不错的选择。
3.1 迁移学习
在训练好(pre-training)的的网络中,去掉最后一层随机,重新初始化最后一层的参数根据新的 < x , y > <x, y> <x,y>样本进行训练(这种方式被称作fine-tuning):
- 样本较少时只训练最后一层
- 样本较多时可以尝试训练所有层
迁移学习的条件(任务A到任务B):
- 任务A与任务B的输入是一样的;
- 任务A的数据远远多于任务B;
- 任务A能够提供对任务B有用的Low level features.
一般应用在大数据模型向小数据场景应用的情况下。
3.2 多任务学习
以多目标检测(4个)为例,最后的输出单元每一位负责一个对象,包括:
- 汽车
- 红绿灯
- 停车标识
- 行人标识
目标函数也会相应更改:
1
m
∑
i
=
1
m
∑
j
4
L
(
y
^
j
(
i
)
,
y
j
(
i
)
)
\frac{1}{m} \sum^m_{i=1}\sum^4_j \mathcal{L}(\hat{y}_j^{(i)}, y_j^{(i)})
m1i=1∑mj∑4L(y^j(i),yj(i))
需要,注意与Softmax的区别。
什么时候多任务学习有意义:
- 多任务之间能够共享一些lower-level特征;
- 能够训练更大的网络来在所有关注的任务上表现都很好。
- (非硬性要求)每一个任务拥有的数据量相近;
4. End-to-End Learning
4.1 什么是端到端学习?
课程中以语音识别为例进行了说明:
- 传统方法:Audio → \rightarrow → MFCC Features → \rightarrow → ML Phonems(音素) → \rightarrow → Words → \rightarrow → Transcript (句子)
- 端到端:Audio → \rightarrow → Transcript
端到端只有在数据中有大量数据的时候才有效,在数据不够充分时,可以只将部分阶段替换成深度学习,而其它的保持不变。
课程中举了一例来说明端到端并非总是最佳方案:在旋转门识别中,如果直接建立旋转门前收集到的图片到目标的标注(端到端)的映射,那么能够采集到的样本非常少。但是如果先进行图像分割缩放,得到统一大小的状况图像,可以用于识别的数据就非常非常多了。问题分割成了两步,但是可行性大幅提升。
4.2 端到端学习的优缺点
优点:
- 让数据说话,而不必去学习一些人为设计的中间元素(比如语音识别中的音素)
- 减少了对手工设计特征的依赖
缺点:
- 有可能需要采集大量数据
- 去掉了可能有用的手工设计组件(特征),手工设计的组件可能能提供很强的先验知识