RecBole小白入门系列博客(四)
——Sequential类模型运行流程
注意:本系列基于RecBole v.0.2.0 版本!
传送门:
RecBole小白入门系列博客(一)——快速安装和简单上手
RecBole小白入门系列博客(二)——General类模型运行流程
RecBole小白入门系列博客(三)——Context类模型运行流程
写在前面
- 这次的内容和General类和Context模型运行流程差不多,我会特别提一下Sequential类模型不一样和需要注意的地方。
- 由于模型的完整运行流程会牵扯到很多部分,从数据到参数,所以这里将简略的举出例子,让大家可以大致独立完成模型的运行。关于一些更加具体和细微的部分,我将在后面单独写博客为大家介绍。
选定模型
RecBole中共有17个Sequential类模型可供使用,模型列表如下:
- Sequential模型列表
关于模型的具体信息可以查看上面的链接,大家选用需要的模型即可。我们以模型GRU4Rec为例。
设置模型超参数
每个模型的超参数都不一致,大家可以从上面的链接中查看自己所需模型的超参数有哪些。在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
中写入想要修改的参数 - 保存
例如,我想修改模型GRU4Rec的参数,就去查看路径RecBole/recbole/properties/model/GRU4Rec.yaml
,参数如下:
embedding_size: 64
hidden_size: 128
num_layers: 1
dropout_prob: 0.3
loss_type: 'CE'
那如果我想把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 |
每个原子文件可以被看作 m 行 n 列的表格(不计表头),代表该文件存储了 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 文件,模式如下:
设置数据集参数
针对特定数据集,需要设置相应的参数,才可以让模型正常运行。这里仍然以 ml-1m 数据集为例,给出相应的配置文件。在上文 test.yaml
继续写入数据集参数,我会在下面注释中给出各个参数的含义。不同于General类模型和Context类模型,Sequential类模型需要考虑时间,因此在数据集参数中也会有相应体现。
# 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 #指定标签域
ITEM_LIST_LENGTH_FIELD: item_length #指定序列长度域
LIST_SUFFIX: _list #指定序列前缀
MAX_ITEM_LIST_LENGTH: 50 #指定最大序列长度
POSITION_FIELD: position_id #指定生成的序列位置id
#指定从什么文件里读什么列,这里就是从ml-1m.inter里面读取user_id, item_id, rating, timestamp这四列,剩下的以此类推
load_col:
inter: [user_id, item_id, rating, timestamp]
这里注释写的比较简略,感兴趣的同学可以参考API文档,后续我也会专门开一篇博客来介绍。
设置训练参数
设置好数据及之后,我们要继续设置训练的参数,在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 #控制训练收敛的步骤数,在该步骤数内若选取的评测标准没有什么变化,就可以提前停止了
大家一定注意,大部分Sequential类模型不需要负采样而某些需要,因此training_neg_sample_num
不一定是0。
需要负采样的模型有:FPMC、TransRec,别的都不需要,具体情况请参照模型文档。
设置评测参数
运行前最后一步,需要设置评测参数。在test.yaml
中继续写入:
# evalution settings
eval_setting: TO_LS,full #对数据按时间排序,设置留一法划分数据集,并使用全排序
metrics: ["Recall", "MRR","NDCG","Hit","Precision"] #评测标准
valid_metric: MRR@10 #选取哪个评测标准作为作为提前停止训练的标准
eval_batch_size: 4096 #评测的batch_size
总结参数设置
至此我们的参数设置就全都好了,完整的 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 #指定标签域
ITEM_LIST_LENGTH_FIELD: item_length #指定序列长度域
LIST_SUFFIX: _list #指定序列前缀
MAX_ITEM_LIST_LENGTH: 50 #指定最大序列长度
POSITION_FIELD: position_id #指定生成的序列位置id
#指定从什么文件里读什么列,这里就是从ml-1m.inter里面读取user_id, item_id, rating, timestamp这四列,剩下的以此类推
load_col:
inter: [user_id, item_id, rating, timestamp]
# 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: TO_LS,full #对数据按时间排序,设置留一法划分数据集,并使用全排序
metrics: ["Recall", "MRR","NDCG","Hit","Precision"] #评测标准
valid_metric: MRR@10 #选取哪个评测标准作为作为提前停止训练的标准
eval_batch_size: 4096 #评测的batch_size
运行
将 ml-1m
数据集文件夹放在目录RecBole/dataset
下,至此几个关键文件的层次应该是:
-RecBole
-dataset
-ml-1m
ml-1m.inter
test.yaml
run_recbole.py
接下来按照我上期RecBole小白入门系列博客(一)——快速安装和简单上手讲的运行方法运行就好啦!
假设运行GRU4Rec模型(别的模型同理,改一下model就好)
python run_recbole.py --model=GRU4Rec --dataset=ml-1m \
--config_files=test.yaml
然后就有下面这样的信息输出了:
这里是打印出的训练参数信息,可以看到有很多我们没设置的默认信息
接下来是数据集的参数信息:
之后给出数据集的基本信息:
再然后是evaluation的设置:
下面是模型结构:
**接下来就开始训练啦,会打印出每一轮的结果: **
一直到训练结束,会给出最终的测试结果:
调(lian)参(dan)
参照之前博客里的调参即可
RecBole小白入门系列博客(二) ——General类模型运行流程
结束语
注意:并不是所有的Sequential类模型都可以顺利按上述步骤运行,有几个模型设置比较复杂,请大家查看。之后我会单独开一期讲所有特殊模型的设置问题。
Sequential类模型运行流程就写到这里,之后我还会继续更新剩下的模型运行流程,以及之前提到的各种参数设置,数据集处理,数据集配置等。大家还有什么想看的可以留言( ̄▽ ̄)~,有什么问题也欢迎和我讨论!
最后附上官网、API文档和GitHub链接~大家有兴趣可以自行查阅哦!
官网:https://recbole.io/cn/index.html
API文档:https://recbole.io/docs/
GitHub:https://github.com/RUCAIBox/RecBole