窺大廠:為你揭秘知乎是如何應(yīng)用AI的

12 評(píng)論 9123 瀏覽 101 收藏 60 分鐘

經(jīng)常刷知乎的你是否好奇過(guò)這個(gè)問(wèn)題:知乎的AI應(yīng)用在哪些領(lǐng)域?應(yīng)用了哪些技術(shù)和模型,產(chǎn)生了哪些作用?本文將從內(nèi)容生產(chǎn)、內(nèi)容消費(fèi)與分發(fā)、內(nèi)容連接、內(nèi)容治理這四大應(yīng)用場(chǎng)景來(lái)為你揭曉答案。

我們相信,在垃圾泛濫的互聯(lián)網(wǎng)海洋中,真正有價(jià)值的信息是絕對(duì)的稀缺品。

知乎CTO李大海曾在全球移動(dòng)互聯(lián)網(wǎng)大會(huì)提到知乎誕生的初心,而這位CTO也在各種場(chǎng)合不遺余力的提到知乎對(duì)于AI投入和應(yīng)用。

微信圖片_20190123133913.png

知乎合伙人、CTO李大海

對(duì)于一個(gè)的坐擁1.4億多用戶(hù),平均日活躍用戶(hù)量超過(guò) 3400 萬(wàn),人均日訪問(wèn)時(shí)長(zhǎng) 1 小時(shí),月累計(jì)頁(yè)面訪問(wèn)量達(dá)到 230 億的大廠來(lái)說(shuō)(數(shù)據(jù)截止2018年?3 月),知乎的AI都到底應(yīng)用在了哪些領(lǐng)域,這中間應(yīng)用到了哪些技術(shù)和模型,又產(chǎn)生了哪些作用?

今日第1期數(shù)智方法論將從內(nèi)容生產(chǎn)、內(nèi)容消費(fèi)與分發(fā)、內(nèi)容連接、內(nèi)容治理這四大應(yīng)用場(chǎng)景帶你一窺知乎AI。

image.png

一、內(nèi)容生產(chǎn)

為了讓用戶(hù)快速看到自己感興趣的提問(wèn)并且激發(fā)用戶(hù)的創(chuàng)作欲望,知乎在內(nèi)容生產(chǎn)上從兩個(gè)方向進(jìn)行了布局:?jiǎn)栴}提出與問(wèn)題路由。

1.1 問(wèn)題提出

問(wèn)題提出是一個(gè)從用戶(hù)的查詢(xún)中識(shí)別出意圖,發(fā)現(xiàn)知乎現(xiàn)在還無(wú)法滿(mǎn)足的意圖,引導(dǎo)用戶(hù)進(jìn)行提問(wèn),并根據(jù)用戶(hù)的意圖生成合理的問(wèn)題的過(guò)程,得到提問(wèn)和描述后,后臺(tái)的卷積神經(jīng)網(wǎng)絡(luò)模型會(huì)從知乎超過(guò)二十五萬(wàn)個(gè)話(huà)題中選擇出最匹配的話(huà)題,進(jìn)行話(huà)題的推薦和綁定。

1.2 問(wèn)題路由

問(wèn)題路由是如何分發(fā)問(wèn)題以讓合適的用戶(hù)看到問(wèn)題、激發(fā)他們的創(chuàng)作欲望。

這是一個(gè)典型的機(jī)器學(xué)習(xí)排序(learning to rank)問(wèn)題:先在眾多用戶(hù)中通過(guò)召回定位合適的范圍,然后通過(guò) pointwise/pairwise/listwise 等排序方法,找出最有可能接受邀請(qǐng)以及最有可能產(chǎn)生優(yōu)質(zhì)回答的用戶(hù),進(jìn)行推薦,或讓用戶(hù)選擇委托系統(tǒng)進(jìn)行邀請(qǐng)。

問(wèn)題路由在其中起到的就是提升匹配精準(zhǔn)度和效率的作用。

image.png

二、內(nèi)容分發(fā)和消費(fèi)

內(nèi)容的分發(fā)和消費(fèi)部分,知乎從首頁(yè)信息流、搜索和相關(guān)推薦、首頁(yè)架構(gòu)等進(jìn)行了不斷地優(yōu)化和升級(jí),力圖讓每個(gè)用戶(hù)能快速、便捷地獲得更多感興趣、有用的內(nèi)容。

2.1 首頁(yè)「水晶球」推薦系統(tǒng)

知乎的「水晶球」信息流推薦框架是一個(gè)基于多策略融合的多源內(nèi)容推薦系統(tǒng),關(guān)于「水晶球」的來(lái)源知乎首頁(yè)負(fù)責(zé)人張瑞提到:

我們把系統(tǒng)命名為「水晶球」,是希望能夠通過(guò)這個(gè)系統(tǒng)得以一窺用戶(hù)想要看到什么內(nèi)容,然后推薦給他。

如下圖所示,在這個(gè)系統(tǒng)中,首頁(yè)上出現(xiàn)的內(nèi)容會(huì)經(jīng)歷兩次排序: 第一次是從數(shù)十個(gè)推薦隊(duì)列里被「召回」,第二次是在合并后經(jīng)過(guò)深層神經(jīng)網(wǎng)絡(luò)(DNN)的「排序」。

image.png

「水晶球」信息流推薦框架

對(duì)于如何「召回」和「排序」,知乎團(tuán)隊(duì)也做過(guò)詳細(xì)介紹:

  • 「召回」的第一個(gè)步驟是,召回模塊根據(jù)用戶(hù)的歷史行為表現(xiàn)(用戶(hù)畫(huà)像),確定數(shù)十個(gè)推薦隊(duì)列,或者說(shuō)數(shù)十個(gè)「召回源」的召回比例和召回?cái)?shù)量。推薦隊(duì)列是一個(gè)個(gè)含有特定標(biāo)簽的內(nèi)容合集。有些隊(duì)列里內(nèi)容性質(zhì)相似,比如熱點(diǎn)新聞隊(duì)列、視頻隊(duì)列。還有的隊(duì)列與用戶(hù)行為緊密相關(guān),比如關(guān)注的人隊(duì)列、搜索關(guān)鍵詞隊(duì)列。
  • 「召回」過(guò)程的第二個(gè)步驟是各召回源根據(jù)用戶(hù)的需求分別將自己的隊(duì)列中的內(nèi)容做排序后,按召回?cái)?shù)量返回內(nèi)容。
  • 「召回」過(guò)程會(huì)選出數(shù)百條候選內(nèi)容進(jìn)入「排序」過(guò)程,最后,DNN 可以在一百毫秒內(nèi)對(duì)這數(shù)百條完成打分和排序過(guò)程,決定推送給用戶(hù)的內(nèi)容。

2.2 知乎首頁(yè)信息流算法進(jìn)化史

2.2.1 Edge Rank 算法

知乎從?2013 年就上線(xiàn)了信息流產(chǎn)品。當(dāng)時(shí)的主邏輯是一套叫做 Edge Rank 的算法。把用戶(hù)關(guān)注的所有人和話(huà)題所產(chǎn)生的所有新內(nèi)容,當(dāng)成候選池,候選池里的每個(gè)內(nèi)容的權(quán)重與三個(gè)因素相關(guān),分別是表示用戶(hù)對(duì)關(guān)注對(duì)象的關(guān)注度的權(quán)重,內(nèi)容的類(lèi)型,以及時(shí)效性權(quán)重。

image.png

2.2.2?GBDT 算法

隨著知乎體量的增長(zhǎng),Edge Rank 已經(jīng)不能滿(mǎn)足分發(fā)效率的需要。

知乎從 2016 年開(kāi)始升級(jí)首頁(yè)產(chǎn)品。首先使用 GBDT 來(lái)進(jìn)行 CTR 預(yù)估,并以 CTR 預(yù)估值作為排序的主要考慮因素。

GBDT 算法的引入,對(duì)知乎首頁(yè)的分發(fā)效率提升是非常可觀的。

GBDT 的算法首次上線(xiàn),用戶(hù)停留時(shí)長(zhǎng)就有了 12% 的提升,后續(xù)不斷改進(jìn)算法,一年時(shí)間里面,累積獲得了 70% 的用戶(hù)在線(xiàn)時(shí)長(zhǎng)的增長(zhǎng)。

GBDT 的優(yōu)勢(shì)是可解釋?zhuān)⑶倚枰挠?xùn)練數(shù)據(jù)量級(jí)不算太大,GBDT 的研發(fā)、調(diào)試和訓(xùn)練成本都較低,從 0 開(kāi)始構(gòu)建的時(shí)間成本也比較可控,特別適合研發(fā)及計(jì)算資源比較受限、但又亟需使用機(jī)器學(xué)習(xí)改進(jìn)業(yè)務(wù)的團(tuán)隊(duì)嘗試。

image.png

2.2.3 深度學(xué)習(xí)技術(shù)

從?2017 年開(kāi)始,知乎將深度學(xué)習(xí)技術(shù)引入了首頁(yè)推薦產(chǎn)品之中。

原有GBDT 模型的容量和表示能力有很大的限制,當(dāng)模型的訓(xùn)練樣本量達(dá)到千萬(wàn)數(shù)量級(jí)時(shí),再增加訓(xùn)練樣本的規(guī)模,模型精確度已經(jīng)得不到明顯的改善。所以知乎轉(zhuǎn)向了深度學(xué)習(xí)技術(shù)。

