减少自动编码器的损失

joh*_*ler 3 python compression autoencoder deep-learning

我目前正在尝试训练一个自动编码器,它允许将长度为 128 个整数变量的数组表示为压缩为 64 的数组。该数组包含 128 个整数值,范围从 0 到 255。

我在每个时期使用超过 200 万个数据点来训练模型。每个数组的形式如下:[ 1, 9, 0, 4, 255, 7, 6, ..., 200]

input_img = Input(shape=(128,))
encoded = Dense(128, activation=activation)(input_img)
encoded = Dense(128, activation=activation)(encoded)

encoded = Dense(64, activation=activation)(encoded)

decoded = Dense(128, activation=activation)(encoded)
decoded = Dense(128, activation='linear')(decoded)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='mse')

history = autoencoder.fit(np.array(training), np.array(training),
                    epochs=50,
                    batch_size=256,
                    shuffle=True,
                    validation_data=(np.array(test), np.array(test)),
                    callbacks=[checkpoint, early_stopping])
Run Code Online (Sandbox Code Playgroud)

我还将上传一张显示训练和验证过程的图表:训练损失图

我怎样才能进一步降低损失呢?到目前为止我已经尝试过的(两种选择都没有成功):

  1. 更长的训练阶段
  2. 更多层

小智 5

当然,没有什么神奇的方法可以立即减少损失,因为它是针对特定问题的,但我可以建议以下几个技巧:

  • 减少小批量大小。较小的批量大小会使梯度在反向传播时变得更加嘈杂。首先,这似乎违反直觉,但梯度下降中的这种噪声可以帮助下降克服可能的局部极小值。这样想吧;当下降有噪音时,需要更长的时间,但平台会较低;当下降平稳时,需要更少的时间,但会在较早的平台上稳定下来。(非常笼统!)
  • 尝试使图层具有具有扩展/收缩顺序的单元。因此,不要连续使用 128 个单位层,而是将其设为 128 到 256。这样,您就不会强迫模型用另一组 128 个数字来表示 128 个数字。所有层都可以有 128 个单元,理论上这会产生无损自动编码,其中输入和输出实际上是相同的。但由于梯度下降的本质,这种情况在实践中不会发生。这就像你随机从丛林中的某个地方开始,并尝试沿着线索(负梯度)穿过它,但仅仅因为你有线索并不意味着你可以到达你要去的地方。因此,为了从分布中获取有意义的信息,您应该强制模型用较小的单位表示信息。这将使梯度下降的工作变得更容易,因为你设置了一个先验条件;如果它不能很好地编码信息,就会有很高的损失。所以你让它了解想要从模型中得到什么。
  • 误差函数的绝对值。你正在努力降低损失,但目的是什么呢?您需要它接近 0,还是只需要它尽可能低?因为随着潜在维度的缩小,损失会增加,但自动编码器将能够更好地捕获数据的潜在代表性信息。因为您强制编码器用较低维度的信息来表示较高维度的信息。因此,潜在维度越低,自动编码器就越会尝试从输入中提取最有意义的信息,因为它的空间有限。因此,即使损失更大,也能更有效地捕获分布。所以这取决于你的问题,如果你想要图像降噪之类的东西,请使用更高的编码维度,但如果你想做异常检测之类的东西,最好尝试较低的维度而不完全破坏模型的代表能力。
  • 这是我的更多锡箔建议,但你也可以尝试将数字向下移动,使范围为 -128 到 128。我 - 不太准确 - 观察到某些激活(尤其是 ReLU)在这些类型下效果稍好输入。

我希望其中一些对您有用。祝你好运。