当前位置: 代码迷 >> 综合 >> Andrew Ng 《Deep Learning》 Notes
  详细解决方案

Andrew Ng 《Deep Learning》 Notes

热度:78   发布时间:2023-12-23 14:54:39.0

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有用
  • 多任务学习数据量更大,性能更好
  • 迁移学习比多任务学习用的更多

端到端

  • 拆分成子问题比端到端效果更好(数据够多),端到端没有足够的数据。如人脸识别
  • 端到端适合机器翻译
  相关解决方案