前言
大模型最近很是火啊,媒体铺天盖地的宣传,候选者简历中写LLM微调等等。本文希望以huggingface trl/RLHF notebooks讲到的几个例子作为入口,介绍下RLHF在整个训练工作中的位置以及起到的作用,方便理解与后续应用。
代码分析
在huggingface trl/RLHF notebooks这个文件夹下,一共有三个例子:
同时也按照上述这三个文件顺序进行分析。
一、gpt2-sentiment.ipynb
目的:这个文件实现的是如何利用RLHF学会生成正向评论。
1. Load IMDB dataset
数据集默认有两个字段,text
和label
,即用户对一部电影的评论和这条评论的情感倾向(正向、负向)。
这里对text
字段随机截断长度为n后面的文本,例如:text=这个电影我觉得很棒
。 截取后变成query=这个电影
。
2. Model和Ref Model
这里采用GPT2作为训练model,ref model和model是一样的,可先理解成model是用来训练的,ref model是用来参考的。
ref model是RLHF训练过程中不可缺少的一部分,也跟在generation model后面添加ValueHead层是一个道理,关于强化学习更细力度,本文先忽略。
3. reward model
这里采用distilbert-imdb模型来作为打分模型,这个模型的作用是输入一条评论,它会给出positive、negative的打分。
4. 训练
即让model基于query生成指max_new_tokens的文本,然后让reward model来打分,以positive score为目标,不断优化model,使其能够基于用户给定的文本开头来生成正向评论。
这里的max_new_tokens也比较有意思,它可以有两层的不同解释:
- 一条文本的长度不会很长
- 折扣因子
关于后者,我觉得会是一个比较有意思的点。在RLHF中,有针对每一步给一个score,还有走完后针对整条路径给一个score。那这里的max_new_tokens是不是就可以理解成是中间的状态~
既不会因为每一步都打分造成训练效率低下也不会因为对整条路径打分导致某些点决策失误所带来的更大偏差,尽量缓解这种情况。
结束。
二、gpt2-sentiment-control.ipynb
目的:通过添加prompt来控制生成评论的情感。
这里的prompt有三类:positive、negative、neutral。由于neutral是reward model本身能力所不具备的,看到这里也可以跳过。
其构造示例如下:
1 | query="[positive]这个电影很" |
那么预期目标是好
。
如果是
1 | query="[negative]这个电影很" |
那么预期目标是不好
,差
之类的情感。
剩下流程和上面文件一致,此处忽略。
三、best_of_n.ipynb
目的:RLHF的目标是超越原有天花板,那这种是选取ref model的best of n来和RLHF训练后的做个比对。
整体下来,reward model占据很重要的作用,决定了RLHF的效果,需要注意。
更多看下原代码,整体流程不是很复杂。又水水水了一篇。
实验
1. 数据集
以ChnSentiCorp作为情感分类数据集。
2. reward model
train_score.py
1 |
|
训练后F1能达到95%,所以打分模型至此结束。
3. train RLHF
1 | import pandas as pd |
4. eval RLHF
1 | from transformers import AutoModelForCausalLM, AutoTokenizer |
使用RLHF训练后的生成结果示例如下:
1 | 这个电影,见证点深的艺术价值。<|endoftext|> |
前两个例子还好,比较容易生成理想的正面评论,第三个和第四个例子前面说到了天气很差
和屏幕很差
,都是偏负面的评论,但是后面生成的文本还是能生成正向的回答,说明经过强化学习的确有产生预期效果。
关于文本流畅问题,有个问题是Wenzhong-GPT2本身产生通顺句子的能力就比较弱,但经过多轮训练,也能产生除生成正向评论外的效果,这点也是很nice.