Meta-KDD2025-RPG-token級別并行生成式提高效率!

文章目錄

  • 1. 背景
  • 2. 方法
    • 2.1 長語義id
      • 2.1.1 獲取 item embedding
      • 2.1.2 item embedding 離散化
    • 2.2 并行生成語義 id
      • 2.2.1 訓練(item串行,token并行)
      • 2.2.2 高效 logit 打分
        • 暴力枚舉式打分:
        • 高效實現:
        • 復雜度分析:
    • 2.3 圖約束推理 Top-k
  • 3. 實驗
    • 3.1 主試驗
    • 3.2 推理效率分析
    • 3.3 消融實驗
    • 3.4 語義id長度
    • 3.5 冷啟動
    • 3.6 推理參數 b/k/q
  • 4. 總結

來學一下 KDD2025 的一篇 Meta 的關于 生成式推薦的文章:RPG( Recommendation with Parallel semantic ID Generation)。

論文鏈接:https://arxiv.org/pdf/2506.05781

代碼鏈接:https://github.com/facebookresearch/RPG_KDD2025

1. 背景

生成式推薦大部分都是將每個 item 通過 codebook 拆分成多個 語義id(sid),這點就不說了。文中提到一個效率瓶頸,就是說這種自回歸的方式延遲高,比如一個 item 用 3 個 sid 表示,就需要經過 3 次 decoder,還需要 beam-search 等策略生成多個候選,每一步都要維護多個”備選拼法“,比如我們想要通過 beam-search 得到 top 512,就需要在通過 bos 生成 sid0 的時候保留 top 512,然后再第二步的時候,需要將這 512 個同時輸入 decoder,并將生成的 sid1 也保留 top 512,在這 262144 的概率組合中,選擇 top512,再繼續將這 512 個 sid0-sid1組合 輸入到 decoder 第三步得到 sid2 的 top 512,然后再從 262144 個概率組合中,選擇 top 512 的 sid0-sid1-sid2,得到 top 512的結果。這樣需要跑大量的推理,耗時算力都比較大。

上面的方法還是說 用 3 個語義id 去表示一個 item 的情況,但是 token 太少,表達力不夠,現實中一個 item 可能屬性、內容很豐富,只用 3 個 token來描述肯定難以把 item 豐富的語義細致地編碼出來,也就是說:token 越少,模型能表達的內容越有限;token越多,推理資源越扛不住。當然上面這種 3 個語義id 的方法 肯定需要 RQ 的,不然其實 3 個 token 表達的信息真的太少了,用了 RQ 其實應該還好。RQ 的話每層 codebook 就是有遞進關系的了。

本文對比這篇 VQ-Rec 這篇文章是采用 Product Quantization(PQ)的方式,這種方式就是將一個 item embedding 比如 1024 維度,如果要分成 8 個 token,就是切成 8 份,每份 128 維,每份就是一個獨立的子空間,每份子空間都配一個獨立的 codebook,每個 codebook 大小就取決于需求了,假設是 8192 個吧,訓練 codebook 采用 K-means 聚類,對每個子空間,用 K-means 聚類算法,聚出 8192 個中心點 表示 8192 個語義id。對于一個 item,我們可以將其切分,然后用其 每個 128 維 embedding 去各個 codebook 中找對應的 sid,拼成 8 個 sid,這 8 個 sid 就可以看做是這個 item 的語義id。實際推薦或下游任務,如果需要變回向量,直接把 8 個 sid 對應的 8 個中心向量查出來,拼接成最終的 item embedding。

對于并行生成 RPG 來說有兩個挑戰:

  1. 解碼空間稀疏:所有 token 并行生成后,每個 token 之間沒有順序以來,互不影響,”合法“的 sid 組合在巨大的組合空間中其實極其稀少,比如 8 個 sid 每個 codebook 有 8192 個 token 就 81928 大約 1030 個組合,現實實際中,item 最多 也是 億級 10 9 ,所以就會有大量 sid 組合 在實際商品池力根本不存在。
  2. 高效無序解碼:推薦系統要為每個用戶生成 top-k ,如果把所有可能得 token 組合都枚舉出來就失去了 并行生成的效率優勢。傳統 beam-search 方法, token是有順序的,可以依次生成,但是 RPG 方法里,token 是無序并行生成的,不需要按照固定順序生成,所以不能用傳統的有序解碼策略。怎樣才能在不遍歷所有 token 組合的情況下,快速精準的找到真實存在的得分最高的 item id?

