首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型可训练嵌入层减慢了训练速度

大型可训练嵌入层减慢了训练速度
EN

Stack Overflow用户
提问于 2019-01-17 20:46:00
回答 2查看 290关注 0票数 0

我正在训练一个使用LSTM对文本进行分类的网络。我为单词输入使用了一个随机初始化的可训练嵌入层。网络使用Adam Optimizer进行训练,并使用one-hot编码将单词输入网络。

我注意到嵌入层中表示的单词数量对训练时间有很大影响,但我不明白为什么。将网络中的单词数量从200'000增加到2'000'000几乎使一个训练周期的时间增加了一倍。

训练不应该只更新在预测当前数据点时使用的权重吗?因此,如果我的输入序列始终具有相同的长度,则无论嵌入层的大小如何,都应该始终发生相同数量的更新。

EN

回答 2

Stack Overflow用户

发布于 2019-01-17 21:51:04

所需的更新次数将反映在达到一定精度所需的纪元数中。

如果你的观察结果是收敛需要相同的时期,但每个时期需要两倍的挂钟时间,那么这表明简单地执行嵌入查找(并编写嵌入表的更新)现在占用了你训练时间的很大一部分。

情况很容易就是这样。2'000'000个字乘以4字节/ float32乘以嵌入向量的长度(它是什么?让我们假设200)大约是每个小批量需要接触的1.6 be的数据。你也没有说你是如何训练的( CPU,GPU,什么GPU),这对结果有意义的影响,例如缓存效应,因为CPU以稍微不太适合缓存的方式(更稀疏)进行完全相同数量的读/写,可以很容易地将执行时间增加一倍。

而且,你的前提有点不同寻常。你有多少标签数据,有足够的#20000000个最稀有单词的例子来直接计算有意义的嵌入?这可能是可能的,但这将是不寻常的,在几乎所有的数据集,包括非常大的数据集,第20000000个单词将是一个现时词,因此将其包含在可训练嵌入中是有害的。通常的场景是从大型的未标记数据中单独计算大型嵌入,并将其用作固定的不可训练层,并可能将它们与标记数据中的小型可训练嵌入连接起来,以捕获特定于领域的术语等内容。

票数 1
EN

Stack Overflow用户

发布于 2019-01-17 21:24:45

如果我理解正确的话,您的网络将表示单词的one-hot向量嵌入到一定大小的embedding_size中。然后,将嵌入作为输入馈送到LSTM。网络的可训练变量既是嵌入层的变量,也是LSTM本身的变量。

关于嵌入层中权重的更新,您是正确的。但是,一个LSTM单元中的权重数量取决于嵌入的大小。例如,如果你看一下第t个单元的遗忘门的方程,

您可以看到权重矩阵W_f乘以输入的x_t,这意味着W_f的其中一个维度必须恰好为embedding_size。因此,随着embedding_size的增长,网络规模也在增长,因此需要更长的时间进行训练。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54236285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档