本文由 「AI前線」原創,原文連結:線上購買率轉化高達60%,Amazon推薦系統是如何做到的?
作者 | 袁源
編輯 | Vincent
AI 前線導讀:根據美國財富雜誌的報導, Amazon 的銷售額高速增長,得益於它將系統整合進使用者購買, 從產品發現到付款的整個流程。根據華爾街分析師的估計, Amazon 的線上推薦系統的購買轉化率高達 60%。 那麼 Amazon 推薦系統的成功祕訣在哪兒呢,讓我們為您揭開其神祕面紗。
宣告 | 本文整理自 AI 前線 2018 年 3 月 1 日直播分享,未經許可不得轉載!
大家好!很高興今天有機會跟大家一起分享個性化的智慧推薦系統。
我先自我介紹一下,我叫袁源,2011 年獲得博士學位,曾經在亞馬遜工作有兩年半的時間。在這些工作中,我有一些經驗可以給大家分享,所以趁今天這個機會跟大家聊一聊。
時間有限,我可能會講的比較抽象,如果大家希望瞭解具體的內容,可以掃我們的二維碼,來我們貪心科技的網路課程,在裡面我會把今天講的每一個演算法用最詳細的語言和最清晰的、最有條理的方式給大家講解,並且每一種演算法我都會用 Python 寫好程式碼分享給大家,所以說大家不但能夠從理論上學到一個演算法、能夠理解它,並且能夠看到這個演算法怎麼實現的。我在實現演算法的時候,會盡量不用任何第三方的庫,我儘量不用那些已經打包好的,可能很多現成的人工智慧的庫是 C++ 寫的,並且為了效率可能用上了 GPU。我會用最純粹的 Python 寫,這樣的話,大家就可以看到很詳細的每一個步驟是怎麼實現的。
如果大家有興趣,知道詳細內容的可以繼續掃我們二維碼,到我們貪心科技的網站上了解更多細節。
weixin.qq.com/r/eCqPl5XE6… (二維碼自動識別)
今天和我一起和大家分享的還有我們的 CEO,李文哲,文哲現在你可以給大家打個招呼嗎?
李文哲:大家好,我叫李文哲,我目前是貪心科技的 CEO 也是創始人。我之前也是在美國讀人工智慧博士的,我之前是在 USC。在國內多家企業也做過首席科學家,所以我對整個的 AI 領域還是比較熟悉的。
我建立這樣的一家公司是希望把這種 AI 的技術還有 AI 的知識普及起來,讓國內的很多人可以去學習,然後在實戰中能夠用起來,今天我們也很高興邀請到了 Jerry 老師來分享推薦系統這樣的一個課題,希望大家在今天的課程當中學到一些知識。如果有任何問題,我們可以一起討論,也可以給我提問,到課程結束之後,我們一起在論壇裡面再互動一下。接下來我們就把時間給 Jerry 老師。
袁源:那我們現在正式開始我們今天的分享。
我今天的主要內容如下:
首先我給大家介紹一下推薦系統的概述,它代表什麼,有哪些具體的推薦系統實現我們可以借鑑;
第二是我給大家推薦一下常用的推薦演算法,如果你自己正要做一個系統的話,你可以從這些最常用的演算法開始嘗試;
然後我想強調一下大家可能不太重視的一點,就是如何評價一個推薦系統?只有你建立一個比較好的評價標準,你才有辦法不斷的改進你的演算法,讓你的系統執行的越來越好;
最後,我會介紹一下現在已經存在的一些推薦系統它們一般會怎麼來架構的,以及如何從軟體系統上來描述它。
推薦系統概述
首先什麼是推薦系統?
我們要先定義一下,我們今天到底講什麼。
推薦系統其實就是一種資訊處理的系統,用來預測一個使用者對某個東西是不是很喜歡,如果喜歡的話,喜歡的程度是什麼樣的,是非常喜歡,還是一般般喜歡,還是一點都不喜歡。推薦系統用的領域肯定很多,我舉一些例子:現在的今日頭條給使用者推薦個性化的新聞;優酷土豆 YouTube 給使用者推薦視訊;蝦米音樂給使用者推薦喜歡的音樂,當然還有淘寶、京東商城推薦圖書、食品、衣服還有其他各種商品。除此之外在社交網路裡面 Twitter、Facebook,還有像新浪微博,都會給使用者推薦朋友。
當然,推薦的方式也是用推薦系統來實現的。現在金融很火,如果你在做金融類的產品,肯定希望做 P2P 金融給你的客戶推薦股票、基金理財、基金證券和理財產品。當然單身狗們不要忘了在婚戀市場裡面的各種相親網站裡面,也會給單身的朋友推薦合適的另一半,同樣是用的推薦系統。
所以說我們可以看到推薦系統現在已經成為很多網站、手機 APP 不可獲缺的一部分。這些 APP 和網站依靠推薦系統來提高銷量,吸引使用者注意力,提高使用者活躍度和吸引新的使用者。
因為我曾經在亞馬遜工作,我們來看一個具體的一個公司它是怎麼使用推薦系統的。
我現在顯示的是 Google felines 里亞馬遜的股價,可以看到,它最近簡直像發射火箭一樣,股價一直上漲的非常厲害。從 2015 年大概 300 美元一股,現在漲到了 1500 美元一股。
那它這麼成功它靠的是什麼?我們看看美國著名的《財富》雜誌是怎麼價值它的:它說亞馬遜的成功取決於它把它的推薦系統放到了從產品發現,到產品購買的整個過程。
財富雜誌還提到說,亞馬遜的推薦系統在進行推薦以後,使用者購買率、轉化率會達到 60% 的程度。
那我們來具體看一下亞馬遜都使用了哪些推薦呢?
如果你登入到亞馬遜網站上,第一個你會看到,它會按照不同的產品類別進行推薦,比如說左上角,它推薦給當前登入的 taomas 這個使用者,給他推薦健身器材,左下角又推薦咖啡和茶,還有其他的圖書,這是第一個:按照類別給每個人推薦。
第二個是經常購買的商品。
假設一個使用者現在購買了左邊的這一個訓練機構的這個健身棒,它就會推薦你買右邊的這個橘黃色的這個健身的按摩球,為什麼呢?這兩個東西根據它們的歷史顯示經常被人一起購買,這也是個經典的案例,大家可能會知道 MBA 裡面的一個經典案例:研究人員發現,超市應該把嬰兒尿布和啤酒放在相鄰處,因為很多父親去買嬰兒尿布,同時看到旁邊有啤酒,就會一起購買,這也是採用樣的策略。
第三,亞馬遜推薦的方式是按照你最近的歷史推薦。
你最近看了什麼?我最近看了健身用的健身棒,所以推薦的一堆用來健身相關的物品。
第四是什麼?不是推薦你曾經沒看過的,而是告訴你今天看了什麼、前幾天看了什麼、某月某日看了什麼,把你曾經看過,但是並沒有下單的東西再給你看一遍,也許你就有下單的衝動了。
第五是什麼呢?也是按照你的瀏覽歷史給你推薦,不是按照你現在的瀏覽歷史,比如我最近看的是健身器材,但是給我推薦的第二個商品是沙丁魚,他是按照我曾經久遠的歷史來給我推薦的。
還有第六種推薦,就是按照其他跟你購物習慣相同的使用者推薦,比如他和我買了同樣商品,他接下來又買了什麼,根據其他跟我買相同商品的使用者購買的物品的推薦。
第七是,系統知道我的購買歷史,知道我曾經買了一個 kindle,然後告訴我說,現在 kindle 出了新版本,那我會不會想要購買,這是根據使用者的購買歷史推薦同一個商品新版本。
還有第八,它根據我的購買歷史推薦周邊產品。系統知道我買了 kindle,他就推薦我說你要不要其他周邊產品,比如保護套。
第九,就跟我個人購買歷史和我個人的瀏覽歷史無關的,而是根據在亞馬遜網站上賣的比較好的那些商品進行推薦。
除了登陸網站,系統會給你推薦之外,它還會主動進行推薦。在美國大家用郵件用的比較多,都是用郵件來登陸的,所以說亞馬遜知道美國使用者的郵件,就會給使用者發郵件進行推薦。
比如說這個例子:我最近看了一下佳能的數碼照相機,它就會給我發郵件,給我推薦佳能最近賣的比較好的照相機給我。
如果我無動於衷,它又會有推薦:佳能的你可能不感興趣,推薦柯達的數碼相機給你看你會不會感興趣?這就是跟我曾經瀏覽相似的東西,但是呢,只是侷限於柯達這個品牌。
如果我還無動於衷,他還會給我發郵件說,你看佳能的相機,這裡有一個便宜的一個套件,包括相機的殼子、包括記憶卡,一起買會比較便宜,你會不會感興趣?推薦系統會按照你曾經瀏覽的物品推薦周邊產品,做一套件給使用者購買。
最後,如果使用者還無動於衷,它還會給你推薦,比如直接告訴你,賣得最好的數碼相機是什麼。除了我曾經自己看的佳能,還有索尼的,這就是它給我推薦的東西。
我每種推薦的演算法標了一個數字,到這裡一共是 13 種,也就是說:簡簡單單的一個購物網站,僅對每件商品的,就用了 13 種不同的推薦策略。
我們高屋建瓴來看一下,各種推薦到底背後的演算法是什麼呢?
如果我們把推薦系統來分類的話,其實我們每個人都接觸到推薦系統,這是一個很原始的技術。
早期的入口網站,比如說新浪、雅虎,還有人民日報也是有推薦系統的,只不過裡面的內容是網站編輯,或者是報社的編輯幫讀者手工選擇的,它也是一種推薦,只不過是手工生成的推薦。
第二類推薦,是一些簡單的聚合系統。比如說你去 KTV,點唱皮膚上就會有 KTV 的最近點唱的排行榜,如果你去書店就有暢銷書排行榜,去買電影票,貓眼電影之類的系統也會告訴你熱賣電影是什麼;包括豆瓣裡面會有電影票房排行榜。
還有按照物品的時間順序,按照時間性質給使用者推薦,比如說新上架的物品優先推薦。
這些推薦系統只是基於最簡單的統計來進行推薦,他們雖然說看起來方式很簡單,但很多時候很有效。
最後一個就是我們關注的重點,就是真正個性化的千人千面的推薦系統。
無論是第一種,還是第二種,你會看出來不論是人工生成的推薦系統,還是簡單的聚合,它 都不是針對個人的。每個人開啟人民日報看到的是一樣的內容,每個人去 KTV 裡面點歌看到的排行榜是一樣的。那我們現在最關心的就是千人千面的推薦系統,比如說每個人開啟 Amazon 主頁,每個人開啟 Netflix 他會看到這些商品,或者電影的推薦是不一樣的,那這就是我們今天想要關注的重點。
如果我們從數學上來抽象一個推薦系統,應該從理論上來看是個什麼樣的?有什麼樣的要素、要解決什麼樣的問題呢?
首先我們用 U 代表所有使用者的集合,我們有一堆的使用者,然後我們用 S 代表所有物品的集合,比如說我有一堆使用者,我有一堆東西,這些東西可能是電影,可能是音樂,可能是人,可能是其他的物品。我的推薦系統模型也就是說:U×S,推薦出來 R,這個乘積在這裡表示笛卡爾積。意思就是說:每個使用者和每個物品我給它一個 R,這個 R 的值就是推薦值,就是說每一個使用者對一個物品他的喜愛程度是多少,很多的網站會有,讓你打分就是一到五顆星星這種方式來表達,也有像 Facebook 用點讚的方式,或者是鄙視這種方式來表達,這就是 R 代表的值,推薦系統說到底也就是一堆使用者對於一堆物品的喜歡的程度的值。
舉一個大家都能明白的例項:假設我有小明、小李,韓美美和小靜這四個人。有四個電影作為我的物品:《大話西遊》、《夏洛特煩惱》、《黃飛鴻》、《笑傲江湖》。那我能掌握的資料、能夠收集到的做推薦系統的資料是哪些呢?
首先是推薦值裡面記錄了每一行是每個使用者對於各個物品的喜好程度。比如:小李對於《夏洛特煩惱》喜歡程度是 2,對《黃飛鴻》喜好程度是 5。
在這個推薦矩陣裡,你會看到有的人數值是已知的,有的是未知的,比如說小明對《大話西遊》他的喜好程度是什麼呢?我們不知道,這就是我們想要的,同樣也是推薦系統的一個關鍵問題:我們怎麼從我們這些已知的這些推薦值推匯出這些未知的值? 比如小明對《大話西遊》的喜好程度,除此之外我們還能獲取哪些資料呢?當然我們獲取使用者的資料,每個使用者有性別、年齡和其他的屬性,這些是我們可以獲得的;還有物品的屬性,比如我們能輕易的獲取這個電影的類別,是武俠還是文藝片,還是喜劇,這也是後續另外一些物品的屬性。
有這三個矩陣,這些值就是我們可以利用的值,然後我們要解決的問題就是利用這些獲取的資料推導那些位置的值,比如小明對《大話西遊》的喜好程度。
我強調一下推薦系統要解決的關鍵問題:
第一是 收集資料。推薦系統本質上說,當然是一種人工智慧系統,人工智慧系統需要 Training,需要訓練,它當然需要訓練資料了,所以說收集資料非常重要。我覺得有一點要注意:收集資料不是一蹴而就的,需要經常更新的,資料有時效性的。比如說一個人對一個東西的喜好程度是隨著時間變化而變化的,每一個人童年喜歡的書籍電影在成年後可能就不喜歡了;可能你去年喜歡的東西和今年就不一樣,也許你的興趣愛好變了。還有比如說一個使用者他現在小孩出生了,他可能關注更多的嬰兒物品,比如說尿不溼,所以說收集資料很重要,而且收集資料是經常需要更新的。
第二,推薦系統要解決的關鍵問題當然就是如何預測那些未知的資料;
第三個就是 怎麼建立評價系統。只有建立一個評價系統,才能知道現在我的推薦系統到底好不好,如果不好,我們調整,怎麼調整算是好?
收集資料
收集資料有一種方式,是顯示收集,就是直接讓使用者打分,或者是點贊,或者讓使用者留言評價。這有一個很大的問題,就是很多使用者不願意,或者懶得點贊、寫評論,或者是打分。比如說我自己,比如我在 YouTube 上看了很多視訊,我從來沒有給他們點過贊,或者是寫過評價說:“非常不錯”或者是“很討厭”,我從來不評價,我相信很多人會這樣子。
在沒有辦法收集資料的情況下,有沒有其他方式來收集呢?這就是越來越多的 隱性收集 資料,那怎麼隱性收集呢?比如說一個視訊網站,如果一個使用者看了一部電影,過了一段時間發現他又在看那部電影,表示他很喜歡這個電影;如果他在觀影時一直快進,或者中途就跳開了,那就說明他不喜歡,這就是隱性收集的一個策略。
購物網站就更簡單,如果一個使用者買了某個東西,當然就表示他喜歡某個東西,如果他退貨了,肯定就表示不喜歡。隱性收集現在越來越重要,而且隱形收集的資料遠遠高於顯性收集的資料。
如何預測
得到了資料之後,我們如何來預測呢?它關鍵的挑戰有哪些?
我們得到的推薦值矩陣就是一個使用者到底喜歡什麼東西,但實際上,得到的資料基本上是非常稀疏的,意思就是說大多數使用者對大的物品喜不喜歡我是不知道的。我們只知道,每個使用者可能對少量物品的喜好程度,或者是某一個物品只有少量的使用者喜歡,所以他表達出喜好。
還有就是冷啟動物體,這是什麼?假設我現在有一個新的物品,比如說 iPhone11 要放在我的購物網站上,沒有任何使用者為他打高分,因為它剛出來,沒有人用過,自然沒有反饋了,你怎麼推薦它?你怎麼知道人家是喜歡 iPhone11,還是喜歡華為 P11?
還有就是新的使用者。如果有個新的使用者上來,他沒有任何的互動行為,你根本不可能知道他到底喜歡或者不喜歡什麼,這就是一個很大的挑戰。
那常用的推薦方法有哪些呢?如果你現在要負責公司,做一個推薦系統,我建議你在我先要介紹這個列表裡逐一試過來,再去使用更 Fashion,更先進的方法。
我會逐一把它們做些簡單的介紹。
第一是 基於內容 的,這裡有一個圖來簡單介紹,表達它的意思。
假設一個人他喜歡這種酸酸的啤酒,就讓系統找跟這種啤酒所有相似的口味的其他啤酒,如果找到另外一個,當然就可以推薦給他。
基於內容推薦看起來是最簡單最容易實現的,效果反而也是還不錯的,但是它的問題在於很多情況:很難獲取一個物品的屬性。如果基於內容,基於產品的屬性找到兩個相似的產品做推薦,怎麼判斷兩個產品相似呢?不是一件容易的事情。
比如給使用者推薦兩篇新聞,怎麼判斷兩個新聞相類似呢,需要用到自然語言理解,系統需要知道這篇新聞裡面包含了哪些人物、哪些事件、哪些地點、哪些時間,這篇新聞裡邊是不是有國家元首,如果這兩篇沒有國家元首,至少某種程度上是相似的;或者這兩篇文章是不是都包含了比如北京的事情,是不是都包含了同樣的主題,它們是都在談政治、都在談軍事,或者都在談經濟呢。基於內容這種推薦方法,最關鍵的問題是怎麼獲取這個物品的屬性,對於文字,可能會用到自然語言處理;對於影象,可能需要用到深度學習的影象識別技術,知道這個影象圖片裡面到底包含了哪些物體是人、是狗、還是貓,如果是貓的話,這兩個方式相似的,是不是橘黃色貓?這就是基於內容的方法。
第二種方法是 協同過濾 的方法。
我給大家舉個最簡單的例子,但是你馬上就能理解協同過濾。
假設我有三個使用者和四個物品,分別是橘子、草莓、蘋果和香蕉。我知道第三個使用者他購買蘋果,接下來,我問你:在其他的三個他沒有購買的物品,橘子,草莓和香蕉裡面,第三個使用者可能會最喜歡的哪個?
基於協同過濾的考慮方式是這樣子:我們希望給第三個使用者推薦的物品應該是跟他已經購買的蘋果相似的物品,那什麼物品可以和蘋果相似呢?我們可以這樣思考,什麼物品在使用者購買蘋果之後,被同時購買的次數是最多的?
我們先看香蕉,香蕉有沒有跟蘋果同時購買?有,第一個使用者,他同時購買了橘子、蘋果和香蕉,香蕉我們算它得了一分,因為跟蘋果同時購買了,所以加一分;那我們再看草莓,草莓沒有任何人買草莓的同時也買過蘋果,草莓得分是 0 分;那麼再看橘子,第一個使用者,他同時購買了蘋果,和橘子,第二人也同時購買了蘋果和橘子,所以說橘子得兩分,它跟蘋果的相似度是 2。這樣我們就發現蘋果跟橘子相似度是 2,蘋果和草莓相似度是 0,蘋果跟香蕉相似度是 1,得出結論:橘子跟蘋果最相似,我們就給第三個使用者推薦橘子,這就是協同過濾的精髓。
接下來我們再介紹 矩陣分解 方式。
舉個例子,這裡面 ABCD 四個使用者,我們有 WXYZ,四個產品,我們知道使用者對產品的喜好程度,比如說 A 對 X 的喜好程度 4.5,就給我們這樣一個打分的矩陣,我們怎麼來預測比如說 A 對對 W 它的喜好程度是多少呢?
矩陣分解的最好方式是這樣子的:我希望找到另外兩個矩陣,分別叫做 使用者矩陣和物品矩陣,使用者矩陣行的個數是等於我這個打分矩陣裡面使用者的個數,物品矩陣裡面列的個數是等於物品的總數;至於使用者矩陣的列,它一定要等於這個物品的矩陣的行數,那它的列數和行數具體等於什麼值呢,是一個引數裡你可以預設的,可以是 2,可以是 3,可以是 10,可以是 100。
這兩個矩陣使用者矩陣和物品矩陣應該有怎樣的屬性?我們希望他們的屬性是這樣子:當這兩個矩陣相乘,他們乘的積肯定是一個矩陣,和我的打分矩陣是同樣的行,同樣的列;我希望他們兩個乘積裡面對應的值,它跟我的這個打分矩陣,應該同樣行,同樣列,那麼就對應的值。
比如說第一行第二個值,我希望它的值是接近於 4.5 的,在 AX 位置接近 4.5、在 AY 位置接近 2.0、在 BW 這個位置接近 4.0,也就是說我希望這兩個矩陣乘積的一個最終的矩陣,跟我打分矩陣裡面已知的值是相似的。
如果可以做到這一點,那乘積的矩陣,它在這裡是肯定是會對應值的,我認為這兩個矩陣乘積以後對應的值就是我的預測的值,這就是矩陣分解的基本思想。
你馬上可以發現矩陣分解它有一個問題:它只利用了使用者對物品的打分的值,其實我們是知道使用者的屬性,比如說使用者是男是女,是老是少,我們也知道物品的一些屬性,比如說這個物品,如果是電影的話,我們知道它導演是誰,演員主演有哪些,他的風格是什麼,但是我們沒有辦法在矩陣分解裡面提供一些資訊,因為資料沒有辦法提供,我們就沒有辦法利用它們來提高我們的系統。
所以就有人提出另外一種演算法,叫因子分解機。
它的思路是:把使用者對物品的喜好變成我下面定義的這樣一個公式形式。它的意思是什麼呢?
比如我這裡有三個使用者:湯姆、傑克和艾麗斯,我們有電影、圖書和音樂,有他們互相之間的喜好程度,我把這個使用者作為讀者編碼,每一行只有一個,人數為 1,1 就表示代表湯姆,然後另一行這一個 1 是代表傑克;然後是物品進行讀者編碼,每一行也是隻有一個物品為 1,再把使用者的屬性,比如說年齡、性別放在這裡,再把物品的屬性放在這裡;然後每一行,這些 X 資料分別代表是哪個使用者,是哪個物品,以及這個使用者的年齡是什麼、性別是什麼,這個物品的屬性分別是什麼;這個使用者對於這個物品它的喜好程度是什麼,這就是 Y 的值。也就是說,我們希望這些 X 的值通過下面這樣一個公式的計算產生一個 Y 的值。
有一點跟矩陣分解很不一樣的是:X 之間是有乘積的,是有相關性的。比如:湯姆的 X 值要跟湯姆的年齡、性別相乘;湯姆的值也要跟這個物品的屬性相乘,性別或者年齡也要跟物品相乘,再互相交叉相乘,才能得到我們的變數。
這裡面已知的值是 Y、X,未知的是 W,V 的值。我們只要通過計算知道 W 和 V 的值,就能對未知的那些 Y 做計算,因為 X 是已知的,這就是因子分解機的工作原理。
跟前面相比,這種方法就是同時利用對物品的喜好,也同時利用了物品的屬性和使用者的屬性。
當然我們現在絕對不能忽略的一件事情就是深度學習的推薦系統。
我能想到的最簡單的,用深度學習做推薦模型就是這樣子的:輸入式使用者 ID,比如有一百個使用者,分別對使用者編碼從 0 到 99;如果有一千個物品,就把物品編碼從 0 到 999,作為深度學習網路的輸入,然後加一個嵌入層,再把嵌入層輸出的兩個向量連線在一起,加入一個全連線層、加正則化,再加一個全連線層、再加正則化,再加兩個全連線層,然後用 softmax 作為預測。
它預測的值分別是輸出 000,或者假設想要的評分是從 0 到 5 打分,輸出就是五個元素,分別是值為 0 和 1 的數。如果我預測它的打分是 1 分的話,那就是第一個元素為 1,其他元素為 0,如果我預測打分數目,那就是第五個元素為 1 其他元素為 0。
這就是一個最簡單的深度學習模型,它唯一的資料就是輸入就是使用者 ID、物品 ID 和這個使用者對這個物品打分的值,然後虛擬網路最後就會告訴你,如果你把一個新的使用者 ID 和一個沒有打過分的物品 ID 告訴它,它會預測一個打分的值。
講一個實際使用的例子,這個稍微複雜一點,但是跟前面我介紹的大同小異。
這是 Google Play,相當於蘋果的 APP Store,用來下載 APP 的,可能中國用的比較少。它用了這樣一個深度學習的方式來做推薦:輸入分別是使用者的性別、年齡、使用者一共裝了多少個 APP、跟這個系統之間的互動是什麼樣子的,這些直接送到它的嵌入層裡;然後是使用者的裝置,三星、華為、或者其他裝置;以及使用者安裝了哪些 APP,和使用者的對 APP 的打分情況是什麼,這些都加入一個額外的一個嵌入層,跟前面的這些屬性直接連在一起,加了三層的深度學習網路,之後直接把使用者安裝了 APP,和使用者對已經安裝的 APP 的打分兩兩相乘的積,作為它最後的輸入。訓練這樣一個結構的神經網路,用在 Google Play 的 APP 推薦裡面。
還有一種推薦的演算法,是因為大家已經花了很多工夫來研究搜尋引擎,搜尋引擎本質上就是一個推薦系統。
比如輸入“黃曉明”這個詞到搜尋引擎裡面,不管百度還是 Google,會反饋很多的頁面,第一個頁面就是推薦系統認為,你會最喜歡的一篇關於黃曉明的文章或者網頁,第二個頁面是系統認為使用者次喜歡的文章。
本質上來說,這種推薦就是:把一堆物品給某一個使用者呈現的時候排序的過程,使用者具體喜歡的物品不重要,重要的是使用者比較而言更喜歡的物品。
如果收集了使用者資料和使用者打分的資料,就可以用傳統的搜尋引擎方式,去為每一個物品打分,然後進行排序,這是很傳統但是很有用的一種方式。
還有一種方式,不用任何資料支援都能想到的一種,就是 探索與利用。聽起來很 fancy,但其實原理很簡單,這裡舉個例子:假設有 5 個使用者,他們是一類的,就是很相似的使用者,隨機把使用者 1 和使用者 2 抽取出來,作為小白鼠做實驗,給他們推薦兩部電影,看看他們對電影的反應是怎麼樣的。
給第一個使用者推薦一部,給第二個使用者推薦另外一個部影,我們發現第一個使用者沒有點選電影,沒有看電影,但第二個使用者看了,就表示說這個電影更適合第二個使用者這類群體的口味。那我就知道了,原來給第二個使用者推薦的這部電影好,於是就可以給其他使用者推薦被第二個使用者點選過的電影。
為什麼呢?很簡單,因為這五個使用者是相似的,我已經拿使用者一和使用者二作為小白鼠實驗了,實驗反映這個電影好,那我就應該給這些其他的使用者推薦這個電影了。
但是還要注意一點:你也看到我們也給使用者推薦了一部沒有被使用者一一點選的電影,為什麼?如果我們只給所有的使用者推薦,不使用者點選的電影,萬一使用者一直點錯了,他其實也是喜歡那個電影但他沒點,或者他現在正忙,有什麼原因看不了呢?那不就丟掉了這個好電影被使用者看到的機會嗎?我們還是要把它顯示給某些使用者看到,但是隻能在顯示的時候,顯示的選擇它的概率低一點,因為它明顯被使用者喜歡過。
最後不得不提就是 整合學習 的方法。
我們有很多不同的推薦演算法,如果我把這些推薦演算法全部加起來,合在一起,對使用者會不會更好呢?現實的反映是會更好。
怎麼來把這些不同的演算法輸出合在一起呢?第一個方式就是投票。假設有三個推薦系統,其中兩個認為某一個使用者對物品的喜歡程度是 5,只有一個認為是 4,那我肯定相信這兩個了,投票多的就認為是它。或者取平均值,但我認為第一個演算法更好,累計一個看法的輸出,給它更大的權重。
第二種整合學習的方式就是堆疊。假設有兩種推薦演算法,我把第一種演算法的輸出的結果作為第二種演算法的輸入或者輸入的一部分,再訓練第二種演算法。
第三種就是提升,我把一個推薦演算法的輸出值和我想要的真實的值的偏差再作為我的訓練資料進行推理、進行訓練,這也是一種整合學習的方法。
如何評估推薦系統
然後我想給大家談一下,怎麼評估推薦系統。
說到推薦系統的評估的方式,馬上能想到 離線評估。根據有歷史資料,一個使用者喜不喜歡某個東西,我把歷史資料分成兩部分,一部分作為訓練資料,一部分作為測試資料,我用訓練資料的值來預測測試資料集裡面的值,如果推薦的值跟我測試資料裡面真實值相差少,就認為我是對的,這是很常見的一個方法,叫離線評估的方法。
第二個是 問卷調查,就是在網站或者頁面上放置一個按紐,直接告訴使用者:我現在給你推薦這個電影,你覺得好或者不好?使用者就直接給做評價。或者是搞個問卷調查,問使用者願不願意做個問卷調查。在設計問卷調查的時候要注意一下:同一個問題的兩種形式,比如說問使用者喜不喜歡《夏洛特煩惱》這個電影,可以首先用一個句子問:《夏洛特煩惱》是不是你喜歡的電影;第二個問題是:你是不是特別討厭《夏洛特煩惱》這個電影,因為有這樣兩個加起來可以讓使用者重新思考,並且防止他有的時候只是點錯了。還有就是所言非所意,這是什麼意思?其實人有情感有理智,也有一些潛意識,他在問卷裡告訴你他喜歡某個東西,不一定是他真的喜歡,這也是值得注意的一個問題。
第三個評估推薦系統方法是 使用者學習。請一堆使用者,做一個小規模的測試,他測試的不只是推薦系統好不好,還包括這個推薦系統最後呈現的使用者介面好不好。這是針對整個使用者體驗進行測試,只是幾十個使用者小範圍的測試,可能會發現系統 90% 左右的大問題,這是一個非常好的評估推薦系統的方法。
然後就是最近非常流行的所謂 A/B 測試,或者所謂 線上測試。一個新的模型出來,一個新的演算法出來了,隨機選擇一些使用者,比如 10% 的使用者,用新演算法的結果,另外 90% 還是用原來的演算法的結果,然後比較新演算法的 10% 的使用者最後是不是獲得了更好的推薦效果,比如說有購買更多的商品,或者是更踴躍的來訪問我們的網站。
推薦系統架構 & 總結
接下來,我想總結一下。
有一個理論叫做:No free lunch theory,天下沒有免費午餐。就是說 世界上沒有一種演算法在解決任何問題的情況下都比另外一種演算法好,即使是現在最火熱的深度學習演算法,也並不意味著它會比傳統的學習演算法在解決任何問題下都好。所以組合多種不同的演算法,就顯得很重要,就是我前面提到的整合學習的方法。
Netflix 是美國的一個電影網站,相當於愛奇藝這種收費的電影網站,它的推薦系統非常有名,他們之前搞了個比賽,獎金有一百萬美金,讓大家比賽誰能夠比他們原來的推薦演算法提高 10% 的效果。最後贏得這個比賽的是當時 AT&T 的一個團隊,他們用了幾十種演算法,把這幾十種演算法結合起來,做一個推薦系統,提高了 10.09% 的效果。這就是大家要注意的,把多種演算法合在一起。
最後呢,我想談的就是在架構,我以 Netflix 為架構為主說如果要做一個推薦系統,應該怎麼來選擇軟體系統。
分別要把你的系統分成:離線的部分,近實時的部分和線上的部分。
離線的部分可以使用 Hadoop,Hive、Pig 或者 Spark 這種方式來做大規模的計算,因為這種計算都需要很長的時間。近實施的系統呢,他們使用 Cassandra 這種分散式資料庫,MySQL,還有 Catch。還有實時系統,就是在記憶體裡面計算這個系統,在這個部分的系統要求是:資料量比較少,演算法比較簡單,反饋一般都是毫秒為單位,在這個在實時系統裡邊一般都只做排序,在離線這部分可能要做比較複雜的事。
那這就是我今天要講的所有內容,因為今天時間有限,我只能點到為止,如果你對推薦系統感興趣,對我前面講到的那些推薦系統想要有個更深入的瞭解,從演算法到實現,都感興趣的話,你可以掃我們貪心科技的二維碼,進入我們的公眾號,我們會在裡面提交更多的內容。
weixin.qq.com/r/eCqPl5XE6… (二維碼自動識別)
問答環節
Q1. 深度學習使用者 ID 加 embedding 怎麼操作?
A:Embeding 的本質是對輸入的特徵進行固定長度的編碼。 使用者 ID 的值可能是從 0 到 10000, 是一個整數, 通過 Embeding 層, 輸出變為一個預先設定長度的向量。 這樣做的目的是為了通過訓練資料得到更豐富的資訊, 這個向量能包含了對應使用者 ID 的資訊。
Q2. 探索和利用 和協同過濾 區別
A:探索和利用這種演算法比較適合物品種類比較少的情況, 通常使用在推薦系統的最後一個階段。 就是使用其它演算法找出最有可能被某個類別使用者接受的物品以後, 再使用探索和利用來對物品重新排序。協同過濾相對計算量小,更適合大規模資料的情況。
Q3:PPT 能共享嗎?
A:請關注我們公眾號,我們會在裡面分享。
Q4. 能具體說一下整合學習中的堆疊和 boosting 嗎?
A:堆疊:前一個演算法的輸出作為下一個演算法的輸入,或者輸入的一部分Boosting:請一個演算法的輸出和實際值的差,作為本演算法或者其他演算法的輸入
Q5:線上排序的演算法現在主要應用比較廣泛的都有哪些?
A:我不太明白你的具體問題。我假設你的問題是“Learning to rank”裡面最流行的演算法, 我的答案是:LambdaMART
Q6:請問用 spark 做推薦系統,除了 mllib 的 ALS 演算法,還有什麼實現方法呢?
A:Spark 官方只提供了協同過濾的 ALS 演算法。 其他演算法還需要自己實現。
Q7: 深度學習的輸入層請詳細講解下?
A:這個問題太寬泛,需要具體情況具體分析。
Q8:item2item 協同過濾 跟矩陣分解 應用環境分別是什麼樣的?
A:item2item 的協同過濾算是一種最近鄰方法 (Neighborhood Method), 相對矩陣分解, 比較容易實現, 比較容易微調, 可解釋性也比較好。
Q9: 推薦演算法通常都和使用者畫像一起使用嗎?
A:如果你能夠獲取使用者畫像,當然應該利用。高質量的使用者畫像一定會提高推薦的效果。
Q10: 老師我想問下關於 LFM,在矩陣分解後再相乘,和目標矩陣做差的過程中,目標矩陣中沒有過的值是怎麼補了?
A:目標中沒有的值不用補,做差的過程只需要考慮存在的值。
Q11:embedding 簡單用 one hot?
A:理論上講, 你可以直接使用全連線層和 one hot 編碼代替 Embedding 層。 但是在許多情況下, 直接使用 one hot 編碼作為輸入計算量會大增。 例如在自然語言處理裡面, 輸入的 ID 值可能在百萬級別, 如果直接 one hot 編碼, 輸入的向量就是百萬級別的長度, 如果還需要使用 batching(批處理)來提高運輸效率,那麼內容佔用和計算量都是巨大的。
Q12: 推薦系統有在工業(電力、化工、製造)領域的應用麼?
A:我還沒有發現推薦系統在電力,化工和製造業的應用。我想在工業 4.0, 先進製造業, 私人訂製的領域,推薦系統應該是大有可為的。
Q13:剛才其實整個的這個課程講了很多的演算法,從協同過濾到深度學習,比如說一個工程師面對一個推薦系統的這樣一個問題,大概有沒有一個 guideline,對這類問題,我們需要採用這種一個協同過濾的方式,然後可能對另一個沒問題可能採用深度學習的方式,有沒有大概這樣一個 guideline?
A:我的建議是先從基於內容的開始,基於內容的推薦系統和基於協同過濾的推薦系統開始,為什麼呢?即使你用深度,即使你開始上更 fancy 的演算法,你也不知道你的演算法是不是比傳統的演算法好,如果你用一個轉動的演算法先做出來了,你再用更先進的演算法,這至少讓你有一個比較說這個演算法好,不然的話,你都雲裡霧裡,你即使用了更先進的演算法,你不知道先進的演算法是不是真的好,這是其一;
其二是越先進的演算法越難以實現,比如說我講到 Netflix 花一了一百萬美金,得到了 AT&T 貝爾實驗室得冠軍的演算法,但實際上他們並沒有在他們的系統裡面使用,為什麼?因為太複雜了,一個演算法在學術界裡面可以很複雜,在工業界裡面實現,要考慮到記憶體,考慮到計算量,考慮到一個程式設計師能不能看懂那個演算法,考慮到你的程式碼是不是比較容易 maintain,那考慮到這些以後,Netflix 最後沒有使用那個演算法,也就是說,如果要著手的話,我建議你從前面的演算法開始,最先使用的是基於內容的推薦和基於協同過濾的推薦,接下來才是更先進的演算法。
Q14:還有一個問題:因為深度學習這種技術在影象識別這種領域已經很成熟了,但是我想了解一下比如說在工業界裡面深度學習目前的在推薦系統這塊應用情況到底是怎麼樣的?
A:現在深度學習很火了,那現在是不是有向深度學習做推薦系統的這樣一個趨勢呢?是有的,為什麼有呢?比如說有的圖片分享網站,或者像 YouTube 這種視訊分享網站,大家往上面發東西,並沒有人告訴你裡面的內容是什麼樣,上傳短片上去,這個系統它並不知道這個短片作者是誰,風格是什麼,有哪些演員在裡面,那什麼都不知道,怎麼知道這裡面的相關性呢?
圖片也一樣,怎麼知道推薦什麼圖片呢?深度學習,比如說 CNN 卷積神經網路,它可以做影象和視訊裡面的物質的識別、提取,他可以告訴你這個圖片是奧巴馬,這個圖片是川普或者是其他人。包括音樂他會告訴你這個音樂的風格是什麼。
所以說現在的確是有向深度學習進展的一個趨勢,而且像 LSTM、RNN 它可以獲取時間資訊,就是時間上的相關性。比如說一個人他喜歡看《甄鬟傳》,還喜歡看《紙牌屋》,但是他更喜歡看《紙牌屋》,那傳統的推薦系統,我在看甄鬟傳的 21 集,看完了我推薦什麼呢?推薦《紙牌屋》,為什麼?因為它更喜歡紙牌屋,但是在這個前提下,我告訴你:我正在看《甄鬟傳》的 21 集,你是應該推薦我《紙牌屋》嗎?你應該推薦我《甄鬟傳》的 22 集,因為我正在看《甄鬟傳》的 21 集。這種時間上的,時間序列上的這種預測,顯然是用這種 LSTM、遞迴神經網路會比較好。
講師介紹
袁源,英文名:Jerry,美國微軟總部資深工程師、主導多款核心推薦系統的研發,是人工智慧、分散式系統、雲端計算方面的專家。博士畢業於美國新澤西理工,擁有 14 年人工智慧、推薦系統、自然語言處理、數字影象和視訊處理專案經驗。曾師從中國科學院王守覺院士從事人臉識別研究、共同發表論文。在美國博士期間,主要研究 NASA(美國航天局)支援的基於人工智慧的空間天氣預測專案。
更多幹貨內容,可關注AI前線,ID:ai-front,後臺回覆「AI」、「TF」、「大資料」可獲得《AI前線》系列PDF迷你書和技能圖譜。