在使用词嵌入训练网络时,添加嵌入层以首先将输入向量转换为嵌入是标准做法。
然而,假设嵌入是预先训练和冻结的,还有另一种选择。我们可以简单地在将训练数据提供给模型之前对其进行预处理,以便它已经转换为嵌入。这将加快训练速度,因为这种转换只需要执行一次,而不是在每个 epoch 中即时执行。
因此,第二种选择似乎更好。但首选似乎更常见。假设嵌入是预先训练和冻结的,我是否有理由选择第一个选项而不是第二个?
在使用词嵌入训练网络时,添加嵌入层以首先将输入向量转换为嵌入是标准做法。
然而,假设嵌入是预先训练和冻结的,还有另一种选择。我们可以简单地在将训练数据提供给模型之前对其进行预处理,以便它已经转换为嵌入。这将加快训练速度,因为这种转换只需要执行一次,而不是在每个 epoch 中即时执行。
因此,第二种选择似乎更好。但首选似乎更常见。假设嵌入是预先训练和冻结的,我是否有理由选择第一个选项而不是第二个?
如果你必须在训练期间移动大量数据(比如从磁盘/网络/你有什么检索批次),那么作为 [批次、文档、索引] 的 rank-3 张量比作为排名要快得多[批次、文档、索引、向量]的 -4 张量。在这种情况下,尽管无论您将其放在何处,嵌入都是 O(1),但将其作为图形的一部分这样做会更有效。
有多种方法可以从语料库中获取词嵌入。
CountVectorizer()
fromsklearn.feature_extraction.text
然后使用fit_transform()
TfidfVectorizer
fromsklearn.feature_extraction.text
然后再次使用 thefit_transform()
word2vec
使用gensim.models
. word2vec.Word2vec
假设您的模型提出的单词字典是预训练嵌入的子集,例如 Google 的预训练 word2vec,那么如果您的模型可以处理这种尺寸的维度,那么遵循这些嵌入可能是一个更好的选择.
然而,考虑到问题的性质,有时这并不总是最好的解决方案。例如,如果您尝试在包含稀有和特殊单词的医学文本上使用 NLP,那么您可能应该使用嵌入层,假设您有足够的数据大小,或者两者兼而有之。这只是我的一个想法。当然,可能还有其他几个应该提出嵌入层的用例。