Giter Site home page Giter Site logo

blog's Introduction

Blog

【LLM整理】

1. LLM训练和推理提速技巧 Link

  • 使用Attention with Linear Biases替换正弦位置编码,获得更好的外推能力并加速训练
  • 使用稀疏Attention(例如BigBird)避免对所有Attention进行计算,加速训练和推理
  • 使用FlashAttention提高GPU上的Attention计算效率,这一功能已被pytorch2.0内置,加速训练和推理
  • 使用Multi-Query Attention共享各个注意力头上的线性投影层,加速推理
  • 使用条件计算区分出轻/重前馈分支,特别对于d >> n场景,减少不重要token的计算量,加速训练和推理

2. AlpacaFarm解析 Link

斯坦福提出AlpacaFarm来解决三个问题:

  • 高成本的数据注释。提出了混合API LLM标注方案,能够与人类标注者有较高的一致性同时捕捉标注者之间的差异性和偏好;
  • 缺乏公认的自动化评估方案。混合已有的公开数据集和真实人类指令得到评估数据集,将Davinci-003作为基线模型进行胜率对比,实现较一致的模型比较;
  • 缺乏充分验证的人类偏好学习方法。评估了6种基于偏好的学习模型,结论是PPO效果最好。公布了相关的评估代码。

同时,AlpacaFarm数据集还存在一些局限性,包括:

  • 采用的指令相对较为简答
  • 评分时可能更偏向于风格而非事实
  • 没有衡量模型可能造成的危害

3. LLaMA模型如何扩充中文词表 Link

没有中文词表的tokenizer会导致序列长度显著增长,且模型很难将中文与其他utf-8字节进行区分,并学习到其中的语义。

扩充方法是首先用中文语料训练tokenizer,然后将中文tokenizer词表与原始词表(尾部)合并。然后进行两阶段预训练,第一阶段只训练embedding,第二阶段才进行全量参数微调。

blog's People

Contributors

dr-corgi avatar

Stargazers

tom.ling avatar

Watchers

 avatar

blog's Issues

LLaMA模型如何扩充中文词表

(一)为什么需要扩充中文词表

原始LLaMA模型的训练数据主要是英文+少量欧洲语言。因此LLaMA的跨语言理解能力主要以欧洲语言形式表现出来。而Chinese-LLaMA-Alpaca项目团队的研究发现,尽管LLaMA的中文文本生成能力很弱,它还是能够表现基本的中文理解能力。

尽管如此,原始LLaMA模型的tokenizer只包含了约1000个汉字,不足以编码一般的中文文本。尽管LLaMA tokenizer会将未知的UTF-8字符token转化为字节来规避这个问题,但这个方法会显著增加序列长度,降低中文编解码效率(因为每个汉字都会变成一个3-4byte的token)。此外,字节token也可以用来表征其他语言,因此要让模型学习出哪些是汉字以及它们的含义是很困难的。所以,一个比较直观的思路是直接对词表进行扩展。

(二)如何扩充中文词表

根据Chinese-LLaMA-Alpaca项目的论文的做法,主要有以下三步:

  1. 首先使用SentencePiece在中文语料上训练一个词表大小为20000的tokenizer;
  2. 通过与原始的LLaMA tokenizer取并集,得到一个词表大小为49,953的tokenizer;随后将word_embedding层进行扩展,将新增词汇的Embedding拼接到原始embed矩阵的末尾,确保不对原始的embedding造成影响;
  3. 在继续预训练(阶段1)中,固定transformer模型参数并仅训练embedding来学习新词汇的表示并最小化对原始模型embedding的扰动;
  4. 在LoRA指令微调(阶段2)中,则开放全部参数进行微调。

Reference

[1] Cui Y, Yang Z, Yao X. Efficient and effective text encoding for chinese llama and alpaca[J]. arXiv preprint arXiv:2304.08177, 2023. https://arxiv.org/pdf/2304.08177.pdf

中文LLM模型评测

(一)为什么要评测LLM

自动化、标准化评测LLM的主要动机如下:

  • 公开评测数据集非常多,测试量大;
  • 公开数据集的数据可能包含在LLM训练数据集中,导致评测结果不准确;
  • 评测任务的范围定义困难(尽管理论上可以完成无穷多的任务,但哪些任务是真正能够反映大模型能力的?);
  • 基于人工评测的方式可以避免LLM见过测试数据,但评测成本大,难以保证覆盖度和公平性;
  • 调用第三方测试平台存在信息风险问题(如三星代码泄露事故)。

(二)评测LLM的主要方式

1. 基于数据集评估

1) HELM基准

