EasyRec演算法架構中包含資料欄位、特徵,還包含FG(Feature Generate)特徵的概念。這三個概念很容易搞混,因此我們重點介紹一下這些概念和差異。

FG在PAI-Rec、PAI-FeatureStore、EasyRec Processor中的總覽
名詞解釋
FeatureStore:PAI-FeatureStore是PAI平台下的特徵平台管理工具,用於儲存和管理離線和線上系統中的特徵(詳情見FeatureStore概述)。
FG:FG是Feature Generate(特徵產生)的簡稱,FG是為瞭解決離線、線上特徵處理的一致性問題的。具體的FG特徵包括id_feature、raw_feature、combo_feature、lookup_feature、match_feature、sequence_feature、overlap_feature。我們用的比較多的是lookup_feature和sequence_feature,詳情見RTP FG的特徵配置說明。
使用者特徵(user features):以上案例描述推薦系統中的使用者特徵,包括從離線和線上系統中擷取使用者特徵。在上圖左下角 PAI-RecRecommendation Engine是通過FeatureStore SDK(FS)讀取使用者特徵。
物品特徵(item features):在打分服務EasyRec Processor內部,通過FeatureStore SDK讀取物品特徵。
assemble input:根據請求裡面的使用者特徵和緩衝裡面的物品特徵,拼裝成FG之前的特徵。經過FG特徵變換之後,餵給tensorflow模型打分。
EasyRec Processor:是指部署在PAI-EAS上的推薦、廣告、搜尋模型打分服務,主要是可以載入EasyRec相關的深度學習模型,並做了一系列效能最佳化工作。
easyrec.conf:即描述EasyRec深度學習模型用到的資料欄位、特徵類型,以及模型網路結構的檔案。
鏈路解釋
離線部分:在FS內部利用UserViews(指使用者側的多個特徵視圖),ItemViews(指物品側的多個特徵視圖),Label Table(帶有訓練標籤的MaxCompute表)構造得到ModelFeature(模型特徵,即訓練樣本表),通過Feature Generator程式(即下文提到的mapreduce jar包:fg_on_odps-1.3.59-jar-with-dependencies.jar)以及特徵變換檔案fg.json,對ModelFeature表變換得到結果表rank_sample_fg_encoded,再根據easyrec.conf設定檔到PAI平台上做模型訓練,把模型匯出儲存到OSS上,最終餵給Tensorflow模型打分。
線上部分:PAI-RecRecommendation Engine中擷取使用者特徵,內部擷取需要打分的物品ID集合(圖中忽略此部分邏輯),然後請求EasyRec Processor,在Processor內部組裝特徵,經過FG模組做線上特徵變換,最終對物品ID打分並返回。
1. EasyRec設定檔中的資料欄位和特徵欄位
1.1. 資料欄位配置:data_config
data_config是EasyRec的設定檔(即上文提到的easyrec.conf)中說明資料的原始欄位名稱、類型、以及缺失值填充方式(參考EasyRec中的資料欄位)。其中資料欄位類型包括int、double、string等。資料可以儲存為CSV檔案、MaxCompute表、Kafka資料流等。
舉例:key-value類型的資料
缺失值填充:預設值用一個KV值填充,即"-1024:0"
離線訓練和線上預測邏輯:在Tensorflow模型中對缺失值做填充
input_fields: {
input_name: "prop_kv"
input_type: STRING
default_val:"-1024:0"
}1.2. 特徵欄位配置:feature_config
在data config中主要是資料和label的定義。而在feature_config中,說明了模型如何解析使用這些資料欄位。例如一個欄位x作為STRING類型的特徵,但是在feature_config中可以按照IdFeature、TagFeature、SequenceFeature、TextCNN來解釋。
舉例:IdFeature特徵
features {
input_names: "user_id"
feature_type: IdFeature
embedding_dim: 32
hash_bucket_size: 100000
}說明:user_id特徵,通過雜湊映射到100000個桶,每個桶號再通過模型訓練映射到32維向量。
離線訓練和線上預測的處理邏輯:在Tensorflow模型中把user_id變換為32維向量。
舉例:RawFeature特徵
features {
input_names: "ctr"
feature_type: RawFeature
boundaries: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
embedding_dim: 8
}預先處理:通過PAI的離散化演算法binning得到一組分隔點(boundaries),配置到feature_config的features中。
離線訓練和線上預測的處理邏輯:上面的ctr特徵,通過分隔點集合boundaries分桶得到桶號,然後根據桶號得到向量。
舉例:TagFeature特徵
features : {
input_names: 'tags'
feature_type: TagFeature
separator: '|'
hash_bucket_size: 100000
embedding_dim: 24
}如文章標籤特徵tags的值可能是“娛樂|搞笑|熱門”,其中|為分隔字元。
離線訓練和線上預測的處理邏輯:在tf模型中把標籤特徵分別hash embedding,然後再做average pooling轉化為embedding。
2. FG中的lookup_feature變換介紹
FG包含了多種特徵組合和變換方式,以下用lookup特徵變換為例:
{
"map": "user:map_brand_click_kv",
"key":"item:brand",
"feature_name": "map_brand_click_count",
"feature_type":"lookup_feature",
"needDiscrete":false,
}離線資料處理:需要jar包fg_on_odps-1.3.59-jar-with-dependencies.jar,把物品側特徵brand作為查詢key,使用物品的品牌去使用者側特徵map_brand_click_kv(表示使用者在不同品牌下的點擊次數統計)查詢得到value值,把value作為新特徵map_brand_click_count的值(即使用者在該物品品牌下的點擊次數)。
線上預測處理:在EasyRec Processor(推薦打分服務)中,先通過FG模組計算得到map_brand_click_count,然後餵給Tensorflow模型做預測。
3. 常見問題
3.1.離散化分隔點從哪裡擷取以及含義是什嗎?
在下面的EasyRec設定檔中,ctr特徵包含了boundaries參數。具體如下:
feature_configs: {
input_names: "CTR"
feature_type: RawFeature
boundaries: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
embedding_dim: 8
}其中的分隔點集合boundaries,是使用阿里雲PAI的binning組件分箱得到的。
在Tensorflow模型中,對上面CTR特徵做離散化處理時,實際上是把分隔點集合boundaries看做一系列的離散化區間:(-inf, 0.1), [0.1, 0.2), [0.2, 0.3), [0.3, 0.4),[0.4, 0.5), [0.5, 0.6), [0.6, 0.7), [0.7, 0.8), [0.8, 0.9), [0.9, 1.0)。在配置了參數boundaries之後,需要再配置embedding_dim,即把區間編號變換為一個向量。
3.2. FG特徵變換線上上系統怎麼執行?怎麼保證離線和線上的一致性?
FG特徵變換依賴fg.json來描述特徵變換過程。線上和離線系統都是用同一套代碼來保證特徵變換邏輯的一致性。線上系統是通過特徵變換模組來執行特徵變換。
3.3. 如何對特徵做缺失值填充?特徵填充在哪裡執行?
在配置easyrec.config檔案時,通過給data_config每一個特徵欄位設定default_value參數來進行缺失值的填充。在訓練的時候,是讀資料的時候根據default_value來填充缺失值;線上上模型推理的時候,需要先填充缺失值再推理。
在使用FG的情況下,缺失值填充在fg.json中描述,離線和線上都在FG模組中填充缺失值。