Skip to content

后训练hugging face学习

(手写的草稿)

期望达成目标

继续深入学习 了解概念后,框架和代码初入门。

笔记和总结

SFT STF(https://huggingface.co/docs/trl/en/sft_trainer) 这篇讲了个入门,主要就是原始数据集 -> hf 处理成 input_ids(不是字符串而是数字, 对应vocab) -> 定义了labels去做masks,因为有些输入不会被计算loss。 训练样式多种多样,比如有补全的,有对话的,但无论如何在SFT的时候都是会把内容拼在一起然后输入给模型,从模型底层看,最终都会变成一串 input_ids;但训练集的结构化格式仍然很重要,因为它决定了如何拼接、套用 chat template,以及哪些 token 被 mask 后参与 loss。

这里文档没讲的是trainer.train()在被调用后,预计会耗时多久,如何监控进度,如何调用底层资源,都被封装在了下面细节里,更多的是工程上的问题,可以之后进一步了解。

DPO

https://huggingface.co/docs/trl/en/dpo_trainer

dpo 是offline policy的策略,这里特别的是不仅给出了正向的答案,也给出了rejection,于是计算loss的公式也根据此做了调整,从hugging face的api来看,主要区别在于测试集的不同,以及api提供的接口不同。

GRPO

GRPO是online policy,意味着在没有标准答案(或者标准答案不唯一,比如说写代码功能更重要而命名没有标准答案),但可验证的情况下仍然可以训练。对于hugging face提供的API来说,这里需要提供reward function, reward function非常大程度上影响了训练质量。这里面重点是每次会sampling多次(所以叫做group relative policy optimization).

这里面有两个 term比较重要,第一个是advantage,比较这次生成结果的reward和baseline的差距(注意不是生成概率分布和baseline的比较);第二个是KL和reference model,也就是每次训练的时候,尽管可以认为训练会变好,但因为reward函数可能出现问题,所以需要避免模型本身相比于过去的model差别过大,所以说需要来用KL衡量当前模型和reference model的变化。需要提及的是,reference model加上KL的这一层主要作用于整个模型训练的级别,不同于DPO限制单次更新。这里比较有趣的是,由于训练必然偏离ref model,在这个阶段KL并不区分“是否离想要的(reward)更近“, 而是全部都给予一个惩罚。但是对于reward鼓励的,会给予高分,扣掉KL的惩罚还有奖励,而对于reward不倾向的奖励,在扣掉KL后可能就是不合算的方向了。

Dataset Formats

dpo带来的蕴涵着比较性,他没有说rejection绝对不行, 而是说相比于chosen,他不行,但是kto是绝对的,true or false. 测试数据集分standard和conversational,提供了多种的结构,但是这会被框架处理好,等输入到模型里面都是一样的。所以在这个阶段,可以引入很多可配置项并配套训练模型,之后模型就可以尊重这些配置了,这个转换是一个叫做chat template的模版来做的。忽略层次上的结构不同,更需要关注的是模型是不是prompt only,是不是有preference等。

Comments