斯坦福大学22年11月发表的论文《Holistic Evaluation of Language Models》对当时主流的30个LLM进行了评测,构建了相应的评测标准并为寻找ChatGPT的替代方案指明了参考方向。文章中的关键结论包括:

  • 50B规模参数是大模型的入场券;
  • 越准确的模型越倾向于闭源,实际上最准确的模型都没有开源;
  • 在Instruct tuning中,提示词的设置对于模型的表现影响很大,而各个模型使用的提示词没有统一的标准,因此在一段时间内还是要依赖于prompt engineering;
  • 在不同类模型的情况下,准确性和效率之间不存在明显的trade-off,即我们总能在某个场景下找到又快又好的模型;
  • LLM做文本摘要的能力很强,已经超出常用的学术数据集的ground-truth
  • 模型越大其知识存储能力越强
  • 经过代码训练过的模型,其逻辑推理能力更强

完整的25条结论如下:

  1. 指令微调/Instruction-tuning - 很关键;
  2. 准确性与开放性/Relating model accuracy with model access - 闭源模型的准确性远高于开源模型;
  3. 置信度/Calibration - 针对不同的场景和适配过程,有时提升精度会导致置信度恶化,有时候会带来置信度提升;
  4. 鲁棒性与公平性/Robustness and fairness perturbations - 在所有的场景下,准确性、鲁棒性和公平性之间存在强相关性;
  5. 种族场景性能差异/Performance disparities - 所有模型在白人英语上表现更好,在黑人英语方言上的表现明显下降;
  6. 有毒内容生成/Generative harms - 模型生成中的偏差和毒性很大程度上比较一致,在核心场景的总体平均水平较低;
  7. 准确性 vs 效率/Accuracy vs. efficiency - 准确性和效率之间不存在明显的trade-off;同系列模型中,参数越多,准确性越高,开销越大;
  8. 问答/Question answering - 最好的模型都是闭源;
  9. 信息检索/Information retrieval - 在经典任务上LLM优于传统方法,在一定设置下超出微调的专有模型,但距离SOTA还有差距;
  10. 摘要/Summarization - 效果超过了经典数据集提供的参考摘要,所以需要有人类高质量改写以提升数据集的参考摘要水平,以便于评估in-context learning,instruction tuning和fine-tuning的效果;
  11. 情感分析/Sentiment analysis - 大部分模型在IMDB上效果良好,鲁棒性和公平性扰动方面略有下降;
  12. 有毒内容检测/Toxicity detection - 在CivilComments上的毒性检测效果都不太准,最好的模型(OPT-175B)仅达到50.1%;
  13. 文本分类/Miscellaneous text classification - 模型在不同的文本分类任务上的表现存在明显差异,例如Instruct-davinci-v2在其他任务上都很准确,除了systematic review inclusion任务(40.8%,而其他模型在该任务上可以达到97.5%);
  14. 语言理解/Linguistic understanding - 在标准语法上越准确的模型,在不规范文本上的表现越差。说明这些模型可能过度概括了特定的语言规则;
  15. 知识/Knowledge - 模型规模增大有助于事实知识的记忆
  16. 逻辑推理/Reasoning - 代码模型的推理能力远强于文本模型,即使在自然语言的综合推理任务上也是如此。如codex-davinci-v2在GSM8K数据集上可以达到52.1%准确性(而其他模型只有16%左右);
  17. 材料记忆/Memorization of copyrighted/licensed material - 大段拷贝受版权保护的内容并不常见,但热门书籍的内容更容易出现。模型准确度越高,越容易出现大段的内容拷贝;
  18. 虚假信息/Disinformation - 大模型擅长生成支持给定结论的标题,但在生成鼓励人们开展某些行为的文本时表现差异很大;
  19. 有针对性的偏见/Targeted biases - 模型精度和模型偏见在模棱两可情景中存在非常显著的相关性。测试中精度最高的三个模型所呈现的偏见与社会广泛偏见/歧视呈现高度一致性,而其他模型则有各自的偏见方向;
  20. 针对性的有毒内容生成/Targeted toxicity generation - 在核心场景有毒内容生成的比例非常低。使用有毒的提示词会大大增加模型生成有毒内容的趋势;
  21. 综合评测的好处/Comprehensiveness - 在统一条件下进行广泛的评估能够揭示先前公开数据集测试中没有被发现的特性;
  22. 提示词/Prompting - 所有模型都对prompting的格式、few-shot example的选择与数量有显著的敏感性,各个模型在prompting的选择上没有统一的标准;
  23. 多选择自适应方法/Multiple choice adaptation method - 多选场景下模型对于提示词非常敏感,如何公平地评测不同模型是一个挑战;
  24. 上游困惑度和下游准确度/Upstream perplexity and downstream accuracy - 基于上游任务指标预测下游任务准确率不可靠
  25. 模型规模趋势/Trends for model scale - 同系列模型中,模型规模越大准确率越高;参数大于50B的模型在准确率上显著高于小于50B的模型;超过50B后,训练方法比参数量更重要。

