2

虽然迁移学习/微调最近的语言模型,例如 BERT 和 XLNET,是迄今为止非常普遍的做法,但这对 GloVe 来说如何?

基本上,当使用 GloVe 获得下游 NN 可以使用的密集向量表示时,我看到了两个选项。

1) 微调 GloVe 嵌入(在 pytorch 术语中,启用渐变)

2) 只使用没有梯度的嵌入。

例如,给定 GloVe 的嵌入矩阵,我会

embed = nn.Embedding.from_pretrained(torch.tensor(embedding_matrix, dtype=torch.float))
...
dense = nn.Linear(...)

最好的做法是单独使用 GloVe 来获得向量表示(并且只训练密集层和可能的其他层),还是也可以微调嵌入矩阵?

4

2 回答 2

10

你绝对应该微调你的词嵌入矩阵。事情是这样的,当您使用 GloVe 词嵌入初始化词嵌入矩阵时,您的词嵌入将已经捕获数据的大部分语义属性。但是,您希望您的词嵌入适合您解决的任务,即特定任务(Check Yang)。现在,假设你的数据集中没有足够的数据,你不能自己学习词嵌入矩阵(如果你用随机向量初始化词嵌入矩阵)。因此,您希望使用已在大型数据集上训练且通用的向量对其进行初始化。

要记住的一件非常重要的事情 → 因为你的模型的其余部分将被随机初始化,当你开始训练你的词嵌入矩阵时可能会遭受灾难性的遗忘(检查Howard、RuderKirkpatrick 等人的工作),即,梯度会很大,因为您的模型将严重欠拟合前几批的数据,并且您将完全丢失初始向量。您可以通过以下方式克服这个问题:

  1. 前几个 epoch 不微调词嵌入矩阵,保持原样:embeddings = nn.Embedding.from_pretrained(glove_vectors, freeze=True).

  2. 在模型的其余部分学会拟合您的训练数据后,降低学习率,解冻嵌入模块embeddings.weight.requires_grad = True,然后继续训练。

通过执行上述步骤,您将获得两全其美。换句话说,您的词嵌入仍将捕获语义属性,同时针对您自己的下游任务进行定制。最后,有作品(例如 Check Ye Zhang)表明可以立即微调,但我会选择更安全的选择。

于 2019-11-06T09:57:57.633 回答
2

没有理由不微调 GloVe 嵌入以获得更好的最终任务得分,除非您必须与使用原始嵌入的另一个模型保持链接(例如用于解释您的结果)。

在为您的目标函数微调嵌入时,单词嵌入将(可能)失去其初始属性(在单词相似性和类比任务中表现良好)。

使用词嵌入只是一种不使用随机向量进行初始化的方法,那么保持随机向量固定是否有意义?

有几篇文章可以微调词嵌入,例如这篇文章:https ://arxiv.org/abs/1505.07931

我假设你有足够的训练数据。否则最好让词嵌入固定,因为它涉及更少的参数来训练,从而避免过度拟合。

于 2019-11-03T08:58:45.513 回答