2. 方法

在這里插入圖片描述

2.1 長語義id

2.1.1 獲取 item embedding

本文采用兩種將 text --> embedding 的 embedding模型 sentence-t5-base 以及 更強大的 openAI 的 text-emb-3-large,實驗如下:

在這里插入圖片描述

作者結論:對于 基于 OPQ 的 RPG 來說,換用更好的 embedding 模型,效果提升;但是對于 基于 RQ 的 TIGER 來說,效果差異不大。

2.1.2 item embedding 離散化

主流離散化方式有兩種:RQ、PQ。

本文選擇 PQ/OPQ,因為 PQ 并行預測友好,生成的 token 可以同時獨立預測,不像 RQ 那樣每一步都依賴前面的 token;表達均衡且可擴展:RQ 生成的 token 序列會出現 ”某些 token 很重要,某些 token 沒啥用“的現象(信息分布不均),還容易隨著 token 變多而失控(可擴展性差)。而 PQ/OPQ 各個 token 攜帶的信息比較均衡、規模也好擴展。

2.2 并行生成語義 id

2.2.1 訓練(item串行,token并行)

訓練目標是讓模型能一次性并行預測所有 token,而不是像傳統自回歸那樣一步步生成。

假設用戶歷史行為序列編碼成向量 s s s,預測目標 item 的 sid ( c t , 1 , … , c t , m ) (c_{t,1}, \dots, c_{t,m}) (ct,1?,,ct,m?)

訓練,最大化整個語義ID各個位的概率乘積(即并行多位分類):
L = ? ∑ j = 1 m log ? P ( j ) ( c t , j ∣ s ) \mathcal{L} = -\sum_{j=1}^{m} \log \mathbb{P}^{(j)}(c_{t,j} | s) L=?j=1m?logP(j)(ct,j?s)

其中,第 j j j 位token的概率 P ( j ) ( c t , j ∣ s ) \mathbb{P}^{(j)}(c_{t,j} | s) P(j)(ct,j?s) 通過下式計算:

P ( j ) ( c t , j ∣ s ) = exp ? ( e c t , j ? ? g j ( s ) / τ ) ∑ c ∈ C ( j ) exp ? ( e c ? ? g j ( s ) / τ ) \mathbb{P}^{(j)}(c_{t,j}|s) = \frac{\exp(\mathbf{e}_{c_{t,j}}^\top \cdot \mathbf{g}_j(s)/\tau)}{\sum_{c \in C^{(j)}} \exp(\mathbf{e}_c^\top \cdot \mathbf{g}_j(s)/\tau)} P(j)(ct,j?s)=cC(j)?exp(ec???gj?(s)/τ)exp(ect,j????gj?(s)/τ)?

  • g j ( s ) \mathbf{g}_j(s) gj?(s)是將序列表示 s s s 投影到第 j j j 個 codebook 空間的映射, τ \tau τ 是溫度超參數。

2.2.2 高效 logit 打分

在模型訓練好后,推理階段的目標是:給定用戶歷史行為(編碼為 s s s),計算每個候選商品的 sid組合 的匹配分數,挑出 Top-K 推薦

暴力枚舉式打分:
  • 理論上:每個 item i 有自己的 sid ( c i , 1 , … , c i , m ) (c_{i,1},…,c_{i,m}) (ci,1?,,ci,m?)
  • 按照訓練時的loss公式,可以為每個 item i 打分: score i = ∑ j = 1 m log ? p c i , j ( j ) \text{score}i = \sum{j=1}^{m} \log p_{c_{i,j}}^{(j)} scorei=j=1mlogpci,j?(j)?
  • 這里的 p c i , j ( j ) p_{c_{i,j}}^{(j)} pci,j?(j)? ,就是用戶序列 s s s 在第 j j j 位 token 上,預測它是 c i , j c_{i,j} ci,j? 的概率。
高效實現:

