【问题标题】:Training loss increases after 12 epochs训练损失在 12 个 epoch 后增加
【发布时间】:2018-04-02 18:08:30
【问题描述】:

我有一个模型,它在 7-14 个 epoch 后几乎以 100% 的准确率学习分类(二元分类),但在达到 0.0004 的最小损失后,在下一个 epoch 中它会跃升至 7.5(这意味着它有50% 的机会正确分类,同样有纯粹的机会),然后在所有后续 epoch 中保持在 7. 附近。

我使用 adam 优化器来处理学习率。

如何防止训练损失增加?

SGD 优化器不会发生这种巨大的跳跃。

inputs = Input(shape=(X_train.shape[1],))
Dx = Dense(32, activation="relu")(inputs)
Dx = Dense(32, activation="relu")(Dx)
for i in range(20):
    Dx = Dense(32, activation="relu")(Dx)
Dx = Dense(1, activation="sigmoid")(Dx)
D = Model(input=[inputs], output=[Dx])
D.compile(loss="binary_crossentropy", optimizer="adam")

D.fit(X_train, y_train, nb_epoch=20)

【问题讨论】:

    标签: tensorflow neural-network keras


    【解决方案1】:

    对于完全连接的架构,您的网络非常深。很可能您已经被vanishing- or exploding gradient 击中,即重复乘以非常小的或非常大的数字引起的数字问题。我建议使用更浅但更宽的网络,根据我的经验,2-3 层之类的密集层通常就足够了。如果您更喜欢使用更深层次的架构,您可以尝试skip connections 之类的东西。

    【讨论】:

    • 我正在为标准密集架构和二进制分类实施残差学习方法。我发现它在前 5-10 个 epoch 训练得很好,然后训练和验证损失都突然增加了 10-15 个数量级。我认为这可能是因为我还没有找到在瓶颈处跳过连接的方法。我正在考虑某种平均池来降低尺寸。你有什么建议吗?
    • 嗯,有趣的问题。那么瓶颈是否意味着你正在做一个自动编码器风格的架构但具有完全连接的层?肯定跳过连接在卷积架构中建立得更多,跳过所有 O(n²) 连接将导致 sphagetti 网络非常快。也许在网络更深处再次重复输入?或者只是跳过每个神经元的 1 个连接并希望它学习“信号桥”?我之前对网关守卫跳过连接使用了软注意,据说它对维度有所帮助,但我猜它会在这里被淹没。
    • 具有相似目标的另一种路径可能是使用 SELU 重新规范化激活单元,这可能有助于提高深度 (arxiv.org/pdf/1706.02515.pdf)。另外我不知道你的背景,但是如果你没有对神经网络做很多工作,那么很常见的东西就是不起作用或训练因未知原因而偏离。另请注意,您总是需要比文章中至少多一个数量级的数据,我什至不会尝试使用 NN 来训练具有唯一数据点数量
    • 是的,基本上。任何时候下一层中的神经元数量少于上一层,这就是我所说的瓶颈。但是根据您所说的,也许我完全误解了快捷连接的想法。在阅读 ResNet 论文时,我理解该过程是将块的输入简单地添加到相同的块输出中:y = F(x) + x。我并没有真正通过连接进行连接。我只是直接添加输入和输出。就数据而言,我有很多。
    • 你完全正确。抱歉,由于某种原因,我感到困惑并开始考虑将完全连接的层相互连接起来。您的解释是正确的,您只需添加权重。我从未放弃过 FCNN 的维度。我认为你可以放弃每一秒的权重,让网络学习路径。在 CNN 中,通常使用逐点卷积进行可学习的下采样,没有规则阻止您进行卷积下采样。但是我的猜测是问题出在其他地方,例如类不平衡或标签噪声或诸如此类。
    【解决方案2】:

    这可能来自小批量。您可以尝试增加批量大小.. referring to this.

    【讨论】:

    • 这些不是波动,是一致的模式
    猜你喜欢
    • 2022-11-15
    • 2021-04-13
    • 1970-01-01
    • 2022-01-10
    • 2020-01-27
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多