知乎用戶(hù)的興趣比較廣泛,一個(gè)用戶(hù)在知乎上往往會(huì)對(duì)幾十、上百個(gè)話(huà)題感興趣。

在這種情況下,用傳統(tǒng)的 content based 算法,會(huì)有大量的分發(fā)策略需要人工設(shè)計(jì),例如興趣的衰減、交叉、去重等。而要是用 ALS 之類(lèi)的協(xié)同過(guò)濾算法,又會(huì)面臨數(shù)據(jù)過(guò)于稀疏的問(wèn)題,知乎到了一個(gè)用戶(hù)和內(nèi)容都達(dá)到了上億量級(jí)規(guī)模的推薦場(chǎng)景。

所以,他們參考了?word2vec 的設(shè)計(jì)思路,設(shè)計(jì)了一個(gè) DNN 網(wǎng)絡(luò),希望把每個(gè)用戶(hù)和每一篇內(nèi)容都表示成同一個(gè)空間的向量。

任意兩個(gè)向量的距離越小,表示它們?cè)较嚓P(guān),如果這兩個(gè)向量一個(gè)是用戶(hù),一個(gè)是內(nèi)容,那就代表該用戶(hù)對(duì)該內(nèi)容感興趣的概率越高。

有了這個(gè)表示之后,對(duì)于每個(gè)用戶(hù),都可以利用 ANN 算法(Approximate Nearest Neighbor,近似最近鄰搜索)召回它可能喜歡的內(nèi)容。

image.png

這個(gè)?DNN 網(wǎng)絡(luò)結(jié)構(gòu)比較簡(jiǎn)單,但作為召回系統(tǒng)的效益是非常明顯的。

知乎衡量推薦系統(tǒng)的召回模塊有效性時(shí),主要看一個(gè)關(guān)鍵的指標(biāo),從幾萬(wàn)條數(shù)據(jù)中挑出的 100 個(gè)結(jié)果的準(zhǔn)確度有多少,這 100 個(gè)結(jié)果里有多少準(zhǔn)確預(yù)測(cè)到用戶(hù)下次點(diǎn)擊的數(shù)據(jù)。在這個(gè)指標(biāo)上, DNN 比起 ALS 來(lái)講提升了 10 倍的量級(jí)。

當(dāng)然,這個(gè) DNN 網(wǎng)絡(luò)也有一個(gè)問(wèn)題,那就是新內(nèi)容的表示不會(huì)在老的網(wǎng)絡(luò)中自動(dòng)被學(xué)習(xí)到。

為了保證新內(nèi)容能夠比較快地被感興趣的用戶(hù)看到,知乎采用一個(gè)離線(xiàn)流水線(xiàn)來(lái)解決這個(gè)問(wèn)題。

這條流水線(xiàn)使用 spark streaming 來(lái)實(shí)現(xiàn)了內(nèi)容?embedding 的批量更新。這個(gè) spark streaming 應(yīng)用會(huì)采集線(xiàn)上的數(shù)據(jù),根據(jù)線(xiàn)上內(nèi)容的分發(fā)狀況,以及用戶(hù)對(duì)這些內(nèi)容的行為反饋情況,通過(guò)一個(gè)簡(jiǎn)單的、兩層神經(jīng)網(wǎng)絡(luò)的梯度下降,快速更新內(nèi)容庫(kù)中內(nèi)容的 embedding 表示。

image.png

隨后知乎也把?DNN 用在了排序中。最初上線(xiàn)的 DNN 是一個(gè)比較簡(jiǎn)單的全連接版本。

image.png

在上線(xiàn)后知乎持續(xù)地對(duì)這個(gè)模型進(jìn)行了各種優(yōu)化,包括引入?FM 層作特征之間的自動(dòng)交叉、利用卷積神經(jīng)網(wǎng)絡(luò)處理文本輸入、利用 LSTM 處理時(shí)序序列數(shù)據(jù)等,都取得了較好的效果。

采用 DNN 模型的召回和排序上線(xiàn)后,再結(jié)合這些持續(xù)不斷地優(yōu)化,F(xiàn)eed 流的人均閱讀量和人均使用時(shí)長(zhǎng)均增長(zhǎng)了 50% 以上。

image.png

2.2.4 多目標(biāo)學(xué)習(xí)

在知乎上,除了「閱讀」這種行為非常重要外,其他的一些交互動(dòng)作,例如點(diǎn)贊、評(píng)論、分享、收藏等,也都是反映用戶(hù)體驗(yàn)的重要的行為指征。

對(duì)于首頁(yè)的優(yōu)化,除了上面介紹的方法之外,知乎也進(jìn)行了多種方向的嘗試。

其中一個(gè)方向是多目標(biāo)學(xué)習(xí)。從?GBDT 開(kāi)始到現(xiàn)在的 DNN 網(wǎng)絡(luò),本質(zhì)上都是 CTR 預(yù)估。所以知乎設(shè)計(jì)了一個(gè)機(jī)制來(lái)進(jìn)行多目標(biāo)學(xué)習(xí),拋棄只看點(diǎn)擊率的局限性。

具體來(lái)說(shuō),是使用豐富的閱讀數(shù)據(jù)來(lái)訓(xùn)練一個(gè)基準(zhǔn)網(wǎng)絡(luò),然后利用這個(gè)基準(zhǔn)網(wǎng)絡(luò)的前面一些層做參數(shù)共享,在后兩層,分別對(duì)于不同的學(xué)習(xí)目標(biāo),進(jìn)行參數(shù)的微調(diào)。

這是一種遷移學(xué)習(xí)的思路,可以大大節(jié)省離線(xiàn)模型訓(xùn)練和線(xiàn)上多目標(biāo)推斷時(shí)的計(jì)算量。

多目標(biāo)排序目前在知乎的實(shí)際應(yīng)用中已經(jīng)有一些初步的結(jié)果,通過(guò)小流量對(duì)比發(fā)現(xiàn),使用多目標(biāo)模型來(lái)排序,除閱讀之外的行為量都能有?10% 左右的增長(zhǎng)。

另外,知乎也在探索如何在排序?qū)W習(xí)中體現(xiàn)推薦列表的多樣性。

CTR 預(yù)估實(shí)際上是一種 pointwise 的排序方法,可能造成的后果是,如果用戶(hù)對(duì)很多內(nèi)容感興趣,在內(nèi)容質(zhì)量相當(dāng)?shù)那闆r下,這種排序會(huì)將「最喜歡的一類(lèi)內(nèi)容」全都排到最前面,造成用戶(hù)閱讀時(shí)的疲憊感和單調(diào)感。

一般來(lái)說(shuō),線(xiàn)上都會(huì)使用一些 Rerank 的方法,例如打散、隔離等規(guī)則,來(lái)保證多樣性。但人工規(guī)則既不精確,設(shè)計(jì)起來(lái)也非常容易出 badcase。所以,知乎正在嘗試?yán)?seq2seq 的方法,來(lái)為用戶(hù)直接生成推薦內(nèi)容的列表。在 seq2seq 模型中,會(huì)將用戶(hù)已經(jīng)看到的內(nèi)容考慮進(jìn)去做為模型的輸入,來(lái)體現(xiàn)用戶(hù)推薦列表的多樣性。

image.png

2.2.5 人機(jī)結(jié)合

知乎CTO李大海毫不避諱地提到知乎目前的機(jī)器學(xué)習(xí)算法并不完美,尤其是在 NLP 領(lǐng)域,在語(yǔ)義理解方向上,AI 技術(shù)還有很大的提升空間。

為了讓用戶(hù)得到更好的體驗(yàn),知乎的?AI 應(yīng)用自始至終都伴隨著人的高度參與,人機(jī)結(jié)合是避免「算法偏見(jiàn)」出現(xiàn)的有效方法之一。

所以知乎在今年啟動(dòng)了一項(xiàng)名為「泰戈?duì)枴沟挠?jì)劃,從標(biāo)簽定義、標(biāo)簽生產(chǎn)、質(zhì)量審核、標(biāo)簽應(yīng)用等方面,建立了一套對(duì)內(nèi)容進(jìn)行識(shí)別和應(yīng)用的閉環(huán),并明確了算法、運(yùn)營(yíng)、業(yè)務(wù)團(tuán)隊(duì)在這個(gè)閉環(huán)中的角色。

這個(gè)計(jì)劃啟動(dòng)以后,在機(jī)器識(shí)別方面,接入了領(lǐng)域識(shí)別、內(nèi)容質(zhì)量判定、內(nèi)容時(shí)效性識(shí)別等多個(gè)維度的識(shí)別算法,同時(shí),知乎內(nèi)容運(yùn)營(yíng)的同事會(huì)在機(jī)器識(shí)別的基礎(chǔ)上,每天都會(huì)對(duì)健康、影視、法律等多個(gè)領(lǐng)域的,成千上萬(wàn)篇內(nèi)容進(jìn)行標(biāo)注和算法結(jié)果的糾正。

image.png

2.3 首頁(yè)架構(gòu)改進(jìn)

除了算法方面的改進(jìn)之外,首頁(yè)推薦團(tuán)隊(duì)在架構(gòu)上從兩個(gè)方面進(jìn)行了改進(jìn):

