RecBole小白入門系列部落格(三)——Context類模型執行流程

一隻醜顏狗發表於2020-12-15

傳送門
RecBole小白入門系列部落格(一)——快速安裝和簡單上手
RecBole小白入門系列部落格(二)——General類模型執行流程

寫在前面

  1. 這次的內容和上次General類模型執行流程差不多,我會特別提一下Context類模型不一樣和需要注意的地方。
  2. 由於模型的完整執行流程會牽扯到很多部分,從資料到引數,所以這裡將簡略的舉出例子,讓大家可以大致獨立完成模型的執行。關於一些更加具體和細微的部分,我將在後面單獨寫部落格為大家介紹。

選定模型

RecBole中共有13個General類模型可供使用,模型列表如下:

關於模型的具體資訊可以檢視上面的連結,大家選用需要的模型即可。我們以模型FM為例。

設定模型超引數

每個模型的超引數都不一致,大家可以從上面的連結中檢視自己所需模型的超引數有哪些。在RecBole中每個模型都有預設的引數,因此如果是想簡單跑一跑就暫時不動。
模型預設引數在原始碼目錄RecBole/recbole/properties/model 中,各位感興趣在小夥伴可以在裡面檢視預設引數值。
那麼想調參的同學怎麼辦呢?讀過RecBole小白入門系列部落格(一)——快速安裝和簡單上手的朋友可能知道,在RecBole中調整引數有好幾種方法,這裡我推薦使用自定義配置檔案
RecBole的配置檔案格式均使用.yaml檔案,十分簡潔明瞭,大致的形式如下:

accum: "stack"
gcn_output_dim: 500
embedding_size: 64
dropout_prob: 0.3
sparse_feature: True
class_num: 2
num_basis_functions: 2

引數名稱: 引數值這樣的樣式
引數值可以是字典巢狀,也可以是列表等,就像這樣

load_col:
  inter: [user_id, business_id, stars]
  item: [business_id, address, categories]
  user: [user_id, fans, compliment_hot, compliment_cool, complitment_cute, compliment_plain]

大家暫時不用管引數的含義等,後面會注意講到。大致瞭解配置檔案的格式之後,我再說下推薦的修改模型引數的方法:

  • 在目錄 RecBole/ 下新建配置檔案 test.yaml
  • test.yaml 中寫入想要修改的引數
  • 儲存

例如,我想修改模型LR的引數,就去檢視路徑RecBole/recbole/properties/model/LR.yaml,可以發現LR引數很少,就只有一個:

embedding_size: 10

那如果我想把embedding_size改成32的話,就在test.yaml中寫入

# model config
embedding_size: 32

別的模型引數同理

選定資料集

資料集基本格式

選定模型之後就是要選定要用的資料集了。RecBole框架使用的資料集要求處理成對應的原子檔案才可以正常使用,目前支援6種原子檔案,Context模型顧名思義會用到各種上下文,因此會用到的檔案可能有多個 .inter.item和**.user**

字尾含義例子
.inter使用者-商品互動特徵user_id, item_id, rating, timestamp, review
.user使用者特徵user_id, age, gender
.item商品特徵item_id, category

每個原子檔案可以被看作 mn 列的表格(不計表頭),代表該檔案儲存了 n 種不同的特徵,共 m 條記錄。 檔案第一行為表頭,表頭中每一列的形式為 feat_name:feat_type,標示了該列特徵的名字及型別。 約定特徵為四種型別之一。

feat_type含義例子
token單個離散特徵user_id, age
token_seq離散特徵序列review
float單個連續特徵rating, timestamp
float_seq連續特徵序列vector

關於資料集原子檔案的處理和格式等,我接下來會專門用一篇部落格來講,這裡給出一個簡明的例子即可,想馬上了解的同學可以看他們的網站https://recbole.io/cn/atomic_files.html
以及RecBole提供的已經按格式處理好的資料集
https://github.com/RUCAIBox/RecDatasets
ml-1m 為例 :
處理過後可以得到 ml-1m.inter 檔案,模式如下:
在這裡插入圖片描述

還要注意Context模型用的資料集可以沒有使用者id和物品id,但最好特徵多一些,才能得到更好的結果。

設定資料集引數

針對特定資料集,需要設定相應的引數,才可以讓模型正常執行。這裡仍然以 ml-1m 資料集為例,給出相應的配置檔案。在上文 test.yaml 繼續寫入資料集引數,我會在下面註釋中給出各個引數的含義,這些都是必須設定的引數。

# dataset config
field_separator: "\t" #指定資料集field的分隔符
seq_separator: " " #指定資料集中token_seq或者float_seq域裡的分隔符
USER_ID_FIELD: user_id #指定使用者id域
ITEM_ID_FIELD: item_id #指定物品id域
RATING_FIELD: rating #指定打分rating域
TIME_FIELD: timestamp #指定時間域
NEG_PREFIX: neg_ #指定負取樣字首
LABEL_FIELD: label #指定標籤域
#因為資料集沒有標籤,所以設定一個閾值,認為rating高於該值的是正例,反之是負例
threshold:
    rating: 4
