25、手写数字识别:模型优化与实验探索

手写数字识别:模型优化与实验探索

1. 验证样本数量的选择

在模型训练中,验证样本数量的选择至关重要。使用 1000 个验证样本效果尚可,与测试数据仍有较好的相关性。这也是选择在第 1000 行进行分割的原因,而非选取 9000 个有趣的样本用于训练,仅保留 1000 个简单样本用于验证。

然而,1000 个样本数量略显不足。目标是达到 0.5% 的错误率,即仅允许 5 个错误。在 1000 个样本中,很难判断 6 个错误的模型是否比 7 个或 8 个错误的模型泛化能力更强,因为可能只是某个样本的运气因素。但在 10000 个样本中,60 个错误与 70 个或 80 个错误相比,受运气影响的可能性就会降低。

2. 筛选难样本

在实际训练数据中,模型对不同样本的学习难度不同。以 MNIST 数据集为例,简单样本就像标准的手写数字,而难样本则如同用右手画画的 Bart Simpson(这里是一种形象的比喻)。

要从 50000 个 MNIST 训练样本中获取最难的 1000 个样本,可按以下步骤操作:
1. 在所有 50000 个训练样本上构建一个相对简单的模型,例如:

m <- h2o.deeplearning(x, y, train, valid)
  1. 运行预测:
p <- h2o.predict(m, train)
  1. 获取预测概率和最大概率。
  2. 对概率进行排序,选择最低的 1000 个。

步骤 3 是关键。如果模型对某个答案有 99.9% 的置信度,说明该样本对模型来说更容易学习;而置信度仅为 80% 的样本则相对较难。为确保错误样本也能被包含,当模型预测错误时,将实际预测概率替换为 0.1。

通过筛选难样本,可以加快后续模型的学习速度,对这些样本进行加权处理,让模型更专注于学习它们;或者在生成数据时,以这些难样本为起点。

3. 自编码器的应用

自编码器可用于将数据集降维至二维以便可视化,还能解决多层神经网络训练的难题。可以逐层或两层地以无监督自编码器的方式学习,最后添加一两个监督层。

为获取多种输入数据,构建了三个自编码器:
| 自编码器 | 描述 |
| ---- | ---- |
| AE200 | 大型,有 200 个隐藏单元,单层,高丢弃率/L2 |
| AE32 | 小型,32 个隐藏单元,低丢弃率/L2 |
| AE128 | 两层,第一层与输入大小相近(768 个隐藏节点),有较高的丢弃率和 L2,第二层 128 个节点,无丢弃率,分两个阶段构建 |

使用这三个自编码器得到了 360 个特征,取代了原来的 784 个原始像素,同时保留了 113 个增强特征。这一方法效果显著,将单个模型的结果从 120 - 140 范围降至 80 - 110 范围,在集成模型中可达到 70 多(0.7% 错误率)。不过,由于同时开始使用生成数据,难以确定各因素的具体贡献。

4. 卷积与收缩操作

MNIST 数据集上表现最佳的模型基于卷积神经网络(CNNs),但 H2O 不提供此类模型,且计算量较大。其原理是在图像上匹配如 5x5 的模式,然后通过收缩层选择每个 2x2 块中的最大像素值,得到如 12x12 的输出。

尝试了一种介于真正的 CNN 和扩展字段之间的“穷人的卷积”方法:
1. 生成十二个 5x5 模式。
2. 进行 2x2 最大收缩操作,得到十二个 12x12 输出。

为训练 5x5 模式,使用了一个具有 6 个隐藏节点的单层自编码器生成 6 个模式,以及通过 h2o.prcomp() 返回的前 6 个主成分生成另外 6 个模式。训练数据选取 1000 个最难的训练样本,并提取所有 5x5 重叠窗口,得到 576000 个训练样本。

构建了四个深度学习模型,其性能如下:
| 模型 ID | 验证错误 | 隐藏节点 | 丢弃率 | L1,L2 | 测试分数 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| DLt2 | 4 | 400,500,600,700 | 0.1 | 1e - 5,0 | 73 |
| DLt1 | 6 | 300,400,500,600 | 0.1 | 1e - 5,0 | 57 |
| DLx1 | 8 | 800,800,800 | 0.3 | 1e - 4,1e - 4 | 58 |
| DLb1 | 12 | 1024,2048 | 0.1 | 1e - 5,0 | 93 |