2.3.1 已讀服務(wù)的升級(jí)

為了避免把用戶(hù)已經(jīng)看過(guò)的內(nèi)容再次推薦給他,信息流產(chǎn)品通常需要記錄下來(lái)哪些內(nèi)容已經(jīng)推薦給用戶(hù)過(guò),這個(gè)信息是一個(gè)?NXN 的大表,數(shù)據(jù)量非常大且稀疏,另一方面,這個(gè)服務(wù)在讀寫(xiě)上都有很高的訪問(wèn)量,hbase 這樣的服務(wù)在響應(yīng)時(shí)間的穩(wěn)定性上,不能達(dá)到知乎的要求,所以知乎實(shí)現(xiàn)了一個(gè)叫 Rbase 的系統(tǒng),這個(gè)系統(tǒng)綜合利用了 MySQL 的存儲(chǔ)能力和可靠性以及 Redis 的低時(shí)延和高吞吐。

在緩存失效的情況下對(duì)同一個(gè)熱鍵值的并發(fā)讀取不會(huì)產(chǎn)生驚群效應(yīng)。

利用寫(xiě)通緩存的更新策略再加上變更下推來(lái)維護(hù)緩存的一致性,所以不需要對(duì)緩存數(shù)據(jù)設(shè)定過(guò)期時(shí)間。

知乎使用分層緩存來(lái)從空間維度和時(shí)間維度提高命中率。利用分層緩存還可以更有效的應(yīng)對(duì)跨數(shù)據(jù)中心部署時(shí)帶寬受限的問(wèn)題。

最重要的是?Rbase 提供了 BigTable 一樣的數(shù)據(jù)模型,并且和 Hbase 的 API 在功能和用法上非常接近,方便遷移。

image.png

2.3.2 推薦架構(gòu)的改造

知乎早期廣泛采用?python 語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā),包括首頁(yè)推薦的業(yè)務(wù)框架也不例外。

在經(jīng)過(guò)長(zhǎng)時(shí)間的功能疊加之后,老系統(tǒng)在響應(yīng)時(shí)間優(yōu)化以及可維護(hù)性等方面,已經(jīng)很難提出比較高的要求。所以知乎在 18 年使用 java 進(jìn)行了系統(tǒng)的重寫(xiě),不僅大幅度優(yōu)化了響應(yīng)時(shí)間,節(jié)約了比較多的機(jī)器資源,還引入了多隊(duì)列召回的能力,允許從不同維度召回與用戶(hù)相關(guān)的內(nèi)容,進(jìn)一步提高多樣性。

image.png

2.4 知乎搜索系統(tǒng)

搜索是知乎在壯大過(guò)程中逐步優(yōu)化的一個(gè)功能。知乎希望通過(guò)個(gè)性化推薦和搜索系統(tǒng),盡可能縮短用戶(hù)和內(nèi)容之間的距離,讓用戶(hù)在知乎擺脫信息過(guò)載帶來(lái)的負(fù)擔(dān)和壓力。

2.4.1?搜索算法改進(jìn)與應(yīng)用

以深度學(xué)習(xí)為代表的搜索相關(guān)性語(yǔ)義特征,知乎的搜索算法近幾年獲得了長(zhǎng)足的發(fā)展:從最早的以?DSSM 為代表的 Query/Doc 分別提取深度表征的方法,到近期的以MatchPyramid, KNRM 等為代表的 Query/Doc 相互交叉為相關(guān)度圖再做計(jì)算的方法,再到這兩類(lèi)方法相互融合的方法,以及最近的 BERT 模型。

知乎在實(shí)踐過(guò)程中發(fā)現(xiàn) MatchPyramid, KNRM 等第二類(lèi)方法的效果,普遍優(yōu)于 DSSM 等第一類(lèi)方法。深度語(yǔ)義特征上線(xiàn)之后,知乎在頭部、腰部、長(zhǎng)尾的搜索點(diǎn)擊比普遍提升了約?2% – 3% 不等。

image.png

2.4.2?搜索架構(gòu)優(yōu)化

除了算法方面的改進(jìn),知乎也投入了不少人力在搜索的架構(gòu)優(yōu)化上。早年采用?ES 作為索引引擎,隨著數(shù)據(jù)量的增加,知乎遇到了 ES 集群的服務(wù)穩(wěn)定性問(wèn)題,以及 ES 對(duì)排序算法支持不友好等問(wèn)題。所以在 17 年,知乎自己開(kāi)發(fā)了一套在索引格式上完全兼容 ES 的引擎系統(tǒng),逐步替換了在線(xiàn)上服務(wù)的 ES 集群。

這個(gè)系統(tǒng)使用 Rust 開(kāi)發(fā),Rust 語(yǔ)言是一種類(lèi)似于 C/C++ 的無(wú) GC 語(yǔ)言,李大海曾提到雖然 Rust 語(yǔ)言的學(xué)習(xí)曲線(xiàn)非常陡峭,但是在團(tuán)隊(duì)熟悉語(yǔ)言后,由于 Rust 能在編譯器層面避免內(nèi)存安全問(wèn)題和并發(fā)安全問(wèn)題,所以整體獲得的收益是非常顯著的。

目前知乎全部的搜索請(qǐng)求都由新的索引服務(wù)支撐,在可用性達(dá)到了?5 個(gè) 9 的同時(shí)性能上也不輸于 C++ 編寫(xiě)的類(lèi)似系統(tǒng)所能達(dá)到的水平。

image.png

三、用戶(hù)連接

知乎為了加強(qiáng)社區(qū)內(nèi)用戶(hù)與用戶(hù)的聯(lián)系,通過(guò)Graph Embedding 模型對(duì)用戶(hù)進(jìn)行隱式表示的學(xué)習(xí),計(jì)算出兩個(gè)用戶(hù)之間的親密度、興趣相似度,以此進(jìn)行更精準(zhǔn)的推薦,讓用戶(hù)更多地在社區(qū)里發(fā)生連接。

3.1 基于用戶(hù)行為的?Embeeding 表示

基于用戶(hù)行為的?Embeeding 表示,主要使用用戶(hù)搜索內(nèi)容、關(guān)注、收藏、點(diǎn)贊、閱讀的回答、文章等對(duì)應(yīng)的話(huà)題,作為用戶(hù)的特征,整理成 0-1 的向量。

使用變分自編碼器(Variational Auto-Encoder,VAE) ,使樣本對(duì)應(yīng)到正態(tài)分布,計(jì)算此正態(tài)分布和標(biāo)準(zhǔn)正態(tài)分布的 KL 散度距離作為額外的 loss,最終為得到用戶(hù)的 Embedding 表示。

image.png

3.2 基于用戶(hù)社交關(guān)系的?Embeeding 表示

基于用戶(hù)社交關(guān)系的?Embeeding 表示,主要使用 skip-gram 模型,得到用戶(hù)的特征表示,從用戶(hù)關(guān)注優(yōu)秀回答者的關(guān)注關(guān)系網(wǎng)絡(luò)中抽取數(shù)據(jù)集,采用 Randomwalk 方法抽樣有序的節(jié)點(diǎn),從而將社交網(wǎng)絡(luò)轉(zhuǎn)化為有序節(jié)點(diǎn)進(jìn)行學(xué)習(xí)。

image.png

Embedding 模型主要應(yīng)用在了知乎的以下場(chǎng)景:

1.?用戶(hù)聚類(lèi):使用用戶(hù)聚類(lèi)來(lái)在推薦中做召回,使用用戶(hù)?Embedding 表示,經(jīng)過(guò)聚類(lèi)計(jì)算后,得到用戶(hù)的人群,可以把這個(gè)群體的高互動(dòng)內(nèi)容作為 feed 候選,放入到推薦系統(tǒng)當(dāng)中。

2.?用戶(hù)親密度:使用用戶(hù) Embedding 表示 + 用戶(hù)對(duì)用戶(hù)的互動(dòng)行為特征,可以預(yù)測(cè)用戶(hù)的關(guān)注關(guān)系,得到用戶(hù)親密度值。這個(gè)值用在很多和社交相關(guān)的策略之中。

3.?基于種子用戶(hù)和 user representation 的人群擴(kuò)展:人工給定或者策略圈定種子用戶(hù),使用用戶(hù) Embedding 表示計(jì)算得到和種子用戶(hù)最相近的 top n 用戶(hù)進(jìn)行目標(biāo)人群擴(kuò)展,這個(gè)能力目前主要應(yīng)用于商業(yè)化產(chǎn)品中。

4. 內(nèi)容治理36氪報(bào)道過(guò)知乎一直把「穩(wěn)定而高質(zhì)量的知識(shí)內(nèi)容」作為重要的護(hù)城河,但隨著用戶(hù)的不斷增加,以及算法的普遍應(yīng)用,甚至是競(jìng)爭(zhēng)對(duì)手「挖墻腳」(2017年今日頭條挖走300個(gè)知乎大V ,并且簽約后禁止發(fā)知乎,今日頭條后續(xù)推出了悟空問(wèn)答,騰訊新聞客戶(hù)端也推出過(guò)問(wèn)答產(chǎn)品),似乎知乎的推送內(nèi)容與頭條并無(wú)太大區(qū)別,知乎社區(qū)的內(nèi)容質(zhì)量也有所下降。在內(nèi)憂(yōu)外患情況下知乎對(duì)于內(nèi)容治理也進(jìn)行了大刀闊斧的改革,「瓦力」、「悟空」等算法和系統(tǒng)不斷出擊,并且加大了人工質(zhì)檢的投入。

