發(fā)布人:Ellie Zhou、Tian Lin、Shuangfeng Li 以及 Sushant Prakash
簡(jiǎn)介和動(dòng)機(jī)
我們非常高興地宣布推出一種自適應(yīng)框架,用于使用您自己的數(shù)據(jù)以及高級(jí)用戶建模架構(gòu)構(gòu)建設(shè)備端推薦 ML 解決方案。
在之前開源了設(shè)備端推薦解決方案后,我們發(fā)現(xiàn)社區(qū)中的許多人都對(duì)引入設(shè)備端推薦系統(tǒng) AI 頗有興趣。受反饋內(nèi)容的激勵(lì)與啟發(fā),我們考慮了各種不同的用例,并創(chuàng)建了一種框架,該框架可以生成適應(yīng)不同種類的數(shù)據(jù)、特征和架構(gòu)的 TensorFlow Lite 推薦模型,對(duì)之前的模型進(jìn)行了完善。
此框架的優(yōu)勢(shì)
靈活:自適應(yīng)框架支持用戶以可配置方式創(chuàng)建模型。
優(yōu)化了模型表征: 為了完善之前的模型,我們的新推薦模型可以利用多種特征,而非單單一種特征。
個(gè)性化推薦在如今的數(shù)字化生活中越來越重要。隨著越來越多的用戶操作已轉(zhuǎn)移至邊緣設(shè)備,支持設(shè)備端推薦系統(tǒng)將變?yōu)橐粋€(gè)重要方向。與完全基于服務(wù)器的傳統(tǒng)推薦系統(tǒng)相比,設(shè)備端解決方案具有獨(dú)特的優(yōu)勢(shì),如保護(hù)用戶隱私、快速地對(duì)設(shè)備端用戶操作作出反應(yīng)、利用輕量級(jí) TensorFlow Lite 推理,以及繞過網(wǎng)絡(luò)依賴。我們歡迎您體驗(yàn)此框架并在您的應(yīng)用中創(chuàng)建推薦體驗(yàn)。
框架
https://tensorflow.google.cn/lite/examples/recommendation/overview
在本文中,我們將
介紹完善后的模型架構(gòu)和框架自適應(yīng)性。
帶您循序漸進(jìn)地了解如何利用框架。
根據(jù)使用公開數(shù)據(jù)集完成的研究提供數(shù)據(jù)分析。
您可以在 TensorFlow 網(wǎng)站上找到更多詳細(xì)信息。
TensorFlow 網(wǎng)站
https://tensorflow.google.cn/lite/examples/recommendation/overview
模型
推薦模型通常根據(jù)用戶之前的活動(dòng)預(yù)測(cè)用戶未來活動(dòng)。我們的框架支持模型使用上下文信息展開預(yù)測(cè),框架可以按照以下架構(gòu)進(jìn)行描述:
在上下文方面,由編碼器聚合所有用戶活動(dòng)的表征,以生成上下文嵌入。我們支持三種不同類型的編碼器:1) 詞袋(又名為 BOW),2) 1-D 卷積(又名為 CNN)和 3) LSTM。在標(biāo)簽方面,同樣會(huì)將正樣本標(biāo)簽項(xiàng)和詞匯表中的所有其他負(fù)樣本標(biāo)簽項(xiàng)編碼為向量。將上下文和標(biāo)簽嵌入與點(diǎn)積進(jìn)行結(jié)合并提供給 softmax 交叉熵?fù)p失。
在框架內(nèi)部,將 ContextEncoder、LabelEncoder 和 DotProductSimilarity 的 tf.keras 層封裝為 RecommendationModel 中的重要組件。
為了為每個(gè)用戶活動(dòng)建立模型,我們可以使用活動(dòng)項(xiàng)目編號(hào)(稱為基于編號(hào)的模型)、項(xiàng)目的多個(gè)特征(稱為基于特征的模型)或二者的組合?;谔卣鞯哪P蜁?huì)使用多個(gè)特征,集中性地對(duì)用戶行為進(jìn)行編碼。借助我們的框架,您可以可配置方式創(chuàng)建基于編號(hào)或基于特征的模型。
與上一版本類似,系統(tǒng)會(huì)在訓(xùn)練后導(dǎo)出 TensorFlow Lite 模型,可以直接在推薦候選條目中提供前 K 個(gè)預(yù)測(cè)。
分步教程
為了展示這個(gè)全新的自適應(yīng)框架,我們使用多個(gè)特征對(duì)含有 MovieLens 數(shù)據(jù)集的設(shè)備端電影推薦模型進(jìn)行了訓(xùn)練,并將其整合到演示版應(yīng)用中(模型和應(yīng)用僅用于演示目的)。MovieLens 1M 數(shù)據(jù)集包含 6039 位用戶對(duì) 3951 部電影的評(píng)分,每個(gè)用戶僅對(duì)一小部分電影進(jìn)行評(píng)分。
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)境準(zhǔn)備
git clone https://github.com/tensorflow/examples
cd examples/lite/examples/recommendation/ml/
pip install -r requirements.txt
(b) 準(zhǔn)備訓(xùn)練數(shù)據(jù)
請(qǐng)參考 movielens 示例生成文件準(zhǔn)備訓(xùn)練數(shù)據(jù)。需要注意的是,預(yù)計(jì) TensorFlow Lite 輸入特征為 FixedLenFeature,因此請(qǐng)?zhí)畛浠蚪厝√卣鳎⒃谳斎肱渲弥性O(shè)置特征長(zhǎng)度。您可以按照您的想法隨意使用以下命令來處理示例數(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(列: 用戶編號(hào)、 電影編號(hào)、 評(píng)分、 時(shí)間戳)和 movies.dat(列:電影編號(hào)、 標(biāo)題、 類型)。在示例生成腳本中,我們同時(shí)采用了這兩個(gè)文件,僅將評(píng)分保持在 2 分以上、構(gòu)成用戶電影交互時(shí)間線,作為標(biāo)簽的示例活動(dòng)以及之前的用戶活動(dòng)作為預(yù)測(cè)上下文。請(qǐng)查找生成的 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)建輸入配置
準(zhǔn)備好數(shù)據(jù)后,請(qǐng)?jiān)O(shè)置輸入配置,例如,這是 movielens 電影推薦模型的一個(gè)示例配置。
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) 訓(xùn)練模型
模型訓(xùn)練器將根據(jù)輸入配置構(gòu)建含有簡(jiǎn)單界面的推薦模型。
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í)行模型訓(xùn)練啟動(dòng)器:
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 中找到推理代碼,同時(shí)我們會(huì)推薦讀者查看該處的詳細(xì)信息。
Notebook
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb
框架自適應(yīng)性
我們的框架會(huì)提供 protobuf 接口,用戶可在此接口中對(duì)特征組、類型和其他信息進(jìn)行配置,以相應(yīng)地構(gòu)建模型。在此接口中,您可以配置:
protobuf
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/configs/input-config.proto
特征
框架通常將特征分為 3 種類型:整型、字符串和浮點(diǎn)數(shù)。由于需要為整型和字符串特征創(chuàng)建嵌入空間,因此需要指定嵌入維度、詞匯表名稱和大小。浮點(diǎn)數(shù)特征值可直接使用。此外,對(duì)于設(shè)備端模型,我們建議使用可直接進(jìn)行配置的固定長(zhǎng)度特征。
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;
}
特征組
一個(gè)用戶活動(dòng)的一個(gè)特征可能具有多個(gè)值。例如,一部電影可以屬于多個(gè)類別,每部電影將具有多個(gè)類型的特征值。為了處理不同特征形狀,我們引入了“特征組”,用于將特征合并為組。可以將長(zhǎng)度相同的特征放置到同一特征組中,以一起進(jìn)行編碼。在輸入配置中,您可以設(shè)置全局特征組和活動(dòng)特征組。
message FeatureGroup {
repeated Feature features = 1;
// Supported encoder types: BOW, CNN, LSTM.
optional EncoderType encoder_type = 2;
}
輸入配置
您可以使用輸入配置界面同時(shí)設(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 會(huì)使用輸入配置將訓(xùn)練數(shù)據(jù)處理為 tf.data.Dataset,并相應(yīng)地構(gòu)建模型。在 ContexEncoder 內(nèi)部,我們將為所有特征組創(chuàng)建 FeatureGroupEncoders,并將其用于計(jì)算輸入特征中的特征組嵌入。通過頂部隱藏層饋送串聯(lián)特征組嵌入,以獲得最終上下文嵌入。值得注意的是,最終上下文嵌入和標(biāo)簽嵌入維度應(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
請(qǐng)?jiān)诟戒洸糠植榭词褂貌煌斎肱渲蒙傻牟煌P蛨D。
附錄
https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb
實(shí)驗(yàn)與分析
我們會(huì)借此機(jī)會(huì),針對(duì)基于編號(hào)和基于特征的模型,分析其在不同配置下的性能,并提供一些實(shí)證結(jié)果。
對(duì)于基于編號(hào)的模型,僅會(huì)將 movie_id 用作輸入特征。對(duì)于基于特征的模型,會(huì)使用 movie_id 和 movie_genre 特征。兩種類型的模型都嘗試使用了 3 種編碼器類型 (BOW/CNN/LSTM) 和 3 種上下文歷史長(zhǎng)度 (10/50/100)。
由于 MovieLens 數(shù)據(jù)集是一個(gè)實(shí)驗(yàn)數(shù)據(jù)集,其中大約含有 4000 部候選電影和 19 種電影類型,因此我們會(huì)在實(shí)驗(yàn)中縮小嵌入維度,以模擬生成場(chǎng)景。對(duì)于上述實(shí)驗(yàn)結(jié)果圖表,將編號(hào)嵌入維度設(shè)置為 8 并將電影類型嵌入維度設(shè)置為 4。如果以 context10_cnn 為例,基于特征的模型性能比基于編號(hào)的模型性能高出 58.6%。此外,平均結(jié)果顯示基于特征的模型性能要高出 48.35%。因此,在這種情況中,基于特征的模型性能要優(yōu)于基于編號(hào)的模型,因?yàn)?movie_genre 特征向模型引入了其他信息。
MovieLens
https://grouplens.org/datasets/movielens/
此外,候選項(xiàng)目的大部分基礎(chǔ)特征的詞匯表都相對(duì)較小,因此嵌入空間也相對(duì)較小。例如,電影類型詞匯表要比電影編號(hào)詞匯表小很多。在這種情況中,使用基礎(chǔ)特征會(huì)減小模型的內(nèi)存大小,從而令其更適合設(shè)備端。
編輯:jq
-
嵌入式
+關(guān)注
關(guān)注
5046文章
18832瀏覽量
298797 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7395瀏覽量
88228 -
ML
+關(guān)注
關(guān)注
0文章
143瀏覽量
34447
原文標(biāo)題:推出適用于設(shè)備端推薦的自適應(yīng)框架
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論