我一直在阅读一些带有深度学习论文的NLP,发现微调似乎是一个简单但却令人困惑的概念。问here同样问题,但仍然不太清楚。
将预先训练过的单词嵌入微调到任务特定的单词嵌入,如 Y等论文中所述。 Kim,“用于句子分类的卷积神经网络”,和 K. S. Tai,R。Socher和C. D. Manning,“改进了树结构长短期记忆网络的语义表示”,只是简单提及而没有详细说明。
我的问题是:
使用word2vec或Glove生成的Word嵌入作为预训练的单词向量用作输入要素(X)
,用于解析或情感分析等下游任务,这意味着这些输入向量插入到某个特定任务的新神经网络模型中,在训练这个新模型的同时,我们可以以某种方式获得更新的特定于任务的单词嵌入。
但据我所知,在训练过程中,反向传播的作用是更新模型的权重(W)
,它不会改变输入要素(X)
,所以具体如何原始字嵌入得到微调?这些微调的载体来自哪里?
答案 0 :(得分:5)
是的,如果您将嵌入向量作为输入,则无法微调嵌入(至少很容易)。但是,所有框架都提供某种EmbeddingLayer
作为输入的整数,它是单词/字符/其他输入标记的类序数,并执行嵌入查找。这样的嵌入层非常类似于馈送单热编码类的完全连接层,但是更有效,因为它只需要在前后通道上从矩阵中获取/改变一行。更重要的是,它允许学习嵌入的权重。
所以经典的方法是将实际的类提供给网络而不是嵌入,并在整个网络前面加上一个嵌入层,使用word2vec / glove初始化,并继续学习权重。在开始微调它们之前,在开始时将它们冻结几次迭代也是合理的,直到网络的其余部分开始对它们做一些合理的事情。
答案 1 :(得分:0)
一种热编码是构建嵌入初始层的基础。训练网络后,一种热编码本质上将用作表查找。在微调步骤中,您可以选择特定作品的数据,并提及在使用诸如此类的优化器定义优化器时需要微调的变量
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.