4.1 瓦力治杠精

image.png

瓦力:社區(qū)管理的「大腦」

所謂「杠精」是指抬杠成癮的一類(lèi)群體。不管別人說(shuō)的是什么,先反駁挑刺,為了反對(duì)而反對(duì),通過(guò)反駁別人來(lái)凸顯自己的優(yōu)越感,再加上「只有我一個(gè)人覺(jué)得……」句式的加持,基本上能成功惹翻他人。

2018年12月3日,詞語(yǔ)「杠精」被《咬文嚼字》公布為2018十大流行語(yǔ)。而「杠精」在知乎具體體現(xiàn)為各種「陰陽(yáng)怪氣」的言論,「瓦力」就專(zhuān)門(mén)針對(duì)這類(lèi)杠精言論而生。

微信圖片_20190123133928.png

瓦力算法系統(tǒng)作為整個(gè)知乎社區(qū)管理的「大腦」,以知乎社區(qū)管理規(guī)范為標(biāo)準(zhǔn),主要應(yīng)用于不友善、答非所問(wèn)、低質(zhì)提問(wèn)、色情低俗、違法違規(guī)等方面的治理。從18年4月自上線(xiàn)至今,瓦力已經(jīng)過(guò)多次的迭代更新,被應(yīng)用多個(gè)使用場(chǎng)景中。

目前,這個(gè)系統(tǒng)可以做到:實(shí)時(shí)篩查并處理社區(qū)新生產(chǎn)內(nèi)容中的不友善因素;結(jié)合知友們的舉報(bào),在?0.3 秒內(nèi)識(shí)別判斷被舉報(bào)內(nèi)容是否包含不友善因素,并做出相應(yīng)處理;每天清理約 5000 條新產(chǎn)生的「答非所問(wèn)」內(nèi)容,以及此前現(xiàn)存的近 120 萬(wàn)條「答非所問(wèn)」內(nèi)容,還能實(shí)時(shí)對(duì)社區(qū)內(nèi)提問(wèn)進(jìn)行篩查,每天處理約 900 條封建迷信、求醫(yī)問(wèn)藥類(lèi)的低質(zhì)提問(wèn);能夠識(shí)別色情圖文、違法違規(guī)、垃圾廣告等內(nèi)容。

下圖比較完備地展示了知乎識(shí)別陰陽(yáng)怪氣評(píng)論的技術(shù)方案。

知乎把評(píng)論和相應(yīng)回答的文本特征、標(biāo)點(diǎn)符、表情符統(tǒng)計(jì)特征、是否命中反諷詞表等多維度?feature 作為模型的輸入,采用 CNN 和 LSTM 相結(jié)合的網(wǎng)絡(luò)拓樸結(jié)構(gòu)訓(xùn)練二分類(lèi)模型。

image.png

在訓(xùn)練數(shù)據(jù)獲取方面,使用站內(nèi)有大量一致用戶(hù)行為的語(yǔ)料,來(lái)自動(dòng)生成二元的標(biāo)注;為了提高模型泛化能力,通過(guò) active learning 方法選取站內(nèi)評(píng)論,經(jīng)過(guò)人工標(biāo)注加入訓(xùn)練集。

2018年?6 月,「瓦力」的陰陽(yáng)怪氣識(shí)別功能上線(xiàn),在召回率 25% 的情況下,準(zhǔn)確率達(dá)到了 95%。

具體來(lái)說(shuō),解決方案分為了以下三個(gè)步驟:

1. 進(jìn)行數(shù)據(jù)增強(qiáng),以提升模型的泛化能力;

數(shù)據(jù)增強(qiáng)是為了提升模型在大量數(shù)據(jù)上的泛化能力。在這方面,知乎進(jìn)行了兩種嘗試:提取陰陽(yáng)怪氣關(guān)鍵詞做替換,比如同音異字變換,洗地黨→洗滌黨,真的很惡心?→ 震得很惡心;此外,知乎也利用提取出的陰陽(yáng)怪氣關(guān)鍵樣本,隨機(jī)構(gòu)造評(píng)論上文與評(píng)論。

2. 提取相關(guān)數(shù)據(jù)特征,利用卷積網(wǎng)絡(luò)以及人工特征等來(lái)獲得更多更詳細(xì)的特征;

特征構(gòu)建層方面,知乎從文本特征、數(shù)值特征、陰陽(yáng)怪氣詞以及表情詞著手。文本特征即文本加入陰陽(yáng)怪氣關(guān)鍵詞進(jìn)行分詞后,保留標(biāo)點(diǎn),表情等;數(shù)值特征即句子長(zhǎng)度,句號(hào)數(shù)量,感嘆號(hào)數(shù)據(jù)等;陰陽(yáng)怪氣詞即提取社區(qū)內(nèi)被踩過(guò)很多次的表示陰陽(yáng)怪氣關(guān)鍵詞;表情特征:劃分正負(fù)樣本表情。

3. 將提取出的特征輸入分類(lèi)器;

特征學(xué)習(xí)層方面,主要考慮了評(píng)論和上文的文本特征,包括字,詞,標(biāo)點(diǎn),表情符號(hào)等,并利用知乎全量數(shù)據(jù)訓(xùn)練?word2vec 模型。

知乎將評(píng)論上文與評(píng)論經(jīng)過(guò) embedding 層后分成兩個(gè)金字塔型 CNN 網(wǎng)絡(luò),目的是訓(xùn)練各自獨(dú)立的參數(shù),知乎采取 CNN 網(wǎng)絡(luò)是因?yàn)?CNN 卷積可以捕獲字詞的位置關(guān)系也可以比較有效的提取特征。

除上述文本特征外,知乎也充分考慮了其它特征,比如評(píng)論長(zhǎng)度,評(píng)論中句號(hào),問(wèn)號(hào)等標(biāo)點(diǎn)的個(gè)數(shù),評(píng)論中是否包含陰陽(yáng)怪氣關(guān)鍵詞等;這些特征離散化后,與評(píng)論的卷積提取特征進(jìn)行拼接,最后與評(píng)論上文的卷積輸出進(jìn)行?dot-attention ,目的是獲取評(píng)論上文與評(píng)論不同的權(quán)重。

最后,知乎將特征數(shù)據(jù)全連接層以 softmax 方式進(jìn)行了分類(lèi)。

盡管瓦力在各個(gè)維度進(jìn)行的社區(qū)治理準(zhǔn)確度已超過(guò)?90%,但卻是無(wú)法取代人工的,知乎也沒(méi)有將內(nèi)容和社區(qū)管理的任務(wù)全部集于算法一身,而是采用算法 + 人工的方式。

對(duì)瓦力處理的內(nèi)容,知乎會(huì)每天進(jìn)行質(zhì)檢,同時(shí)也有專(zhuān)門(mén)的團(tuán)隊(duì)對(duì)于用戶(hù)申訴進(jìn)行復(fù)核和響應(yīng)。

4.2 悟空反作弊

image.png

Wukong 是知乎的反作弊系統(tǒng),主要負(fù)責(zé) SPAM 的召回和處理。

從 2015 年 4 月上線(xiàn),隨著知乎的不斷發(fā)展壯大,悟空也進(jìn)行著持續(xù)地優(yōu)化升級(jí)。接下來(lái)分享下知乎「悟空」的架構(gòu)演進(jìn)和構(gòu)建過(guò)程中積累的經(jīng)驗(yàn)與教訓(xùn)。

4.2.1 知乎典型?Spam

在知乎長(zhǎng)期存在,且比較典型的?Spam有這么幾類(lèi):

1. 內(nèi)容作弊?Spam:這類(lèi) Spam 的核心獲益點(diǎn)一方面是面向站內(nèi)的傳播,另一方面,面向搜索引擎,達(dá)到 SEO 的目的。內(nèi)容類(lèi)的 Spam 是社區(qū)內(nèi)主流的 Spam 類(lèi)型,目前主要包括四種形式:

  • 導(dǎo)流內(nèi)容:這類(lèi)?Spam 大概能占到社區(qū)中 Spam 的 70% – 80%,比較典型的包括培訓(xùn)機(jī)構(gòu), 美容,保險(xiǎn),代購(gòu)相關(guān)的 Spam。導(dǎo)流內(nèi)容會(huì)涉及到 QQ,手機(jī)號(hào),微信,url 甚至座機(jī),在一些特殊時(shí)間節(jié)點(diǎn)還會(huì)出現(xiàn)各類(lèi)的專(zhuān)項(xiàng) Spam,比如說(shuō)世界杯,雙十一,雙十二,都是黑產(chǎn)大賺一筆的好時(shí)機(jī)。
  • 品牌內(nèi)容:這類(lèi)內(nèi)容會(huì)具有比較典型的?SEO 特色,一般內(nèi)容中不會(huì)有明顯的導(dǎo)流標(biāo)識(shí),作弊形式以一問(wèn)一答的方式出現(xiàn),比如提問(wèn)中問(wèn)什么牌子怎么樣?哪里的培訓(xùn)學(xué)校怎么樣?然后在對(duì)應(yīng)的回答里面進(jìn)行推薦。
  • 詐騙內(nèi)容:一般以冒充名人,機(jī)構(gòu)的方式出現(xiàn),比如單車(chē)退款類(lèi)?Spam,在內(nèi)容中提供虛假的客服電話(huà)進(jìn)行詐騙。
  • 騷擾內(nèi)容:比如一些誘導(dǎo)類(lèi),調(diào)查類(lèi)的批量?jī)?nèi)容,非常嚴(yán)重影響知友體驗(yàn)。

