【王樹森推薦系統】召回05:矩陣補充、最近鄰查找

概述

  • 這節課和后面幾節課將詳細講述向量召回,矩陣補充是向量召回最簡單的一種方法,不過現在已經不太常用這種方法了
  • 本節課的矩陣補充是為了幫助理解下節課的雙塔模型
  • 上節課介紹了embedding,它可以把用戶ID和物品ID映射成向量

矩陣補充

模型結構

  • 下面的模型圖是基于embedding做推薦
    在這里插入圖片描述
  • 模型的輸入是一個用戶ID和一個物品ID,模型的輸出是一個實數,是用戶對物品興趣的預估值,這個數越大,表示用戶對物品越感興趣
  • 左邊的結構只有一個embedding層,把一個用戶ID映射成向量,記作向量 a,這個向量是對用戶的表征
  • 回憶一下上節課的內容:embedding 的參數是一個矩陣,矩陣中列的數量是用戶數量,每一列都是圖中 a 那么大的向量,embedding 層的參數數量等于用戶數量 × 向量 a 的大小

在這里插入圖片描述

  • 右邊的結構是另一個 embedding 層,把一個物品ID映射到向量,記作 b,大小和向量設置成一樣的,向量 b 是對物品的表征。embedding 層的參數是一個矩陣,輸出的向量 b 是矩陣的一列,矩陣中列的數量是物品的數量
    在這里插入圖片描述
  • 模型一共用了兩個 embedding 層,它們不共享參數
    在這里插入圖片描述
  • 對向量 a 和向量 b 求內積得到一個實數作為模型的輸出,這個模型就是矩陣補充模型
    在這里插入圖片描述

訓練

基本想法

  • 用戶 embedding 參數矩陣記作 A A A。第 u u u 號用戶對應矩陣第 u u u 列,記作向量 a u a_u au?
  • u u u 號用戶對應矩陣的第 u u u 列,記作向量 a u a_u au?
    在這里插入圖片描述
  • 物品 embedding 的參數矩陣記作 B B B。第 i i i 號物品對應矩陣第 i i i 列,記作向量 b i b_i bi?
    在這里插入圖片描述
  • 內積 < a u , b i > <a_u, b_i> <au?,bi?> 是第 u u u 號用戶對第 i i i 號物品興趣的預估值,內積越大,說明用戶 u u u 對物品 i i i 的興趣越強
  • 訓練模型的目的是學習矩陣 A A A B B B ,使得預估值擬合真實觀測的興趣分數。矩陣 A A A B B B 是 embedding 層的參數

數據集

  • 數據集:(用戶ID, 物品ID, 興趣分數) 的集合,記作 Ω = { ( u , i , y ) } \Omega = \{(u,i,y)\} Ω={(u,i,y)} 。含義為該用戶對該物品真實的興趣分數在系統里有記錄
  • 數據集中興趣分數的記錄方法如下:
    • 曝光但是沒有點擊 → 0分
    • 點擊,點贊,收藏,轉法 → 各算 1 分,這些行為都說明用戶對物品感興趣
    • 分數最低是 0,最高是 4
  • 訓練的目的是讓模型輸出擬合興趣分數

訓練

  • 把用戶ID和物品ID映射成向量
    • u u u 號物品 → 向量 a u a_u au?
    • i i i 號物品 → b i b_i bi?
  • 求解優化問題,得到參數 A A A B B B (它們是優化變量,embedding層的參數)
  • 我們希望預估值和真實值的差越小越好,我們對其取平方。差越小,則預估值越接近真實值。對所有差的平方求和,作為優化的目標函數
  • 求最小化可以用隨機梯度下降等方法,每次更新矩陣 A A A B B B 的一列,這樣就可以學出矩陣 A A A B B B
    在這里插入圖片描述

矩陣補充

  • 系統里面物品很多,一個用戶看過的物品只是系統的極少數
    在這里插入圖片描述
  • 矩陣中大部分都是灰色,只有少部分是綠色,也即曝光給用戶的物品只是少數,而我們并不知道沒曝光給用戶的物品用戶感不感興趣
  • 我們用綠色位置的數據去訓練模型,我們就可以知道灰色位置的分數,也就是把矩陣的元素給補全,這就是為什么模型叫矩陣補充
  • 把矩陣元素補全之后我們就可以做推薦,給定一個用戶,我們選出對應用戶的行中分數較高的物品推薦給該用戶