對于每一層 codebook(總共 m m m 層),先將用戶行為序列 s s s 經過投影( g j ( s ) \mathbf{g}_j(s) gj?(s))和溫度縮放( τ \tau τ),與所有 codebook 的 embedding 計算點積(可以理解為分類 logit),再 softmax,得到該層所有 token 的概率分布 p ( j ) p^{(j)} p(j)
p ( j ) = softmax ( E j ? g j ( s ) τ ) ∈ R M p^{(j)} = \text{softmax}\left( \frac{E_j \cdot \mathbf{g}_j(s)}{\tau} \right) \in \mathbb{R}^{M} p(j)=softmax(τEj??gj?(s)?)RM

  • E j E_j Ej? 是第 j j j 層 codebook 的 embedding 表, M M M 是每層 codebook 的 token 數量(比如256)。
  • 這一步只算 m m m 層,每層 M M M 個logit,和商品數量無關

對于任意一個商品 i i i,它的 sid組合 是 ( c i , 1 , … , c i , m ) (c_{i,1}, …, c_{i,m}) (ci,1?,,ci,m?),直接取出每層對應 token 的概率 p c i , j ( j ) p_{c_{i,j}}^{(j)} pci,j?(j)?,取對數相加:
score i = ∑ j = 1 m log ? p c i , j ( j ) \text{score}_i = \sum_{j=1}^{m} \log p_{c_{i,j}}^{(j)} scorei?=j=1m?logpci,j?(j)?
只需查表+加法,就能算出每個商品的得分,最后選 Top-k 即可。

復雜度分析:
  • 傳統方式復雜度: O ( N m d ) O(Nmd) O(Nmd) (遍歷所有商品,每個商品 m 位 codebook,每位與用戶表示做一次點積)
  • 優化后復雜度: O ( M n d + N m ) O(Mnd + Nm) O(Mnd+Nm) (M 遠小于 N)前面是 每位 codebook 和用戶序列 算一次點積,后面是查表累加。

2.3 圖約束推理 Top-k

理論上,上面推理就可以了,遍歷所有 item,把每個 item id 的所有 token logit 分數相加,得到總分,選分數最高的 Top-k。

但是

  1. 實際 item 數量巨大,這樣遍歷太慢。
  2. 直接全遍歷可能選出的 Top-k 商品 token 組合,有些組合其實在真實語義空間里不合法。因為每一位都是獨立最大化,可能拼成不存在的 item id。

故提出 圖約束推理:

在這里插入圖片描述

核心思想:只允許在真實出現過的 item 之間做 Top-k 搜索,避免出現非法組合。

每個節點就是一個 item (sid 組合),邊用 ”語義相似性“ (兩個 item 如何 sid 組合接近 他們就相似)連起來:

  • 兩個節點 A = ( c 1 , 1 , … , c 1 , m ) A=(c_{1,1},…,c_{1,m}) A=(c1,1?,,c1,m?) B = ( c 2 , 1 , … , c 2 , m ) B=(c_{2,1},…,c_{2,m}) B=(c2,1?,,c2,m?)
  • 相似度 S ( A , B ) = ∑ j = 1 m e j , c 1 , j T e j , c 2 , j S(A, B) = \sum_{j=1}^m \mathbf{e}_{j,c_{1,j}}^T \mathbf{e}_{j,c_{2,j}} S(A,B)=j=1m?ej,c1,j?T?ej,c2,j??

對每個節點,只保留相似度最高的 k 個鄰居,構成稀疏圖。

圖推理流程

  1. 隨機采樣一批節點作為候選集,比如上圖中,隨機采樣 b 個節點,圖中 2 個(實驗中 10 個)
  2. 擴展候選集:對當前每個節點,找它在圖中的 k 個鄰居,圖中 2 個(實驗中 50-100-500 個)
  3. 打分:對候選集中每個節點,計算其 sid 分數(每一位 token 的 logit 相加)
  4. 保留得分最高的 b 個,作為新一輪候選
  5. 迭代 q 次(實驗中 2-3-5 次)
  6. 最終保留 b 個節點

3. 實驗

3.1 主試驗

在這里插入圖片描述

3.2 推理效率分析

在這里插入圖片描述

原因

  • 高效的 token 級并行機制
  • 圖約束的稀疏檢索機制

對比 TIGER

  • 推理速度慢:每一步都要 forward 一次模型,token 越多,推理越慢,復雜度隨商品的 token 數量 和 beam-search 步數線性增加。
  • infer 內存消耗大:beam-search 過程中要維護多個候選路徑。

3.3 消融實驗

在這里插入圖片描述

3.4 語義id長度

在這里插入圖片描述

小數據集支撐不了太多層 codebook,大數據集適合更多層 codebook