这种方法训练速度比普通 CNN 快,但效果不如最佳的卷积网络。

5. 集成模型

集成模型通过平均多个模型的预测概率来提高性能。在使用集成模型时,希望模型之间尽可能不同。但在模型调优后,深度学习模型明显优于其他算法。不过,深度学习有很多可调整的参数,通过改变隐藏层的数量和大小、丢弃率等,可以增加模型的多样性。

实验发现,相对较弱的模型组成的集成模型提升效果更明显。例如,早期的一个实验使用了八个模型(两种不同的深度学习配置和最佳的随机森林模型),单个模型的分数范围从 120(1.2%)到 302(3.02%),但集成后的分数为 105,比八个模型的平均错误率低近 70,比最佳模型低 15。而由最佳的三个深度学习模型组成的集成模型,分数仅比最佳模型高 1,这可能是因为为追求每个模型的最佳性能,导致模型之间的多样性减少。

graph LR
    A[数据处理] --> B[筛选难样本]
    B --> C[自编码器应用]
    C --> D[卷积与收缩操作]
    D --> E[构建深度学习模型]
    E --> F[集成模型]

综上所述,在模型训练中,数据工程和收集更多数据通常比微调参数更有价值。不同算法在不同数据集上的表现各有优劣,需要根据具体情况选择合适的算法和方法。

6. 实验总结与算法性能分析

6.1 不同数据集上的算法表现

在不同的数据集上,各种算法展现出了不同的性能。在第一个数据集(小数据集的回归问题)和第二个数据集(大数据集的 10 分类问题)中,深度学习表现出色;而在第三个数据集(具有较大随机元素的二项分类问题)中,简单的广义线性模型(GLM)和随机森林表现更佳。

6.2 参数调整的效果

参数调整很快就会达到收益递减的点。模型在默认设置下通常表现良好,尤其是结合增加树的数量/迭代次数并使用早停策略时。因此,花费大量精力进行参数微调可能并非最佳选择。

6.3 数据工程的重要性

从实验结果来看,数据工程和收集更多数据通常比微调参数更能提升模型性能。以下是不同方法的实际效果排序推测:
1. 增加更多训练数据
2. 使用自编码器替代原始像素
3. 采用“穷人的卷积”方法
4. 集成模型(弱模型组成的集成效果更好)
5. 构建更大的模型

7. 模型训练与评估的关键要点总结

7.1 数据处理

  • 数据平衡 :确保训练数据的平衡,避免数据偏差对模型性能的影响。
  • 数据筛选 :筛选出难样本,可加快后续模型学习速度或进行加权处理。
  • 数据增强 :使用自编码器生成特征,替代原始像素,提升模型性能。

7.2 模型构建

  • 深度学习 :具有多个可调整参数,可通过改变隐藏层数量、大小和丢弃率等增加模型多样性。
  • 卷积神经网络 :在 MNIST 数据集上表现最佳,但 H2O 不提供,可尝试“穷人的卷积”方法。
  • 集成模型 :通过平均多个模型的预测概率提高性能,注意模型之间的多样性。

7.3 训练与评估

  • 早停策略 :结合增加树的数量/迭代次数和早停策略,避免过拟合。
  • 交叉验证 :使用交叉验证评估模型性能,确定最佳参数。

7.4 操作步骤总结

操作类别 操作步骤
筛选难样本 1. 构建简单模型: m <- h2o.deeplearning(x, y, train, valid) ;2. 运行预测: p <- h2o.predict(m, train) ;3. 获取预测概率和最大概率;4. 排序选择最低的 1000 个
自编码器应用 构建 AE200、AE32、AE128 三个自编码器,得到 360 个特征替代原始像素
“穷人的卷积” 1. 生成十二个 5x5 模式;2. 进行 2x2 最大收缩操作,得到十二个 12x12 输出
集成模型 选择不同的模型,平均预测概率,注意模型多样性
graph LR
    A[数据处理] --> B[模型构建]
    B --> C[训练与评估]
    C --> D[优化调整]
    D --> B

在实际应用中,需要根据具体的数据集和问题,综合运用上述方法和策略,不断尝试和优化,以找到最适合的模型和参数配置,从而提高模型的性能和泛化能力。总之,通过对各种算法和方法的实验和分析,我们可以更好地理解它们的优缺点,为实际问题的解决提供更有效的方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值