在實踐中效果并不好…

  • 缺點1:僅使用ID embedding,沒利用物品,用戶屬性
    • 物品屬性:類目,關鍵詞,地理位置,作者信息等等
    • 用戶屬性:性別,年齡,地理定位,感興趣的類目等等
    • 考慮以上的屬性,推薦可以更加精準
    • 雙塔模型可以看作矩陣補充的升級版,它不單單使用用戶ID和物品ID,還會結合各種物品屬性和用戶屬性,雙塔模型的實際表現是非常好的
  • 缺點2:負樣本的選取方式不對
    • 樣本:用戶——物品的二元組,記作 ( u , i ) (u,i) (u,i)
    • 正樣本:曝光之后,有點擊,交互(正確的做法)
    • 負樣本:曝光之后,沒有點擊,交互(錯誤的做法)。這是一種想當然的做法,學術界的人可能以為這樣沒錯,但可惜在實踐中不 work。后面的課程會講解正負樣本怎么選。
  • 缺點3:做訓練的方法不好
    • 內積不如余弦相似度,工業界普遍用余弦相似度而不是內積
    • 用平方損失(回歸)不如用交叉熵損失(分類)。工業界一般做分類來判斷一個樣本是正樣本還是負樣本

線上服務

在訓練好模型后,可以將模型用于推薦系統中的召回通道。比如在用戶刷小紅書的時候,快速找到這個用戶可能感興趣的一兩百篇筆記

模型存儲

做完訓練之后,要把模型存儲在正確的地方便于做召回。

  1. 訓練得到矩陣 A A A B B B ,它們是 embedding 層的參數。這輛個矩陣可能會很大,比如小紅書有幾億個用戶和幾億篇筆記,那么這幾個矩陣的列數都是好幾億。為了快速讀取和快速查找,需要特殊的存儲方式
    • A A A 的每一列對應一個用戶
    • B B B 的每一列對應一個物品
  2. 把矩陣 A A A 的列存儲到 key-value 表。
    • key 是用戶的ID,value 是 A A A 的一列
    • 給定用戶ID,返回一個向量(用戶的embedding)
  3. 矩陣 B B B 的存儲和索引比較復雜。不能簡單地用 key-value 表

線上服務

在訓練好模型,并且把 embedding 向量做存儲之后,可以開始做線上服務,某用戶刷小紅書的時候,小紅書開始在后臺做召回:

  1. 把用戶ID作為 key,查詢 key-value 表,得到該用戶的向量,記作 a a a
  2. 最近鄰查找:查找用戶最有可能感興趣的 k 個物品,作為召回結果
    • i i i 號物品的 embedding 向量記作 b i b_i bi?
    • 內積 < a , b i > <a,b_i> <a,bi?> 是對第 i i i 號物品興趣的預估
    • 返回內積最大的 k 個物品

這種最近鄰查找有一個問題:如果枚舉所有物品,時間復雜度正比于物品數量,這種計算量是不可接受的。比如小紅書有幾億篇筆記,逐一計算向量 a a a 和每一個向量 b b b 的內積是不現實的,做不到線上的實時計算

近似最近鄰查找(ANN)

  • 有很多種算法加速最近鄰查找,這些算法非常快,即使有幾億個物品也只需要幾萬次內積,這些算法的結果未必是最優的,但是不會比最優結果差多少

  • 支持的系統有:Milvus, Faiss, HnswLib等等

  • 衡量最近鄰的標準:

    • 歐氏距離最小(L2距離)
    • 向量內積最大(內積相似度)
    • 向量夾角余弦最大(cosine相似度,推薦系統最常用),把所有向量都做歸一化,讓它們的二范數都等于 1,那么此時內積等于余弦相似度
  • 如下圖,其中 a 是一個用戶的embedding,我們需要召回用戶感興趣的物品,這就需要計算 a 與所有點的相似度。如果用暴力枚舉,計算量正比于點的數量,即物品的數量

  • 想要減少最近鄰的查找的計算量,必須避免暴力枚舉

在這里插入圖片描述

  • 我們在查找之前,先對數據做預處理,對數據進行如下圖的劃分:對于如何劃分取決于最近鄰的標準
    • 如果是余弦相似度,那么劃分結果就是這樣的扇形
    • 如果是歐式距離,那么結果就是多邊形

在這里插入圖片描述

  • 劃分之后,每個區域用一個向量表示,比如下面的藍色區域用那個藍色箭頭的向量表示。黃色區域用圖中黃色的向量表示。
  • 這些向量的長度都是 1。
  • 劃分之后建立索引,把每個區域的向量作為 key,區域中所有點的表作為 value。給定一個藍色向量,就應該取回藍色扇形中所有的點

/

  • 現在在劃分之后,每個區域都用一個單位向量來表示。那么如果我們劃分成 1w 個區域,索引上就會一共有 1w 個 key 值。每個向量是一個區域的key值

在這里插入圖片描述

  • 給定一個向量,就可以快速取回區域中的所有點。這樣我們就可以快速做召回了
    在這里插入圖片描述
  • 現在我們要做推薦,給定一個用戶的 embedding 向量 a。我們首先把向量 a 和索引中的向量做對比,計算它們的相似度
  • 如果物品數量是幾億,索引中的 key 數量也只有幾萬而已,這一步的計算開銷不大

