黃波:AI技術在知乎的應用實踐

人工智慧頻道發表於2019-01-16

導語: 本文根據知乎AI團隊技術負責人黃波於第十屆中國系統架構師大會(SACC 2018)的現場演講《知乎如何利用AI理解內容和使用者》內容整理而成。

講師介紹

黃波 ,知乎AI團隊技術負責人。負責知乎NLP與使用者畫像相關技術與業務。碩士畢業於北京大學智慧科學系,曾在JMLR、ICLR等國際頂級期刊及會議發表多篇學術論文。在加入知乎前,曾任百度自然語言處理部門高階演算法工程師,從事智慧互動、語義表示、語義標籤、內容質量的研發工作,參與了度秘、百度feed流等產品的關鍵技術突破。\

正文:

大家下午好,非常感謝 SACC 大會的邀請,我今天演講的主題是 AI 技術在知乎的應用,內容重點介紹偏底層的相關技術,包括知識圖譜、內容分析與使用者分析。最後會簡單介紹這三塊技術在相關業務線的應用。


一、知識圖譜的構建與應用

我們先來看一下知識圖譜,知識圖譜的構建包括三個核心要素:本體、本體屬性以及本體間的關係。其構建過程大概分三步:第一步基於網際網路上結構化和半結構化資料抽取本體資訊,再透過知識融合構建統一的本體庫,這裡本體通常包括實體、概念、事件等;第二步我們會挖掘本體的屬性以及本體間的關係,比如本體 勒布朗 詹姆斯 的型別屬性是 人物 、領域屬性是 體育 ,與本體 德懷恩 韋德 有較強的相似性,與本體 ”NBA“ 屬於上下位關係等;第三步是知識圖譜的表徵,我們可以利用離散如 RDF 規則語言和基於神經網路的 embedding 方式來表示知識圖譜。

我們在構建知識圖譜時主要以知乎話題為核心,將百科詞條與話題進行融合構建本體庫,並豐富本體的內容資訊,包括名字、描述、解釋等,同時會挖掘本體相關的屬性,例如本體的型別是人物還是地點,以及對應領域屬於網際網路還是體育。

本體關係的構建分為兩種,第一種是話題的上下位關係,上圖中可見,韋德的上位話題是 NBA 球員;另外是話題的相似關係,比如說話題 韋德 和話題 詹姆斯 的相似度就非常高,話題上下位為有向關係,相似關係為無向的。另外也有本體和屬性之間的關係, 詹姆斯 對應一級領域為 體育 、二級領域為 “NBA” ,對應的型別為 人物

對於知識圖譜的表示,主要有兩類方法,一類是離散表示,透過各種規則語言如 RDF 等描述結構化的知識,離散表示的優點是直觀,可解釋性強,此外透過規則語言也能很好地支援較為複雜的結構化知識,當然缺點也比較明顯,比如離散表示存在的稀疏性問題,可擴充套件性也相對較差。另一類是近幾年比較流行的連續表示,透過神經網路等方法學習結構化知識的 embedding ,將結構化知識對映到低位稠密的空間,最大的優點能夠很方便被用於各種上層計算,比如作為神經網路模型的輸入等,缺點是可解釋性沒有離散表示強,表示能力也稍微弱一點,對於較複雜的知識結構不能很好地支援。

下面簡單介紹知乎知識表示的模型,我們主要圍繞話題為核心來做語義表示。下圖是一個例子,問題標題是 科比和詹姆斯的區別在哪裡? ,相應的會打上相關的多個話題,包括 “NBA” 科比 詹姆斯 等。模型輸入層包括話題的 embedding 表示,同時加上視窗對應詞的 embedding ,預測目標為視窗的中心詞,此外模型預測目標還加了其他兩個任務,一個目標是用話題的 embedding 去預測其對應的領域,另一個是預測其對應的型別。

