Python Keras LSTM 学习在高损失时收敛过快

Posted

技术标签:

【中文标题】Python Keras LSTM 学习在高损失时收敛过快【英文标题】:Python Keras LSTM learning converges too fast on high loss 【发布时间】:2018-02-23 18:17:38 【问题描述】:

这更像是一个深度学习的概念问题,如果这不是合适的平台,我会把它带到别处。

我正在尝试使用 Keras LSTM 顺序模型来学习文本序列并将它们映射到数值(回归问题)。

问题是,在高损失(训练和测试)上,学习总是收敛得太快。我已经尝试了所有可能的超参数,我感觉这是导致模型高偏差的局部最小值问题。

我的问题基本上是:

    鉴于此问题,如何初始化权重和偏差? 使用哪个优化器? 我应该将网络扩展多深(我怕如果我使用非常深的网络,训练时间会难以忍受,模型方差会增大) 我应该添加更多训练数据吗?

输入和输出用 minmax 归一化。

我正在使用带有动量的 SGD,目前有 3 个 LSTM 层(126,256,128)和 2 个密集层(200 和 1 个输出神经元)

我在几个时期后打印了权重,并注意到 许多权重 是零,其余的基本上都是1(或非常接近)。

这里有一些来自 tensorboard 的图:

【问题讨论】:

我喜欢使用'adam' 优化器,它通常会自动找到自己的方式。但是如果没有很多测试和细节,你的答案就无法给出。看来您的学习率可能太高,但这可能不是唯一可能的原因。 你的激活函数是什么? 【参考方案1】:

考虑减少您的 batch_size。 对于较大的 batch_size,可能是您的梯度在某些时候无法找到数据随机性的更多变化,因此它会更早收敛。

【讨论】:

【参考方案2】:

更快的收敛和非常高的损失可能意味着您面临梯度爆炸问题。尝试使用低得多的学习率,例如 1e-5 或 1e-6。在学习率较高的情况下,您还可以尝试使用梯度裁剪等技术来限制梯度。

答案 1

另一个原因可能是权重初始化,尝试以下3种方法:

    本文描述的方法https://arxiv.org/abs/1502.01852 Xavier 初始化 随机初始化

在许多情况下,第一种初始化方法效果最好。

答案 2

您可以尝试不同的优化器,例如

    动量优化器 SGD 或梯度下降 亚当优化器

优化器的选择应基于损失函数的选择。例如:对于以 MSE 作为损失函数的逻辑回归问题,基于梯度的优化器不会收敛。

答案 3

您的网络应该有多深或多宽完全取决于您使用的网络类型以及问题所在。

正如您所说,您正在使用使用 LSTM 的序列模型来学习文本序列。毫无疑问,您选择的模型很适合这个问题,您也可以尝试 4-5 个 LSTM。

答案 4

如果您的梯度变为 0 或无穷大,则称为梯度消失或仅表示早期收敛,请尝试使用适当的学习率和第一个权重初始化技术进行梯度裁剪。

我相信这肯定会解决您的问题。

【讨论】:

以上是关于Python Keras LSTM 学习在高损失时收敛过快的主要内容,如果未能解决你的问题,请参考以下文章

深度学习-Keras-层及损失函数

深度学习-Keras-层及损失函数

如何为 LSTM 实现 Keras 自定义损失函数

python tensorflow 2.0 不使用 Keras 搭建简单的 LSTM 网络

LSTM 模型中 epoch 图中的损失跳跃 - keras

使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因