在這里插入圖片描述

  • 計算相似度之后,我們會發現橙色的向量和 a 最相似
  • 通過索引,我們可以找到這個區域內所有的點,每個點對應一個物品
  • 接下來計算 a 和區域內所有點的相似度。如果一共有幾億個物品被劃分到了幾萬個區域,平均每個區域只有幾萬個點,所以這一步只需要計算幾萬次相似度,計算量不大

在這里插入圖片描述

  • 假如我們想要找到和向量 a 夾角最小的三個點,那么我們會找到藍色框住的三個點,代表三個物品。這三個物品就是最近鄰查找的結果
  • 哪怕有幾億個物品,用這種方法查找,最終也只需要幾萬次查找,比暴力枚舉快 1w 倍

在這里插入圖片描述

總結

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

C# 事件(訂閱事件和觸發事件)

訂閱事件 訂閱者向事件添加事件處理程序。對于一個要添加到事件的事件處理程序來說&#xff0c;它必須具有 與事件的委托相同的返回類型和簽名。 使用運算符來為事件添加事件處理程序&#xff0c;如下面的代碼所示。事件處理程序位于該運 算符的右邊。事件處理程序的規范可以…

64頁精品PPT | 基于DeepSeek的數據治理方案AI大數據治理解決方案數據治理大模型解決方案

這份PPT文檔是關于基于DeepSeek的大模型技術在數據治理方案中的應用介紹。強調數據作為新型生產要素與人工智能技術相結合的重要性&#xff0c;指出大模型憑借強大的文學理解、生成能力以及多模態數據處理能力&#xff0c;能為數據治理帶來新機遇。文檔詳細闡述了數據資產化的路…

【文獻筆記】Tree of Thoughts: Deliberate Problem Solving with Large Language Models

Tree of Thoughts: Deliberate Problem Solving with Large Language Models https://github.com/princeton-nlp/tree-of-thought-llm 標題翻譯&#xff1a;思維樹&#xff1a;利用大型語言模型問題求解 1. 內容介紹 1.1. 背景 決策過程有兩種模式&#xff1a; 快速、自動…

使用 Mathematical_Expression 從零開始實現數學題目的作答小游戲【可復制代碼】

從零開始實現數學題目的作答小游戲 開源技術欄 使用 Mathematical_Expression 讓計算機做出題人&#xff0c;讓代碼與數學碰撞出趣味火花。 目錄 文章目錄 從零開始實現數學題目的作答小游戲目錄 從零開始實現數學題目的作答小游戲&#xff1a;讓代碼與數學碰撞出趣味火花為…

DQL-9-小結

DQL-9-小結 小結DQL語句 小結 DQL語句 SELECT 字段列表 -- 字段名 [AS] 別名FROM 表名列表WHERE條件列表 -- >、 >、 <、 <、 、 <>、 like、 between ... and、 in、 and、 or, 分組之前過濾 GROUP BY分組字段列表HAVING分組后條件列表 -- 分組之后…

[netty5: WebSocketServerHandshaker WebSocketServerHandshakerFactory]-源碼分析

在閱讀這篇文章前&#xff0c;推薦先閱讀以下內容&#xff1a; [netty5: WebSocketFrame]-源碼分析[netty5: WebSocketFrameEncoder & WebSocketFrameDecoder]-源碼解析 WebSocketServerHandshakerFactory WebSocketServerHandshakerFactory 用于根據客戶端請求中的 Web…

數據挖掘:深度解析與實戰應用

在當今數字化時代&#xff0c;數據挖掘已經成為企業獲取競爭優勢的關鍵技術之一。通過從大量數據中提取有價值的信息&#xff0c;企業可以更好地理解客戶需求、優化業務流程、提高運營效率。本文將深入探討數據挖掘的核心技術、實際應用案例以及如何在企業中實施數據挖掘項目。…

LLM面試題14

算法崗面試題 介紹下Transformer模型。 Transformer本身是一個典型的encoder-decoder模型&#xff0c;Encoder端和Decoder端均有6個Block,Encoder端的Block包括兩個模塊&#xff0c;多頭self-attention模塊以及一個前饋神經網絡模塊&#xff1b;Decoder端的Block包括三個模塊&…

Java金融場景中為什么金額字段禁止使用浮點類型(float/double)?

引言 Java金融場景中為什么金額字段禁止使用浮點類型&#xff1f;這是一篇你不能忽視的“爆雷”警告&#xff01; 在金融、電商、支付、清結算等業務系統中&#xff0c;浮點類型是絕對禁區&#xff01; &#x1f6a8;一、核心警告&#xff1a;浮點類型不是十進制數&#xff01;…

