是否可以微调 BERT 以进行转发预测?
Is it possible to fine-tune BERT to do retweet prediction?
我想构建一个分类器来预测用户 i
是否会转发推文 j
。
数据集庞大,包含 1.6 亿条推文。每条推文都带有一些元数据(例如转发者是否关注推文的用户)。
单个推文的文本标记是 BERT id 的有序列表。要嵌入推文,您只需使用 ID(所以它不是文本)
是否可以微调 BERT 来进行预测?如果是,您建议 courses/sources 学习如何进行微调? (我是初学者)
我应该补充一点,预测应该是一个概率。
如果不可能,我正在考虑将嵌入转换回文本,然后使用我要训练的任意分类器。
在Data Science SE中已经有关于这个的答案,这就解释了为什么BERT不能用于预测。这是要点:
BERT can't be used for next word prediction, at least not with the current state of the research on masked language modeling.
BERT is trained on a masked language modeling task and therefore you cannot "predict the next word". You can only mask a word and ask BERT to predict it given the rest of the sentence (both to the left and to the right of the masked word).
但是我从你的案例中了解到你想做 'classification' 那么 BERT 完全有能力做到这一点。请参考我在下面发布的link。这将帮助您根据主题对推文进行分类,以便您可以在空闲时间查看它们。
您可以微调 BERT,并且可以使用 BERT 进行转发预测,但是您需要更多架构才能预测用户 i 是否会转发推文 j.
这是我脑海中的一个架构。
高级别:
- 创建用户 i 的密集向量表示(嵌入)(可能包含有关用户兴趣的内容,例如运动)。
- 创建推文的嵌入 j.
- 创建前两个嵌入组合在一起的嵌入,例如串联或 hadamard 乘积。
- 通过执行二进制分类的神经网络来预测转推或非转推。
让我们按项目分解此架构。
要创建用户 i 的嵌入,您需要创建某种神经网络来接受您拥有的有关用户的任何特征并生成密集向量。这部分是架构中最困难的部分。这个领域不在我的驾驶室,但快速 google 搜索 "user interest embedding" 会出现这篇关于名为 StarSpace 的算法的研究论文。提示可以"obtain highly informative user embeddings according to user behaviors",这就是你想要的
要创建推文 j 的嵌入,您可以使用任何类型的神经网络来获取标记并生成向量。 2018 年之前的研究建议使用 LSTM 或 CNN 来生成向量。但是,BERT(正如您在 post 中提到的)是当前最先进的。它接收文本(或文本索引)并为每个标记生成一个向量;这些标记之一应该是前置的 [CLS]
标记,通常被认为是整个句子的表示。 This article provides a conceptual overview of the process. It is in this part of the architecture that you can fine-tune BERT. This webpage 提供了使用 PyTorch 和 BERT 的 Huggingface 实现来执行此步骤的具体代码(我已经完成了这些步骤并且可以为它担保)。将来,你会想要 google for "BERT single sentence classification".
要创建表示用户 i 和推文 j 组合的嵌入,您可以做很多事情之一。您可以简单地将它们连接成一个向量;所以如果 user i 是一个 M 维向量并且 tweet j 是一个 N 维向量,那么连接会产生一个 (M+N)维向量。另一种方法是计算 hadamard 乘积(逐元素乘法);在这种情况下,两个向量必须具有相同的维度。
要对转推或不转推进行最终分类,请构建一个简单的神经网络,该神经网络采用组合向量并生成单个值。在这里,由于您正在进行二元分类,因此具有逻辑(S 型)函数的神经网络将是合适的。您可以将输出解释为转推的概率,因此高于 0.5 的值将被转推。有关构建二元分类神经网络的基本详细信息,请参阅 this webpage。
为了让整个系统正常工作,您需要一起训练它 end-to-end。也就是说,你必须先把所有的部分都连接起来然后训练它,而不是单独训练组件。
您的输入数据集将如下所示:
user tweet retweet?
---- ----- --------
20 years old, likes sports Great game Y
30 years old, photographer Teen movie was good N
如果您想要一条没有用户个性化的更简单的路线,那么只需省略创建用户嵌入的组件 i。您可以使用 BERT 构建模型来确定推文是否被转发而不考虑用户。您可以再次点击我上面提到的链接。
我想构建一个分类器来预测用户 i
是否会转发推文 j
。
数据集庞大,包含 1.6 亿条推文。每条推文都带有一些元数据(例如转发者是否关注推文的用户)。
单个推文的文本标记是 BERT id 的有序列表。要嵌入推文,您只需使用 ID(所以它不是文本)
是否可以微调 BERT 来进行预测?如果是,您建议 courses/sources 学习如何进行微调? (我是初学者)
我应该补充一点,预测应该是一个概率。
如果不可能,我正在考虑将嵌入转换回文本,然后使用我要训练的任意分类器。
在Data Science SE中已经有关于这个的答案,这就解释了为什么BERT不能用于预测。这是要点:
BERT can't be used for next word prediction, at least not with the current state of the research on masked language modeling.
BERT is trained on a masked language modeling task and therefore you cannot "predict the next word". You can only mask a word and ask BERT to predict it given the rest of the sentence (both to the left and to the right of the masked word).
但是我从你的案例中了解到你想做 'classification' 那么 BERT 完全有能力做到这一点。请参考我在下面发布的link。这将帮助您根据主题对推文进行分类,以便您可以在空闲时间查看它们。
您可以微调 BERT,并且可以使用 BERT 进行转发预测,但是您需要更多架构才能预测用户 i 是否会转发推文 j.
这是我脑海中的一个架构。
高级别:
- 创建用户 i 的密集向量表示(嵌入)(可能包含有关用户兴趣的内容,例如运动)。
- 创建推文的嵌入 j.
- 创建前两个嵌入组合在一起的嵌入,例如串联或 hadamard 乘积。
- 通过执行二进制分类的神经网络来预测转推或非转推。
让我们按项目分解此架构。
要创建用户 i 的嵌入,您需要创建某种神经网络来接受您拥有的有关用户的任何特征并生成密集向量。这部分是架构中最困难的部分。这个领域不在我的驾驶室,但快速 google 搜索 "user interest embedding" 会出现这篇关于名为 StarSpace 的算法的研究论文。提示可以"obtain highly informative user embeddings according to user behaviors",这就是你想要的
要创建推文 j 的嵌入,您可以使用任何类型的神经网络来获取标记并生成向量。 2018 年之前的研究建议使用 LSTM 或 CNN 来生成向量。但是,BERT(正如您在 post 中提到的)是当前最先进的。它接收文本(或文本索引)并为每个标记生成一个向量;这些标记之一应该是前置的 [CLS]
标记,通常被认为是整个句子的表示。 This article provides a conceptual overview of the process. It is in this part of the architecture that you can fine-tune BERT. This webpage 提供了使用 PyTorch 和 BERT 的 Huggingface 实现来执行此步骤的具体代码(我已经完成了这些步骤并且可以为它担保)。将来,你会想要 google for "BERT single sentence classification".
要创建表示用户 i 和推文 j 组合的嵌入,您可以做很多事情之一。您可以简单地将它们连接成一个向量;所以如果 user i 是一个 M 维向量并且 tweet j 是一个 N 维向量,那么连接会产生一个 (M+N)维向量。另一种方法是计算 hadamard 乘积(逐元素乘法);在这种情况下,两个向量必须具有相同的维度。
要对转推或不转推进行最终分类,请构建一个简单的神经网络,该神经网络采用组合向量并生成单个值。在这里,由于您正在进行二元分类,因此具有逻辑(S 型)函数的神经网络将是合适的。您可以将输出解释为转推的概率,因此高于 0.5 的值将被转推。有关构建二元分类神经网络的基本详细信息,请参阅 this webpage。
为了让整个系统正常工作,您需要一起训练它 end-to-end。也就是说,你必须先把所有的部分都连接起来然后训练它,而不是单独训练组件。
您的输入数据集将如下所示:
user tweet retweet?
---- ----- --------
20 years old, likes sports Great game Y
30 years old, photographer Teen movie was good N
如果您想要一条没有用户个性化的更简单的路线,那么只需省略创建用户嵌入的组件 i。您可以使用 BERT 构建模型来确定推文是否被转发而不考虑用户。您可以再次点击我上面提到的链接。