Machine learning 微调单词嵌入是如何工作的?

Machine learning 微调单词嵌入是如何工作的?,machine-learning,deep-learning,word-embedding,Machine Learning,Deep Learning,Word Embedding,我读了一些NLP的深度学习论文,发现微调似乎是一个简单但却令人困惑的概念。有人问过同样的问题,但仍然不太清楚 如Y.Kim,“用于句子分类的卷积神经网络”,K.S.Tai,R.Socher和C.D.Manning,“改进树结构长期短期记忆网络的语义表示”等论文中所述,将预先训练的单词嵌入微调为任务特定的单词嵌入只是简单地提了一下,没有涉及任何细节 我的问题是: 使用word2vec或Glove作为预训练词向量生成的单词嵌入被用作下游任务(如解析或情绪分析)的输入特征(X),这意味着这些输入向量被

我读了一些NLP的深度学习论文,发现微调似乎是一个简单但却令人困惑的概念。有人问过同样的问题,但仍然不太清楚

如Y.Kim,“用于句子分类的卷积神经网络”,K.S.Tai,R.Socher和C.D.Manning,“改进树结构长期短期记忆网络的语义表示”等论文中所述,将预先训练的单词嵌入微调为任务特定的单词嵌入只是简单地提了一下,没有涉及任何细节

我的问题是:

使用word2vec或Glove作为预训练词向量生成的单词嵌入被用作下游任务(如解析或情绪分析)的输入特征
(X)
,这意味着这些输入向量被插入到某个特定任务的新神经网络模型中,同时训练此新模型,不知何故,我们可以得到更新的任务特定的单词嵌入


但据我所知,在训练期间,反向传播所做的是更新模型的权重
(W)
,它不会改变输入特征
(X)
,那么原始单词嵌入是如何精确地得到微调的呢?这些微调向量从何而来?

是的,如果输入嵌入向量,则无法微调嵌入(至少很容易)。然而,所有的框架都提供了某种类型的
EmbeddingLayer
,它接受一个整数作为输入,该整数是单词/字符/其他输入标记的类序号,并执行嵌入查找。这样的嵌入层非常类似于一个完全连接的层,该层提供一个热编码的类,但效率更高,因为它只需要在前后过程中从矩阵中获取/更改一行。更重要的是,它允许学习嵌入的权重


因此,经典的方法是将实际的类提供给网络,而不是嵌入,并使用嵌入层预处理整个网络,该嵌入层用word2vec/glove初始化,并继续学习权重。在开始微调之前,最好将它们冻结几次迭代,直到网络的其他部分开始对它们进行合理的处理。

一个热编码是构建嵌入初始层的基础。一旦你训练了网络,一个热编码就基本上起到了查表的作用。在微调步骤中,您可以为特定的工作选择数据,并在使用类似于以下内容定义优化器时提及需要微调的变量

embedding_variables = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope="embedding_variables/kernel")
ft_optimizer = tf.train.AdamOptimizer(learning_rate=0.001,name='FineTune')
ft_op = ft_optimizer.minimize(mean_loss,var_list=embedding_variables)

where "embedding_variables/kernel" is the name of the next layer after one-hot encoding.

谢谢你的回答。因此嵌入层接受输入,比如一个热编码,并与“真实”隐藏层连接。对吗?通过使用word2vec/glove初始化EmbeddingLayer,这是否意味着将它们用作EmbeddingLayer中的参数?如果你能举个简单的例子,我将不胜感激。感谢keras的示例,TF的一些讨论。嵌入的输入通常不是一个热编码,而是整数。是的,使用手套初始化意味着将嵌入层的权重矩阵设置为手套向量。我觉得这个答案不正确。首先,您确实可以微调嵌入。例如,Keras允许您将嵌入矩阵加载到嵌入层中,并通过反向传播进行更新。其次,您的两个语句相互矛盾:
您不能微调嵌入
并且
允许学习嵌入的权重
。如果嵌入作为输入传递{您不能微调嵌入},则没有矛盾
。否则,如果嵌入查找是使用嵌入层完成的{它允许学习嵌入的权重}
引用的两个语句逻辑上位于两个单独的分支中。