如何将 3D 令牌嵌入组合到 2D 向量中?

How to combine 3D token embeddings into 2D vectors?

我有一组要标记化的字符串。我将每个字符串发送到 gensim 中的 word2vec 模型。比如说,如果有 100 个标记(例如 'I'、'ate'、'pizza' 等),它会生成一个 100 * 100 的 3D 矩阵(list of listpython 中)。如何将生成的 3D 令牌嵌入转换为 2D 向量?

我正在将此 3D 发送到 Tensorflow 库中的模型中。我正在执行以下操作,

model.add(Embedding(max_features, 128, input_length=maxlen))

这里max_features是token向量的大小即100,input_length也是一样的。

但我不确定这是否能完成工作。将 3D 令牌嵌入转换为 2D 向量是否正确?理想情况下,我想在发送到模型之前将嵌入转换为二维向量。

训练的最终结果在通常的 Word2Vec/gensim 术语中并不是真正的“3D”。如果您使用 Word2Vec 及其默认 vector_size=100,并且您有 100 个词汇,那么您将有 100 个向量,每个向量有 100 个维度。

(注意:你永远不会想要为这么小的词汇表创建如此高维的 "dense embedding" 向量。这种密集表示的基本好处来自于将更大的实体集强制到许多 -维度更少,因此它们 "compressed" 进入微妙的、连续的、有意义的相对位置。在 Word2Vec 训练之前,给 100 个单词完整的 100 个连续维度,会使模型容易出现严重的过度拟合。事实上,它可能会趋向于对每个单词进行类似 "one-hot" 的编码,并且在没有真正学习将相关单词彼此靠近地打包在共享 space 中的情况下变得非常擅长训练任务——这是通常期望的训练结果。根据我的经验,对于 100 维向量,您可能需要至少 100^2 个词汇量。如果您真的只关心 100 个单词,那么您会想要使用更小的向量——但也要记住 Word2Vec 和相关技术实际上是针对 "large data" 问题的,有很多子训练示例变化多端,有时几乎不会在玩具大小的数据上给出有意义的结果。)

100 个维度的 100 个向量每个都作为原始 numpy ndarray 在内部存储在 Word2Vec 模型(及相关组件)中,可以将其视为“二维数组”或“二维矩阵”。 (它实际上不是 listlist ,除非你将它转换为不太理想的形式——当然,使用 Pythonic 多态性你通常可以假装它是 listlist).如果您的 gensim Word2Vec 模型在 w2v_model 中,那么学习向量的原始 numpy 数组在 w2v_model.wv.vectors 属性 中,尽管解释其中哪一行对应于哪个单词标记取决于 w2v_model.wv.vocab 字典条目。

据我所知,Tensorflow Embedding class 用于在 TF 中训练您自己的嵌入(尽管它可能可以使用在其他地方训练的向量进行初始化)。它的第一个初始化参数应该是词汇表的大小(根据你推测的情况 100),它的第二个是所需嵌入的大小(根据你推测的情况,也是 100 - 但如上所述,这个匹配vocab-size 和 dense-embedding-size 的组合是不合适的, the example values in the TF docs of 1000 words and 64 dimensions 会更合适)。