InstructGPT

architecture

ChatGPT应用

  1. 代码纠错(需要更多的信息,如整个代码是错的/一部分是错的)

  2. 安全性上避免不合法的答案

  3. 上下文理解(费马小定理 -> 密码学应用 -> 打油诗,上限大约8000词)

  4. 理解局限性(不能物理上发信件)

Openai先发模型再发论文,ChatGPT论文暂时未产出

与InstructGPT原理基本一致

引入

原有语言模型是自监督模型,没有标号,精细度不够

产生问题:

  1. 有效性(让模型去干的事情学不会?未涵盖到这方面的数据)
  2. 安全性(输出不该输出的东西)

解决思路:

标注数据+微调(无监督/自监督的回退?)

摘要

语言模型:

  • 变大 不等于 按用户意图做事
  • 有可能生成不真实、有恶意的答案

行业历史

  • 2015年,Google把黑人识别成gorilla,后把单词从语料库中直接删掉
  • 2016年,Microsoft小冰语言中带有种族歧视,而后紧急下架,重新训练后又…
  • 2021年,Facebook把黑人视频增加灵长类标签
  • 2022年,Meta Galatica(Paper with Code团队)生成错误/有偏见的但是听上去是正确的事情,3天后下架了

Openai作为创业公司,公众的容忍度更高…

绕开安全性的例子

image-20221229193153782

image-20230116132844361

展示了怎么样对语言模型和人类的意图做align

简单来说即fine tuning with human feedback(而非labeled data,更有novelty)

具体做法:让工程师写了很多prompt(OpenAI prompt),问题和答案是数据集是第一个训练的模型

对不同模型输出(不同概率采样)用人来输出标谁来好一点,排序数据集(第二个训练模型,InstructGPT)

以1%大小各种效果超过了GPT-3

核心思路:人工降噪?(工业界考虑?)

介绍

大语言模型(LMs)的目标函数不对:在网络文本中预测下一个词(和想让根据人的指示生成答案有区别

没有align

训练步骤:

image-20230116145235825

标注两块数据,训练三个模型

主要发现:

  • 标注者发现输出结果远好于GPT-3

  • truthfulness ↑

  • improvements in toxicity↑ not bias

  • 原始目标函数最终可以拿回来,保证QA任务提升同时,其他NLP下游任务效果不会变差很多

  • holdout标注人员评估instructGPT也更好

  • 其他流行的NLP数据集效果没那么好(数据为王,微调非常敏感)

  • 模型有一定泛化性(数据不需要纳入所有问题,可以根据先验知识…)

  • 还是会犯一些简单错误(习以为常的,比如数学问题?更像一个玩具)

相关工作

Lyman

方法&实验

方法论

跟OpenAI之前的工作方法上没太大区别(并非InstructGPT原创)

数据集

  • Prompt(先)
    • 写任何问题(Plain)
    • 写不同指令(Few-shot),添加后续问题回答
    • 用户想要支持的API应用场景(User-based)

训练了第一个InstructGPT模型,放在Playground里面

把采集的问题再收回来,做一些筛选,限制每个人最多问的问题数

根据user ID划分,避免问题同时出现在训练集,验证集,测试集中

Human-in-the-loop产品思维

  • Prompt之后的不同数据集
    • SFT数据集,labeler直接写答案
    • 用来训练RM的数据集,只需要排序即可
    • 用于RLHF的数据集,不需要标注(来自RM模型的标注)

分别为13k,33k,31k样本

Prompt对应任务

分布和示例:

image-20230122180237532

image-20230122180335225

image-20230122180401225

image-20230122180427486

image-20230122180449549

image-20230122180512720

image-20230122180523694

数据标注

偏工程化的模块

增加对标注工进行筛选(保障数据足够质量,甚至使用强化学习)

将帮助性排在第一位 -> 将真实性、无害性排在第一位

保持了较高的一致性,大约72%同意对方的评测

模型

  • Supervised fine-tuning(SFT)

    • GPT-3标注好的prompt和答案上重新训练一次
    • 扫了16遍数据(13000,较少)
    • 扫一遍就过拟合了,但作为初始化没有问题
  • Reward modeling(RM):

    • softmax层不用,在后面再加上一个线性层来投影

    • 原来每个词有一个输出,把所有输出放起来投影到一个值上面,即一个输出为1的线性层

    • 输出一个标量的分数

    • 6B RM(最大175B,不稳定,loss会飞)

    • 损失函数:Pairwise Ranking Loss

    • $x$表示问题,$y_w$和$y_l$表示一对回答,前者排序更高

    • $$ loss(\theta)=-\frac{1}{\binom{K}{2}}E_{(x,y_w,y_l)\sim D}[\log(\sigma(r_\theta(x,y_w)-r_\theta(x,y_l)))] $$

    • $r_\theta(x,y_w)-r_\theta(x,y_l)$即奖励分数作差

    • 思路:Sigmoid+Logistic Loss+log+负,用于最大化差值

    • 对每个prompt生成9个答案,因而可以有36对

      • 时间成本大概比4个(上一个工作)多30%,但是得到了6倍的标注信息
      • 奖励分数并不用算36次,可以重用,所以省了4倍的时间,K越大越好
      • 原softmax也要好处,只标注最好的一个,确定pairwise中一个为最优解,做损失就可以把一个而分类的regression变成一个多分类的softmax,标注上面可以4选一,但是容易overfilling
  • Reinforcement learning(RL)

    • 算法即PPO(OpenAI之前的工作)

    • 在下面目标函数上做随机梯度下降

    • $$ objective(\phi)=E_{(x,y)\sim D_{\pi_\phi^{RL}}}[r_\theta(x,y)-\beta \log(\pi^{RL}_\phi (y | x)/\pi^{SFT}(y|x))]+\gamma E_{x\sim D_{pretrain}}[\log (\pi^{RL}_{\phi}(x))] $$
    • $\pi^{SFT}$即SFT得到的模型,$\pi_\phi^{RL}$即RL policy,二者一开始是一样的,$\phi$即要学习的超参数,$y$即action

    • x即第三个数据集中的prompt

    • 区别在于$E_{(x,y)\sim D_{\pi_\phi^{RL}}}$并非如之前的常量,是根据环境变化的动态变量,丢进RM中算分数

    • 数据分布会随着模型更新发生变化(环境会发生变化)

    • 不一步到位的原因如下:

      • 人给出的其实是排序,而非不同回答的分数
      • 需要学习一个函数来替代人为标注($R_\theta$),给出实时反馈
    • 第二项$\pi^{RL}_\phi (y | x)/\pi^{SFT}(y|x)$为KL散度,两项都为概率的时候用其来评估相似度,想要的散度比较少

    • 为了避免其他下游任务性能下降,第三项$\gamma E_{x\sim D_{pretrain}}[\log (\pi^{RL}_{\phi}(x))]$把原始目标函数又拿了回来

    • $\gamma$不为0时,即PPO-ptx

在线学习的形式?

之前的工作:RL里多跑几个来回,多次标注并训练

对一些任务还可以,对某些任务没有太大必要

评估与实验结果

image-20230122190552102

以一个1%的模型突破性能

讨论

  1. 训练代价相对比较低(跟预训练相比)
  2. 多数数据标注者第一语言是英语
  3. 模型上也没有完全align或者完全的安全
Yikun Han
Yikun Han
First Year Master Student

Wir müssen wissen. Wir werden wissen.