Improving Deep Neural Networks
初始化
- 一般的数据集,训练:开发集=7:3;训练:开发:测试=6:2:2
- 大数据集:几万,99:1,开发/测试:1万就够了
- 扩大网络+正则化:减小偏差不增大方差
- 增加数据:减小方差不增大偏差
正则化
L2
- 一般用L2多于L1
- 通常使用开发集或hold-out交叉验证,来选择正则化参数λ
- 正则化大→w趋于0,则①某些隐藏单元接近0,网络变为更简单的网络;②z=wa+b,z变得很小,tanh激活函数接近线性,网络只能拟合线性函数,不能拟合复杂的非线性,所以不会过拟合
- 若仍然画原来定义的J代价函数,可能不换单调递减,要用加入正则化的新J
dropout
- dropout:反向随机激活,输出除以keepprob=0.8,则有20%概率失活
- dropout原理:①相当于每次训练一个较小的网络,②每个单元有可能失活,倾向于给每个都比较小的权重,压缩平方范数
- 类似L2正则,L2更广泛,cv领域用得多
- 参数多的层留存率可以设置小一点,输入层一般不设
- 代价函数J不明确,在不用dropout时确保J单调递减,用dropout需要用其他方法
建立优化问题
- 归一化:为了让各特征尺度相同,便于优化
- 初始化:Xavier-tanh,ReLU-1/n[l-1]
- 梯度检查:调试时用,记得正则项,检查时不能用dropout,在初始迭代几代时用
优化算法
- 样本<2000可以用批量梯度下降(所有x)
- 一般64-512
- 参数很多,遇到局部最优的概率极小(需要所有维都是凸),更多时候遇到鞍点(一些凸一些凹)
超参数
- 重要性:学习率→动量、批大小、隐藏单元→层数、学习率衰减
- 随机搜索而不是网格搜索(不同参数在每一次都有尝试不同的值),从粗到精
- 对数尺度区间搜索:如r=-4*rand(),α=10^r(越小越密)
- β越接近1越敏感(adam)
BN
- 用BN则不需要b
Structuring Machine Learning Projects
- 正交化
建立目标
- 如果你同时关心多项指标 你可以将其中的一样设为优化指标 使其表现尽可能的好 将另外的一项或多项设为满足指标
- 建立更合适的指标
人类表现水平
-
最小的误差是贝叶斯误差,人类表现比贝叶斯误差相近、稍差
-
若算法训练集误差与贝叶斯误差相差大(偏差大),测试集误差与训练集误差相差小(方差小),则偏差提升空间大
-
对于文本、语音任务容易超过人类水平,而图像任务很难
-
减小偏差:1.增大模型 2.训练更久,用更好的优化(动量,RMSprop,Adam) 3.结构、超参数搜索
-
减小方差:增加数据、正则化(L2、dropout、数据增强)
误差分析
- 挑出一些开发集样本~100,看错误标签的占比。这是训练能达到的天花板。如果某类占比很多,在增加某类数据进行训练能提高较多
- 记录误判类别占比和特点。
- 若错误标签占比小于算法的其他错误则先不修复
- 可以只修复开发和测试集的错误标签
失配问题
- 开发集误差大:高方差/开发集和训练集分布不同-不匹配
- 验证:在训练集中划分一部分作为train-dev set(不参与训练)
- 若dev和teat差太多,需要找个更大的dev
- dev和test服从相同分布
- 观察训练集和测试集不同的地方,使训练集和测试集相似
- 人工合成数据(可能过拟合
- 人类error、training error 、train-dev error、dev/test error
多任务学习
迁移学习
- 迁移学习:小数据-最后一层,大量数据-重新训练更多层
- 全部重新训练:预训练+微调
- 任务A的低级功能对B有用
- 多任务学习数据量更大,性能更好
- 迁移学习比多任务学习用的更多
端到端
- 拆分成子问题比端到端效果更好(数据够多),端到端没有足够的数据。如人脸识别
- 端到端适合机器翻译