Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 大的可训练嵌入层降低了训练速度_Tensorflow_Optimization_Word Embedding - Fatal编程技术网

Tensorflow 大的可训练嵌入层降低了训练速度

Tensorflow 大的可训练嵌入层降低了训练速度,tensorflow,optimization,word-embedding,Tensorflow,Optimization,Word Embedding,我正在训练一个网络,用LSTM对文本进行分类。我使用一个随机初始化和可训练的嵌入层来输入单词。网络通过Adam优化器进行训练,单词通过一个热编码输入网络 我注意到嵌入层中表示的单词数量严重影响训练时间,但我不明白为什么。将网络中的单词数量从20万增加到200万,几乎使训练时间增加了一倍 训练不应该只更新当前数据点预测期间使用的权重吗。因此,如果我的输入序列始终具有相同的长度,则无论嵌入层的大小,更新的次数应该始终相同。如果我理解正确,您的网络将从一个表示单词的热向量到某个大小的嵌入。然后将嵌入作

我正在训练一个网络,用LSTM对文本进行分类。我使用一个随机初始化和可训练的嵌入层来输入单词。网络通过Adam优化器进行训练,单词通过一个热编码输入网络

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


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

如果我理解正确,您的网络将从一个表示单词的热向量到某个大小的嵌入。然后将嵌入作为输入馈送到LSTM。网络的可训练变量既包括嵌入层的变量,也包括LSTM本身的变量

关于嵌入层中权重的更新,您是正确的。然而,一个LSTM单元中的权重数量取决于嵌入的大小。例如,如果你看第t个细胞的遗忘门方程,
您可以看到权重矩阵W_f乘以输入x_t,这意味着W_f的一个维度必须正好是嵌入大小。因此,随着嵌入单元大小的增加,网络大小也会增加,因此需要更长的时间来训练

需要的更新次数将反映在达到一定精度所需的历次次数中

如果您的观察结果是收敛需要相同数量的历元,但每个历元需要两倍的挂钟时间,那么这表明简单地执行嵌入查找(并编写嵌入表的更新)现在需要占用大量的训练时间

这很可能是事实。2'000'000字乘以4字节/float32倍嵌入向量的长度(它是什么?假设200)相当于1.6GB的数据,每个小批量都需要处理。你也没有说你是如何训练这个(CPU,GPU,什么GPU)的,因为缓存效应,它对这个结果有着有意义的影响,因为CPU以稍微不太缓存友好的方式(更稀疏)执行完全相同的读/写次数,很容易使执行时间加倍


另外,你的前提有点不寻常。您有多少标记数据可以提供足够的第2000000个最稀有单词的示例来直接计算有意义的嵌入?这可能是可能的,但不寻常的是,在几乎所有的数据集中,包括非常大的数据集中,#2000000字将是暂时的,因此将其包含在可训练的嵌入中是有害的。通常的情况是,将大型嵌入与大型未标记数据分开计算,并将其用作固定的不可训练层,并可能将其与标记数据中的小型可训练嵌入连接起来,以捕获特定领域的术语等内容。

对不起,我应该更详细地解释我的方法。我保持一个单词的维度不变,但增加了嵌入中存在的单词总数。我会更新我的问题!一种可能是权重不再适合内存,因此您正在等待tensorflow从文件中读取它们。我也考虑过这一点,但找不到验证这一点的方法。你知道我是怎么看待这个记忆问题的吗?谢谢你详细的回答!我的培训集由很大一部分产品名称组成。我正在GPU上训练。如果内存是RAM,为什么内存中的查找很重要?不管表的大小,查找没有O(1)吗?@Jonas除了O()之外,还有很多细节开始影响“小”的速度差异,比如执行时间加倍。表查找速度高度依赖于缓存命中率(至少对于CPU来说,读取一行100个项目的速度比读取100个随机项目的速度快100倍),对于GPU培训来说,将千兆字节+表从CPU复制到GPU再复制回来的时间是不平凡的(对于您的表来说,半秒可能是合理的),如此突然地,重要的是考虑训练过程在CPU和GPU之间移动数据的频率,等等。