MiniOneRec 开源推荐框架论文解读
项目资源
- 代码仓库:https://github.com/AkaliKong/MiniOneRec
- 技术报告:https://arxiv.org/abs/2510.24431
- 参考工具:https://www.alphaxiv.org/
SFT 阶段
数据集
代码路径:MiniOneRec/data.py
类 Tokenizer:给普通的分词器多包装了一层,可以处理连续的 bos/eos 的特殊字符串。
SidSFTDataset
多样化的指令 任务:输入用户最近交互过的 item 列表,预测用户下一个交互的 item
SidItemFeatDataset
sid2title 或者 title2sid 任务
FusionSeqRecDataset
带意图识别的商品推荐
训练流程
代码入口:MiniOneRec/sft.py
- 运行 train.py,传入要训练的主干 LLM 即 base_model
- 传入 SID token,MiniOneRec 是传入到了普通 tokens 中,而非 special tokens 中
- MiniOneRec 考虑是否冻结 LLM 自带的 token 的 emb 和各种参数,只训练新传入的 SID 的 token emb
- 处理数据集,有三种类型:SidSFTDataset、SidItemFeatDataset、FusionSeqRecDataset
- 训练
Token 扩展:SID
SID 索引示例:MiniOneRec/data/Amazon/index/Industrial_Scientific.index.json
是一个 json 文件,{"0": ["<a_236>", "<b_231>", "<c_226>"], "1": ["<a_42>", "<b_80>", "<c_160>"],...}
indices 是一个字典,如 indices["0"]=["<a_236>", "<b_231>", "<c_226>"]
函数 get_new_tokens 返回 self.new_tokens,就是返回 SID 的子 token 集合。
仅训练新 Token Embedding
先冻结所有参数,然后打开 embedding 参数的 required_grad,然后通过 register_hook 来控制哪些 token 的梯度保留
embedding_layer.weight[:original_vocab_size].requires_grad=False是不行的,因为不能直接对张量(Tensor)的切片(Slice)设置 requires_grad 属性。
print("Freezing LLM parameters, only training new token embeddings")
for param in model.parameters():
param.requires_grad = False
if sid_index_path and os.path.exists(sid_index_path) new_tokens:
embedding_layer = model.get_input_embeddings()
embedding_layer.weight.shape[] > original_vocab_size:
embedding_layer.weight.requires_grad =
():
grad[:original_vocab_size].zero_()
grad
embedding_layer.weight.register_hook(mask_grad)
(
)