2. 行為作弊?spam:主要包括刷贊,刷粉,刷感謝,刷分享,刷瀏覽等等,一方面為了達(dá)到養(yǎng)號(hào)的目的,躲過(guò)反作弊系統(tǒng)的檢測(cè),另一方面通過(guò)刷量行為協(xié)助內(nèi)容在站內(nèi)的傳播。

治理經(jīng)驗(yàn):治理上述問(wèn)題的核心點(diǎn)在于如何敏捷、持續(xù)地發(fā)現(xiàn)和控制風(fēng)險(xiǎn),并保證處理成本和收益動(dòng)態(tài)平衡,從?Spam 的獲益點(diǎn)入手,進(jìn)行立體防御。所謂立體防御,就是通過(guò)多種控制手段和多個(gè)控制環(huán)節(jié)增強(qiáng)發(fā)現(xiàn)和控制風(fēng)險(xiǎn)的能力。

4.2.2 三種控制方式

  • 策略反作弊:在反作弊的初期,Spam 特征比較簡(jiǎn)單的時(shí)候,策略是簡(jiǎn)單粗暴又有用的方式,能夠快速的解決問(wèn)題,所以策略在反作弊解決方案里是一個(gè)解決頭部問(wèn)題的利器。
  • 產(chǎn)品反作弊:一方面通過(guò)改變產(chǎn)品形態(tài)來(lái)有效控制風(fēng)險(xiǎn)的發(fā)生,另一方面通過(guò)產(chǎn)品方案,對(duì)用戶(hù)和?Spammer 痛點(diǎn)趨于一致的需求進(jìn)行疏導(dǎo),有時(shí)候面對(duì) Spam 問(wèn)題,對(duì)于誤傷和準(zhǔn)確會(huì)遇到一個(gè)瓶頸,發(fā)現(xiàn)很難去區(qū)分正常用戶(hù)和 Spammer,這種情況下反而通過(guò)產(chǎn)品方案,可能會(huì)有比較好的解決方案。
  • 模型反作弊:機(jī)器學(xué)習(xí)模型可以充分提高反作弊系統(tǒng)的泛化能力,降低策略定制的成本。模型應(yīng)用需要酌情考慮加入人工審核來(lái)保證效果,直接處理內(nèi)容或用戶(hù)的模型算法,要注意模型的可解釋性。初期一些無(wú)監(jiān)督的聚類(lèi)算法能夠在比較短時(shí)間內(nèi)達(dá)到較好的效果。而有監(jiān)督的分類(lèi)算法,在時(shí)間上和人力上的耗費(fèi)會(huì)更多,樣本的完整程度,特征工程做的好壞,都會(huì)影響算法的效果。

4.2.3 三個(gè)控制環(huán)節(jié)

  • 事前:事前涉及到的幾個(gè)環(huán)節(jié)包括風(fēng)險(xiǎn)教育、業(yè)務(wù)決策參與、監(jiān)控報(bào)警以及同步攔截。反作弊需要提升業(yè)務(wù)的風(fēng)險(xiǎn)意識(shí),明確告知反作弊可以提供的服務(wù);并在早期參與到業(yè)務(wù)決策,避免產(chǎn)品方案上出現(xiàn)比較大的風(fēng)險(xiǎn);業(yè)務(wù)接入后,針對(duì)業(yè)務(wù)新增量、處理量、舉報(bào)量,誤傷量進(jìn)行監(jiān)控,便于及時(shí)發(fā)現(xiàn)風(fēng)險(xiǎn);在策略層面,在事前需要針對(duì)頭部明顯的作弊行為進(jìn)行頻率和資源黑名單的攔截,減輕事中檢測(cè)的壓力。
  • 事中:面向長(zhǎng)尾曲線(xiàn)的中部,主要針對(duì)那些頻率較低,且規(guī)律沒(méi)有那么明顯的作弊行為,針對(duì)不同嫌疑程度的行為與帳號(hào),進(jìn)行不同層級(jí)的處理,要么送審,要么限制行為,要么對(duì)內(nèi)容和帳號(hào)進(jìn)行處罰。
  • 事后:面向長(zhǎng)尾曲線(xiàn)最尾部的行為,即那些非常低頻,或者影響沒(méi)那么大,但是計(jì)算量相對(duì)大的作弊行為。由一些離線(xiàn)的算法模型和策略負(fù)責(zé)檢測(cè)與控制,另外事后部分還涉及到策略的效果跟蹤和規(guī)則的優(yōu)化,結(jié)合用戶(hù)反饋與舉報(bào),形成一個(gè)檢測(cè)閉環(huán)。

4.2.4 知乎「悟空」的架構(gòu)演進(jìn)

悟空 V1

初期 「悟空」主要由事前模塊和事中模塊構(gòu)成。

image.png

事前模塊與業(yè)務(wù)串行執(zhí)行,適用于做一些耗時(shí)短的頻率檢測(cè),關(guān)鍵詞和黑白名單攔截。由于是同步接口,為了盡量少的減少對(duì)業(yè)務(wù)的影響,大部分復(fù)雜的檢測(cè)邏輯由事中模塊去處理。

事中模塊在業(yè)務(wù)旁路進(jìn)行檢測(cè),適合做一些相對(duì)復(fù)雜,耗時(shí)長(zhǎng)的檢測(cè)。事中主要由 Parser 和一系列 Checker 構(gòu)成,Parser 負(fù)責(zé)將業(yè)務(wù)數(shù)據(jù)解析成固定格式落地到基礎(chǔ)事件庫(kù),Checker 負(fù)責(zé)從基礎(chǔ)事件庫(kù)里取最近一段時(shí)間的行為進(jìn)行策略檢測(cè)。

事件接入

在反作弊的場(chǎng)景數(shù)據(jù)落地一般會(huì)涉及到這幾個(gè)維度:誰(shuí),在什么時(shí)間,什么環(huán)境,對(duì)誰(shuí),做了什么事情。

對(duì)應(yīng)到具體的字段的話(huà)就是誰(shuí) (UserID) 在什么時(shí)間 (Created) 什么環(huán)境 (UserAgent UserIP DeviceID Referer) 對(duì)誰(shuí) (AcceptID) 做了什么事情 (ActionType ObjID Content)。

有了這些信息之后,策略便可以基于維度進(jìn)行篩選,另外也可以獲取這些維度的擴(kuò)展數(shù)據(jù)(e.g. 用戶(hù)的獲贊數(shù))進(jìn)行策略檢測(cè)。

策略引擎

「悟空」的策略引擎設(shè)計(jì),充分考慮了策略的可擴(kuò)展性。

一方面支持橫向擴(kuò)展,即支持從基礎(chǔ)維度獲取更多的業(yè)務(wù)數(shù)據(jù)作為擴(kuò)展維度,例如用戶(hù)相關(guān)的信息,設(shè)備相關(guān)的信息,IP 相關(guān)的信息等等。

另一方面縱向擴(kuò)展也被考慮在內(nèi),支持了時(shí)間維度上的回溯,通過(guò)檢測(cè)最近一段時(shí)間內(nèi)關(guān)聯(lián)維度 (e.g. 同一個(gè)用戶(hù),同一個(gè) IP) 上的行為,更高效地發(fā)現(xiàn)和打擊 Spam。

下面是一條典型的 V1 的策略:

image.png

這條策略主要實(shí)現(xiàn)了這樣的邏輯:

最近 10 分鐘在同一話(huà)題下創(chuàng)建的回答,與當(dāng)前用戶(hù),注冊(cè)時(shí)間在一小時(shí)之內(nèi),同一 IP 下注冊(cè)的用戶(hù)數(shù)大于等于 3 個(gè)。

基本上這樣的模式足夠滿(mǎn)足日常的 Spam 檢測(cè)需求,但是知乎發(fā)現(xiàn)這種嵌套結(jié)構(gòu)對(duì)于書(shū)寫(xiě)與閱讀來(lái)說(shuō)還是不太友好,這個(gè)部分的優(yōu)化在 V2有作詳細(xì)描述。

考慮到策略變更會(huì)遠(yuǎn)大于基礎(chǔ)模塊,在 V1 的架構(gòu)中,知乎特別將策略維護(hù)的邏輯單獨(dú)拆分成服務(wù),一方面,可以實(shí)現(xiàn)平滑上下線(xiàn),另一方面,減少策略變更對(duì)穩(wěn)定性帶來(lái)的影響。

存儲(chǔ)選型

存儲(chǔ)上,知乎選擇了 MongoDB 作為基礎(chǔ)事件存儲(chǔ),Redis 作為關(guān)鍵 RPC 的緩存。

