BERT4Rec论文阅读笔记

提出BERT4Rec模型,利用双向自注意力机制改进序列推荐系统的性能。该模型克服了传统单向模型的局限性,能更全面地捕捉用户行为序列特征。

论文地址:https://arxiv.org/abs/1904.06690

摘要

     通过用户的历史行为建模用户的动态兴趣偏好,对推荐系统来说,是具有挑战性且重要的。现有模型利用序列神经网络模型将用户的历史行为交互从左到右编码成隐含表示用做推荐。尽管他们的效果不错,我们认为这样从左到右的单向模型不是最优的,因为以下一些限制:a)单向架构限制了用户行为序列隐含表示的能力;b)它们经常假设一个严格有序的序列,并不总是切合实际。为了解决这些限制,我们提出了一个序列推荐模型(BERT4Rec),利用深度双向自注意力建模用户行为序列。为了避免信息遗漏和有效地训练双向模型,我们采用了填充目标式序列推荐,结合它们左右内容的条件来预测序列中随机标记的items。用这种方法,我们学习一个双向表示模型用做推荐,用户行为序列中的每个item都能融合它左右两边的信息。使用四个基准数据集进行扩展实验,结果表明我们的模型优于各种目前最优的序列模型。

本文要解决的问题

     用户动态行为序列对推荐系统是至关重要的,越来越多的序列模型被用来建模用户序列行为。但是它们普遍存在一个问题:网络都是单向的,并不能高效地学习用户序列行为信息。如下图中的(c)和(d)所示,它们对用户行为序列编码只能依赖序列的前置item,从而限制了模型的表示能力。第二个限制就是它们假设用户行为是一个严格有序的序列,但在实际应用中,这并不总是真的,用户历史行为中的顺序并不是严格有序的。
     为了解决以上两个问题,本文使用了双向序列模型建模用户序列行为。受到BERT模型的启发,本文运用深度双向自注意力模型建模序列推荐。本文的三个主要贡献是提出了使用双向自注意力网络和填充式任务建模用户行为序列。
在这里插入图片描述

本文模型

     问题申明U={ u1,u2,...,u∣U∣}U=\{u_1,u_2,...,u_{|U|}\}U={ u1,u2,...,uU}表示用户集,V={ v1,v2,...,v∣V∣}V=\{v_1,v_2,...,v_{|V|}\}V={ v1,v2,...,vV}表示items集,Su={ v1(u),...,vt(u),...,vnu(u)}S_u=\{v_1^{(u)},...,v_t^{(u)},...,v_{n_u}^{(u)}\}Su={ v1(u),...,vt(u),...,vnu(u)}表示用户的交互行为序列。建模:p(vnu+1(u)=v∣Su)p(v_{n_u+1}^{(u)}=v|S_u)p(vnu+

### BERT4REC 实现及其在推荐系统中的应用 #### 背景介绍 BERT4REC 是一种基于 Transformer序列化推荐算法,其核心思想来源于自然语言处理领域的双向编码器表示(Bidirectional Encoder Representations from Transformers)。该方法通过建模用户的交互历史来预测下一个可能的行为。它利用掩码语言模型(Masked Language Model, MLM)和因果语言模型(Causal Language Model, CLM),从而捕捉用户行为的上下文关系。 在推荐系统的背景下,BERT4REC 将用户的历史交互视为一系列 token 序列,并尝试通过对这些序列的学习来进行个性化推荐[^1]。 --- #### 技术实现要点 以下是 BERT4REC 在推荐系统中的主要实现步骤和技术细节: 1. **输入表示** 用户的历史交互被转化为一个由 item ID 组成的序列 \( S = \{i_1, i_2, ..., i_n\} \),其中每个 \( i_k \) 表示用户的一个交互项。为了适配 Transformer 结构,通常会将这些 item ID 映射到嵌入向量空间中[^3]。 2. **掩码机制** 掩码语言模型的核心在于随机遮蔽部分位置上的 items 并让模型去预测它们。具体来说,在训练过程中,某些 tokens 会被替换为特殊标记 `[MASK]` 或其他替代值。这种设计使得模型能够学习到更丰富的上下文依赖关系[^4]。 3. **Transformer 编码层** 使用多头注意力机制捕获全局范围内的关联模式。每一层都包含两个子模块:一个多头自注意网络以及一个前馈神经网络。经过若干堆叠后的隐藏状态可以用来生成最终的输出分布[^2]。 4. **目标函数** 对于给定的时间步 t 和对应的 ground truth label y_t ,交叉熵损失定义如下: ```python loss = -log(p(y_t | h_{t})) ``` 其中 p(\(y_t|h_t)\)) 表示根据当前时刻隐含表征计算得到的概率估计值。 5. **微调阶段** 预训练完成后进入下游任务特定调整期——即针对实际应用场景重新设置参数权重并优化性能指标的过程。例如,在电子商务网站上部署时可考虑加入商品类别特征作为额外辅助信息加以指导。 --- #### 示例代码片段 下面提供了一个简单的 PyTorch 版本实现概览: ```python import torch from transformers import BertTokenizer, BertForMaskedLM class BERT4RecModel(torch.nn.Module): def __init__(self, vocab_size, hidden_dim=768, num_layers=12, n_heads=12): super(BERT4RecModel, self).__init__() # 初始化 Tokenizer 及 Pre-trained model tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') bert_model = BertForMaskedLM.from_pretrained('bert-base-uncased') self.embedding_layer = bert_model.bert.embeddings.word_embeddings self.transformer_encoder = torch.nn.TransformerEncoder( encoder_layer=torch.nn.TransformerEncoderLayer(d_model=hidden_dim, nhead=n_heads), num_layers=num_layers ) def forward(self, input_ids, attention_mask=None): embeddings = self.embedding_layer(input_ids) output = self.transformer_encoder(embeddings, src_key_padding_mask=~attention_mask.bool()) return output # 假设我们有一个 batch size 为 2 的样本集 input_tensor = torch.tensor([[101, 7592, 102], [101, 2054, 102]]) # Example inputs with special tokens like '[CLS]' and '[SEP]' model = BERT4RecModel(vocab_size=30522) outputs = model(input_tensor) print(outputs.shape) # 输出形状应匹配预期大小 ``` 上述代码展示了如何构建基础框架并通过加载预训练好的 BERT 来初始化 embedding 层与 transformer 架构的一部分组件。 --- #### 讨论与展望 尽管 BERT4REC 已经取得了显著成果,但仍存在一些挑战亟待解决。比如长期记忆能力不足可能导致冷启动问题恶化;另外高昂算力需求也可能成为大规模工业级落地障碍之一。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值