#指定從什麼檔案裡讀什麼列,這裡就是從ml-1m.inter裡面讀取user_id, item_id, rating, timestamp這四列,剩下的以此類推
load_col:
    inter: [user_id, item_id, rating]
    user: [user_id, age, gender, occupation]
    item: [item_id, genre]

  

設定訓練引數

設定好資料及之後,我們要繼續設定訓練的引數,在test.yaml中繼續寫入:

# training settings
epochs: 500 #訓練的最大輪數
train_batch_size: 4096 #訓練的batch_size
learner: adam #使用的pytorch內建優化器
learning_rate: 0.001 #學習率
training_neg_sample_num: 0 #負取樣數目
eval_step: 1 #每次訓練後做evalaution的次數
stopping_step: 10 #控制訓練收斂的步驟數,在該步驟數內若選取的評測標準沒有什麼變化,就可以提前停止了

大家一定注意,因為Context類模型不用負取樣,因此training_neg_sample_num一定是0

設定評測引數

執行前最後一步,需要設定評測引數。在test.yaml中繼續寫入:

# evalution settings
eval_setting: RO_RS #對資料隨機重排,設定按比例劃分資料集
group_by_user: False #是否將一個user的記錄劃到一個組裡
split_ratio: [0.8,0.1,0.1] #切分比例
metrics: ['AUC', 'LogLoss'] #評測標準
valid_metric: AUC #選取哪個評測標準作為作為提前停止訓練的標準
eval_batch_size: 4096 #評測的batch_size

注意,區別於General類模型,Context模型沒有全排序,所以在eval_setting設定裡是沒有full

總結引數設定

至此我們的引數設定就全都好了,完整的 test.yaml 應該是這個樣子的:

# model config
embedding_size: 32
# dataset config
field_separator: "\t" #指定資料集field的分隔符
seq_separator: " " #指定資料集中token_seq或者float_seq域裡的分隔符
USER_ID_FIELD: user_id #指定使用者id域
ITEM_ID_FIELD: item_id #指定物品id域
RATING_FIELD: rating #指定打分rating域
TIME_FIELD: timestamp #指定時間域
NEG_PREFIX: neg_ #指定負取樣字首
LABEL_FIELD: label #指定標籤域
#因為資料集沒有標籤,所以設定一個閾值,認為rating高於該值的是正例,反之是負例
threshold:
    rating: 4
#指定從什麼檔案裡讀什麼列,這裡就是從ml-1m.inter裡面讀取user_id, item_id, rating, timestamp這四列,剩下的以此類推
load_col:
    inter: [user_id, item_id, rating]
    user: [user_id, age, gender, occupation]
    item: [item_id, genre]

# training settings
epochs: 500 #訓練的最大輪數
train_batch_size: 4096 #訓練的batch_size
learner: adam #使用的pytorch內建優化器
learning_rate: 0.001 #學習率
training_neg_sample_num: 0 #負取樣數目
eval_step: 1 #每次訓練後做evalaution的次數
stopping_step: 10 #控制訓練收斂的步驟數,在該步驟數內若選取的評測標準沒有什麼變化,就可以提前停止了
# evalution settings
eval_setting: RO_RS #對資料隨機重排,設定按比例劃分資料集
group_by_user: False #是否將一個user的記錄劃到一個組裡
split_ratio: [0.8,0.1,0.1] #切分比例
metrics: ['AUC', 'LogLoss'] #評測標準
valid_metric: AUC #選取哪個評測標準作為作為提前停止訓練的標準
eval_batch_size: 4096 #評測的batch_size

執行

ml-1m 資料集資料夾放在目錄RecBole/dataset 下,至此幾個關鍵檔案的層次應該是:

-RecBole
	-dataset
		-ml-1m
			ml-1m.inter
			ml-1m.item
			ml-1m.user
	test.yaml
	run_recbole.py

接下來按照我上期RecBole小白入門系列部落格(一)——快速安裝和簡單上手講的執行方法執行就好啦!
假設執行LR模型(別的模型同理,改一下model就好)

python run_recbole.py --model=LR --dataset=ml-1m \
--config_files=test.yaml

然後就有下面這樣的資訊輸出了:
這裡是列印出的訓練引數資訊,可以看到有很多我們沒設定的預設資訊
在這裡插入圖片描述

接下來是資料集的引數資訊:
在這裡插入圖片描述

之後給出資料集的基本資訊:
在這裡插入圖片描述

再然後是evaluation的設定:
在這裡插入圖片描述

下面是模型結構:
在這裡插入圖片描述

**接下來就開始訓練啦,會列印出每一輪的結果: **
在這裡插入圖片描述

一直到訓練結束,會給出最終的測試結果:
在這裡插入圖片描述

調(lian)參(dan)

參照上一期裡的調參即可
RecBole小白入門系列部落格(二) ——General類模型執行流程

結束語

Context類模型執行流程就寫到這裡,之後我還會繼續更新剩下的兩種模型執行流程,以及之前提到的各種引數設定,資料集處理,資料集配置等。大家還有什麼想看的可以留言( ̄▽ ̄)~,有什麼問題也歡迎和我討論!
最後附上官網、API文件和GitHub連結~大家有興趣可以自行查閱哦!
官網https://recbole.io/cn/index.html
API文件https://recbole.io/docs/
GitHubhttps://github.com/RUCAIBox/RecBole

相關文章