2) SuperCLUE

SuperCLUE框架(https://www.cluebenchmarks.com/superclue.html)是针对中文可用的通用大模型的一个测评基准。该框架从三个不同的维度评价模型的能力:

  1. 基础能力: 包括了常见的有代表性的模型能力,如语义理解、对话、逻辑推理、角色扮演、代码、生成与创作等10项能力。
  2. 专业能力: 包括了中学、大学与专业考试,涵盖了从数学、物理、地理到社会科学等50多项能力。
  3. 中文特性能力: 针对有中文特点的任务,包括了中文成语、诗歌、文学、字形等10项多种能力。

① SuperCLUE的特点:

  1. 多个维度能力考察(3大类70+子能力):从三个不同角度对中文大模型进行测试,以考察模型的综合能力;并且每一个子能力又含有十项或以上不同的细分能力。
  2. 自动化测评(一键测评):通过自动化测评方式以相对客观形式测试不同模型的效果,可以一键对大模型进行测评。
  3. 广泛的代表性模型(9个模型):选取了多个国内外有代表性的可用的模型进行测评,以反应国内大模型的发展现状并了解与国际领先模型的差距或相对优劣势。
  4. 人类基准:在通用人工智能发展的情况下,也提供了模型相对于人类效果的指标对比。

② SuperCLUE的局限性:

  1. 基础能力、中文特性能力:虽然每一部分都包含了10类子能力,但这两个能力的总数据量比较少,可能存在需要扩充数据集的问题。
  2. 选取模型的不完全:测试了9个模型,但还存在着更多的可用中文大模型。需要后续进一步添加并测试;有的模型由于没有广泛对外提供服务,我们没能获取到可用的测试版本。
  3. 选取的能力范围:框架尽可能的全面、综合衡量模型的多维度能力,但是可能有一些模型能力没有在其考察范围内。
  4. 客观考察的不足:一些主观、开放性问题的模型能力的考察可能存在不足。

3) C-Eval

上海交大与清华大学的C-Eval平台(https://cevalbenchmark.com/index_zh.html)是一个全面的中文基础模型评估套件。它包含了13948个多项选择题,涵盖了52个不同的学科和四个难度级别。
image

4) CUGE

智源研究院的CUGE框架(https://cuge.baai.ac.cn/#/task)包含高质量中文自然语言处理数据集、排行榜与在线评测平台,旨在构建全面系统的中文机器语言能力评测体系,形成多层次维度的评测方案,力求更加科学、规范、高质量地推进中文自然语言处理技术的标准评测。

该框架包含七个维度的能力评测,包括:

  1. 词句级语言理解 - 中文分词、词性标注、古诗文识记、命名实体识别、实体关系抽取
  2. 篇章级语言理解 - 幽默检测、故事情节完形填空、阅读理解
  3. 信息获取及问答 - 反向词典、开放域问答、文档检索
  4. 语言生成 - 摘要生成、数据到文本生成
  5. 对话交互 - 知识驱动的对话生成
  6. 多语言 - 机器翻译、跨语言摘要
  7. 数学推理 - 数值计算

5) MMLU

UC伯克利提出的MMLU框架(https://github.com/hendrycks/test)是一个包含了57个多选问答任务的多样性英文评测基准数据集,涵盖了初等数学、美国历史、计算机科学、法律等领域,难度覆盖从高中到专家水平的人类知识,是目前主流的LLM评测数据集。

6) BigBench

谷歌提出的BigBench(https://github.com/google/BIG-bench)基准旨在探索大型语言模型并推断其未来功能。BIG-Bench中包含了超过200个任务,其中一些任务被认为超出了当前LLM的能力。

2. 基于裁判大模型评测

1) PandaLM

2) AlpacaEval

AlpacaEval是一种基于LLM的快速、低成本、可靠的自动评估方法。该方法基于AlpacaFarm评估集,通过GPT-4或者Claude来将不同的模型与davinci-003的响应进行比较,从而得到胜率。AlpacaEval与人类标注者显示出很高的一致胜率。

3. 基于ELO竞技场评测

1) UC伯克利

2) SuperCLUE琅琊榜

LLM训练和推理提速技巧

