我想构建一个分类器来预测用户i
是否会转发推文j
。
数据集非常庞大,包含1.6亿条推文。每条推文都附带一些元数据(例如,转发者是否关注推文的作者)。
单条推文的文本标记是一个BERT id的有序列表。要获取推文的嵌入,只需使用这些id(所以它不是文本)。
是否可以微调BERT来进行预测?如果可以,您推荐哪些课程/资源来学习如何微调?(我是一个初学者)
我应该补充的是,预测应该是一个概率值。
如果不可行,我在考虑将嵌入转换回文本,然后使用我将要训练的某个任意分类器。
回答:
您可以微调BERT,并且可以使用BERT来进行转发预测,但您需要更多的架构才能预测用户i是否会转发推文j。
以下是我随手想出的一个架构。
从高层次来看:
- 创建用户i的密集向量表示(嵌入)(可能包含关于用户兴趣的信息,如运动)。
- 创建推文j的嵌入。
- 创建第一个和第二个嵌入结合的嵌入,例如通过连接或哈达玛积。
- 将此嵌入输入到一个进行二元分类的NN中,以预测转发或不转发。
让我们逐项分解这个架构。
要创建用户i的嵌入,您需要创建某种接受用户特征并生成密集向量的神经网络。这是架构中最困难的部分。这不是我的专长领域,但快速搜索“用户兴趣嵌入”会找到一篇关于名为StarSpace的算法的研究论文。它建议可以“根据用户行为获得高度信息化的用户嵌入”,这正是您想要的。
要创建推文j的嵌入,您可以使用任何类型的接受标记并生成向量的神经网络。2018年之前的研究会建议使用LSTM或CNN来生成向量。然而,BERT(如您在帖子中提到的)是当前的技术前沿。它接受文本(或文本索引)并为每个标记生成一个向量;其中一个标记应该是前置的[CLS]
标记,通常被认为是整个句子的表示。这篇文章提供了过程的概念概述。您可以在架构的这一部分微调BERT。这个网页提供了使用PyTorch和Huggingface实现BERT来完成这一步骤的具体代码(我已经按照步骤操作过,可以保证其有效)。将来,您可以搜索“BERT单句分类”。
要创建代表用户i和推文j组合的嵌入,您可以做许多事情。您可以简单地将它们连接成一个向量;所以如果用户i是一个M维向量,推文j是一个N维向量,那么连接会产生一个(M+N)维向量。另一种方法是计算哈达玛积(逐元素乘法);在这种情况下,两个向量必须具有相同的维度。
为了进行最终的转发或不转发的分类,构建一个简单的NN,它接受组合向量并生成一个值。在这里,由于您在进行二元分类,带有逻辑(sigmoid)函数的NN是合适的。您可以将输出解释为转发的概率,因此高于0.5的值将被视为转发。请参见这个网页,了解构建用于二元分类的NN的基本细节。
为了使整个系统工作,您需要端到端地训练它。也就是说,您必须先将所有部分连接起来,然后进行训练,而不是单独训练各个组件。
您的输入数据集看起来像这样:
user tweet retweet?---- ----- --------20 years old, likes sports Great game Y30 years old, photographer Teen movie was good N
如果您想要一个没有用户个性化的更简单的路径,那么只需省略创建用户i嵌入的组件。您可以使用BERT构建一个模型来确定推文是否被转发,而不考虑用户。您可以再次参考我上面提到的链接。