模型訓練完之後,可以將話題 詹姆斯 和其他話題以及所有的詞對映到同一個語義空間裡。有什麼用呢?既然大家都在同一個語義空間裡了,基於話題之間的相似度我們可以構造一個話題的相關性圖譜,這裡有一個相關性圖譜的例子,輸入給定話題 “Facebook” ,相關性圖譜可以輸出 與其相關的話題,例如 祖克伯 “Facebook 廣告 “Twitter” 等,相關性圖譜可以用在使用者潛在感興趣話題推薦,使用者興趣圖譜構建等場景。


二、內容分析實踐

講完知識圖譜,接下來講內容分析。什麼是內容分析呢?簡單來說就是給內容打上各種各樣的標籤,包括語義層面的一二級領域、話題、實體、關鍵詞等標籤。這裡有一個例子,關於物理的一個問題 ——“ 有哪些看似荒謬的事,卻有著合理的物理解釋? ,這個問題對應的一級領域是 自然科學 ,二級領域是 物理學 ,另外還有粒度更細的話題,包括 科普 物理科普 冷知識 等等。在語義維度標籤基礎上,我們還會打上內容的質量標籤,內容質量包括專業性分析和題文相關性分析,專業性分析是透過文字分析模型判斷某個回答 / 文章內容的專業性,並給出判斷其專業性程度的打分,題文相關性模型則是給出回答與問題的相關性打分。最後會基於文字分析模型來判斷內容的時效性,時效性標籤是上層推薦系統很重要的一個特徵,比如低時效的優質內容可以一直在推薦系統裡流通被使用者消費,而如果是高時效性的優質內容則應該短時間加大其分發量,並且過期之後就不能再讓它流通了。

關於語義標籤,我們由粗到細構建了一個完整的語義標籤體系,包括一二級領域領域、話題到實體 / 關鍵詞等。為什麼要做這種多粒度的語義標籤?不同應用場景對語義標籤粒度需求不一樣,另外對不同粒度的語義標籤要求也不一樣,比如一二級領域我們希望它是一個粒度相對較粗並且儘量完備正交的分類體系,以儘可能保證任何一篇內容都能被分到對應的一二級領域,話題粒度的標籤我們希望模型能夠高準確度地打上相關話題,類似地,針對實體 / 關鍵詞,要求模型的準確度比較高,優先保證熱門的實體 / 關鍵詞被召回就可以。

接下來透過具體展開來講幾個模型來介紹我們怎麼做內容分析。

內容分析——領域分類

首先是領域分類,當時做的時候面臨最大的問題是沒有訓練資料,在梳理出分類體系後,對應的分類體系沒有相應訓練資料,短期內透過人工標註也不太現實,那要怎麼構建訓練資料呢?我們基於知乎資料每個問題都帶有相關話題的特點,再結合以話題為核心的知識圖譜,構建了一個帶噪聲的訓練資料集。可以看下面這個例子,對於問題 零基礎如何學繪畫? ,其對應的話題有 繪畫 自學 ,而 繪畫 在知識圖譜裡面所屬的一級領域是 藝術 自學 所屬的一級領域是 教育 。這樣的話,這條訓練資料就會同時有 藝術 教育 這兩個類別,但對於這條資料來說教育在這個類別是錯的,也就是屬於噪聲標籤。為了降低噪聲對模型效果的影響,我們在模型訓練時加入了降噪層來進行降噪,同時預測階段透過 ensemble 模型的方法進行預測。

對於傳統的文字分類方法,一般是預處理後,結合人工特徵和淺層分類器為主的方法。最近幾年比較流行基於神經網路的 end2end 文字分類模型,比如說 FastText TextCNN RNN/LSTM 等文字分類模型。我們選取 LSTM 作為 baseline 模型,但 LSTM 包括上述其他模型都不能很好地降低噪聲資料對於模型的影響。

