2

两周来,我一直在通过工作台和 Java 代码修改 Encog 中的标准多层感知器和反向传播算法。我的下一项工作将需要在输入模式中插入噪声,如本文所示: http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber= 6033567 (MLP 神经网络训练中的 PCA 和高斯噪声提高了问题的泛化能力小且不平衡的数据集)

基本上,我需要(这是一个二元分类问题): 1 - 使用主成分分析 (PCA) 转换输入模式 2 - 使用反向传播来训练 MLP,有一个技巧:在每个训练模式中插入不同的白噪声每个时代。

使用 Java 版本的 Encog 进行这种噪声注入的更直接的方法是什么?是否有任何可用的训练算法涉及人工噪声注入?

PS.:我引用的论文的完整算法是

    1. 应用 PCA 对变量进行去相关
2. 初始化系统架构
3. 设置 k, max number of epochs and min error
4. 开始训练 - While epoch counter 一个。随机绘制一个输入模式(向量 x)而不替换表示
b。将噪声注入输入模式
1。对于输入模式中的每个变量
a。从高斯分布中画出 g。g ~ N(0,1)
b。计算 n = k * g
c。添加 ninto 输入模式 x
c。呈现输入模式
d. 调整系统参数
e.如果已达到训练停止标准,则
1. 停止训练
f。否则
1. 增加历元计数器
2. 转到 4.a
4

2 回答 2

2

我认为最好的方法是创建一个实现 MLDataSet 接口的类。然后,您将为新版本的 MLDataSet 提供常规 BasicMLDataSet(或其他数据集)。对于 size() 方法,您将返回每次迭代要训练的训练模式的数量。然后,每次调用新的 MLDataSet 以返回一个 MLDataPair,您从提供的数据集中随机选择一对,然后克隆此元素,并按照描述添加噪声,然后返回它。

这听起来像它会完成论文所描述的吗?如果你最终实现了这个并想将它贡献给 Encog 项目,那就太好了。如果你不这样做,我也可以自己尝试。

于 2013-05-24T16:25:41.937 回答
2

我研究了 Backprop 类,并想出了另一种看起来更通用和直接的方法。我创建了一个 ErrorStructure 接口、一个 NoisyBackpropagation 类和一个 NoisyGradientWorker。

第一节课概括了许多噪声注入技术(这个主题在上个月得到了新的关注,来自我在一些科学论文中看到的内容)。

第二类只是带有 ErrorStructure 属性的 Backprop。第三类是 GradientWorker,它接收一个 NoiseStructure 作为参数,并在训练过程中注入噪声。

棘手的位:

  • 一些 ErrorStructure 实现(特别是我希望发布的)将需要从训练集派生的复杂初始化参数。我不能使用更通用的 MLDataSet。这不是绝对必要的,但我想在将来的某一天使用它。
  • 我不得不 在 Java 包中添加 SSJ: Stochastic Simulation作为依赖项,否则 NoiseStructure 计算将花费太长时间。我不知道 SSJ 会在多大程度上阻碍 Encog 的速度。

顺便说一句,MLDataSet 调整解决方案似乎对一些高级重采样方案非常有用。

于 2013-05-24T17:58:55.547 回答