發(fā)布人:Ellie Zhou、Tian Lin、Shuangfeng Li 以及 Sushant Prakash
簡介和動機
我們非常高興地宣布推出一種自適應(yīng)框架,用于使用您自己的數(shù)據(jù)以及高級用戶建模架構(gòu)構(gòu)建設(shè)備端推薦 ML 解決方案。
在之前開源了設(shè)備端推薦解決方案后,我們發(fā)現(xiàn)社區(qū)中的許多人都對引入設(shè)備端推薦系統(tǒng) AI 頗有興趣。受反饋內(nèi)容的激勵與啟發(fā),我們考慮了各種不同的用例,并創(chuàng)建了一種框架,該框架可以生成適應(yīng)不同種類的數(shù)據(jù)、特征和架構(gòu)的 TensorFlow Lite 推薦模型,對之前的模型進行了完善。
此框架的優(yōu)勢
靈活:自適應(yīng)框架支持用戶以可配置方式創(chuàng)建模型。
優(yōu)化了模型表征: 為了完善之前的模型,我們的新推薦模型可以利用多種特征,而非單單一種特征。
個性化推薦在如今的數(shù)字化生活中越來越重要。隨著越來越多的用戶操作已轉(zhuǎn)移至邊緣設(shè)備,支持設(shè)備端推薦系統(tǒng)將變?yōu)橐粋€重要方向。與完全基于服務(wù)器的傳統(tǒng)推薦系統(tǒng)相比,設(shè)備端解決方案具有獨特的優(yōu)勢,如保護用戶隱私、快速地對設(shè)備端用戶操作作出反應(yīng)、利用輕量級 TensorFlow Lite 推理,以及繞過網(wǎng)絡(luò)依賴。我們歡迎您體驗此框架并在您的應(yīng)用中創(chuàng)建推薦體驗。
框架
https://tensorflow.google.cn/lite/examples/recommendation/overview
在本文中,我們將
介紹完善后的模型架構(gòu)和框架自適應(yīng)性。
帶您循序漸進地了解如何利用框架。
根據(jù)使用公開數(shù)據(jù)集完成的研究提供數(shù)據(jù)分析。
您可以在 TensorFlow 網(wǎng)站上找到更多詳細信息。
TensorFlow 網(wǎng)站
https://tensorflow.google.cn/lite/examples/recommendation/overview
模型
推薦模型通常根據(jù)用戶之前的活動預(yù)測用戶未來活動。我們的框架支持模型使用上下文信息展開預(yù)測,框架可以按照以下架構(gòu)進行描述:
在上下文方面,由編碼器聚合所有用戶活動的表征,以生成上下文嵌入。我們支持三種不同類型的編碼器:1) 詞袋(又名為 BOW),2) 1-D 卷積(又名為 CNN)和 3) LSTM。在標簽方面,同樣會將正樣本標簽項和詞匯表中的所有其他負樣本標簽項編碼為向量。將上下文和標簽嵌入與點積進行結(jié)合并提供給 softmax 交叉熵損失。
在框架內(nèi)部,將 ContextEncoder、LabelEncoder 和 DotProductSimilarity 的 tf.keras 層封裝為 RecommendationModel 中的重要組件。
為了為每個用戶活動建立模型,我們可以使用活動項目編號(稱為基于編號的模型)、項目的多個特征(稱為基于特征的模型)或二者的組合。基于特征的模型會使用多個特征,集中性地對用戶行為進行編碼。借助我們的框架,您可以可配置方式創(chuàng)建基于編號或基于特征的模型。
與上一版本類似,系統(tǒng)會在訓練后導(dǎo)出 TensorFlow Lite 模型,可以直接在推薦候選條目中提供前 K 個預(yù)測。
分步教程
為了展示這個全新的自適應(yīng)框架,我們使用多個特征對含有 MovieLens 數(shù)據(jù)集的設(shè)備端電影推薦模型進行了訓練,并將其整合到演示版應(yīng)用中(模型和應(yīng)用僅用于演示目的)。MovieLens 1M 數(shù)據(jù)集包含 6039 位用戶對 3951 部電影的評分,每個用戶僅對一小部分電影進行評分。
MovieLens
https://grouplens.org/datasets/movielens/
讓我們了解一下如何在此 Notebook 中分步使用框架。
Notebook
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb
(a) 環(huán)境準備
git clone https://github.com/tensorflow/examples
cd examples/lite/examples/recommendation/ml/
pip install -r requirements.txt
(b) 準備訓練數(shù)據(jù)
請參考 movielens 示例生成文件準備訓練數(shù)據(jù)。需要注意的是,預(yù)計 TensorFlow Lite 輸入特征為 FixedLenFeature,因此請?zhí)畛浠蚪厝√卣?,并在輸入配置中設(shè)置特征長度。您可以按照您的想法隨意使用以下命令來處理示例數(shù)據(jù)集。
FixedLenFeature
https://tensorflow.google.cn/api_docs/python/tf/io/FixedLenFeature
python -m data.example_generation_movielens
--data_dir=data/raw
--output_dir=data/examples
--min_timeline_length=3
--max_context_length=10
--max_context_movie_genre_length=32
--min_rating=2
--train_data_fraction=0.9
--build_vocabs=True
MovieLens 數(shù)據(jù)包含 ratings.dat(列: 用戶編號、 電影編號、 評分、 時間戳)和 movies.dat(列:電影編號、 標題、 類型)。在示例生成腳本中,我們同時采用了這兩個文件,僅將評分保持在 2 分以上、構(gòu)成用戶電影交互時間線,作為標簽的示例活動以及之前的用戶活動作為預(yù)測上下文。請查找生成的 tf.Example:
0 : {
features: {
feature: {
key : “context_movie_id”
value: { int64_list: { value: [ 1124, 2240, 3251, 。。。, 1268 ] } }
}
feature: {
key : “context_movie_rating”
value: { float_list: {value: [ 3.0, 3.0, 4.0, 。。。, 3.0 ] } }
}
feature: {
key : “context_movie_year”
value: { int64_list: { value: [ 1981, 1980, 1985, 。。。, 1990 ] } }
}
feature: {
key : “context_movie_id”
value: { int64_list: { value: [ 1124, 2240, 3251, 。。。, 1268 ] } }
}
feature: {
key : “context_movie_genre”
value: { bytes_list: { value: [ “Drama”, “Drama”, “Mystery”, 。。。, “UNK” ] } }
}
feature: {
key : “l(fā)abel_movie_id”
value: { int64_list: { value: [ 3252 ] } }
}
}
}
(c) 創(chuàng)建輸入配置
準備好數(shù)據(jù)后,請設(shè)置輸入配置,例如,這是 movielens 電影推薦模型的一個示例配置。
activity_feature_groups {
features {
feature_name: “context_movie_id”
feature_type: INT
vocab_size: 3953
embedding_dim: 8
feature_length: 10
}
features {
feature_name: “context_movie_rating”
feature_type: FLOAT
feature_length: 10
}
encoder_type: CNN
}
activity_feature_groups {
features {
feature_name: “context_movie_genre”
feature_type: STRING
vocab_name: “movie_genre_vocab.txt”
vocab_size: 19
embedding_dim: 4
feature_length: 32
}
encoder_type: CNN
}
label_feature {
feature_name: “l(fā)abel_movie_id”
feature_type: INT
vocab_size: 3953
embedding_dim: 8
feature_length: 1
}
(d) 訓練模型
模型訓練器將根據(jù)輸入配置構(gòu)建含有簡單界面的推薦模型。
python -m model.recommendation_model_launcher --
--training_data_filepattern “data/examples/train_movielens_1m.tfrecord”
--testing_data_filepattern “data/examples/test_movielens_1m.tfrecord”
--model_dir “model/model_dir”
--vocab_dir “data/examples”
--input_config_file “configs/sample_input_config.pbtxt”
--batch_size 32
--learning_rate 0.01
--steps_per_epoch 2
--num_epochs 2
--num_eval_steps 2
--run_mode “train_and_eval”
--gradient_clip_norm 1.0
--num_predictions 10
--hidden_layer_dims “32,32”
--eval_top_k “1,5”
--conv_num_filter_ratios “2,4”
--conv_kernel_size 4
--lstm_num_units 16
在推薦模型內(nèi)部,核心組件將被打包到 keras 層(context_encoder.py、label_encoder.py 和 dotproduct_similarity.py),其中每一層都可以被自身使用。下圖介紹了代碼結(jié)構(gòu):
context_encoder.py
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/context_encoder.py
label_encoder.py
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/label_encoder.py
dotproduct_similarity.py
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/dotproduct_similarity.py
通過此框架,您可以通過命令直接執(zhí)行模型訓練啟動器:
python -m model.recommendation_model_launcher
--input_config_file “configs/sample_input_config.pbtxt”
--vocab_dir “data/examples”
--run_mode “export”
--checkpoint_path “model/model_dir/ckpt-1000”
--num_predictions 10
--hidden_layer_dims “32,32”
--conv_num_filter_ratios “2,4”
--conv_kernel_size 4
--lstm_num_units 16
導(dǎo)出至 TensorFlow Lite 后,可以在 Notebook 中找到推理代碼,同時我們會推薦讀者查看該處的詳細信息。
Notebook
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb
框架自適應(yīng)性
我們的框架會提供 protobuf 接口,用戶可在此接口中對特征組、類型和其他信息進行配置,以相應(yīng)地構(gòu)建模型。在此接口中,您可以配置:
protobuf
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/configs/input-config.proto
特征
框架通常將特征分為 3 種類型:整型、字符串和浮點數(shù)。由于需要為整型和字符串特征創(chuàng)建嵌入空間,因此需要指定嵌入維度、詞匯表名稱和大小。浮點數(shù)特征值可直接使用。此外,對于設(shè)備端模型,我們建議使用可直接進行配置的固定長度特征。
message Feature {
optional string feature_name = 1;
// Supported feature types: STRING, INT, FLOAT.
optional FeatureType feature_type = 2;
optional string vocab_name = 3;
optional int64 vocab_size = 4;
optional int64 embedding_dim = 5;
optional int64 feature_length = 6;
}
特征組
一個用戶活動的一個特征可能具有多個值。例如,一部電影可以屬于多個類別,每部電影將具有多個類型的特征值。為了處理不同特征形狀,我們引入了“特征組”,用于將特征合并為組。可以將長度相同的特征放置到同一特征組中,以一起進行編碼。在輸入配置中,您可以設(shè)置全局特征組和活動特征組。
message FeatureGroup {
repeated Feature features = 1;
// Supported encoder types: BOW, CNN, LSTM.
optional EncoderType encoder_type = 2;
}
輸入配置
您可以使用輸入配置界面同時設(shè)置所有特征和特征組。
message InputConfig {
repeated FeatureGroup global_feature_groups = 1;
repeated FeatureGroup activity_feature_groups = 2;
optional Feature label_feature = 3;
}
input_pipeline.py 和 recommendation_model.py 會使用輸入配置將訓練數(shù)據(jù)處理為 tf.data.Dataset,并相應(yīng)地構(gòu)建模型。在 ContexEncoder 內(nèi)部,我們將為所有特征組創(chuàng)建 FeatureGroupEncoders,并將其用于計算輸入特征中的特征組嵌入。通過頂部隱藏層饋送串聯(lián)特征組嵌入,以獲得最終上下文嵌入。值得注意的是,最終上下文嵌入和標簽嵌入維度應(yīng)該相同。
input_pipeline.py
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/input_pipeline.py
recommendation_model.py
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/recommendation_model.py
請在附錄部分查看使用不同輸入配置生成的不同模型圖。
附錄
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb
實驗與分析
我們會借此機會,針對基于編號和基于特征的模型,分析其在不同配置下的性能,并提供一些實證結(jié)果。
對于基于編號的模型,僅會將 movie_id 用作輸入特征。對于基于特征的模型,會使用 movie_id 和 movie_genre 特征。兩種類型的模型都嘗試使用了 3 種編碼器類型 (BOW/CNN/LSTM) 和 3 種上下文歷史長度 (10/50/100)。
由于 MovieLens 數(shù)據(jù)集是一個實驗數(shù)據(jù)集,其中大約含有 4000 部候選電影和 19 種電影類型,因此我們會在實驗中縮小嵌入維度,以模擬生成場景。對于上述實驗結(jié)果圖表,將編號嵌入維度設(shè)置為 8 并將電影類型嵌入維度設(shè)置為 4。如果以 context10_cnn 為例,基于特征的模型性能比基于編號的模型性能高出 58.6%。此外,平均結(jié)果顯示基于特征的模型性能要高出 48.35%。因此,在這種情況中,基于特征的模型性能要優(yōu)于基于編號的模型,因為 movie_genre 特征向模型引入了其他信息。
MovieLens
https://grouplens.org/datasets/movielens/
此外,候選項目的大部分基礎(chǔ)特征的詞匯表都相對較小,因此嵌入空間也相對較小。例如,電影類型詞匯表要比電影編號詞匯表小很多。在這種情況中,使用基礎(chǔ)特征會減小模型的內(nèi)存大小,從而令其更適合設(shè)備端。
編輯:jq
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304796 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7553瀏覽量
88729 -
ML
+關(guān)注
關(guān)注
0文章
149瀏覽量
34642
原文標題:推出適用于設(shè)備端推薦的自適應(yīng)框架
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論