模型展開來講主要分為兩部分,模型左邊的輸入是問題標題中的詞 (question title) ,每個詞會對應一個 embedding ,詞的 embedding 經過一個 LSTM 層後再過一個 Attention 得到問題的表示;右邊部分的輸入是問題自帶的話題( question topic ),同樣話題也會有對應的 embedding 層,把話題表示加起來再透過一個 Identity+ L1 Noise  的降噪層得到這個話題降噪後的表示。損失函式層面,我們沒有采用常用的交叉熵作為 loss ,因為在構建訓練資料時,我們發現同一個資料可能會出現多個標籤,有時候一個問題確實可以屬於多個領域,而有時是噪聲資料,採用交叉熵損失較難降低噪聲資料的影響。我們採用了 sigmoid 損失加最小熵正則約束的方式來訓練模型, sigmoid 損失是多標籤任務常用的損失,儘量讓模型把多個正例標籤都預測為 1 ,但是標籤之間沒有競爭關係,我們又加上最小熵正則來讓標籤之間產生競爭以增加模型的降噪能力。在模型預測階段,我們採用了多模型 ensemble 的方式,考慮知乎資料帶有話題的特點,並且話題都是使用者打的,使用者打的好處就是可以引入額外知識,當然也會帶來一些噪聲,我們單獨訓練了一個基於話題的文字分類模型,會和基於標題的模型 ensemble 起來進行線上預測。

內容分析——話題匹配

我們再看一下話題匹配。話題匹配是一個文字多標籤任務,它的定義是給定一段文字,從給定話題集合中匹配出相應的話題,以自動給問題、文章、 Live 等進行相關話題標註。這裡有個例子,對於問題: 如何評價美劇西部世界 ,模型會打上 西部世界 西部世界第二季 美劇 人工智慧 等話題,大家平時用知乎提問,問題提出後模型就會推薦出相應的候選集。另外對使用者搜尋 Query 模型也能打上相關話題,可以用作搜尋特徵或使用者興趣畫像的沉澱等。

我們在分析時,發現話題匹配這個問題非常難,到底難在哪?難點可以拆成以下三點:第一,話題本身語義粒度的差異特別大,大到領域級別的 娛樂 這種話題,小到 吳亦凡 這種實體級別話題,這種語義粒度差異特別大的情況會讓模型很難去學習;第二,話題集合數非常大,大概有 10 萬量級,長尾話題(出現次數小於 10 )特別多,佔比大概 80% 以上;第三,部分話題之間語義相似度特別高,例如 “Python” “Java” 插畫 繪畫 這種,透過深度學習模型較難去捕捉這種細微的差異。我們嘗試過很多端到端的深度學習方法,包括經典的 FastText Matching CNN LSTM+Attention 等端到端的方法,這些方法都有一個問題,模型傾向於去預測偏高頻 話題,低頻、長尾話題的效果較差。

針對上述問題,我們將話題匹配進行了拆解,類似推薦系統一樣,包括召回 + 排序兩部分。召回的邏輯是給定候選問題,我們先從標籤庫裡找出數十個最有可能相關的候選話題,在對這候選的數十個話題進行精細的排序打分,最終得到 1 5 個相關話題。模型效果還算不錯,準確是 93% ,召回是 83%

接來下具體展開講下召回和排序的策略,召回層分三個策略,第一個是比較簡單的 AC 多模匹配,直接把匹配的話題作為候選集合;第二個比較有意思,我們在經典的點互資訊( PMI )演算法上做了最佳化,提出了一個兩趟對齊演算法的 PMI 演算法,解決了傳統 PMI 不能很好區分 “Python” “Java” 這種經常共現的兄弟節點的問題;最後我們會利用之前構建的知識圖譜,把話題的上位話題也作為候選集合召回。

在排序的時候,剛才也有提到單一的端到端模型不能很好地解決話題匹配任務中的問題,我們在深度學習的模型基礎上,引入了一些規則策略,最終是一個多策略融合的排序模型。如上圖,我們採用了基於 LSTM pair wise 排序模型。左側輸入是文字的詞,詞上面接一個 embedding 層,過一個 LSTM 層後再過一個 Attention 層來得到一段文字的表示,右側分別是正負話題標籤,話題上同樣接了一個 embedding 層,再過一個全連線層後得到話題的表示,再將其和該段文字的表示計算相似度,分別計算正負樣本與文字的相似度後,最後再計算 pair wise 的損失。此外我們還加三個基於規則的排序打分,第一個利用了當前話題與召回階段得到的數十個話題的相似度得分,思路是正確的話題會傾向於跟召回階段的大部分話題都比較像,第二個規則我們利用了話題圖譜權重來進行打分,最後一個規則比較直觀,會對完全匹配的話題進行加權。