3.5 冷啟動

在這里插入圖片描述

3.6 推理參數 b/k/q

在這里插入圖片描述

4. 總結

很有意思的工作!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速搭建MySQL8.0本地數據庫,連接idea

1.打開終端,按順序輸入命令,在root用戶下,創建用戶和數據庫 1.進入數據庫 mysql -u root -p 2.創建專用數據庫 create database 數據庫名 character set utf8mb4 3.使用數據庫 use 數據庫名 4.設置此數據庫用戶 create user "用戶名&q…

Docker 常用運維命令

Docker 提供了一系列命令來幫助開發者和運維人員管理容器、鏡像以及其他 Docker 對象。以下是一些常用的 Docker 運維命令&#xff0c;這些命令可以幫助你更高效地進行日常操作&#xff1a; 容器相關命令 啟動容器&#xff1a; docker start <container_id_or_name>停止…

linux下MQTT訂閱發布驗證-mosquitto安裝測試流程

本文詳細介紹了&#xff0c;如何在linux環境搭建一個MQTT server, 并同時安裝 了客戶端 &#xff0c;進行了mqtt消息發布、訂閱驗證。 mosquitto 服務端安裝(ubuntu) #添加源 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppasudo apt update # install mosquitto su…

Source Insight 的簡單介紹

對 Source Insight 進行一次全面深入的介紹。這款軟件在特定開發者群體中&#xff08;尤其是嵌入式、驅動、系統級編程領域&#xff09;享有極高的聲譽&#xff0c;被譽為“源碼閱讀和分析的神器”。 一、 起源與歷史 誕生背景 (1990年代中后期)&#xff1a; 在1990年代中后期…

Linux 系統中,查詢 JDK 的安裝目錄

在 Linux 系統中&#xff0c;查詢 JDK 的安裝目錄可以通過以下幾種常用方法&#xff1a; 方法 1&#xff1a;通過 update-alternatives 查詢&#xff08;推薦&#xff09; 適用于通過包管理器&#xff08;如 apt/yum&#xff09;安裝的 JDK&#xff1a; sudo update-alternat…

簡單工廠、工廠、抽象工廠模式

簡單工廠、工廠、抽象工廠模式 1. **簡單工廠模式&#xff08;Simple Factory&#xff09;**2. **工廠方法模式&#xff08;Factory Method&#xff09;**3. **抽象工廠模式&#xff08;Abstract Factory&#xff09;**對比總結 以下是三種工廠模式在C#中的實現與對比分析&…

如何在Redis中實現緩存功能

Redis 是一種高性能的鍵值存儲系統&#xff0c;廣泛用于實現緩存功能。它通過將數據存儲在內存中&#xff0c;能夠快速讀寫數據&#xff0c;從而顯著提高應用程序的性能。在Redis中實現緩存功能需要結合數據讀寫策略、失效機制及性能優化方案。 一、Redis作為緩存的核心優勢 …

Kafka消費者客戶端源碼深度解析:從架構到核心流程

在Kafka生態系統中&#xff0c;消費者客戶端作為數據消費的入口&#xff0c;其設計與實現直接影響數據處理的效率和可靠性。本文將深入Kafka消費者客戶端源碼&#xff0c;通過核心組件解析、流程拆解與源碼分析&#xff0c;揭示其高性能消費背后的技術奧秘&#xff0c;并輔以架…

從0開始學習R語言--Day26--因果推斷

很多時候我們在探討數據的相關性問題時&#xff0c;很容易會忽略到底是數據本身的特點還是真的是因為特征的區分導致的不同&#xff0c;從而誤以為是特征起的效果比較大。 這就好比測試一款新藥是否真的能治病&#xff0c;假如吃藥的患者康復的更快&#xff0c;那到底是因為藥…

Python 中布爾值的使用:掌握邏輯判斷的核心

在 Python 中&#xff0c;布爾值&#xff08;bool&#xff09;是進行邏輯判斷的基礎。布爾值只有兩個可能的值&#xff1a;True 和 False。通過布爾值&#xff0c;你可以實現條件判斷、循環控制以及其他邏輯操作。今天&#xff0c;就讓我們一起深入探討如何在 Python 中使用布爾…

IDEA 中 Tomcat 部署 Java Web 項目(Maven 多模塊 非 Maven 通用版)(linux+windows)