ALiBi位置嵌入、稀疏注意力、FlashAttention、多查询注意力、条件计算和80G A100 GPU。

要点和技巧

要点

  1. Self-Attention层的时间复杂度是O(n²d)或O(nd²),其中:
  • Q, K, V:(n, k) x (k, d),假定k=d有复杂度为O(nd²)
  • QK^T:(n, d)和(d, n)运算,得到(n,n)矩阵,复杂度为O(n²d)
  • softmax计算:对每行做softmax,复杂度为O(n),则n行的复杂度为O(n²)
  • 加权和:(n, n) 与 (n, d)运算,得到(n, d)矩阵,复杂度为O(n²d)
  1. Transformer结构中,可学习的矩阵权重的形状与输入token的数量n无关。因此,经过训练的2K context长度的Transformer可以处理100K长度的输入。但是如果没有在100K上训练,推理期间无法在100K token上产生有意义的结果。
  2. 由于Self-Attention的O(n²d)复杂度,在巨大的语料库上训练vanilla Transformer是不可行的。根据估算,2K长度的LLaMA训练成本为3M美元,因此100K长度的LLaMA将花费150M美元。
  3. 一种选择是在2K token上训练模型,然后在更长的上下文(如65K)上微调模型。但由于Positional Embedding是正弦编码,他不能和原始的Transformer一起工作。

技巧

  1. 解决这个问题的首要技巧是删除正弦编码并使用Alibi,这种方式不会影响精度,并且允许模型在2K上训练,在100K上微调。
  2. 不需要计算所有token之间的attention分数。有些token比其他token更重要,因此可以使用稀疏注意力来加快训练和推理的速度。
  3. 在GPU上可以使用Flash Attention实现高效的注意力。它通过平铺来避免不适合GPU SRAM的中间矩阵计算,这有助于加快训练和推理的速度。
  4. 使用Multi-Query Attention替代Multi-Head Attention。这意味着在线性投影K和V时,可以在所有head上共享权重,这显著加快了增量推理的速度。
  5. 使用条件计算避免将所有模型参数应用于输入序列中的所有token。CoLT5仅将繁重的计算应用于最重要的token,而使用轻量版本的层处理其他token。这能够加快训练和推理的速度。
  6. 为了适应更大的Context,需要大量的GPU RAM,因此使用80G A100 GPU。

综上,训练和推理的速度越快,可以使用的上下文长度就越大。

原始Transformer和Context Length

在Transformer结构中,可学习矩阵权重的形状不取决于输入token的数量n。训练长context Transformer的解决方案是分两阶段训练它:

  1. 在2K token上下文长度上训练基本模型
  2. 在更长的Context (65K或100K)上继续训练(微调)

回顾Multi-head Attention

符号定义

  1. Q, K, V:与论文中信息检索有关的符号,将Query插入系统并搜索最接近的Key
  2. n:输入的token数
  3. d:文本embedding维度
  4. h:attention head的数量
  5. k:Q和K的线性投影尺寸
  6. v:V的线性投影尺寸

Multi-head Attention

  1. 首先是look-up Embedding层,对于一个给定的token,返回一个大小为(1,d)的向量。因此对于n个token的序列,可以得到(n,d)大小的文本Embedding矩阵X。随后我们给它加上位置正弦嵌入。
  2. Multi-head Attention层的目的是计算该token序列的新嵌入,但(1)按照token之间相对于上下文的重要性加权,(2)按token的相对位置加权。
  3. 使用h个attention head并行地处理这个(n,d)矩阵X。要获得所有attention head的Q,K和V,需要将X线性投影到k, k和v维度。这一步可以通过将X乘以h个形状为(d, k), (d, k)和(d, v)的矩阵来实现。
  4. Attention head返回h个大小为(n,v)的注意力分数矩阵。然后,将所有head中的片段串联起来 - 即(n, h*v) - 并对其进行线性投影用于下一步。
    image

Scaled Dot-product Attention

  1. Q, K, V时大小为(n, k), (n, k)和(n, v)的3个线性投影,通过乘以每个头部单独的可学习权重获得。
  2. 通过计算Q和K转置之间的距离(点积)来获得注意力分数。将(n,k)乘以(k,n)得到(n,n)。然后,将其乘以mask矩阵,将一些token归零(例如在decoding阶段)。然后对其应用softmax缩放到0至1。这样就得到了形状为(n, n)的矩阵n_ij,表示第i个和第j个令牌之间的相对注意力分数。该分数显示了这些令牌在长度为n的特定上下文中的“接近”程度。
  3. 然后,将这个Attention分数矩阵(n,n)乘以大小为(n,d)的值V,以获得由这些相对注意力分数加权的文本嵌入。
    image

