【问题标题】:Problem training an autoencoder for byte sequence classification训练用于字节序列分类的自动编码器的问题
【发布时间】:2019-06-19 17:07:26
【问题描述】:

我正在做一个使用字节序列作为样本的分类任务。通过对每个字节 x 应用 x/255,可以将字节序列归一化为神经网络的输入。这样,我训练了一个简单的MLP,准确率在80%左右。然后我在整个数据上使用“mse”损失训练了一个自动编码器,看看它是否适用于该任务。我冻结了编码器层的权重,并在其中添加了一个 softmax 密集层以进行分类。我重新训练了新模型(只训练了最后一层),令我惊讶的是,结果比 MLP 差很多,只有 60% 的准确率。

自动编码器不能从所有数据中学习好的特征吗?为什么结果这么差?

【问题讨论】:

    标签: python machine-learning neural-network deep-learning autoencoder


    【解决方案1】:

    “为什么结果如此糟糕?”这其实并不意外。您已经训练了一个模型来擅长压缩信息。它在每一层学习的转换根本不需要对任何其他类型的任务有好处。事实上,它可能会丢弃大量信息,这些信息对于您拥有的任何辅助分类任务都非常有用,但对于纯粹的压缩和重建序列的任务来说却不需要这些信息。

    与其通过训练单独的自动编码器来接近它,不如将 MLP 层中的稀疏惩罚项添加到损失函数中,或者使用一些其他类型的正则化,例如 dropout,可能会更好。最后,您可以考虑针对一维序列进行修改的更高级的网络架构,例如 ResNet / ODE 层或 Inception 层。

    【讨论】:

    • 您的建议很有道理,谢谢。但是,我仍然对自动编码器的应用场景感到困惑。当我学习这个理论时,据说可以以无监督的方式对 AE 进行预训练以学习有趣的特征。然后可以创建一个新的网络,重用较低的层来训练分类器。它在实践中是否总是像我的任务一样受到限制?
    • 在深度学习文献中,像您提到的那样使用自动编码器的真正成功案例并不多。相反,自动编码器通常与另一种类型的损失函数相结合,通常是一种 GAN,它试图将重建与原件区分开来,以迫使 AE 在训练中变得更好。 AE 的瓶颈层可能有用的一件事是一种嵌入模型,例如创建最近邻搜索索引或反向搜索索引。但通常如果你只是训练一个 AE,中间层对于其他任务没有普遍的“优势”。
    • 自编码器被广泛认为是了解深度学习技术的教育垫脚石。也许它们有一些应用程序或者可以扩展以解决利基问题,但该领域转移到仅考虑直接应用于您关心的学习任务的网络。您仍然可以在某些方面拥有类似于自动编码器的网络架构,具有瓶颈层,但损失层不仅仅是重建……而是您感兴趣的任何学习任务。在最简单的情况下就像您开始使用的 MLP 一样。
    【解决方案2】:

    可能采取的措施:

    • 检查自动编码器的错误,它真的能预测自己吗?
    • 可视化自动编码器结果(降维),是否用更少的维度解释方差?
    • 使模型更复杂并不一定优于更简单的模型,您是否绘制了验证 mse 与 epoch?多个步骤后是否存在全局最小值
    • 你有足够的epochs吗?
    • 您的自动编码器中有多少个单位?它可能太少(或太多,以防欠拟合),具体取决于您的数据行为及其数量。
    • 您是否对 PCA、NMF 等其他降维方法进行了比较
    • 最后但并非最不重要的一点是,使用自动编码器为这项任务设计功能是不是最好的方法?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 2021-04-03
      • 2021-01-29
      • 2021-05-10
      • 2023-03-16
      • 2020-07-03
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多