问问题
7589 次
2 回答
16
是的,如果您将嵌入向量作为输入提供,您将无法微调嵌入(至少很容易)。但是,所有框架都提供了某种类型的 an EmbeddingLayer
,它将作为单词/字符/其他输入标记的类序数的整数作为输入,并执行嵌入查找。这样的嵌入层非常类似于输入单热编码类的全连接层,但效率更高,因为它只需要在前后传递中从矩阵中获取/更改一行。更重要的是,它允许学习嵌入的权重。
因此,经典的方法是将实际的类而不是嵌入提供给网络,并在整个网络之前添加一个嵌入层,该嵌入层使用 word2vec / glove 进行初始化,并继续学习权重。在开始时将它们冻结几次迭代也可能是合理的,直到网络的其余部分开始对它们进行合理的处理,然后再开始微调它们。
于 2016-10-31T18:13:46.767 回答
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.
于 2020-04-20T01:06:43.423 回答