Transformer的复杂度和Context长度

矩阵乘法中(a,b) * (b,c)的复杂度为O(a * b * c)。为了简化计算,假定k * h = O(d)。

注意力层的复杂度由两部分组成

  1. Q, K, V的线性投影:大小为(n,d)的embedding矩阵乘以k个可学习矩阵(d, k)、(d, k)和(d, v)。因此,复杂度~O(nd²);
  2. Q和K的乘法转换,然后乘以V:其中(n, k) * (k, n) = (n, n)和(n, n) * (n, v) = (n, v)。复杂度~O(n²d)

因此,有

  1. 当d>n时,项O(nd²)更重要(例如在LLaMA中,n=2K, d=4K)
  2. 当n>d时,项O(n²d)更重要(例如用n=65K和d=4K训练MosaicML)

增加上下文长度的优化技术

Trick 1:更好的位置编码ALiBi 【加速训练】

两阶段训练方案不能用在传统的Transformer架构是因为位置正弦编码没有“外推”能力。带线性偏差的注意力(Attention with Linear Biases, AliBi)位置嵌入应用于注意力头(而不是网络底部),它以与其距离成正比的惩罚来偏置query-key注意力分数(在softmax之前)。
image
这个技巧加速了训练。
image

Trick 2:稀疏Attention 【加速训练/推理】

不是全部的100K个上下文中的所有token都相互有关。减少计算次数的一种方法是在计算注意力分数时只考虑一些token。添加稀疏性的目的是使得计算线性于n,而不是二次于n。有一些方法来解决如何选择token之间的连接:
image
image

滑动窗口Attention在每个token周围使用固定大小的窗口注意力。在这一模式中,给定一个固定的窗口大小w,每个token在每一侧都会处理w/2个token。这种方式的复杂度为O(n*w),它与输入序列长度n呈线性缩放。为了使其高效,w应该相比于n更小。

BigBird则结合了全局、局部和随机机制。

Trick 3:FlashAttention 【加速训练/推理】

Attention层中有一些计算是被多次重复的:

  • S = Q * K
  • P = softmax(S)
  • O = P * V

FlashAttention实现了注意力层算法以利用GPU内存,并计算精确的注意力。

当GPU进行操作时,输入数据必须存在于名为SRAM的“快速”存储器中。数据从“慢”的HBM存储器复制到SRAM,在计算结束后返回HBM。SRAM内存比HBM快得多,但是大小要小得多(40GB A100 GPU中的20MB)。
image

因此,访问HBM是一项昂贵的操作。GPU内存利用率——注意力层中的主要问题是P、S、O等中间乘法结果的规模很大(n,n)。需要把他们保存在HBM,并且在Attention操作期间再次读取它们。将P、S、O在HBM和SRAM之间来回移动是瓶颈,因此FlashAttention的主要**是将Q、K、V矩阵拆分成块,将这些块从HBM加载到SRAM,然后计算这些块的Attention输出。这一过程称为平铺(Tiling)。
image

这里的Matrix Multiplication操作针对GPU进行优化。FlashAttention将几种乘法和softmax与平铺操作进行融合,并优化了对HBM的访问。Pytorch 2.0版本内置了FlashAttention。

Trick 4:Multi-Query注意力 【加速推理】

原始的Multi-Head Attention中,每个Head都有一个单独的线性层,用于K和V矩阵。在推理过程中,解码器先前token的key和value被缓存以防止重新计算他们,因此GPU内存的使用量随着token的生成而增长。

多查询注意力(Multi-Query Attention, MQA)是一种优化,建议在线性投影K和V时在所有Attention Head共享权重,因此只需要保留两个大小为(n, k)和(n, v)的矩阵。一个大模型可以有多达96个头(如GPT-3),这意味着使用MQA可以节省96倍的key/value解码器缓存消耗。

这种优化在生成长文本时特别有益。其优点是显著加快了增量注意力score的计算,而训练的速度基本保持不变。

Trick 5:条件计算 【加速训练/推理】

当d>n时,模型的瓶颈不是注意力层,而是FFN和projection层。减少FLOPs(是floating point operations的缩写,意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度)的常见方法是采用某种形式的条件计算,避免将所有模型参数应用于输入序列中的所有token。

在Trick 2中,有些token比其他token更重要。基于类似的原因,在CoLT5论文中,作者将所有的FFN和注意力计算分为两个分支:重和轻。轻层应用于所有的token,而重层只应用于重要token。

“轻前馈分支和重前馈分支仅在hidden维度上不同,轻分支的hidden维度比标准T5前馈层小,而重分支的hidden维度更大。”

