窺大廠:為你揭秘知乎是如何應(yīng)用AI的
經(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)用。
知乎合伙人、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。
一、內(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)度和效率的作用。
二、內(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)的「排序」。
「水晶球」信息流推薦框架
對(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)重。
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ì)嘗試。
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)容。
這個(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 表示。
隨后知乎也把?DNN 用在了排序中。最初上線(xiàn)的 DNN 是一個(gè)比較簡(jiǎn)單的全連接版本。
在上線(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% 以上。
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ù)推薦列表的多樣性。
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é)果的糾正。
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 在功能和用法上非常接近,方便遷移。
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)一步提高多樣性。
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% 不等。
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á)到的水平。
三、用戶(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 表示。
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í)。
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 瓦力治杠精
瓦力:社區(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)杠精言論而生。
瓦力算法系統(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)模型。
在訓(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 悟空反作弊
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)成。
事前模塊與業(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 的策略:
這條策略主要實(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):
- 策略學(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ò)誤。
- 策略制定周期長(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)圖:
策略結(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ì)變成下面這種格式:
結(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)的效率。
策略上線(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)如下圖所示:
由于是串行組件,所有請(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
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)行處理。
緩存優(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)
過(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)
品牌類(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è)部分:
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é)議
干貨!
真干貨
干貨 點(diǎn)贊
非常棒! 產(chǎn)品看出邏輯和方向就好了吧. 看完就去給自己技術(shù)提需求的就是找死
干貨 深?yuàn)W
很干貨很良心,收藏,給小編加雞腿!
我是這篇文章的編輯卷毛雅各布,之所以寫(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ǔ)~
精彩 關(guān)注你
收藏了,非常詳細(xì)
您覺(jué)得大部分產(chǎn)品經(jīng)理能看懂您寫(xiě)的這篇文章嗎
這是一篇非常好的,也很用心的文章。在AI時(shí)代,需要這樣能看懂該篇文章的產(chǎn)品經(jīng)理。
給技術(shù)看的