向量召回評估組件計算召回的hitrate結果。hitrate作為結果好壞的評價,hitrate越高表示訓練產出的向量去召迴向量的結果越準確。本文為您介紹向量召回評估組件的原理和配置指導。
原理
向量召回評估組件同時支援u2i召回和i2i召回的計算。u2i召回時,拿user(使用者)的向量去召回top k個items(物品),i2i召回時拿item的向量去召回top k個items。 hitrate的具體計算方法為,假設真實trigger(u2i召回時為user,i2i召回時為item)的關聯item集合為M,而實際召回了top k個和trigger相似的items,若其中落在了M裡的集合為N,則top k hitrate為|N| / |M|。為了進行bad case study,組件同時會輸出在top k裡面但是不在M裡面的items以及對應的距離。組件同時支援單機和分布式運行。 具體實現流程為:
每個worker分區載入user、item的embedding表,構建KNN需要的索引。
每個worker分區按批次讀真實序列表,尋找embedding搜尋KNN,得到top k的items。
根據真實的items序列和top k的items計算hitrate。
匯總結果並輸出到ODPS表。
組件輸入
item embedding表
item的embedding表,一般為GraphSAGE等訓練演算法的輸出,表示例如下。
item id (bigint) | item embeddings (string) |
23456677 | 0.1,0.2,0.3.... |
user embedding表
user的embedding表,一般為GraphSAGE等訓練演算法的輸出,表示例如下。
user id (bigint) | user embeddings (string) |
12345 | 0.1,0.2,0.3.... |
真實序列表
trigger和關聯item的真實表,做為ground truth。u2i召回時trigger id為user id, i2i召回時為item id。item ids為真實的和trigger id相關的item列表,表示例如下。
trigger id (bigint) | item ids (string) |
12345 | 23456677,2233445,6837292,... |
組件輸出
total_hitrate表
總的hitrate,表示例如下。
hitrate(double) |
0.4 |
hitrate_details表
hitrate詳情表,行數和真實序列表一致,表示例如下。
id (bigint) | topk_ids (string) | topk_dists (string) | hitrate (double) | bad_ids (string) | bad_dists (string) |
1123 | 2345,2367,2483,2567 | 0.8,0.7,0.2,0.1 | 0.39 | 2483,2567 | 0.2,0.1 |
該表的行數與真實序列表相同
id當u2i召回時為user_id, i2i召回時為item_id。
topk_ids是與trigger最相關的前k個item的id,以半形逗號(,)分割。
topk_dists是與topk_ids對應的距離。
hitrate為針對該trigger召回item的命中率。
bad_ids為召回但是未命中的item id。
bad_dists為與bad_cases對應的距離。
組件參數配置
向量召回評估組件支援介面化配置和命令方式配置,配置參數一致,參數配置指導如下。
參數 | 類型 | 參數說明 | |
輸入配置 | item_emb_table (item向量表) | string | item embedding表。 |
true_seq_table (真實序列表) | string | 真實序列表。u2i召回時為user和user關聯的items;i2i召回時為item和item關聯的items。 重要 測試召回效果時,訓練embedding用T時間資料時,真實序列使用T+1時間的,否則出現穿越,hitrate偏高。 | |
user_emb_table (user向量表) | string (可選) | user embedding表,只在u2i召回時需要提供。 | |
輸出配置 | total_hitrate (向量召回評估值) | string | 輸出表,總的hitrate。 |
hitrate_details (向量召回評估詳情) | string | 輸出表,hitrate詳情。 | |
參數設定 | recall_type (召回類型) | string | 召回類型,'u2i'或者'i2i'。 |
emb_dim (向量表特徵維度) | int | embedding表的embedding維度。 | |
k(召回數目) | int | 召回的數目。 | |
metric (召回相似性度量方式) | int (可選,預設1) | 召回相似性度量方式。0為L2距離,1為內積。 L2時返回距離最小的k個,內積時返回內積最大的k個。 | |
strict(是否容錯) | bool (可選,預設False) | 相似性計算有一定誤差,如果需要嚴格結果,strict設為True,但是strict=True時,速度會比較慢。 | |
lifecycle | int (可選,預設7) | 輸出表的lifecycle,單位為天。 | |
執行調優 | batch_size | int (可選,預設1024) | 一次計算的樣本數量,記憶體不夠時可以設小。 |
worker_count (計算核心數) | int (可選,預設1) | 啟動並執行機器數,當輸入表比較大或者單個worker運行比較慢時可以設大次數目。 | |
worker_memory (每個核心記憶體) | int (可選,預設20000) | 每個機器的記憶體大小,單位為M位元組,預設20000 MB。 |
PAI命令示列
pai -name hitrate_gl_ext
-Ditem_emb_table='item_emb_table'
-Duser_emb_table='user_emb_table'
-Dtrue_seq_table='true_seq_table'
-Dhitrate_details='hitrate_details'
-Dtotal_hitrate='total_hitrate'
-Drecall_type='u2i'
-Dk=5
-Demb_dim=10
-Dmetric=1
-Dstrict=False
-Dbatch_size=1024
-Dworker_count=1
-Dworker_memory=20000
-Dlifecycle=7;
上述命令展示了u2i召回計算hitrate的例子,該命令指定按照內積方式計算向量相似性(距離),不要求距離計算的嚴格性,按批次計算,每次計算1024個true_seq_table裡的內容,指定了1個worker,記憶體是20 GB,輸出表hitrate_details和total_hitrate的生命週期是7天。