RecBole小白入门系列博客(五)
——Knowledge类模型运行流程
注意:本系列基于RecBole v.0.2.0 版本!
传送门:
RecBole小白入门系列博客(一)——快速安装和简单上手
RecBole小白入门系列博客(二)——General类模型运行流程
RecBole小白入门系列博客(三)——Context类模型运行流程
RecBole小白入门系列博客(四)——Sequential类模型运行流程
写在前面
- 这次的内容和之前的运行流程差不多,我会特别提一下Knowledge类模型不一样和需要注意的地方。
- 由于模型的完整运行流程会牵扯到很多部分,从数据到参数,所以这里将简略的举出例子,让大家可以大致独立完成模型的运行。关于一些更加具体和细微的部分,我将在后面单独写博客为大家介绍。
选定模型
RecBole中共有17个Sequential类模型可供使用,模型列表如下:
关于模型的具体信息可以查看上面的链接,大家选用需要的模型即可。我们以模型CKE为例。
设置模型超参数
每个模型的超参数都不一致,大家可以从上面的链接中查看自己所需模型的超参数有哪些。在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
中写入想要修改的参数 - 保存
例如,我想修改模型CKE的参数,就去查看路径RecBole/recbole/properties/model/GRU4Rec.yaml
,参数如下:
embedding_size: 64
kg_embedding_size: 64
reg_weights: [1e-2,1e-2]
那如果我想把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 文件,模式如下:
设置数据集参数
注意:Knowledge类模型会用到.kg
和.link
文件,这些需要根据.inter
文件生成,生成方式请参照RecBole数据集生成工具,后续会就数据集使用单开一期介绍
针对特定数据集,需要设置相应的参数,才可以让模型正常运行。这里仍然以 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域
HEAD_ENTITY_ID_FIELD: head_id #指定头实体id域
TAIL_ENTITY_ID_FIELD: tail_id #指定尾实体id域
RELATION_ID_FIELD: relation_id #指定关系id域
ENTITY_ID_FIELD: entity_id #指定实体id域
NEG_PREFIX: neg_
LABEL_FIELD: label
#指定从什么文件里读什么列
load_col:
inter: [user_id, item_id, rating]
kg: [head_id, relation_id, tail_id]
link: [item_id, entity_id]
unused_col:
inter: [rating]
lowest_val:
rating: 3
这里注释写的比较简略,感兴趣的同学可以参考API文档,后续我也会专门开一篇博客来介绍。
设置训练参数
设置好数据及之后,我们要继续设置训练的参数,在test.yaml
中继续写入:
# training settings
epochs: 500 #训练的最大轮数
train_batch_size: 4096 #训练的batch_size
learner: adam #使用的pytorch内置优化器
learning_rate: 0.001 #学习率
training_neg_sample_num: 1 #负采样数目
eval_step: 1 #每次训练后做evalaution的次数
stopping_step: 10 #控制训练收敛的步骤数,在该步骤数内若选取的评测标准没有什么变化,就可以提前停止了
设置评测参数
运行前最后一步,需要设置评测参数。在test.yaml
中继续写入:
# evalution settings
eval_setting: RO_RS,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域
HEAD_ENTITY_ID_FIELD: head_id #指定头实体id域
TAIL_ENTITY_ID_FIELD: tail_id #指定尾实体id域
RELATION_ID_FIELD: relation_id #指定关系id域
ENTITY_ID_FIELD: entity_id #指定实体id域
NEG_PREFIX: neg_
LABEL_FIELD: label
#指定从什么文件里读什么列
load_col:
inter: [user_id, item_id, rating]
kg: [head_id, relation_id, tail_id]
link: [item_id, entity_id]
unused_col:
inter: [rating]
lowest_val:
rating: 3
# training settings
epochs: 500 #训练的最大轮数
train_batch_size: 4096 #训练的batch_size
learner: adam #使用的pytorch内置优化器
learning_rate: 0.001 #学习率
training_neg_sample_num: 1 #负采样数目
eval_step: 1 #每次训练后做evalaution的次数
stopping_step: 10 #控制训练收敛的步骤数,在该步骤数内若选取的评测标准没有什么变化,就可以提前停止了
# evalution settings
eval_setting: RO_RS,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
ml-1m.kg
ml-1m.link
test.yaml
run_recbole.py
接下来按照我上期RecBole小白入门系列博客(一)——快速安装和简单上手讲的运行方法运行就好啦!
假设运行CKE模型(别的模型同理,改一下model就好)
python run_recbole.py --model=CKE --dataset=ml-1m \
--config_files=test.yaml
然后就有下面这样的信息输出了:
这里是打印出的训练参数信息,可以看到有很多我们没设置的默认信息
接下来是数据集的参数信息:
之后给出数据集的基本信息:
再然后是evaluation的设置:
下面是模型结构:
**接下来就开始训练啦,会打印出每一轮的结果: **
调(lian)参(dan)
参照之前博客里的调参即可
RecBole小白入门系列博客(二) ——General类模型运行流程
结束语
Knowledge类模型运行流程就写到这里,之后我还会继续更新剩下的模型运行流程,以及之前提到的各种参数设置,数据集处理,数据集配置等。大家还有什么想看的可以留言( ̄▽ ̄)~,有什么问题也欢迎和我讨论!
最后附上官网、API文档和GitHub链接~大家有兴趣可以自行查阅哦!
官网:https://recbole.io/cn/index.html
API文档:https://recbole.io/docs/
GitHub:https://github.com/RUCAIBox/RecBole