內容分析——專業性

最後再講講內容的專業性分析,知乎鼓勵大家去生產專業性的內容,同時也希望專業內容在知乎得到更多的流通,但難點是機器怎麼知道內容是否具有專業性,或者說推薦演算法怎麼知道內容的專業性程度,透過文字分析模型判斷內容專業性是非常必要的。專業性識別的難點主要在於定義比較模糊,針對具體的一條資料很容易判斷它的專業性,卻很難制定出一個具體的標準,因為不同領域內容判斷其是否為專業性的標準差異很大,另一個難點是缺少高質量的訓練資料。

專業模型大概分了兩個階段,第一階段主要利用使用者行為,我們分析發現針對專業性內容,使用者更傾向於收藏,很直觀地思路是,我們利用 hits 演算法對使用者建立的收藏夾和收藏夾的內容進行建模,計算出的每個收藏夾權重及對應收藏夾裡的內容權重,在此基礎上計算出內容的專業性得分。

這個方法優點是準確度非常高,缺點是覆蓋相對較低,因為是基於使用者行為會有一定的滯後性,沒法判斷新內容的專業性。在第二個階段,我們採用了基於文字語義分析的分類模型。這裡採用了傳統文字分類的人工特徵加淺層模型的思路,為什麼不用深度學習呢?剛才也提到訓練資料獲取成本很大,我們大概只有幾萬條訓練資料,而專業性的回答和文章又特別長,直接上深度學習,模型大機率會過擬合。我們的人工特徵主要包括兩個層面。第一個是文字風格的特徵,包括詞性,還有標點之類的。另一個是非常重要的語義特徵,我們基於全量語料對詞進行聚類,並把詞的類簇當作專業性模型的一個基本特徵,最終專業性的效果準確是 84% ,召回是 60% ,應用於首頁推薦頁也取得了收藏率和點贊率等指標顯著提升的正向效果。


三、使用者分析實踐

在理解完內容後,我們也需要對使用者進行分析,簡單來說就是給使用者打上各種各樣的標籤,同時也會對使用者社交關係的進行挖掘與建模,比如使用者聚類、使用者親密度等。使用者分析首先會分析使用者的基本屬性,像性別年齡以及使用者本身的一些登陸地、裝置資訊等基本屬性。然後就是使用者興趣的建模,興趣計算主要來源於使用者對推薦系統的互動行為,我們構建了基於不同粒度語義標籤的使用者興趣以靈活支援多種場景,並且時間上也分為長期興趣和實時短期興趣,另外也可以根據內容的專業性標籤和使用者的互動行為判斷其對於專業性內容的偏好。這裡是一個使用者分析的例子,對於 程式設計師張三 這個使用者,我們能獲取他的以下畫像資訊:性別 ,興趣標籤有 “AI” 機器學習 ,更喜歡看專欄文章這種內容型別的資源,對回答、影片等型別偏好度較弱,另外也更偏好閱讀專業性的內容,說明 程式設計師張三 喜歡在知乎學習計算機和機器學習相關的專業性知識。另一個使用者 運營小麗 則區別很大,她喜歡看綜藝和電視劇相關的討論,對專業性內容偏好較弱。

使用者分析主要依賴於使用者和推薦系統的互動行為資料,這裡就要求我們能處理好大資料量的離線計算和快速實時計算等大資料相關工作,並且還需提供高併發低延時的線上服務,我們設計了一套完善的離線與線上計算架構,以支撐策略更新和上層業務呼叫需求。整體架構上分了三大塊,第一部分是實時計算,包括使用者實時行為儲存,使用者實時興趣計算等。第二部分是離線計算,包括模型迭代後的資料批次更新,包括使用者基本屬性、使用者長期興趣建模、使用者聚類等工作。