選擇 MongoDB 的原因:一方面是因?yàn)橹趸A(chǔ)事件庫(kù)的業(yè)務(wù)場(chǎng)景比較簡(jiǎn)單,不需要事務(wù)的支持;另一方面,知乎面對(duì)的是讀遠(yuǎn)大于寫(xiě)的場(chǎng)景,并且 90% 都是對(duì)最近一段時(shí)間熱數(shù)據(jù)的查詢(xún),隨機(jī)讀寫(xiě)較少, 這種場(chǎng)景下 MongoDB 非常適合。

另外,初期由于需求不穩(wěn)定,schema-free 也是 MongoDB 吸引知乎的一個(gè)優(yōu)點(diǎn)。由于策略檢測(cè)需要調(diào)用非常多的業(yè)務(wù)接口,對(duì)于一些接口實(shí)時(shí)性要求相對(duì)沒(méi)那么高的特征項(xiàng),知乎使用了 Redis 作為函數(shù)緩存,相對(duì)減少業(yè)務(wù)方的調(diào)用壓力。

悟空 V2

「悟空 V1」已經(jīng)滿(mǎn)足了日常的策略需求,但是在使用過(guò)程知乎也發(fā)現(xiàn)了不少的痛點(diǎn):

  1. 策略學(xué)習(xí)曲線(xiàn)陡峭, 書(shū)寫(xiě)成本高:上面提到的策略采用嵌套結(jié)構(gòu),一方面對(duì)于產(chǎn)品運(yùn)營(yíng)來(lái)說(shuō)學(xué)習(xí)成本有點(diǎn)高,另一方面書(shū)寫(xiě)過(guò)程中也非常容易出現(xiàn)括號(hào)缺失的錯(cuò)誤。
  2. 策略制定周期長(zhǎng):在「悟空 V1」上線(xiàn)一條策略的流程大概會(huì)經(jīng)過(guò)這幾步, 產(chǎn)品制定策略 – 研發(fā)實(shí)現(xiàn)策略 – 研發(fā)上線(xiàn)策略召回 – 產(chǎn)品等待召回 – 產(chǎn)品確認(rèn)策略效果 – 上線(xiàn)處理。整個(gè)環(huán)節(jié)涉及人力與環(huán)境復(fù)雜,策略驗(yàn)證麻煩,耗時(shí)長(zhǎng),因此策略試錯(cuò)的成本也會(huì)很高。

鑒于此,「悟空 V2」著重提升了策略自助配置和上線(xiàn)的體驗(yàn),下面是「悟空 V2」的架構(gòu)圖:

image.png

策略結(jié)構(gòu)優(yōu)化

參考函數(shù)式語(yǔ)言,新的策略結(jié)構(gòu)引入了類(lèi) spark 的算子:filter, mapper, reducer, flatMap, groupBy 等等,一般基礎(chǔ)的策略需求通過(guò)前三者就能實(shí)現(xiàn)。

舉個(gè)例子,上面提到的策略在優(yōu)化之后,會(huì)變成下面這種格式:

image.png

結(jié)構(gòu)上變得更清晰,可擴(kuò)展性也更強(qiáng),工程上只需要實(shí)現(xiàn)可復(fù)用的算子即可滿(mǎn)足日常策略需求,不管是機(jī)器學(xué)習(xí)模型還是業(yè)務(wù)相關(guān)的數(shù)據(jù),都可以作為一個(gè)算子進(jìn)行使用。

策略自助配置

完成了策略結(jié)構(gòu)的優(yōu)化,下一步需要解決的,是策略上線(xiàn)流程研發(fā)和產(chǎn)品雙重角色交替的問(wèn)題,「悟空 V2」支持了策略自助配置,將研發(fā)徹底從策略配置中解放出去,進(jìn)一步提升了策略上線(xiàn)的效率。

image.png

策略上線(xiàn)流程優(yōu)化

為了使策略上線(xiàn)變得更敏捷,知乎在每一條上線(xiàn)的策略都在準(zhǔn)確率和召回率之間權(quán)衡,在盡量高準(zhǔn)確的情況下打擊盡量多的 Spam,因此每條要上線(xiàn)的策略都需要經(jīng)過(guò)長(zhǎng)時(shí)間的召回測(cè)試,這是一個(gè)非常耗時(shí)并且亟待優(yōu)化的流程。

「悟空 V2」策略上線(xiàn)的流程優(yōu)化成了:創(chuàng)建策略 – 策略測(cè)試 – 策略試運(yùn)行 – 策略上線(xiàn)處理 – 策略監(jiān)控。

策略測(cè)試主要用于對(duì)策略進(jìn)行初步的驗(yàn)證,避免策略有明顯的語(yǔ)法錯(cuò)誤。

策略試運(yùn)行可以理解成快照重放,通過(guò)跑過(guò)去幾天的數(shù)據(jù),快速驗(yàn)證策略效果,一切都可以在分鐘級(jí)別完成。這部分的實(shí)現(xiàn)將策略運(yùn)行依賴(lài)的資源復(fù)制了一份,與生產(chǎn)環(huán)境隔離,實(shí)現(xiàn)一個(gè) coordinator 將歷史的事件從 MongoDB 讀出并打入隊(duì)列。

值得注意的是,入隊(duì)速度需要控制,避免隊(duì)列被瞬間打爆。

通過(guò)試運(yùn)行的驗(yàn)證之后,策略就可以上線(xiàn)了。上線(xiàn)之后,策略監(jiān)控模塊提供了完善的指標(biāo),包括策略執(zhí)行時(shí)間、策略錯(cuò)誤數(shù)、策略命中及處理量等等。

悟空 V3

2016 年中旬,知乎主站各業(yè)務(wù)開(kāi)始垂直拆分,相應(yīng)的,「悟空」業(yè)務(wù)接入成本的簡(jiǎn)化開(kāi)始提上日程。

Gateway

Gateway 負(fù)責(zé)與 Nginx 交互,作為通用組件對(duì)在線(xiàn)流量進(jìn)行風(fēng)險(xiǎn)的阻斷。

目前 Gateway 承擔(dān)了所有反作弊和帳號(hào)安全用戶(hù)異常狀態(tài)攔截、反作弊功能攔截和反爬蟲(chóng)攔截。

這樣一來(lái),這部分邏輯就從業(yè)務(wù)剝離了出來(lái),尤其是在業(yè)務(wù)獨(dú)立拆分的情況下,可以大大減少業(yè)務(wù)的重復(fù)工作。作為通用組件,也可以提升攔截邏輯的穩(wěn)定性。

Gateway 當(dāng)前的架構(gòu)如下圖所示:

image.png

由于是串行組件,所有請(qǐng)求要求必須在 10ms 內(nèi)完成,因此所有的狀態(tài)都緩存在 Redis。Gateway 對(duì)外暴露 RPC 接口(Robot),相關(guān)服務(wù)調(diào)用 Robot 更新用戶(hù),IP,設(shè)備等相關(guān)的狀態(tài)到 Redis。

當(dāng)用戶(hù)請(qǐng)求到達(dá)時(shí),Nginx 請(qǐng)求 Gateway,Gateway 獲取請(qǐng)求中的 IP,用戶(hù) ID等信息, 查詢(xún) Redis 返回給 Nginx。當(dāng)返回異常狀態(tài)時(shí) Nginx 會(huì)阻斷請(qǐng)求,返回錯(cuò)誤碼給前端和客戶(hù)端。

TSP – Trust & Safety Platform

image.png

TSP 主要為反爬蟲(chóng)和反作弊提供服務(wù):

一方面解析旁路鏡像流量,通過(guò) Spark 完成流量清洗和基礎(chǔ)計(jì)數(shù),再通過(guò) Kafka 將計(jì)數(shù)數(shù)據(jù)打給反爬蟲(chóng)策略引擎,進(jìn)行檢測(cè)和處理,從而實(shí)現(xiàn)業(yè)務(wù)零成本接入;另一方面,由于反作弊依賴(lài)較多業(yè)務(wù)數(shù)據(jù),難以從流量中獲取,故以 kafka 接入替代 RPC 接入,實(shí)現(xiàn)與業(yè)務(wù)進(jìn)一步解耦,減少對(duì)業(yè)務(wù)的影響。

隨著「悟空」策略上線(xiàn)效率的提升,在線(xiàn)的策略逐漸增多,知乎開(kāi)始著手優(yōu)化「悟空」的檢測(cè)性能與檢測(cè)能力。

策略充分并行化

「悟空 V2」策略檢測(cè)以行為為單位分發(fā),帶來(lái)的問(wèn)題是策略增多之后,單行為檢測(cè)時(shí)長(zhǎng)會(huì)大大增強(qiáng)。

在 V3優(yōu)化了這部分邏輯,將策略檢測(cè)分發(fā)縮小到以策略為粒度,進(jìn)一步提升策略運(yùn)行的并行度,并實(shí)現(xiàn)了業(yè)務(wù)級(jí)別的容器隔離。

優(yōu)化后,事中檢測(cè)模塊演化成了三級(jí)隊(duì)列的架構(gòu)。第一級(jí)是事件隊(duì)列,下游的策略分發(fā) worker 將數(shù)據(jù)落地,并按照事件的業(yè)務(wù)類(lèi)型進(jìn)行策略分發(fā)。

策略執(zhí)行 worker,從二級(jí)隊(duì)列獲取任務(wù),進(jìn)行策略檢測(cè),并將命中的事件分級(jí)處理,分發(fā)到對(duì)應(yīng)的第三級(jí)隊(duì)列。第三級(jí)隊(duì)列即處理隊(duì)列,負(fù)責(zé)對(duì)命中規(guī)則的內(nèi)容或者用戶(hù)進(jìn)行處理。

