为什么我的 LSTM 需要这么长时间来训练?

机器算法验证 深度学习 模型评估 时间复杂度
2022-03-18 09:03:26

我正在尝试训练双向 LSTM 来执行顺序文本标记任务(特别是,我想做自动标点符号)。

我使用字母作为构建块:我用 50 维嵌入向量表示每个输入字母,馈入单个 100 维隐藏层,馈入 100 维输出层,然后馈入 MLP。

对于训练,我有一个包含大约 18 百万个字母的语料库——大约有 70,000 个句子,每个句子中大约有 250 个字母。(我在 Ubuntu 16.04 系统上的 Python 3 上使用过 DyNet)。

主要问题是训练非常缓慢:每次训练迭代大约需要半天时间。由于训练通常需要大约 100 次迭代,这意味着我必须等待一个多月才能获得合理的结果。

我问了其他一些做深度学习的人,他们告诉我“深度学习很慢,你必须习惯它”。尽管如此,等待一个多月的培训似乎非常缓慢。

这些时间对于训练 LSTM 模型很常见吗?如果没有,我做错了什么,我能做些什么来加快训练速度?

2个回答

不管我说这话有多痛苦,Deep learning is slow, get used to it..

不过,您可以采取一些措施来加快训练速度:

  • 你用的是什么GPU?我的一个朋友去年对 LSTM 进行了一些研究,并在她的 NVIDIA GTX7 上训练他们?显卡。由于这变得非常缓慢,他们试图在更现代的 CPU 上训练网络,这实际上导致了一个非常重要的加速。

  • 你用的是什么框架?虽然大多数框架都具有可比性,但我听说一些框架比其他框架慢的传言 ( https://arxiv.org/pdf/1608.07249.pdf )。如果您要进行大量培训,那么切换框架可能是值得的。

  • 是否可以在您的公司/大学硬件上训练您的网络?大学和研究公司通常拥有一些强大的硬件供他们使用。如果这不是一个选项,也许您可​​以考虑使用一些云计算能力。

所有这些解决方案显然都假设您的模型本身是最佳的(就训练时间和准确性而言),这也是您需要考虑的问题,但超出了此答案的范围。

如果其他人为此苦苦挣扎,我也遇到了同样的问题——我的 LSTM 层在每个 epoch 的训练时间上增加了大约 1 小时。我意识到这是因为在我的 IDE (PyCharm) 中,当我尝试使用尚未在脚本顶部手动导入的方法时,我使用了自动导入选项。默认情况下,自动导入语句是

from tensorflow.python.keras.layers import Bidirectional, LSTM

当我将其更改为

from tensorflow.keras.layers import Bidirectional, LSTM

每个 epoch 的训练时间下降到只有 4 分钟。