较大的可训练嵌入层会减慢训练速度

时间:2019-01-17 12:46:00

标签: tensorflow optimization word-embedding

我正在训练一个网络,以使用LSTM对文本进行分类。我为单词输入使用了一个随机初始化且易于训练的嵌入层。该网络使用Adam Optimizer进行训练,并且单词采用单次热编码的方式馈入网络。

我注意到嵌入层中表示的单词数量严重影响了训练时间,但是我不明白为什么。网络中的单词数从200'000增加到2'000'000几乎使训练时间缩短了一倍。

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

2 个答案:

答案 0 :(得分:1)

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

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

很容易是这种情况。 2'000'000字乘以每个float的4个字节乘以嵌入向量的长度的32倍(这是什么?让我们假设200)是大约1.6 GB的数据,每个微型批处理都需要触摸。您也没有在说您如何训练它(CPU,GPU,什么GPU),这将对诸如此类的结果产生重大影响。缓存效果,对于CPU以稍微不太友好的缓存方式(更多的稀疏性)进行完全相同数量的读/写操作,很容易使执行时间加倍。

此外,您的前提有点不寻常。您有多少带标签的数据有足够的第#2000000个最罕见单词的示例来直接计算有意义的嵌入?在几乎所有数据集中,包括非常大的数据集,可能都是有可能的,但不寻常的是,第2000000个单词将是一个随机数,因此将其包含在可训练的嵌入中将是有害的。通常的情况是将大型嵌入与未标记的大数据分开计算,并将其用作固定的不可训练层,并可能将它们与来自标记数据的可训练的小嵌入串联起来,以捕获特定于领域的术语。

答案 1 :(得分:0)

如果我的理解正确,您的网络会采用一度热的向量来表示单词,嵌入大小为embedding_size的嵌入。然后将嵌入作为LSTM的输入。网络的可训练变量既是嵌入层的变量,也是LSTM本身的变量。

您对嵌入层中权重的更新是正确的。但是,一个LSTM单元中的权重数量取决于嵌入的大小。例如,如果您看第t个单元格的“忘记门”方程, f_t = \sigma_g(W_f x_t + U_f h_{t-1} + b_f) 您会看到权重矩阵W_f与输入x_t相乘,这意味着W_f的维度之一必须恰好是embedding_size。因此,随着embedding_size的增加,网络的大小也会增加,因此需要花费更长的时间进行训练。