image.png

緩存優(yōu)化

因?yàn)槊總€(gè)策略檢測(cè)都會(huì)涉及到歷史數(shù)據(jù)的回溯,自然會(huì)帶來(lái)較多的重復(fù)查詢(xún),存儲(chǔ)的壓力也會(huì)比較大,所以存儲(chǔ)上又增加了多級(jí)存儲(chǔ),除了 MongoDB,在上層對(duì)于近期的業(yè)務(wù)數(shù)據(jù),存儲(chǔ)在 Redis 和 localcache。

圖片識(shí)別能力增強(qiáng)

隨著文本內(nèi)容檢測(cè)能力的增強(qiáng),不少 spam 開(kāi)始使用圖片的方式進(jìn)行作弊。

在「悟空 V3」增強(qiáng)了圖片相關(guān)的檢測(cè)能力:圖片 OCR,廣告圖片識(shí)別,色情圖片識(shí)別,違法違規(guī)圖片識(shí)別,政治敏感圖片識(shí)別。

針對(duì)圖片類(lèi)的廣告 Spam 的檢測(cè)一直是空缺,需要投入大量的人力進(jìn)行模型訓(xùn)練,所以這一塊知乎借助第三方快速提升這一塊的空缺。接入之后,著實(shí)提升了解決站內(nèi)廣告和詐騙圖片 Spam 的能力。

風(fēng)險(xiǎn)數(shù)據(jù)進(jìn)一步積累

早期由于系統(tǒng)還未成熟,知乎很多的工作時(shí)間都花在 Spam 問(wèn)題的應(yīng)急響應(yīng)上,很少去做各維度的風(fēng)險(xiǎn)數(shù)據(jù)累積。

在「悟空 V3」知乎分別在內(nèi)容、帳號(hào)、IP、設(shè)備維度開(kāi)始累積相關(guān)的風(fēng)險(xiǎn)數(shù)據(jù),供策略回溯和模型訓(xùn)練使用。

目前知乎有三個(gè)數(shù)據(jù)來(lái)源:策略、第三方接口和人工標(biāo)注

鑒于離線(xiàn)人工標(biāo)注效率低,并且抽取數(shù)據(jù)項(xiàng)繁雜的問(wèn)題,知乎專(zhuān)門(mén)搭建了一個(gè)標(biāo)注后臺(tái),提升運(yùn)營(yíng)標(biāo)注數(shù)據(jù)的效率,使標(biāo)注數(shù)據(jù)可復(fù)用,可追溯。

以下是一些知乎比較常用的風(fēng)險(xiǎn)維度:

1. 內(nèi)容維度:e.g. 導(dǎo)流類(lèi)廣告,品牌類(lèi)廣告,違反法律法規(guī)

2. 帳號(hào)維度:e.g. 批量行為(批量注冊(cè),刷贊,刷粉等),風(fēng)險(xiǎn)帳號(hào)(社工庫(kù)泄露等), 垃圾手機(jī)號(hào),風(fēng)險(xiǎn)號(hào)段

3. IP 維度: e.g. 風(fēng)險(xiǎn) IP ,代理 IP

4. 設(shè)備維度:e.g. 模擬器,無(wú)頭瀏覽器

回溯能力增強(qiáng)

在「悟空 V3」,知乎還增強(qiáng)了策略的回溯能力。

一方面,搭建失信庫(kù)覆蓋新增內(nèi)容中與失信內(nèi)容相似的 Spam 內(nèi)容,相似度的算法目前知乎使用的是 consine-similarity 和 jaccard;

另一方面,基于 Redis,知乎支持了基于導(dǎo)流詞、標(biāo)簽、社區(qū)的快速回溯。這樣的話(huà)相關(guān)的行為更容易被聚集到一起,使得知乎可以突破時(shí)間的限制,對(duì)相似的 Spam 一網(wǎng)打盡。

此外,知乎工程和算法團(tuán)隊(duì)在算法模型引入做了諸多嘗試。

結(jié)網(wǎng) – ZNAP (Zhihu Network Analysis Platform)

image.png

過(guò)去做反作弊的很長(zhǎng)一段時(shí)間,知乎花了很多功夫在行為和內(nèi)容層面去解決 Spam 問(wèn)題。但換個(gè)角度知乎發(fā)現(xiàn),黑產(chǎn)團(tuán)伙固然手上的資源巨多,但是也得考慮投入產(chǎn)出比,不管怎么樣,資源都會(huì)存在被重復(fù)使用的情況,那用什么方式去表示這種資源的使用情況呢?

知乎想到了圖,也成為了知乎做「結(jié)網(wǎng)」這個(gè)項(xiàng)目的出發(fā)點(diǎn)。這個(gè)項(xiàng)目分成了幾個(gè)階段:

第一階段,實(shí)現(xiàn)基于圖的分析能力:

這個(gè)階段旨在提供一種通過(guò)網(wǎng)絡(luò)圖譜分析問(wèn)題的渠道,提升運(yùn)營(yíng)和產(chǎn)品的效率,快速進(jìn)行社區(qū)(設(shè)備,IP……)識(shí)別,團(tuán)伙行為識(shí)別以及傳播分析。

圖譜分析平臺(tái)的數(shù)據(jù)基于用戶(hù)的寫(xiě)行為,將用戶(hù),設(shè)備,IP, Objects (提問(wèn),回答……) 作為節(jié)點(diǎn),具體行為作為邊。當(dāng)行為發(fā)生時(shí),將用戶(hù)與設(shè)備,用戶(hù)與 IP, 用戶(hù)與對(duì)應(yīng)的 object 關(guān)聯(lián), 而每個(gè)節(jié)點(diǎn)的度就代表發(fā)生關(guān)聯(lián)的數(shù)量。

圖數(shù)據(jù)存儲(chǔ)的部分知乎當(dāng)時(shí)調(diào)研了 Titan, Neo4j 和 TinkerPop,三者之中最終選擇了 TinkerPop 作為存儲(chǔ)框架,底層用 HBase 作為存儲(chǔ)。

TinkerPop 是 Apache 的頂級(jí)項(xiàng)目之一,是面向 OLTP 及 OLAP 的圖計(jì)算框架,其擴(kuò)展性非常之強(qiáng),只要實(shí)現(xiàn)了 TinkerPop 定義的 API,就能作為驅(qū)動(dòng)讓存儲(chǔ)支持圖查詢(xún),可以減少存儲(chǔ)額外維護(hù)和遷移的成本。

目前 Tinkerpop 支持 HBase, Neo4j, OrientDB 等等。另外也通過(guò) GraphComputer 支持使用 Spark 進(jìn)行查詢(xún)和計(jì)算。

Gremlin 是 TinkerPop 定義的 DSL,可以靈活的用于圖數(shù)據(jù)的查詢(xún)。

第二階段,基于圖實(shí)現(xiàn)社區(qū)發(fā)現(xiàn)的能力:

將相似的用戶(hù)通過(guò)社區(qū)的形式化成一個(gè)圈子,便于日常分析和策略運(yùn)用基于一個(gè)圈子去處理。

知乎采用了 modularity + fast-unfolding 實(shí)現(xiàn)了社區(qū)發(fā)現(xiàn)的算法,拿設(shè)備社區(qū)為例,算法的輸入是設(shè)備與用戶(hù)的關(guān)聯(lián),輸出是每個(gè)設(shè)備節(jié)點(diǎn)和每個(gè)用戶(hù)節(jié)點(diǎn)以及他們的社區(qū)號(hào)。模塊度(modularity)是衡量網(wǎng)絡(luò)劃分非常常用的維度,模塊度越大,意味著比期望更多的邊落在了一個(gè)社區(qū)內(nèi),劃分效果越好。

Fast-unfolding 則是一個(gè)迭代算法,主要目標(biāo)就是提升劃分社區(qū)效率,使得網(wǎng)絡(luò)劃分的模塊度不斷增大,每次迭代都會(huì)將同一社區(qū)的節(jié)點(diǎn)合并,所以隨著迭代的增加,計(jì)算量也在不斷減少。迭代停止的條件是社區(qū)趨于穩(wěn)定或者達(dá)到迭代次數(shù)上限。

第三階段,在社區(qū)的基礎(chǔ)上,實(shí)現(xiàn)社區(qū)分類(lèi)的能力:能夠有效地識(shí)別可疑和非可疑的社區(qū),幫助日常分析和策略更好地打擊 Spam 團(tuán)伙。

知乎使用的是可解釋性比較高的邏輯回歸,使用了一系列社區(qū)相關(guān)的特征和用戶(hù)相關(guān)的特征進(jìn)行訓(xùn)練,作為運(yùn)營(yíng)輔助數(shù)據(jù)維度和線(xiàn)上策略使用,都有非常好的效果, 從 2017 年 6 月以來(lái)知乎已經(jīng)積累了 4w 的可疑社區(qū)和 170w 的正常社區(qū)。

文本相似度聚類(lèi)

知乎站內(nèi)的 Spammer 為了快速取得收效,往往傾向于大批量地產(chǎn)生相似的 Spam 內(nèi)容,或者密集地產(chǎn)生特定的行為。

