我正在训练一个网络,以使用LSTM对文本进行分类。我为单词输入使用了一个随机初始化且易于训练的嵌入层。该网络使用Adam Optimizer进行训练,并且单词采用单次热编码的方式馈入网络。
我注意到嵌入层中表示的单词数量严重影响了训练时间,但是我不明白为什么。网络中的单词数从200'000增加到2'000'000几乎使训练时间缩短了一倍。
训练不应仅更新在当前数据点的预测期间使用的权重。因此,如果我的输入序列的长度始终相同,则无论嵌入层的大小如何,都应该总是发生相同数量的更新。
答案 0 :(得分:1)
所需的更新次数将反映在达到一定精度所需的时期数中。
如果您的观察结果是收敛需要相同的时期数,但是每个时期花费的挂钟时间是原来的两倍,那么这表明简单地执行嵌入查找(并编写嵌入表的更新)现在会花费大量时间您训练时间的一部分。
很容易是这种情况。 2'000'000字乘以每个float的4个字节乘以嵌入向量的长度的32倍(这是什么?让我们假设200)是大约1.6 GB的数据,每个微型批处理都需要触摸。您也没有在说您如何训练它(CPU,GPU,什么GPU),这将对诸如此类的结果产生重大影响。缓存效果,对于CPU以稍微不太友好的缓存方式(更多的稀疏性)进行完全相同数量的读/写操作,很容易使执行时间加倍。
此外,您的前提有点不寻常。您有多少带标签的数据有足够的第#2000000个最罕见单词的示例来直接计算有意义的嵌入?在几乎所有数据集中,包括非常大的数据集,可能都是有可能的,但不寻常的是,第2000000个单词将是一个随机数,因此将其包含在可训练的嵌入中将是有害的。通常的情况是将大型嵌入与未标记的大数据分开计算,并将其用作固定的不可训练层,并可能将它们与来自标记数据的可训练的小嵌入串联起来,以捕获特定于领域的术语。
答案 1 :(得分:0)