網易新聞推薦工程優化 - 特徵平臺篇

語言: CN / TW / HK

從2019年年中起,我們針對網易新聞個性化推薦的系統架構做了更新迭代,涉及的工作包括特徵/樣本的平臺化、pCTR推理服務的效能優化、大規模分散式訓練的探索,以及目前正在進行的推薦中臺化改造等。

我們梳理了之前的部分工作,並將涉及特徵、推理、訓練的部分做了一個系列文章,希望和大家多多交流。 本文主要描述網易新聞的特徵平臺。

1

業務特性

網易新聞的業務場景為資訊流推薦,沉浸閱讀的模式使使用者可以持續重新整理以獲取新的資訊、視訊以及其他內容載體。同時,作為新聞媒體,網易新聞還需要在第一時間將實時發生的重大新聞推薦給使用者。這樣的產品特性,使得推薦系統在設計的時候,必須充分考慮到實時性,無論在訓練環節還是特徵環節。

針對使用者側,使用者剛剛登入APP的時候,其可能對NBA新聞感興趣,隨著不斷的重新整理閱讀,使用者興趣很快就會發生遷移,使用者的當前興趣點可能已經轉換到了新能源汽車。如果相關的特徵沒有隨之改變,推薦的精準度一定是不夠的。同時,使用者在重新整理過程中也會實時反饋不喜歡的內容,這對於特徵的實時性提出了更高的要求。

針對新聞側尤其是熱門新聞型別,新聞剛剛釋出時候的熱度值或者點選率,與1天后乃至1個小時候的熱度值/點選率差異會非常大,如果文章側的特徵描述忽略了這一點,其對於文章側的描述也是很不準確的。

2

歷史版本

業內常見的特徵平臺的核心設計往往為資料表,比如設計使用者表和文章表。離線訓練時將日誌資訊、使用者表、文章表做join處理以生成樣本;線上服務時則有專門的服務加速從資料表中獲取內容的過程。而基於上述的實時性的考慮,我們沒有采取這種方式。

我們歷史版本的基本思路為:線上服務實時生產特徵,離線樣本生成則使用線上實時落盤的特徵,其基本流程如下圖所示。

推薦引擎完成召回、過濾、粗排環節之後,獲取或計算使用者側、文章側的各個維度的原始屬性,並人工特徵工程以得到結構化/規範化的特徵資料,並將此刻的特徵資料輸入對應模型之中進行預估操作,並根據返回的CTR分數做最後的排序。引擎側完成推薦之後,啟動樣本落盤流程,落盤資料為此刻預估時的特徵資料。離線訓練環節,基於該特徵資料,以使用者ID和文章ID為key,與曝光日誌、點選日誌、其他行為日誌關聯標籤,形成帶有標籤的特徵樣本。演算法同事可以直接使用特徵樣本進行模型訓練。

這種方式下,可保證預估和訓練的特徵一致性,避免特徵穿越問題。但這種模式的核心缺點為靈活性差:落盤資料為特徵資料,如果演算法同事想對特徵工程的過程進行變更,則往往需要推薦引擎或者預估服務上線,等待週期較長。另外,這種模式下面,如果演算法同事想做驗證特徵的有效性,則需要落全部特徵,選擇其中的子集做處理。

3

當前版本的設計

基於上述的不足,我們從優化靈活性入手,繼而考慮多業務複用,繼而考慮線上服務的高效性,逐步迭代。

3.1 靈活性的優化

針對歷史版本的不足,我們引入的特徵運算元和物料的概念。

(1)我們將特徵工程抽象成不同的特徵運算元,比如bucket、cross、cosine,並基於json檔案做計算邏輯的管理,線上和線上基於同樣的特徵運算元包做計算以保證預估和訓練的一致性。而關於特徵運算元包的內容,我們會在後續的文章中專門詳細介紹。

(2)我們將特徵區分為原始特徵(我們稱為物料)和特徵,比如年齡27歲為物料,年齡3號桶則為特徵。日誌落盤的是物料資料。這樣離線環節,只需要將物料資料和曝光點選等行為日誌關聯標籤,繼而再使用特徵運算元包計算生產特徵樣本,即可進行模型訓練。其基本流程如下圖所示。

這個版本在靈活性上有很大提升。引入特徵運算元包,演算法同事的工作主要聚焦特徵工程和模型訓練。在特徵工程方面,演算法人員可以根據我們提供的基礎工具和基礎特徵運算元書寫特徵配置。特別地為了提高書寫配置檔案的便捷性,我們提供了若干輔助工具,包括原始資料列表和說明(每個原始資料的計算邏輯說明,樣例資料,資料型別)、特徵運算元使用說明和樣例(特徵運算元介紹,功能說明,使用方式,輸入個數,輸出個數,引數定義,支援的資料型別,每個資料型別下的樣例)、特徵輸出展示,以及基礎資料的監控工具,包括原始資料分佈、特徵資料分佈等,用來輔助演算法同事書寫、校驗、評估自己的特徵配置檔案,以此提高使用者特徵配置項開發的開發效率和準確率。

3.2 業務複用的優化

我們率先在網易新聞頭條推薦使用了這套邏輯,但網易新聞除了頭條推薦還有很多小欄目推薦,比如娛樂欄目、體育欄目,比如push的場景等。如果每個子欄目都需要重新構建這樣的服務,其人力開銷則較大。當然,這個時候基於hive表儲存的優勢就體現出來,因為資料表和業務是沒有繫結的。為了解決業務複用的問題,我們引入了物料服務和物料快取閘道器的概念,其架構如下圖所示:

  • 離線環節:各個業務依然是獨自落原始物料,經過特徵運算元計算生成樣本,沒有改變;

  • 線上環節:pCTR服務不再直接和物料服務通訊,而是藉助物料快取閘道器。物料快取閘道器的核心功能則為快取和路由,其根據特徵名稱路由到不同的物料服務來計算。