引言 Java Web 開發中&#xff0c;Tomcat 是最常用的 Servlet 容器&#xff0c;而項目類型通常分為 Maven 管理&#xff08;依賴自動處理、多模塊聚合&#xff09; 和 非 Maven 純手工管理&#xff08;手動引入 jar 包、配置項目結構&#xff09;。本文覆蓋 兩種項目類型 的 T…

使用 React Native Web 實現三端統一開發

使用 React Native Web 實現三端統一開發 關鍵點 React Native Web 簡介&#xff1a;React Native Web 是一個允許開發者使用 React Native 組件和 API 構建 Web 應用的庫&#xff0c;支持在 iOS、Android 和 Web 上使用同一套代碼。架構&#xff1a;通過 React DOM 渲染 Rea…

分享一個git上基于std::array實現的循環隊列(Cycle Queue)模板類庫

為充分利用向量空間,克服“假溢出”現象的方法是:將向量空間想象為一個首尾相接的圓環,并稱這種向量為循環向量。存儲在其中的隊列稱為循環隊列(Circular Queue)。循環隊列是把順序隊列首尾相連,把存儲隊列元素的表從邏輯上看成一個環,成為循環隊列。 網上有很多關于循…

三維視頻融合平臺:如何構建動態感知的數字空間

分享大綱&#xff1a; 你的三維平臺為何不能承載動態視頻捷碼打造三維視頻融合平臺的三步法則為何選擇捷碼 在智慧城市建設過程中&#xff0c;將實時視頻與三維空間結合&#xff0c;已經成為一種主流趨勢。傳統視頻監控模式&#xff0c;經常面臨視頻分散、操作復雜等問題。然而…

【AI Study】第五天,Matplotlib(5)- 顏色映射

文章概要 本文詳細介紹 Matplotlib 的顏色映射功能&#xff0c;包括&#xff1a; 顏色映射類型顏色映射設置數據標準化顏色條 顏色映射類型 pcolormesh import matplotlib.pyplot as plt import numpy as np# 創建網格數據 x np.linspace(-3, 3, 100) y np.linspace(-3,…

DB2中合理使用INCLUDE關鍵字創建索引

DB2中合理使用 INCLUDE 關鍵字創建索引 1. 為何還需要 INCLUDE&#xff1f;——從索引的兩大痛點說起 查詢想“只讀索引不回表”&#xff0c;卻又不想把列都做鍵 → 聯合索引空間膨脹&#xff0c;更新放大。唯一索引定位快&#xff0c;但只能返回鍵列數據 → 仍需 I/O 跳回數據…

基于Spring Boot的民宿管理系統設計與實現

目錄 一.&#x1f981;前言二.&#x1f981;開源代碼與組件使用情況說明三.&#x1f981;核心功能1. ?算法設計2. ?Spring Boot框架3. ?Vue.js框架4. ?部署項目 四.&#x1f981;演示效果1. 管理員模塊1.1 瀏覽后臺首頁1.2 預訂信息管理1.3 入住信息管理1.4 退房信息管理1.…

大數據系統架構實踐(一):Zookeeper集群部署

大數據系統架構實踐&#xff08;一&#xff09;&#xff1a;Zookeeper集群部署 文章目錄 大數據系統架構實踐&#xff08;一&#xff09;&#xff1a;Zookeeper集群部署一、Zookeeper簡介二、部署前準備三、部署Zookeeper集群1. 下載并解壓安裝包2. 配置zoo.cfg3. 設置日志目錄…

《道德經》:探尋古老智慧中的哲學之光

我強烈推薦4本可以改變命運的經典著作&#xff1a; 《壽康寶鑒》在線閱讀白話文《欲海回狂》在線閱讀白話文《陰律無情》在線閱讀白話文《了凡四訓》在線閱讀白話文 《道德經》作為道家經典&#xff0c;短短五千言&#xff0c;卻字字珠璣&#xff0c;蘊含著超越時空的哲學智慧。…

科技賦能民生:中建海龍為民生改善注入新動力

在社會發展的進程中&#xff0c;民生改善始終占據著核心地位。住房、基礎設施建設等民生領域的進步&#xff0c;直接關系到民眾的生活質量與幸福感。中建海龍科技有限公司&#xff08;以下簡稱“中建海龍”&#xff09;作為建筑行業的創新引領者&#xff0c;憑借其強大的科技實…