对于高达64K输入token的超长序列,这种方法被证明优于现有的LongT5模型的速度和准确性。

Reference

[1] The Secret Sauce behind 100K context window in LLMs: all tricks in one place https://blog.gopenai.com/how-to-speed-up-llms-and-use-100k-context-window-all-tricks-in-one-place-ffd40577b4c
[2] Sliding Window Attention https://paperswithcode.com/method/sliding-window-attention
[3] FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness https://arxiv.org/abs/2205.14135
[4] Fast Transformer Decoding: One Write-Head is All You Need https://arxiv.org/abs/1911.02150
[5] Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation https://arxiv.org/abs/2108.12409
[6] Big Bird: Transformers for Longer Sequences https://arxiv.org/abs/2007.14062
[7] PaLM: Scaling Language Modeling with Pathways https://arxiv.org/abs/2204.02311
[8] CoLT5: Faster Long-Range Transformers with Conditional Computation https://arxiv.org/abs/2303.09752

AlpacaFarm解析

主要目标

AlpacaFarm的目标是促进instruction following的模型和方法从人类反馈中学习。这一方式的三个主要挑战是:

  1. 高成本的数据注释
  2. 缺乏模型开发的自动评估方法
  3. 缺乏现有模型的已验证实现

于是,本文提出模拟沙箱AlpacaFarm,使研究人员能够快速迭代模拟环境中的方法,并将它们转移到构建具有实际人类反馈的高性能系统。文章从以下几个方面解决上述挑战:

  1. 对于数据注释成本的挑战,AlpacaFarm采用更快且成本更低的LLM API模拟人工注释。通过为API LLM设计提示,成对比较成本低于众包工作者45倍,通过调整这些提示可以忠实地捕捉人类注释者的质量判断、注释者之间的差异和风格偏好。
  2. 对于自动评估的挑战,AlpacaFarm设计了一个自动评估指标,试图量化系统在简单但真实的现实世界人类指令上的性能。由于人工评估的成本、非可重复性和多样性,改进open-ended instruction following仍然具有挑战。为了解决这一问题,Alpaca Farm采用来自用户交互的指令(Alpaca Demo)作为人类交互参考;
  3. 对于缺乏参考实现的第三个挑战,AlpacaFarm实施和测试了几种流行的学习算法,包括PPO、专家迭代和Quark,并发布参考实现。研究表明PPO使上述方法中最好的方法。

背景&问题定义

学习Instruction Following

Instruction following任务是给定一个用户指令(例如“Tell me something about Alpacas”),目标是开发一个模型来生成高质量的响应,基于未观测的人类奖励函数R。

这篇工作关注于从成对反馈(Learn from pairwise feedback,LPF)中学习。学习的起点是在instruct following上微调过的模型。随后LPF从微调过的模型中获取成对的样本,查询每对中的样本哪个更好,并从这种反馈中学习。

从成对反馈中学习 正式地对该数据集进行定义,有D = {x, y_0, y_1, z},其中x是输入,y_0和y_1是模型的两个候选响应,z表示哪个响应更好。

成对评估 一旦instruction following模型训练好了,可以对这些模型进行评估。这里的方法可以使将两个模型与参考模型进行对比,通过看两个模型相对于参考模型的win rate来决定哪个模型更好。

构建AlpacaFarm

Instruction following数据

论文使用Alpaca数据作为起点,因为其规模达到了52k,且在此数据集上训练的模型具有non-trivial的指令跟随能力。AlpacaFarm将Alpaca数据重新划分为四个部分,使用了其中的42k,为未来留下10k:

  1. SFT部分:包含10k数据用于微调基础的指令跟随LLM;
  2. Pairwise preference部分:包含10k指令数据用来收集pairwise反馈数据;
  3. Unlabeled部分:包含20k未标记的指令,用于诸如PPO的算法;
  4. Validation部分:包含2k数据用于开发和调参。

设计模拟的成对偏好

论文旨在通过prompting OpenAI API LLMs来设计一个模拟器p(z | x, y_0, y_1)。尽管使用LLM作为Annotator日益流行,但是用LLM作为模拟环境的一部分会带来挑战。模拟器的偏好不仅要和人类的偏好高度一致,还要捕捉人类反馈的其他定性方面。例如注释者内和注释者间的不一致。

直观来说,pairwise feedback中的噪声和可变性是LPF问题中的关键挑战,忽略这些因素会导致模拟器和现实世界行为有很大不同。

基本GPT-4 prompt设计

