文章目錄
- 1. 背景與問題
- 2. 方法
- 2.1 多視圖 sid
- 2.2 Code-Guided Semantic Fusion
- 核心創新:
- 常規操作:
- 2.3 Enhanced Representation Learning via Code Masking
- 2.3.1 Masked Code Modeling (MCM)
- 2.3.2 Masked Sequence Alignment (MSA)
- 2.4 復雜度分析
- 2.4.1 訓練階段(Training)
- SFM部分
- SR部分
- 總體訓練復雜度
- 2.4.2 部署階段(Deployment)
- 3. 實驗
- 3.1 主實驗
- 3.2 消融實驗
- 3.3 codebook 層數
- 3.4 不同 sid
- 3.5 加 item id
- 4. 總結
這里記錄一下人民大學高瓴學院-KDD2025的一篇關于語義與協同對齊的文章:《Bridging Textual-Collaborative Gap through Semantic Codes for Sequential Recommendation》
論文鏈接:https://arxiv.org/abs/2503.12183
代碼鏈接:https://github.com/RUCAIBox/CCFRec?tab=readme-ov-file
1. 背景與問題
序列推薦任務下,主流做法都是側重于 ID 協同過濾(只看用戶和商品的 ID,忽略內容),可以很好的捕捉用戶和商品間的互動關系,但現代平臺的商品文本內容(標題、品牌、描述)極為豐富,這些信息能更精準刻畫商品本身,也有助于解決冷啟動問題。
近年來有一些方法把文本信息和 ID 信息拼接或加權,但常常導致兩種信息融合不自然,要么太依賴文本,忽略協同關系,要么文本利用不足,丟失語義信息。
本文關注如何在序列推薦任務中,通過更智能的語義融合機制,把商品文本信息和用戶行為序列的信息深度結合起來,讓推薦系統既懂“內容”又懂“行為”。
本文提出 CCFRec 通過 sid(semantic id)作為橋梁,sid 有兩個重要特征:
- 可以理解為特殊 id,每個 id 有自己的可學習 embedding,可以像傳統 id 那樣建模協同語義。
- 每個 item 可以有多組 sid(每個 item 多個特征如:標題、品牌、類別,每個特征一組 sid,代碼中搞了 5 套),能反應不同層次的內容語義,讓相似內容的 item 自動貼近(同 RPG 文章中提到的,如果有幾位相同的 sid 這兩個 item 就比較相似)。
本兩個創新目標:
- 用 sid 指導模型,靈活地從文本信息中抽取對推薦有用的部分,不會死板地全部用文本。
- 讓商品的最終表示既有內容信息,又有協同信息,讓推薦系統更精確。
2. 方法
2.1 多視圖 sid
這里思想特別簡單(有點大力出奇跡的意思),就是將每個 item 的多種屬性,論文代碼中是 5 種(title,brand,features,categories,description),經過 embedding model 得到對應的 embedding,然后搞多套 sid。
對比之前的方法都是將每個 item 的所有屬性拼成一句話經過 embedding model,這樣更細致了。最后將每個屬性的 sid 拼在一起,組層一個大 sid 表。(每個屬性 20 層 pq/rq 的 codebook,拼在一起 100 層)
每個商品有多個文本屬性(如title、brand、features、categories、description):
-
Step 1:文本編碼
用預訓練模型分別將每個屬性編碼為文本embedding向量:
zit=PLM(ai),i∈{1,...,m}z_i^t = \text{PLM}(a_i), i \in \{1,...,m\} zit?=PLM(ai?),i∈{1,...,m} -
Step 2:向量量化成sid
對每個屬性的文本embedding,用向量量化技術(PQ或RQ)轉為多層語義碼sid:
zit→(c1i,...,cki)z_i^t \rightarrow (c_1^i,...,c_k^i) zit?→(c1i?,...,cki?)
比如用了5個屬性,每個屬性20個sid,則每個商品就有5×20=100個sid。
2.2 Code-Guided Semantic Fusion
核心創新:
這是其實比較新穎的一個點就是將經過 embedding model 得到的 embedding 作為 K/V 去增強 embedding 質量。
這個模塊是本文最核心的創新:
輸入兩類embedding:
- 屬性embedding Zt=[z1t,...,zmt]Z^t=[z_1^t,...,z_m^t]Zt=[z1t?,...,zmt?](內容信息)
- 語義碼embedding Zc=[z1c,...,zncc]Z^c=[z_1^c,...,z_{n_c}^c]Zc=[z1c?,...,znc?c?](協同信息)
這個模塊由多層Transformer-like結構組成,每層包括:
-
Self-Attention層:
語義碼之間相互融合:
H~l=MHA(Hl?1,Hl?1,Hl?1)\tilde{H}^l = \text{MHA}(H^{l-1},H^{l-1},H^{l-1}) H~l=MHA(Hl?1,Hl?1,Hl?1) -
Cross-Attention層:
以語義碼embedding 為 query,以文本屬性 embedding 為 key 和 value,主動抽取有用的文本信息:
Hl=FFN(MHA(H~l,Zt,Zt))H^l = \text{FFN}\left(\text{MHA}\left(\tilde{H}^l,Z^t,Z^t\right)\right) Hl=FFN(MHA(H~l,Zt,Zt)) -
最終得到商品融合表示:
-
先池化獲得整體表示:e=Pool(H)e=\text{Pool}(H)e=Pool(H)
-
再加一個殘差連接保留原始sid信息:
e~=e+Pool(Zc)\tilde{e}=e+\text{Pool}(Z^c) e~=e+Pool(Zc)
-
通過上述模塊,每個商品得到了高質量的語義融合向量 e~\tilde{e}e~。
常規操作:
-
將用戶歷史序列商品的融合embedding拼成序列,加位置編碼,輸入Transformer網絡:
h^i0=e~i+pi\hat{h}_i^0=\tilde{e}_i+p_i h^i0?=e~i?+pi? -
Transformer多層建模序列行為關系,得到最后一層隱藏狀態:
H^l=FFN(MHA(H^l?1,H^l?1,H^l?1))\hat{H}^l=\text{FFN}\left(\text{MHA}\left(\hat{H}^{l-1},\hat{H}^{l-1},\hat{H}^{l-1}\right)\right) H^l=FFN(MHA(H^l?1,H^l?1,H^l?1)) -
最后一個位置的隱藏向量表示用戶當前興趣:
r=H^L[?1]r=\hat{H}^L[-1] r=H^L[?1]
損失:
用戶表示 rrr 與下一個點擊商品embedding e~n+1\tilde{e}_{n+1}e~n+1? 相似度最大,負樣本相似度最小。 用Cross-Entropy損失:
LCE=?log?exp?(g(r,e~n+1)/τ)∑j∈Bexp?(g(r,e~j)/τ)\mathcal{L}_{CE}=-\log\frac{\exp\left(g(r,\tilde{e}_{n+1})/\tau\right)}{\sum_{j\in\mathcal{B}}\exp\left(g(r,\tilde{e}_j)/\tau\right)} LCE?=?log∑j∈B?exp(g(r,e~j?)/τ)exp(g(r,e~n+1?)/τ)?
- 其中,B\mathcal{B}B是正負樣本集合,τ\tauτ是溫度系數,ggg是余弦相似度。
2.3 Enhanced Representation Learning via Code Masking
作者提出通過額外的兩個訓練任務(基于掩碼策略)增強模型的表示學習能力,分別是:
- Masked Code Modeling (MCM, 掩碼語義碼建模)
- Masked Sequence Alignment (MSA, 掩碼序列對齊)
2.3.1 Masked Code Modeling (MCM)
- 核心思想:
受自然語言處理中 BERT 模型的啟發(通過掩碼語言建模MLM學習文本表示),這里對語義碼序列進行隨機掩碼,訓練模型去恢復被掩蓋的語義碼,以促進語義碼和文本信息更好地融合。
- 具體做法:
-
每個商品擁有一個語義碼序列:
sc=(c1,c2,...,cnc)s^c = (c_1, c_2, ..., c_{n_c}) sc=(c1?,c2?,...,cnc??) -
隨機將一定比例 ρ\rhoρ 的語義碼掩蓋 (如 [MASK][MASK][MASK] ),得到掩蓋后的序列:
s^c=(c1,...,[MASK],...,cnc)\hat{s}^c = (c_1, ..., [MASK], ..., c_{n_c}) s^c=(c1?,...,[MASK],...,cnc??) -
語義融合模塊(SFM)接收到這個掩蓋序列,要利用文本embedding和未掩蓋的碼,推測出被掩蓋的碼。
- 損失函數:
預測的目標是讓模型給掩蓋位置預測正確的語義碼:
LMCM=1∣Mc∣∑x∈Mc?log?exp?(g(h^x,zxc)/τ)∑j∈Cexp?(g(h^x,zjc)/τ)\mathcal{L}_{\text{MCM}} = \frac{1}{|\mathcal{M}^c|}\sum_{x\in\mathcal{M}^c}-\log\frac{\exp(g(\hat{h}_x,z_x^c)/\tau)}{\sum_{j\in C}\exp(g(\hat{h}_x,z_j^c)/\tau)} LMCM?=∣Mc∣1?x∈Mc∑??log∑j∈C?exp(g(h^x?,zjc?)/τ)exp(g(h^x?,zxc?)/τ)?
- 其中:
- Mc\mathcal{M}^cMc 為掩蓋位置的集合。
- g(h^x,zxc)g(\hat{h}_x,z_x^c)g(h^x?,zxc?) 為預測表示(通過融合模塊輸出的隱藏向量h^x\hat{h}_xh^x?)和真實碼embedding zxcz_x^czxc? 的余弦相似度。
- 分母上的集合 CCC 表示所有語義碼集合,作為分類的類別。
- τ\tauτ 是溫度系數,用于softmax平滑。
- 作用與優勢:
- 增強語義碼之間的關聯性。
- 提高文本embedding與語義碼之間的對齊能力。
2.3.2 Masked Sequence Alignment (MSA)
- 核心思想:
這個任務用來增強推薦主干網絡的序列建模能力,通過掩蓋部分語義碼產生數據增強(data augmentation),再進行對比學習(Contrastive Learning),提升模型對于序列建模的穩健性。
- 具體做法:
- 同樣對輸入商品序列的語義碼隨機掩蓋部分碼,獲得掩蓋后的序列。
- 掩蓋序列經過語義融合模塊(SFM)得到增強版的商品表示(augmented item representation)。
- 將增強版的序列與原始序列分別輸入到推薦主干網絡,得到兩種用戶序列表示:
- 原始表示 rrr(未掩蓋序列)
- 增強表示 r^\hat{r}r^(掩蓋序列)
- 希望相同序列的原始和增強版表示更相似,不同序列的表示更不同。
- 損失函數(公式7、8):
采用 InfoNCE 對比損失:
LMSA=12(InfoNCE(r^,r,Br)+InfoNCE(r,r^,Br^))\mathcal{L}_{\text{MSA}} = \frac{1}{2}\bigl(\text{InfoNCE}(\hat{r}, r, \mathcal{B}_r) + \text{InfoNCE}(r, \hat{r}, \mathcal{B}_{\hat{r}})\bigr) LMSA?=21?(InfoNCE(r^,r,Br?)+InfoNCE(r,r^,Br^?))
其中 InfoNCE定義為:
InfoNCE(x,y+,Ry)=?log?exp?(g(x,y+)/τ)∑y∈Ryexp?(g(x,y)/τ)\text{InfoNCE}(x, y^+, \mathcal{R}_y) = -\log\frac{\exp(g(x,y^+)/\tau)}{\sum_{y\in\mathcal{R}_y}\exp(g(x,y)/\tau)} InfoNCE(x,y+,Ry?)=?log∑y∈Ry??exp(g(x,y)/τ)exp(g(x,y+)/τ)?
- (x,y+)(x,y^+)(x,y+) 表示一對正樣本(即來自同一用戶序列的原始表示與增強表示)。
- 集合 Ry\mathcal{R}_yRy? 包含了正樣本和批次內其他序列(負樣本)的表示。
- 目的是拉近同序列表示(正樣本),拉開不同序列表示(負樣本)。
- 作用與優勢:
- 增加訓練數據多樣性,有效提升模型對用戶序列的泛化能力和穩健性。
最后,綜合起來三個優化目標(推薦預測損失、掩碼語義碼損失、掩碼序列對齊損失),整體訓練目標為:
L=LCE+αLMCM+βLMSA\mathcal{L} = \mathcal{L}_{CE} + \alpha\mathcal{L}_{MCM} + \beta\mathcal{L}_{MSA} L=LCE?+αLMCM?+βLMSA?
- LCE\mathcal{L}_{CE}LCE?:推薦任務損失(預測下一個商品)。
- LMCM\mathcal{L}_{MCM}LMCM?:掩碼語義碼建模損失,優化SFM語義融合效果。
- LMSA\mathcal{L}_{MSA}LMSA?:掩碼序列對齊損失,優化序列建模的穩健性。
- α,β\alpha,\betaα,β 為超參數,調節不同任務的比重。
2.4 復雜度分析
2.4.1 訓練階段(Training)
CCFRec有兩個關鍵模塊:
- 語義融合模塊(SFM, Semantic-Fusion Module)
- 序列推薦主干(SR, Sequential Recommendation backbone),比如SASRec那樣的Transformer結構。
SFM部分
- 在SFM中,主要有三種操作:自注意力層(Self-Attention)、跨融合層(Cross-Fusion)、前饋網絡(Feed-Forward)。
- 對于單個item,計算復雜度分別是:
- 自注意力層:O(M2d)
- 跨融合層:O(MKd)
- 前饋網絡:O(Md2)
- 其中:
- d 是模型的表示維度(embedding維度)
- M 是語義code序列的長度
- K 是屬性序列的長度
- **綜合起來,得到一個item的SFM輸出的總體復雜度:**O(M2d + MKd + Md2)
SR部分
- 主干SR一般用的是SASRec那種Transformer結構,主要消耗在自注意力層和前饋層。
- 假設用戶行為序列長度為N,則總復雜度為:O(N2d + Nd2)
總體訓練復雜度
- 將SFM和SR加在一起,并考慮 batch(多個item同時訓練),總訓練復雜度為:O(N2d + Nd2 + NM2d + NMKd + NMd2)
- 這里N是用戶序列的長度,M和K是item屬性和code數量,d是embedding維度。
- 重點:實際應用中,M 和 K 遠小于 N(通常N>50,M、K一般不超過20),所以額外的開銷是可以接受的。
(代碼中我看到 M=100,K=20,額。。。不過工業界數據上確實也是 K 會更大)
2.4.2 部署階段(Deployment)
- 部署時,為了提高效率,SFM模塊可以被去掉,因為訓練好的語義融合表示(item embedding)是固定的。
- 我們可以提前離線計算每個item的最終embedding(用SFM提前處理好,存下來),只用主干SR進行推理。
- 這樣,線上推理時的復雜度與SASRec等主流序列推薦模型完全一樣,都是 O(N2d + Nd2)
- 也就是說,部署階段CCFRec的推理速度不會比常見的序列推薦模型慢。
這里倒是沒問題。
3. 實驗
3.1 主實驗
3.2 消融實驗
感覺這些消融有點沒到點上,看不出來那些是本文最重要的組件。也沒有整個去掉(1)(2)的,都是去掉很小的東西,然后微降效果
3.3 codebook 層數
層數增加效果提升,這里還是有點 scaling-law 的意義:
3.4 不同 sid
這里得到比較有趣的現象:
Random code是無用但無害:模型會“忽略”它,不依賴它。
SASRec code是冗余且有害:模型會“重復利用”協同信息,導致空間浪費,降低性能。
3.5 加 item id
論文采取了一種 參數高效(parameter-efficient) 的方式,簡單來說就是在保持原有文本-語義表示的基礎上,再加上一份獨立的 item ID embedding,并且只訓練這部分參數,步驟如下:
- 先用原始的 CCFRec 進行預訓練,學習出每個物品的語義融合表示(只用文本+code)。
- 引入 item ID embedding lookup table:對每個物品,分配一個隨機初始化的可訓練 embedding(通常與語義表征等長,比如128維)。
- 凍結原有 CCFRec 所有參數,只訓練 ID embedding,即其他部分參數都不動,只讓 ID embedding 隨訓練迭代更新。
- 最終物品表示為:
最終表示 = 語義融合表示 + ID embedding
- 兩者直接相加后,作為輸入傳遞給序列推薦器(如 Transformer/SASRec 等)。
- 繼續用推薦損失(如交叉熵)finetune,直到收斂。
原本 CCFRec 只用文本和對應的 semantic code(語義碼)來表達物品,不用傳統的 item ID embedding。這樣做的好處是更關注于文本的內容表達,便于泛化和冷啟動,但有個明顯的短板:無法表達“物品之間純 collaborative(協同過濾)信息”,即沒法捕捉到只有 ID 層面才有的微小區分。
4. 總結
主要是對 item embedding 與 text embedding 融合的工作,感覺設計的十分復雜(復現的時候訓練相比于其他模型時間多太多),實驗整體感覺差點意思,消融做的沒看出哪些最關鍵組件,不過對于部署階段的復雜度分析倒是感覺算是合理,相當于增加了訓練階段的算力以及存儲,換準確度?