最後是線上服務這一塊,離線計算通常是批次計算的邏輯,比如模型天級別更新去批次預測所有使用者的性別或者興趣標籤等,但是離線計算的結果需要 灌到 線上服務的儲存供業務方呼叫,如果直接批次將離線計算的結果匯入線上服務會導致線上業務請求失效,線上服務也就崩了。我們在流程上先把批次資料灌到離線叢集,再透過 kafak 訊息非同步流式地同步到線上叢集,以保證線上服務的穩定性。另外也會有快取請求的相關工作,以支援線上高併發的請求。

下面再介紹下基於 spark streaming 的使用者實時興趣計算流程。首先我們需要把使用者的點選行為、展現以及搜尋行為對應的實時資料流打通並進行實時處理,組成一個三元組 < 使用者、內容、行為型別 > 。三元組抽取完之後,我們會對內容進行進一步的分析,主要是提取內容對應的領域、話題、關鍵詞等語義標籤。為了增加實時處理效率,對問題、文章、回答等內容,可以直接透過 token 到內容畫像服務去獲取之前已經快取好的計算結果,而搜尋 query 沒法提前算好,需要去呼叫語義理解模組實時計算獲取其對應的標籤,比如關鍵詞抽取服務、話題匹配服務等。提取內容標籤之後,我們會得到一個 < 使用者 , 標籤,行為型別 > 三元組資料,再以 < 使用者、標籤 > 進行聚合後,作為終端使用者興趣計算的輸入。使用者興趣計算,主要包括新興趣的疊加,舊興趣的衰減,策略上會去做一些引數平滑、熱門打壓等。

最後是使用者表示和聚類,使用者表示是指透過神經網路或各種 embedding 方法得到使用者在低維空間的 embedding 表示,使用者 embedding 表示可以被靈活應用於各種場景。知乎做使用者表示有天然的優勢,訓練資料非常多,有大量的使用者社交關係,即使用者間的單向和雙向關注行為資料,同時使用者也會關注話題、問題、專欄、收藏夾等資料,我們把上述資料揉到一起就組成了一個異構圖,再利用 graph embedding 方法來獲取每個使用者的表示。


四、典型業務應用場景

剛才提到的知識圖譜、內容分析以及使用者分析,最主要的應用場景是首頁資訊流推薦。內容分析和使用者分析會作為整個推薦系統重要的底層特徵,被用作召回、排序階段。當然召回除了基於內容標籤的方式,也有基於協同演算法和近幾年比較流行的基於神經網路的召回方法。在排序階段,內容和使用者標籤也會作為排序模型的輸入特徵,另外某些標籤也可以作為排序模型的目標,比如專業性內容的佔比等。

剛才提到,推薦系統在召回階段不止可以用基於內容標籤的方式,也可以用協同和神經網路的方法,那麼用標籤來做推薦系統召回有什麼優點和缺點?優點我這裡列了四點,第一個,可解釋性強,粒度越細越準確;第二、會越用越準,能積累長期興趣;第三、可以對各種標籤做比例的精準控制,例如強制要求專業性內容的最小佔比等;第四,沒有內容冷啟的問題,任何打上標籤的內容都可以被召回;另一方面基於標籤召回也存在泛化性較差、標籤不能覆蓋所有內容等缺點。

除了被用在首頁推薦的場景,內容和使用者標籤也可以應用於資料分析以更好地支援業務和產品決策,典型的例子有:分析專業性內容在生產和消費的分佈情況、按領域維度對內容生產和消費進行分析、按人群分析比如大學生對於各種內容的生產 / 消費分佈情況。

最後說下使用者表示,它的應用場景很多,典型的場景有受眾擴充套件,簡單來說就是可以對種子人群進行擴充套件;另外就是基於使用者表示的使用者聚類,還可以進一步對聚類結果進行分析給每一個類打上相應的人群標籤,用作人群或者圈子的劃分。這裡是一個受眾擴充套件的例子,有一些私家課已經有一批點選或者購買的種子人群,現在我們需要找一批使用者發優惠券,要保證轉化率就要求發給跟這些已經點選或購買使用者比較相似的使用者, 這裡我們就可以基於使用者表示計算出與這批種子使用者相似的使用者。

以上是我今天講的內容,歡迎大家進一步交流,謝謝!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2563097/,如需轉載,請註明出處,否則將追究法律責任。

相關文章