首先通过提供合适响应的guideline,输入in-context样本,和使用批量生成来节约成本。作为第一个基线,使用单个prompt来查询GPT-4,发现它与人类注释者有高度一致性。然而,发现这个基线无法捕捉人工注释的可变性,可能导致奖励过度优化问题。

模拟人类变化

为了更完全地模拟注释者,修改了基本的模拟注释器设计,采用两种方式捕获可变性。
首先,采用一组注释器来模拟成对偏好注释中的可变性,通过查询不同的API LLM并设计带有不同格式、batch size和in-context example的prompt来获得变化。最后,创建了13个模拟注释器。其次,25%的时间里通过直接注入随机噪声并反转模拟偏好来模拟注释器内的可变性。

上述变化使得注释器能够满足对一致性和可变性的要求。总体而言,使用模拟器注释1000个输出的成本为6美元,比人工注释便宜50倍。

设计自动评估

为了构建LPF方法的自动评估,需要解决两个挑战:

  1. 如何量化不同模型的输出质量?
  2. 可以使用哪些指令来代表人类交互?

评估协议

使用模型在相同的instruction下,相对于参考模型的胜率来评估LLM的质量。模拟胜率的好处是它提供了易于理解的度量。在单个参考模型的条件下,不同的方法具有可比性,并且可以重用pairwise feedback样本。参考模型采用davinci-003,因为他是经过充分研究的系统,其性能类似于微调过的模型。

评估数据

指令跟随需要对现实交互实现多样化覆盖。为了构建适当的评估协议,结合了几个开源评估数据集,以及真实的指令交互来构建数据。但是这里不直接发布数据。

最终的评估数据由805条指令组成,包括252条来自self-instruct evaluation set,188条来自OASST evaluation,129条来自Anthropic,80条来自Vicuna evluation,156条来自Koala evaluation。

AlpacaFarm中的参考方法

最终,AlpacaFarm定义了一组经过验证的LPF方法进行跟踪。对于所有LPF方法,首先在指令监督数据上进行初始的微调步骤。然后,运行两个简单基线:

  1. Binary FeedME:持续的使用每个对中更好的结果进行有监督微调
  2. Binary reward conditioning:结合了从负样本(非首选)中学习:添加一个前置token来表示该输出是否被选中,并在推理阶段使用positive token

许多LPF方法不直接操作pairwise feedback数据,而是首先构建一个奖励模型。以下的LPF方法最大化由该分类器logits定义的连续奖励值:

  1. Best-of-n sampling:Best-of-n(或重排)是一种简单但有效的inference-time方法,将从SFT模型中提取出n个独立的响应,然后返回得分最高的响应。
  2. Expert iteration:专家迭代法是Best-of-n的训练时扩展,它首先基于新的指令生成best-of-n,然后在最优输出上进行微调。
  3. Proximal Policy Optimization (PPO):PPO是一种流行的强化学习算法,它使得代理奖励最大化,同时受制于初始SFT模型参数保持的KL惩罚;
  4. Quark:使用Quark的top-quantile变体,通过奖励对序列进行bin并在最佳bin上训练,并且添加KL和熵正则化。

AlpacaFarm可能存在的局限性

  1. 采用的指令相对较为简答
  2. 评分时可能更偏向于风格而非事实
  3. 没有衡量模型可能造成的危害

ELO算法

现有的LLM竞技场采用了经典的ELO Rating机制对大语言模型的能力进行排位。ELO Rating也是在棋牌类竞技和电子竞技中常用的排序算法。该算法计算方式如下:

R_a: A玩家当前的Rating
R_b: B玩家当前的Rating

S_a: A玩家的实际胜负值,胜=1,平=0.5,负=0
S_b: B玩家的实际胜负值,胜=1,平=0.5,负=0

E_a: A玩家的期望胜负值,E_a = 1 / (1 + 10^[(R_b - R_a)/400])
E_b: B玩家的期望胜负值,E_b = 1 / (1 + 10^[(R_a - R_b)/400])
其中E_a + E_b = 1

于是,对战后两名玩家的分数重新计算为:

R'_a = R_a + K * (S_a - E_a)
R'_b = R_b + K * (S_b - E_b)
其中K为极限值,代表理论上最多可以赢得的分数。如果两个玩家Rating相同,则其中一方胜利后赢得的分数为K/2。
在国际象棋大师赛中,K=16;在大部分游戏规则中,K=32。通常水平越高的比赛中K值越小,避免少数比赛就改变高端顶尖玩家的排名。

实例说明

假定当前玩家A分数为1500,玩家B分数为1600。
则E_a ≈ 0.36,E_b ≈ 0.64。