這樣,新增業務只需要在對應的物料服務中構建自己專屬的物料,其他欄目的物料可基於閘道器直接複用。同時,為了降低開發成本,我們將物料服務拆分為物料服務模板和BUILDER包,模板封裝了資料格式、服務發現、計算觸發、寫入快取等邏輯,業務人員僅關注具體的builder邏輯即可。

3.3 效能側的優化

為了靈活性,我們引入了特徵運算元包,在離線和線上做實時的計算。然而實時計算就意味著RT增加,隨著進入pCTR排序服務的候選數目的擴大,RT的壓力越來越大。我們開始對效能側也做了集中的優化,優化的內容包括運算元庫實現的效能優化、pCTR服務端的效能優化、以及特徵平臺側的優化等。特徵運算元庫和pCTR服務端的效能優化會在後面的系列文章中詳細說明,這裡主要描述下特徵平臺側的效能優化。

降低RT的常見思路為用空間換時間,給定特徵配置檔案,同個使用者的不同請求中,類似年齡性別等人口屬性和使用者的長期興趣是固定的,沒有必要每次都計算。那麼優化的思路就很直觀了,可以將某些型別的特徵提前計算好並存儲到快取中,線上請求直接拉取對應的特徵即可。其整體架構如下圖所示:

物料和特徵生產: 觸發物料服務計算有兩種方式,訊息佇列和介面呼叫,與3.2小節不同的是,物料服務除了計算物料之外,還會將具體的特徵也計算完成,並且將結果分別快取。 這裡面有幾點需要注意:

(1)避免空間浪費,以線上實際的使用方式來看,不同特徵配置檔案之間其實大同小異,如果每份特徵配置檔案均儲存一份,其實有很大的冗餘,需要將不同特徵配置的儲存做融合。

(2)區分不同物料的計算頻率,我們將物料區分為下面幾種更新週期: 天級別、分鐘級別、實時級別。 實時級別的特徵還是需要每次請求都實時計算的,比如上一刷使用者的點選類別分佈等。 而物料服務針對天級別和分鐘級別物料的更新週期也是有所差異的。

線上服務的獲取:線上服務的獲取與3.2小節基本類似,只是會區分物料和特徵。針對pCTR服務而言,其直接獲取到特徵粒度,物料快取服務閘道器需要根據其對應的特徵配置拉取具體的特徵。而在落物料日誌的過程中,則獲取物料粒度,這樣在效能優化的同時依舊保持了靈活性。

4

樣本生成邏輯

除了提供特徵之外,我們還將常見的樣本生成邏輯做了標準化,並將其儲存到資料表中,使用者在資料表中新增一行資料,即可生成新的樣本,無需程式碼層面的改動。 這裡需要說明的是,如本文開頭所述,業務場景對於實時性的要求很高,所以如頭條推薦的很多場景均使用了流式訓練的方式,本節描述的樣本生成邏輯也是實時的。 我們也提供了離線批處理的樣本生成邏輯,但這種方式需要在有數資料開發及管理平臺提交任務了。

樣本生成標準化的事項如下圖所示,我們將樣本生成的過程拆分為兩個環節:join環節、sample環節。join環節的核心工作為融合資訊,融合如物料資訊、推薦點選資訊、使用者互動資訊等等,同時我們將業務中常見的標籤推理的方式封裝為函式,外面直接設定相關的引數即可得到實際的標籤,比如加上閱讀時長、閱讀完成度類似的限制。sample環節的工作為特徵工程,除了基於配置的特徵工程之外,我們將樣本權重計算、樣本過濾邏輯、樣本取樣邏輯也做了函式式的封裝,並對外暴露引數使其可配置。

樣本生成邏輯是基於flink任務來完成的,flink任務會定期讀取資料表,獲取需要計算的樣本詳情,生成新的樣本。 下圖是2020年的截圖,演算法人員在下表中配置引數並點選上線即可生成樣本。 當然,flink任務除了輸出kafka之外,也會將裡面的部分樣本寫入hdfs路徑下面,方便模型訓練。

這裡值得說明的是,如3.3小節所述,如果每份樣本均進行獨立的特徵計算時,會存在較大的冗餘,比如兩份樣本的特徵配置檔案很相似,比如兩份樣本僅僅是取樣不同,特徵配置檔案是完全一致的。 出於效能的考慮,我們在flink任務中同樣做了計算融合的工作,降低冗餘計算,節省計算資源。

5

總結

針對網易新聞個性化推薦場景,站在實時性的出發點上,我們搭建了一套特徵平臺,並且兼顧了靈活性和高效性。 同時,我們針對常見的樣本生成邏輯做了封裝,使用者在資料表中新增一行即可生成新的樣本邏輯。

然而與業內的其他同類型產品相對,我們的工作更加定製化。 與OpenMLDB相比,我們沒有在離線/線上側做太多更底層的基礎效能優化; 與雲音樂的工作相比,我們在特徵管理方面還不夠完善。 我們的樣本生成邏輯也更吻合精排的邏輯,召回所需要的各種負取樣邏輯還沒有做到很好的抽象,這些都是我們之後待完善的工作了。

獲取最新動態

最新的推文無法在第一時間看到?

以前的推文還需要複雜漫長的翻閱?

進入“網易有數”公眾號介紹頁,點選右上角

“設為星標”

置頂公眾號,從此訊息不迷路

設為星標,最新推文不迷路

分享,點贊,在看,安排一下?