我的回答是针对训练分类器的“不均匀”进展的可能解决方案。关于“为什么”你会看到这种行为,我推迟了。特别是,我不愿意尝试将原因归因于我在训练中观察到的伪影——即,它是数据吗?还是 MLP 实现?还是我选择的可调配置?事实是,是您的分类器与导致此观察的数据的交互,而不是任何一个中的某些固有特征。
分类器能够很好且很快地学习某些输入向量的情况并不少见——即,[观察到的 - 预测的]^2仅在少数周期/时期后变得非常小——并且相同的分类器无法在其他输入向量上反复失败(并且未能改进)。
为了成功完成分类器的训练,Boosting是您问题中描述的问题的教科书答案。
不过,在继续之前,您的配置/设置中的一个小错误也可能是您观察到的行为的原因。
特别是,也许在您的配置中验证这些项目:
您的输入向量是否正确编码 - 例如,它们的范围是 [-1, 1]?
您是否正确编码了响应变量(即1-of-C 编码)?
你是否选择了一个合理的初始学习率和动量项?您是否尝试过在初始学习率的任一侧调整学习率值进行训练?吨
无论如何,假设这些配置和设置问题没问题,以下是有关 Boosting(严格来说,是一种组合多个分类器的技术)的相关实现细节,如下所示:
经过一些时期后,检查结果(就像你一直在做的那样)。*那些分类器未能学习到的数据向量被分配一个加权因子以增加错误*r(一些大于1的数字);类似地,分类器学习好的那些数据向量也被分配了一个权重因子,但这里的值小于一个,从而降低了训练误差的重要性。
因此,例如,假设在第一个 epoch 结束时(迭代包含您的训练数据集的所有数据向量)您的总误差为 100;换句话说,平方误差(观察值 - 预测值)对训练集中的所有数据向量求和。
这些是您的问题中列出的两个 MSE 值
0.667 # poorly learned input vector => assign error multiplier > 1
1.5e-10 # well-learned input vector => assign error multiplier < 1
在 Boosting 中,您会找到与这两个误差测量相对应的输入向量,并将每个向量关联一个误差权重;在第一种情况下,此权重将大于 1,在第二种情况下将小于 1。假设您分别分配了 1.3 和 0.7 的误差权重。进一步假设,在下一个 epoch 之后,您的分类器在学习这两个输入向量中的第一个方面没有改进——即,它返回与上一个 epoch 相同的预测值。然而,对于这个迭代/时期,输入向量对总误差的贡献不是 0.67,而是 1.3 x 0.67,或大约。.87.
这种增加的误差对训练进度有什么影响?
更大的误差意味着更陡峭的梯度,因此对于下一次迭代,对包含权重矩阵的适当权重进行更大的调整——换句话说,更快速的训练集中在这个特定的输入向量上。
您可能会想象这些数据向量中的每一个都具有 1.0 的隐式误差权重。Boosting 只是增加了错误权重(对于分类器无法学习的向量),并降低了它学习好的向量的权重。
我刚刚描述的是一个名为AdaBoost的特定实现,它可能是最知名的 Boosting 实现。有关特定语言实现的指导甚至代码,请查看 boosting.com] 1(认真)。不过,此站点已不再维护,因此这里有一些我所依赖并可以高度推荐的优秀资源。第一个是带注释书目形式的学术站点(包括指向该站点上讨论的论文的链接)。本网站上列出的第一篇论文(带有 pdf 链接),机器学习的增强方法:概述,是一个很好的概述,也是获取这一系列技术的工作知识的有效来源。
videolectures.net上还有一个关于 Boosting 和 AdaBoost 的优秀视频教程