若A玩家获胜,实际胜负值为S_a = 1。则:
R'_a = 1500 + 32 * (1 - 0.36) = 1500 + 20.5 ≈ 1520,A玩家赢得20分,B玩家输掉20分。

若B玩家获胜,实际胜负值为S_b = 1。则:
R'_b = 1600 + 32 * (1 - 0.64) = 1600 + 11.52 ≈ 1612,B玩家赢得12分,A玩家输掉12分。

开源LLM的结构改进

LLaMA模型

LLaMA[2]的结构与GPT相同,采用了causal decoder-only的transformer模型结构。在模型细节上有几个主要改动:

  1. Pre-normalization(来自于GPT-3):为了提升训练的稳定性,采用pre-layernorm代替post-layernorm。具体来说,采用了RMSNorm(均方根Norm)函数;
  2. SwiGLU激活函数(来自于PaLM):使用SwiGLU代替ReLU来提升表现。PaLM中采用的维度是4d,而这里使用了(2/3)4d;
  3. Rotary Embedding(来自于GPTNeo):使用旋转Embedding代替绝对位置Embedding

Bloom模型

BLOOM[3]同样采用了causal decoder-only的transformer模型结构。其模型细节主要改动包括:

  1. ALiBi位置Embedding:ALiBi不是直接向embedding层添加位置信息,而是基于key和query之间的距离给出衰减注意力分数。尽管ALiBi的最初动机是他能够外推出更长的序列,但发现即使在原始序列长度下他也带来了更平滑的训练和更强的下游性能(优于绝对位置Embedding和旋转Embedding;
  2. Embedding Layer Norm:在embedding layer后立即加入一个额外的layer normalization(这种方式来自于bitsandbytes库的StableEmbedding)。研究表明这显著提高了训练稳定性。(注:最终的模型在bfloat16上训练而不是float16,过往研究表明float16可能是引起LLM训练不稳定的某些潜在因素,因为bfloat16减轻了对embedding layer norm的需求。)
  3. 模型采用了GeLU激活函数

GLM模型

GLM[4]采用的是prefix decoder-only的transformer模型结构,模型细节改动比较复杂,包括:

  1. Attention:GLM模型采用双向注意力来处理Context,而不是GPT模型的单向方案。理论上,双向注意力有助于提高模型的NLU能力。当使用[MASK]时,模型接近于BERT或者T5;而使用[gMASK]时模型接近于PrefixLM;
  2. Post Layer Norm:采用了基于DeepNorm的post layer norm,因为在初步实验中他在下游任务表现较好。但是这种方式不是特别稳定;
  3. Rotary Embedding:采用了旋转位置编码;
  4. 模型采用了GeLU激活函数

GLM模型的训练目标是自回归文本填空。相比于LLaMA和Bloom,GLM的训练效率会比较低。因为causal decoder结构会在所有的token上计算损失,而prefix-decoder只会在输出上计算损失,而不计算输入上的损失。因此在相同的训练token量的情况下,prefix decoder的效果会比causal decoder差,因为其实际用于训练的token数量更少。

此外,ChatGPT系列模型证明了causal decoder结构的大语言模型能够获得非常好的zero-shot和few-shot生成能力,并且能够通过指令微调进一步激发。而prefix decoder结构的模型是否能获得相当的能力还缺乏足够的验证。

Reference

[1] 大语言模型LLaMA, ChatGLM, BLOOM 的高效参数微调实践 https://zhuanlan.zhihu.com/p/636491955
[2] Touvron H, Lavril T, Izacard G, et al. Llama: Open and efficient foundation language models[J]. arXiv preprint arXiv:2302.13971, 2023. https://arxiv.org/pdf/2302.13971.pdf
[3] Scao T L, Fan A, Akiki C, et al. Bloom: A 176b-parameter open-access multilingual language model[J]. arXiv preprint arXiv:2211.05100, 2022. https://arxiv.org/pdf/2211.05100.pdf
[4] Zeng A, Liu X, Du Z, et al. Glm-130b: An open bilingual pre-trained model[J]. arXiv preprint arXiv:2210.02414, 2022. https://arxiv.org/pdf/2210.02414.pdf

中文LLM微调

(一)数据准备

  1. 使用人类标注的数据,构建成instruct格式的输入,进行SFT。格式为:
Human: 根据如下文档回答问题,如果找不到答案就拒绝回答:
[文档]

问题: [问题]

Assistant:
  1. 对于单一场景(如QA问答),人类标注数据的重要性更高,如果数据和质量足够可以去掉增强的数据。
  2. 目前只需要标注300多条问答对就可以引导模型做基本的文档QA、拒识和自我身份问答。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.