吴恩达深度学习笔记(2)——结构化机器学习项目

机器学习策略

机器学习策略

  • 收集更多数据
  • 增加数据多样性
  • 增加梯度下降迭代次数
  • 尝试Adam优化算法
  • 使用规模更大/更小的神经网络
  • 使用Dropout
  • 添加$L_2$正则化
  • 修改网络架构(激活函数、隐藏单元数目)

正交化

  • 在训练集上性能良好(更大型的神经网络/更好的优化算法)
  • 在开发集上性能良好(增加正则项/更多的训练样本)
  • 在测试集上性能良好(更大的开发集)
  • 在实际情况上性能良好(调整样本的分布)

单实数评估指标

  • 查准率Precision

$$\frac{\text{True Positive}}{\text{True Positive} + \text{False Positive}}$$

  • 查全率Recall

$$\frac{\text{True Positive}}{\text{True Positive} + \text{True Negative}}$$

  • F1-score

$$\frac{2}{\frac{1}{\text{Precision}}+\frac{1}{\text{Recall}}}$$

满足和优化指标

  • 选择最好的分类器时,准确度和运算时间都要考虑
  • 准确度是优化目标,运算时间是满足指标

训练/开发/测试集划分

  • 确保开发和测试集来自同一分布
  • 将所有数据打乱顺序,随机分配到开发集和测试集上

开发集和测试集的大小

  • 传统的(小规模数据集)划分:训练集:测试集=70%:30%,或者训练集:开发集:测试集=60%:20%:20%
  • 对于较大规模的数据集,训练集:开发集:测试集=98%:1%:1%
  • 提升训练集样本数有助于提高模型的整体性能
  • 测试集用于评估性能可以少于整体样本数的30%
  • 为了评估不同的分类器,开发集需要足够大

改变开发集/测试集指标

  • 在计算误差时,对错误的分类加大权重
  • 误差评估:

$$Error=\frac{1}{m_{dev}}\sum^{m_{dev}}_{i=1}\mathcal{L}{(\hat{y}^{(i)}\not=y^{(i)})}$$

  • 修改错误分类的权重后:

$$Error=\frac{1}{\sum w^{(i)}}\sum^{m_{dev}}_{i=1}w^{(i)}\mathcal{L}{(\hat{y}^{(i)}\not=y^{(i)})}$$

机器学习算法达到人类水平表现

  • 贝叶斯最优误差
  • 评估机器算学习误差产生的原因
  • 更好的分析方差和偏差

可减少的偏差

  • 用人类水平误差替代贝叶斯误差

人类水平误差

  • 比较人类水平误差(贝叶斯误差)-训练集误差-开发集误差之间的差
  • 训练集误差接近人类水平误差(贝叶斯误差),开发集误差较大:减少方差
  • 训练集误差接近开发集误差,与人类水平误差(贝叶斯误差)差距较大:减少偏差

超过人类水平表现

  • 结构化数据问题上,机器学习表现已经超过人类表现,例如:在线广告、产品推荐、物流预测、贷款申请情况预测
  • 自然感知问题上,超越人类表现不容易

提高模型性能

  • 训练集拟合程度较好,低偏差
  • 开发集和测试集表现较好,低方差
  • 训练误差和人类水平误差之间的差距是偏差的优化目标,可采取的方法包括:使用更大的模型、训练更久、使用更好的优化算法(Momentum、RMSprop、Adam)、更好的神经网络架构、改变超参数
  • 开发误差和训练误差之间的差距是方差的优化目标,可采取的方法包括:收集更多数据、正则化($L_2$,Dropout,数据增强)、更好的神经网络架构、改变超参数

进行误差分析

  • 大多数深度学习模型对随机误差鲁棒性强,但对系统误差鲁棒性差
  • 评估某一错误原因占全部错误的比重,决定是否要对该类误差做单独处理
  • 如果因为标记错误导致了误差,除了训练集,开发集和测试集上的数据也要修改,保证它们依然来自同一分布
  • 同时需要考察虽然标记错误但分类正确的样本

快速搭建模型

  • 快速建立第一个模型并进行迭代,利用方差和偏差评估模型的优化方向
  • 在较为热门的领域,参考文献对训练自己的模型有较大的帮助

不同分布数据集的处理

  • 方法1:把两组数组混合在一起。优点:训练集、开发集和测试集来自同一分布;缺点:开发集和测试集包含某一组数据的样本量太少,不是所需求的目标
  • 方法2:50%投入训练集,其他分别投入开发集和测试集。优点:开发集和测试集包含所需要的优化目标;缺点:训练集、开发集和测试集并非来自同一分布

数据不匹配问题

  • 训练-开发集
  • 若训练集误差训练-开发集误差接近,开发集误差较大,则存在样本分布的问题
  • 试图找到训练集和开发集/测试集样本之间的区别,使得训练样本的数据更接近于开发/测试样本或者获取更多相近似的样本
  • 人工合成数据

迁移学习

  • 如果想从任务A中迁移一些知识到任务B,若A和B属于同样的类型,A的数据比B的数据多得多,A低层次的特征可以帮助B的学习,迁移学习意义更大

多任务学习

  • 例如要判断图像中是否有4种物体,则输出结果$\hat{y}$为$4\times1$的向量

$$Loss=\frac{1}{m}\sum^m_{i=1}\sum^4_{j=1}L(\hat{y}^{(i)}_j,y^{(i)}_j)$$

  • 同时处理多个任务比多次处理单个任务性能要好,同时可以应对只有部分标签的情况
  • 适用于训练的多个目标具有相同的低层次特征
  • 如果想要从多任务学习中提升特定任务的性能,要让其余任务训练样本数量之和远大于特定任务的训练样本
  • 可以建立更大的神经网络模型来提高多任务学习的性能

端到端的深度学习

  • 在深度神经网络中输入$X$,直接输出$\hat{y}$,而无需手工提取特征
  • 庞大的训练数据集使得端到端深度学习性能良好
  • 优点:避免人的主观意志,不需要花时间手工设计功能
  • 缺点:依赖大量数据,排除了手工设计功能