SVN下載與拉取

大家好我是蘇麟&#xff0c;今天聊一聊SVN。 SVN官網&#xff1a;下載 TortoiseSVN - TortoiseSVN 軟件 根據系統選擇32位還是64位 打開文件 安裝&#xff0c;下一步&#xff0c;下一步 安裝成功后&#xff0c;右鍵找到SVNcheck 輸入地址 輸入用戶名和密碼就OK了 這期就到這里…

數據結構筆記8:堆

目錄 滿二叉樹&#xff1a; 完全二叉樹&#xff1a; 堆是一種特殊的完全二叉樹&#xff1a; 我們可以以數組的方式存儲堆。 父節點和子節點下標關系的推導&#xff1a; 1.使用數學歸納法證明n2 1 n0&#xff1a; 2.使用邊和節點的關系證明n2 1 n0&#xff1a; 我們…

3. lvgl 9.3 vscode 模擬環境搭建 lv_port_pc_vscode-release-v9.3

文章目錄1. 資源下載1. 1 lv_port_pc_vscode1.2 cmake 和 mingw 環境搭建1.3 sdl 下載1.4 下載lvgl_v9.32. 環境搭建2.1 拷貝lvgl 源碼到工程2.2 添加SDL2 依賴2.3 執行工程3. 運行示例1. 資源下載 1. 1 lv_port_pc_vscode 那么多模擬器&#xff0c;為什么選擇這個&#xff1…

【牛客刷題】小紅的爆炸串(二)

一、題目介紹 本題鏈接為:小紅的爆炸串(二) 小紅定義一個字符串會爆炸,當且僅當至少有k對相鄰的字母不同。 例如,當 k k k=2時,"arc"會爆炸,而"aabb"則不會爆炸。 小紅拿到了一個長度為

【實戰】如何訓練一個客服語音對話場景VAD模型

1. 引言:客服場景下的VAD模型 在客服中心,每天都會產生海量的通話錄音。對這些錄音進行有效分析,可以用于服務質量監控、客戶意圖洞察、流程優化等。VAD在其中扮演著“預處理器”和“過濾器”的關鍵角色: 提升ASR效率與準確性:只將檢測到的語音片段送入ASR引擎,可以避免…

在 Dokploy 中為 PostgreSQL 搭建 PgBouncer 數據庫連接池(圖文)

前言&#xff1a;為什么你需要一個連接池&#xff1f; 如果你正在使用 Node.js (尤其是像 Next.js 這樣的框架) 配合 Prisma 操作 PostgreSQL 數據庫&#xff0c;你很可能在某個階段會遇到那個令人頭疼的錯誤&#xff1a;“Error: Too many clients already”。這通常發生在應…

Mac獲取終端歷史

在 macOS 中&#xff0c;歷史記錄文件的位置取決于你使用的 shell。以下是針對不同 shell 的歷史記錄文件的默認位置&#xff1a;對于 Bash 用戶&#xff1a; 歷史記錄文件通常位于 ~/.bash_history。對于 Zsh 用戶&#xff08;macOS Catalina及以后版本默認使用的shell&#x…

高頻交易服務器篇

在 Binance 進行高頻交易&#xff08;HFT&#xff09;時&#xff0c;服務器的低延遲、高穩定性和快速網絡是關鍵。亞馬遜云&#xff08;AWS&#xff09; 提供了多種適合高頻交易的方案&#xff0c;以下是推薦的配置和優化策略&#xff1a;1. 選擇 AWS 區域&#xff08;Region&a…

MVC與MVVM架構模式詳解:原理、區別與JavaScript實現

Hi&#xff0c;我是布蘭妮甜 &#xff01;在當今復雜的前端開發領域&#xff0c;如何組織代碼結構一直是開發者面臨的核心挑戰。MVC和MVVM作為兩種經典的架構模式&#xff0c;為前端應用提供了清晰的責任劃分和可維護的代碼組織方案。本文將深入探討這兩種模式的原理、實現差異…

從小白到進階:解鎖linux與c語言高級編程知識點嵌入式開發的任督二脈(2)

【硬核揭秘】Linux與C高級編程&#xff1a;從入門到精通&#xff0c;你的全棧之路&#xff01; 第三部分&#xff1a;Shell腳本編程——自動化你的Linux世界&#xff0c;讓效率飛起來&#xff01; 嘿&#xff0c;各位C語言的“卷王”們&#xff01; 在Linux的世界里&#xf…

鎖和事務的關系

事務的4大特性(ACID) 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務被視為一個單一的、不可分割的工作單元一致性&#xff08;Consistency&#xff09;&#xff1a;事務執行前后&#xff0c;數據庫從一個一致狀態轉變為另一個一致狀態&#xff0c;并且強制執行所有…