一. 吴恩达深度学习第三课第二周
p13 2.1 进行误差分析
进行误差分析,你应该找一组 错误例子,可能在你的开发集里,或者测试集里,观察错误标记的例子,看看假阳性和假阴性 ,统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的错误类型,可以帮助你总结出哪些问题需要优先被解决,或者给你构思新优化方向的灵感。
p14 2.2 清楚标注错误的数据
开发集的目的是评估分类器A和B哪个更好。有很多数据集的样本标签可能由于人为的因素而标注错误,若果是偶尔随机的错误,则模型会有鲁棒性来自动处理这些错误。但是如果是系统错误,比如猫分类器总是把白色的狗判定为猫,则会对模型的准确度产生影响,这时就需要人为干预处理这些样本。由于训练集样本量大,开发集和测试集样本量小,在修正标注的错误时可以只对开发集和测试集进行修正,而不对训练集进行修正。
在构建实际的机器学习系统时,通常需要更多的人工错误分析,更多的人类见解。
p15 2.3 快速搭建你的第一个系统,并进行迭代
对于新的领域(还没有人挖掘的领域),不需要有太复杂的模型idea,只需要快速选择一个简单的模型,然后不断在上面进行迭代优化。对于成熟的领域,则就需要阅读大量文献,借鉴前人的经验,改进前人的东西想出更为完善的模型。
p16 2.4 在不同的划分上进行训练并测试
当进行某个任务的数据量非常小时,我们可以将类似任务的数据进入进来。其中,开发集与测试集必须是该任务的数据,训练集可以取大量的来自其他类似任务的数据。因为开发集与测试集是用来瞄准目标,而训练集的选取决定了逼近目标的快慢。
例如图中的汽车后视镜语音识别的例子,只有20K该任务的数据,可以将5K当作开发集,5K当作测试集,另外从其他类似任务取500K,加上该任务的剩下10K当作训练集。
p17 2.5 不匹配数据划分的偏差和方差
在训练集和开发集中间新加入一个training-dev集合,该集合与训练集是同样的分布,但是不会用来训练。
人类错误率与训练集误差之间的差值代表可避免偏差的大小。
训练集误差与training-dev集误差之间的差值代表方差的大小。
training-dev集误差与开发集误差之间的差值代表数据不匹配程度。
开发集误差与测试集的误差之间的差值达标模型在开发集上的过拟合程度。
关于右边误差的情况:如果开发集与测试集分布比你应用实际处理的数据要容易得多,则开发测试集上的错误率可能会下降。
分析该图并不一定会给你指明一条前进道路,但你会洞察到一些特征,可以看出模型训练时到底这些数据集合之间到底存在什么问题,然后根据对应的问题采取相应的措施解决。
p18 2.5 解决数据不匹配问题
解决数据不匹配问题:进行手动误差分析来理解训练集与开发/测试集之间的差异性。让训练数据与开发/测试数据更加类似,或者收集更多与开发/测试数据相似的数据(如采用人工合成数据)。
人工合成数据例子:
人工合成数据诸如语音合成,图像合成,可能会造成数据过拟合现象,因为合成的背景被用过多次。
p19 2.7 迁移学习
迁移学习就是指在一个任务进行训练好基础网络,再将网络迁移到另一个任务中进行训练
迁移来源问题你有很多数据,但迁移目标问题没有那么多数据。
什么时候迁移学习会起作用?
- 任务A与B有相同的输入,例如图像识别迁移到放射科图像的诊断。
- 任务A的数据比目标任务B的数据大得多。
- 模型从任务A中学习到的低级特征会对任务B的学习有帮助。
p20 2.8 多任务学习
多任务学习指多个任务并行进行学习,例如图像识别,识别行人,车等多个物体,而不是一个。
神经网络一些早期特征,在识别不同物体时都会用到,训练一个神经网络做四件事可能要比训练四个完全独立的神经网络分别做四件事性能要好。
多任务学习什么时候有用?
-
任务之间有共享的低级特征。 -
通常(不是绝对正确):每一个任务的数据量差不多。 -
能够训练一个足够大的神经网络来做所有任务。已经有实验验证了,当网络足够大,训练一个网络做多件事比训练多个完全独立的网络做多件事要好。但是网络小的话,性能就不一定了。
p21 2.9 什么是端到端的深度学习
训练一个模型,输入一个x,可以直接输出一个正确的y,这就是端到端的深度学习,但是这种方式需要大量的数据支撑。例如机器翻译因为数据样本很大,可以采取端到端的方式。但是如下图中的根据儿童手的图片来判断儿童的年纪,样本不够多,就需要采取多个流程的形式来进行模型的学习。
p22 2.10 是否要使用端到端的深度学习
端到端学习的优缺点:
优点:
让数据说话
更少的人工设计成分
缺点:
需要大量的数据
排除了一些可能非常有用的人工设计模块
二. CCF CSP 刷题记录
1. 报数
#include <iostream>
#include <set>
# include <algorithm>
using namespace std;
int n;
int a[10];
int main(){
scanf("%d",&n);
int count = n;
int i = 1;
while(count--){
if(((i % 7) == 0) || ((i % 100)/10==7) || ((i%10) ==7)||(i /100==7)){
a[i%4]++;
count++;
}
i++;
}
printf("%d\n",a[1]);
printf("%d\n",a[2]);
printf("%d\n",a[3]);
printf("%d",a[0]);
return 0;
}
|