針對(duì)這種大量,相似,和相對(duì)聚集的特點(diǎn),使用了 Spark 通過(guò) jaccard 和 sim-hash 實(shí)現(xiàn)了文本聚類(lèi),通過(guò)把相似的文本聚類(lèi),實(shí)現(xiàn)對(duì)批量行為的一網(wǎng)打盡。

未登錄熱詞發(fā)現(xiàn)

image.png

品牌類(lèi)內(nèi)容也是知乎站內(nèi)占大頭的 Spam 類(lèi)型。

目前站內(nèi)大部分的惡意營(yíng)銷(xiāo)都是出于 SEO 的目的,利用知乎的 PageRank 來(lái)提升搜索引擎的關(guān)鍵詞權(quán)重。因此這類(lèi)內(nèi)容的特點(diǎn)就是大量的關(guān)鍵詞(品牌相關(guān),品類(lèi)屬性相關(guān)的詞匯)會(huì)被提及。

由于都是一些小眾品牌和新品牌,這類(lèi)關(guān)鍵詞一般都未被切詞詞庫(kù)收錄,就是所謂的未登錄詞 (Unknown Words), 于是知乎從詞匯的左右信息熵和互信息入手,去挖掘未登錄詞, 并取得了比較好的效果。

導(dǎo)流詞識(shí)別

針對(duì)站內(nèi)的導(dǎo)流內(nèi)容,最開(kāi)始在識(shí)別導(dǎo)流信息上采用的是干擾轉(zhuǎn)換+正則匹配+匹配項(xiàng)回溯的方式進(jìn)行異常導(dǎo)流信息的識(shí)別與控制,取得了很好的效果。

此外,隨著整治加強(qiáng),知乎發(fā)現(xiàn)站內(nèi)導(dǎo)流變體的現(xiàn)象也在愈演愈烈,對(duì)此,也成功引入模型進(jìn)行整治,通過(guò) BILSTM-CRF 來(lái)識(shí)別導(dǎo)流變體,目前在提問(wèn)和回答的識(shí)別準(zhǔn)確率分別達(dá)到 97.1%、96.3%。

通用垃圾內(nèi)容分類(lèi)

對(duì)于垃圾內(nèi)容的治理,雖然線(xiàn)上一直有策略在覆蓋,但是策略的泛化能力有限,始終會(huì)有新型的 Spam 繞過(guò)策略。知乎嘗試使用深度學(xué)習(xí)構(gòu)建通用垃圾文本分類(lèi)模型。

模型使用字向量作為輸入,多層 Dilated Convolution 提取文本特征,通過(guò) Attention 對(duì)卷積后的表達(dá)重新加權(quán)得到高層特征,最后得到垃圾內(nèi)容的概率。

針對(duì)近期知乎遇到的批量 Spam 內(nèi)容單條規(guī)則召回率可以達(dá)到 98% 以上,準(zhǔn)確率達(dá)到95.6%。

至此,「悟空」整個(gè)體系的架構(gòu)演進(jìn)已經(jīng)介紹完了,當(dāng)前的整體架構(gòu)如下圖所示一共有這么幾個(gè)部分:

image.png

1. Gateway: 負(fù)責(zé)異常用戶(hù)狀態(tài)攔截,業(yè)務(wù)同步攔截,反爬攔截。

2.?業(yè)務(wù)層:對(duì)接的各個(gè)業(yè)務(wù)方。

3.?數(shù)據(jù)接入層:數(shù)據(jù)接入層有兩種方式,一種通過(guò) RPC 透?jìng)?,一種通過(guò) kafka 消息,實(shí)現(xiàn)業(yè)務(wù)與反作弊系統(tǒng)的解耦。

4.?策略決策層:策略決策層,分為事前同步?jīng)Q策和事中事后異步?jīng)Q策,橫向?qū)?yīng)的還有策略管理服務(wù),一系列風(fēng)險(xiǎn)分析和運(yùn)營(yíng)工具。根據(jù)決策結(jié)果的可疑程度不同,要么送審要么進(jìn)行不同程度的處理,確認(rèn)是 Spam 的行為會(huì)進(jìn)入風(fēng)險(xiǎn)庫(kù),回饋到策略再次使用。

5.?數(shù)據(jù)存儲(chǔ)層:數(shù)據(jù)存儲(chǔ)層包括基礎(chǔ)的基礎(chǔ)的事件庫(kù),風(fēng)險(xiǎn)庫(kù),離線(xiàn) HDFS 的數(shù)據(jù)落地等等, 這一塊的數(shù)據(jù)不僅僅面向反作弊系統(tǒng)開(kāi)放使用,并且會(huì)提供給外部進(jìn)行模型訓(xùn)練使用和在線(xiàn)業(yè)務(wù)使用。

6.?數(shù)據(jù)計(jì)算層:這一層包括一些離線(xiàn)的機(jī)器學(xué)習(xí)模型,每日定時(shí)計(jì)算模型結(jié)果,并將數(shù)據(jù)落地。

7.?數(shù)據(jù)服務(wù)層:因?yàn)榉醋鞅撞粌H僅要依賴(lài)自己內(nèi)部的數(shù)據(jù),還會(huì)涉及到從業(yè)務(wù)取相關(guān)的數(shù)據(jù),所以這一層會(huì)涉及到與業(yè)務(wù)數(shù)據(jù),環(huán)境數(shù)據(jù)以及模型算法服務(wù)的交互。

基于知乎四大場(chǎng)景的AI技術(shù)與應(yīng)用就整理到這里,為了方便大家回顧,數(shù)智君對(duì)于文中所提到的部分技術(shù)、模型和算法做了簡(jiǎn)要腦圖整理:

從這篇能大致看出知乎做起AI來(lái)也真的是很「知乎」,一步步改進(jìn),一步步優(yōu)化,并且基于場(chǎng)景和業(yè)務(wù)本身也做了許多符合自身情況的嘗試。

既然「穩(wěn)定而高質(zhì)量的知識(shí)內(nèi)容」被譽(yù)為知乎的護(hù)城河,不知道知乎的AI能否持續(xù)加固這個(gè)護(hù)城河?

歡迎在評(píng)論區(qū)發(fā)表你的看法,如果這篇方法論讓你有所收獲,對(duì)我的文章感興趣點(diǎn)擊收藏、訂閱~

參考文獻(xiàn)

(1)知乎技術(shù)專(zhuān)欄;

(2)知乎產(chǎn)品專(zhuān)欄;

(3)邱陸陸,《知乎:源自社區(qū)又服務(wù)于社區(qū)的?AI 技術(shù)》,機(jī)器之心公眾號(hào),2018年06月13日;

(4)極客邦科技?InfoQ,《知乎?CTO 李大海:知識(shí)內(nèi)容平臺(tái) AI 技術(shù)應(yīng)用思考》,2019 年 1 月 16 日;

(5)阿司匹林,《呵呵,你開(kāi)心就好!——AI向杠精宣戰(zhàn)》,AI科技大本營(yíng)公眾號(hào),2018年07月02日;

(6)王藝瑾,《融資2.7億美元,知乎仍面臨護(hù)城河焦慮》,36氪,?2018-08-11;

 

編譯:卷毛雅各布

公眾號(hào):數(shù)智物語(yǔ)(公眾號(hào)ID:decision_engine)出品策劃

本文由 @數(shù)智物語(yǔ)?原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 干貨!

    回復(fù)
  2. 真干貨

    回復(fù)
  3. 干貨 點(diǎn)贊

    回復(fù)
  4. 非常棒! 產(chǎn)品看出邏輯和方向就好了吧. 看完就去給自己技術(shù)提需求的就是找死

    回復(fù)
  5. 干貨 深?yuàn)W

    回復(fù)
  6. 很干貨很良心,收藏,給小編加雞腿!

    回復(fù)
  7. 我是這篇文章的編輯卷毛雅各布,之所以寫(xiě)這篇是為大家提供一個(gè)參考方向,看看知乎過(guò)往的經(jīng)歷能不能對(duì)我們的實(shí)際業(yè)務(wù)有所幫助,以史鑒今,也可以發(fā)現(xiàn)自身業(yè)務(wù)的不足之處,看到有評(píng)論說(shuō)大部分產(chǎn)品經(jīng)理可能看不懂這篇文章,其實(shí)現(xiàn)在的情況是產(chǎn)品經(jīng)理也更多的需要了解跟AI相關(guān)的知識(shí),這也能更好的與數(shù)據(jù)科學(xué)家進(jìn)行項(xiàng)目溝通,而且本人也不是技術(shù)出身(純營(yíng)銷(xiāo)門(mén)外漢),哈哈哈~也歡迎大家關(guān)注我們的公眾號(hào)數(shù)智物語(yǔ)~

    來(lái)自上海 回復(fù)
    1. 精彩 關(guān)注你

      回復(fù)
  8. 收藏了,非常詳細(xì)

    來(lái)自安徽 回復(fù)
  9. 您覺(jué)得大部分產(chǎn)品經(jīng)理能看懂您寫(xiě)的這篇文章嗎

    來(lái)自湖北 回復(fù)
    1. 這是一篇非常好的,也很用心的文章。在AI時(shí)代,需要這樣能看懂該篇文章的產(chǎn)品經(jīng)理。

      來(lái)自廣東 回復(fù)
    2. 給技術(shù)看的

      回復(fù)