第一章:引言
第二章:大模型的能力
第三章:大模型的有害性(上)
第四章:大模型的有害性(下)
第五章:大模型的数据
第六章:大模型法律
第七章:模型架构
第八章:模型训练
第九章:分布式训练
第十章:新的模型架构
第十一章:大模型之Adaptation
第十二章:环境影响
(教程地址:https://github.com/datawhalechina/so-large-lm/blob/main/)
文章目录
第一章:引言
介绍了大模型的一些基础概念,并非常简单的介绍了大模型的发展历史
1.1 什么是语言模型
简单介绍了大模型是什么,以及它的基本逻辑:根据概率来与人进行交互。从数据流向来说,我们输入一句"今天是星期几"(这里我省略encoding的过程,包括tokenizer inputids embedding等) 模型会计算他的回答的概率,即从他的词向量库中找到概率最高的进行输出从而完成回答(这里省略了很多中间过程)
顺带还带了一笔温度系数,这个系数在我理解是有点类似于top p这个参数,通过改变温度值来改变词语的概率最终影响输出
1.2.1 信息理论、英语的熵、n-gram模型
简单的介绍了entropy的公式,我第一次接触这个公式是在信号传输这门课程上,现在在引言介绍他我估计是为了接下来的crossentropy等loss计算埋下伏笔
1.2.2 用于下游应用的N-gram模型
N gram没怎么用过,但是在我理解中应该是过时的编码方式。因为这种根据前后词语固定搭配的词向量方式有点类似聚类,这种方法很容易把词语固定在一个向量空间的具体位置,这样会损失词语的多样性
比如说苹果有时候是表示食物,而有时候表示的是手机。用聚类的话就会把苹果固定成水果或者固定成手机,从而增加了模型的困惑度ppl
1.3 这门课的意义
介绍了模型发展的历史,以及参数量处于一个爆炸式增长的趋势,同时模型能力也相应的得到了提升
(至于其他的一些定义就不总结了)
第二章:大模型的能力
就如上一章提到过的,语言模型本质上来说是一种概率计算的工具,从给定的token序列来计算/预测下一个token出现的概率
这一章将会介绍例一些模型的学习方法:
- Language modeling
- Question answering
- Translation
- Arithmetic
- News article generation
- Novel tasks
2.1 Language modeling
学习了一种叫困惑度(Perplexity也作PPL)的指标, 以前只是单纯的认为困惑度高模型就会很“困惑”,但是并不知道困惑到底为何物。
先看公式
其中
的数学含义是给定了序列 i 个长度数据来预测第 i+1 个token的概率。所以很容易看出来,假如概率无线趋近于0的话,那么困惑
度就会趋向于无穷;反之概率趋近于1的话(最大值),那么困惑度就为 exp(1)。 这也很符合数学直觉
结论:给我感觉像是有点类似top k, 即困惑度越高, 那么预测下一个词语的时候的选择就越多。举个例子:假如困惑度是4,同时我输入了"我要吃"三个字,模型就会有4个可能的词语进行预测;即可能会出现"我要吃苹果",“我要吃西瓜”,“我要吃饭”,“我要吃人” 四个可能性。由此可见
文中还提到了lambda, 解释得不是很清楚,但是我的理解应该是sft类的训练任务,其目的应该是修正模型正确的参数以及在诸如
template等方法的帮助下正确的找到eos位置
同理HellaSwag给我的感觉也是类似rm等强化学习的模型,由于文中只有两行字这里只是似懂非懂。
2.2 Question answering
这一块就是sft训练,让模型在N个epoch中不断的迭代自身的参数,从而让模型学习到我们期望它学习的东西。通过一系列逻辑/非逻辑性的QA对来实现类似:
"法国-巴黎+意大利=罗马"
这样的回答
值得注意的是 WebQuestions 貌似提到了一种外部知识库的技术(这也是最近我在研究的方向),因为QA对是不可能枚举出来的。所以外接一个维基百科或者其他的类似的网站/文本可以在模型不知道答案的情况下获取正确的信息
第二章剩下的就不总结了,一句话概括就是在介绍语言模型能干的工作,并没有什么特别可以注意的东西
第三章:大模型的有害性(上)
这一章确实没什么可以总结的内容, 都是一些基本的概念,相信对初学者来说没有很大的帮助。不过照例还是要总结一下
3.1 引言
总所周知语言模型能应用在很多方面:医疗,法律,社会人文,IT 等等。
如果在IT行业,GPT给了我们一个错误的代码的话,我们可以通过debug来解决,这不是非常大的问题;但是如果在生物医疗行业,GPT给了一个错误的"配方"/化学式,那么危害性是显而易见的。所以文章特别指出了,模型在某一方面特别突出/优秀,并不代表在所有方面都是可信赖的(或者说在其他方面是较差的)
3.2 社会群体
欧美的LGBT,犹太人,黑人等天龙人在语言模型面前并没有高人一等,但是我们实际使用的时候却要时时注意
3.3 - 3.6
这部分内容文章中也是三两句话就带过,我也就一句话总结了,举个稍微生动的栗子:
在美国为了杜绝/遏制性交易现象,警察把嫖客抓住之后都统一命名为Jack。然后在电视等媒体中示众以达到警示作用,所以Jack这个名字就带了负面色彩。
而语言模型在学习过程中就会学到 Jack=bad guy 这么一个等式,从而对"Jack"这个名字造成负面的影响。以此类推,llm会有很多的刻板印象,而这些刻板印象都是由于开发者的"刻板"数据造成的。
第四章:大模型的有害性(下)
4.1 概述
提出了有毒性和虚假性(toxic and disinformation)的概念,并阐述了降低毒性和虚假性的必要性。
4.2 毒性(toxic)
即语言模型会回答一些"可怕的"回答, 比如询问语言模型怎么制造枪支,毒品,犯罪等。或者引诱模型回答出一些有害性言论:本拉登应该轰炸美国99次 等等回答。
有人推出了一种数据集来评估语言模型的毒性,这也应该是语言模型的baseline
同时提出了两种降低毒性的方法:数据层和解码层
如果只在数据方面做优化的话,各项指标中的毒性都下降了14%-18%
如果只在decoding方面做优化的话,各项指标中的毒性都下降了16%-23%
但是同时语言模型不会理解各个社区的包容性:例如黑人之间互相称呼尼哥是没问题的,但是一个白人对黑人称呼尼哥却是万万不可,这就是不同社区之间的包容性
4.3 虚假性(disinformation)
这个定义方面也不需要怎么总结了,相信各位从名字上就能理解它代表的意思。
说几个值得关注的点:
-GPT-3已经可以生成语句通顺且新颖的新闻了,所以也就是说语言模型制造假新闻不是什么特别困难的事。
-在GPT-2模型下,微调就可以语言模型的内容以假乱真,但是增加模型大小却让这个能力下降了(边际效益)
-GPT-3比GPT-2更容易生产虚假信息,GPT-2需要微调才可以生产假新闻,而GPT-3只需要通过提示词就可以。个人猜测是由于GPT-3的PT阶段的内容更多,所以它的知识库更丰富。
-通过魔法打败魔法,微调过后的GPT-2就能识别假新闻,有很高的准确性
第五章:大模型的数据
这一章看得有些不明所以,因为全是一些定义类的东西,还都是一些不重要的定义。
主要还是介绍了数据集构造的一些方式,有通过爬虫获取维基百科等网页的数据(web text),有通过一些类似于common crawl的非营利性组织发布的数据作为数据集(本质上还是爬取了web text)。
提了一下数据清洗/过滤的必要性,但是也强调了清洗过后的数据可能会偏见。以及偏见形成的一些原因,如黑人和积极的正面词汇同时出现的次数过低,就造成了黑人的负面偏见等。
最后特别强调了数据的构建者/组织也是一个需要考虑的因素,不同的组织构建的数据方向是不一样的。(也就是说需要清理的方向也是不一样的)
第六章:大模型法律
这一章又是一些我最讨厌的定义类的文章,感觉没什么可以总结的…
非要说的话就是大模型会有一些法律/道德/伦理类的争议。比如说有些地方大麻是合法的,有些地方大麻是非法的;例如训练模型的时候对这些"大麻类"的数据没有进行过滤,而开发出来的时候却在"大麻"不合法的地方使用了这个模型,从而获得了一些"不合法"的答案,这就会引起一些问题。
同理还有一些版权类的争议,例如用GPT生成一本小说,这小说可能会涉嫌抄袭别人已有的小说(因为训练数据就是别人的小说),或者后人再生成的时候会涉嫌抄袭千人生成的小说等等、
总的来说这一章的内容偏无聊,五秒钟就看完了,无奈的水一天打卡
第七章:模型架构
7.1 概述
模型可以理解为就是封装好的以一个提示词(prompt)作为输入,然后返回一个答案(completion)的function。在训练和推理的过程都是以概率来实现的。
7.2 分词(token)
介绍了的BPE, Unicode, unigram model 的一些基本原理
我们输入的每一句话都是若干个token组成的,举个栗子:
luosifen is very good 这句话就会分成一个词汇表 [luosifen, is, very, good]
对应的向量表可能是这样[563541, 147, 100, 321],这里是按照一个单词作为分词的;同样的有些是以句意作为分词,有些可能是以单个字母作为分词;不同的应用场景可能会有不同的tokenizer,但是大多数情况下都是用autotokenizer这个function。
英文的分词也许是一个单词一个数字,但是中文就不一定了,具体怎么分要看使用的模型用的是什么策略,举个栗子:
“螺蛳粉很好吃” 对应的向量表可能是这样的[563541, 147, 100, 321](和英文一样)
也可能是这样的: [6123,32465,54652,541324,11112,677654,456432]
可以看出来不是一个中文字符对应一个数字的,英文也同理(这部分可以参考台大李宏毅教授的课程)
unigram model 里面的思想是通过比较分词的结果和训练数据来计算loss的,按照剔除某些词汇来
7.3 模型架构
有三种语言模型的分类:
编码段架构(encoder only):
代表模型BERT;这类模型对上下文有更好的理解,但是对于文本生成任务却很不足
解码端架构(decoder only):
代表模型Chat GPT,LLAMA 等;这类模型更多的是根据上文来预测下文,在2.1的总结部分已经有一个例子了。所以位置编码在这个模型中起到了不可忽视的作用。
编码-解码架构(encoder-decoder):
代表模型有T5, BART (这个分支了解不多);理论上来说有上面两者的优点,但是以实际情况来说只有GPT分支的模型表现是最佳的。
接下来还有一些数学公式和原理,这也是最值得学习的地方。但是今天太晚了而我本身之前又学过了,所以就把这个坑留到明天填了
第八章:模型的训练
8.1 目标函数
这一章详细介绍三种架构的原理
decoder only:
正如我之前提过好几遍的,这个模型本质上就是输入一组token进一个封装好的模型里,然后输出一些向量表的概率;比如说有个类gpt模型有包含了一亿个token的向量表作为知识库,当我们询问这个模型 “你爱我吗?”, 他会回答计算概率,最后发现"是的" 对应的token最高,然后他就会输出"是的"; 这还没完,他还会继续计算概率,然后发现当他输出了"是的"之后"我爱你"的概率是最高的,他就会继续输出"我爱你";当模型发现输出完这句话之后从词向量库计算不到高的概率的token了,他就会输出一个eos作为结束。
所以最后呈现给我们的就是:我们问一个语言模型 “你爱我吗?” ,他回答你 “是的我爱你”。
这里有几个问题可以说一下:我举的例子是理想情况,真实情况是模型可能计算不出来 “是的我爱你”;有可能是最大似然估计没优化好、模型训练不到位或者单纯的知识库很小完全查询不到答案(举个极端的栗子:知识库只有100个token)
encoder only:
这种架构的模型有两种特殊的token,CLS和SEP;其中CLS和BOS应该是一样的,都是在开头的时候插入的,而SEP和EOS却不是完全一样。SEP更多的像是把一个句子分割为两个句子的作用,主要是用来分割句意,而EOS只是单纯的作为句子的结尾。
与decoder only 另一个不同点是mask,他们的mask是不一样的。decoder用的是只看到左边/右边的三角形掩码,而bert使用的是遮盖若干百分比数据的操作,这里我贴一下文章使用的例子:
这里我们遮掩了mouse 和 the 两个单词, 利用这个被遮掩的单词去预测真实的 the mouse ate the cheese 这个句子。
其中这个mask的定义如下:
接着再进行预测,最后使用CLS来进行分类, 这里有朋友可能不理解是什么意思,我可以简单解释一下。
一个句子的构成如下:
CLS token1 token2 token3 … token k SEP token1 token2 token3 … token m
我们通过拼接不同的SEP, 可以对其答案进行打分/计算loss
在bert的迭代模型 robert中,删除了后一项,只计算前一项,因为发现训练预测这个步骤操作对没有模型提升
encoder decoder:
这种架构使用的是之前介绍的把数据打乱并且遮掩,然后训练,最后预测阶段使用的是decoder only的自回归方式,可以说是集合了两种模型的优点。但是奇怪的是市面上的模型并没有很出色的(相比于GPT来说)
8.2 算法优化
这一部分都是老生常谈的了,有SGD, Adam, AdaFactor等计算参数的方法
然后还提到了一些精度方面的优化,默认的都是fp32,但是为了节省显存就开发出了bf16和fp16,甚至还有int8 int4等,但是根据我个人的微调经验来说bf16是最好的;其中就是因为bf16和fp32的exponent都是8位,而小数位部分没这么重要。具体原因可以自行查找论文
第九章:分布式训练
9.1 为什么分布式训练
现在的语言模型已经不同于以往传统的机器学习/深度学习, 网络结构是越来复杂,也就是说参数量越来越大;随便一个小模型就已经几十亿的参数量,市面上用得稍微多一点的开源模型都要近千亿级别,而gpt3 都有175B的参数量;而参数量越大,训练的时间就越多,显存的需求也越大。谷歌训练一个模型需要几百张A100的显卡训练数十天,所以单纯的串行运算已经不能满足当下的需求了
9.2 分布式训练的策略
并行运算的实现是没这么简单的,以十年前交火的例子来说,1+1=1.1;虽然目前的技术进步了,但是也远远没达到1+1=2的地步。
最常听说的就是数据并行、模型并行、流水线、混合并行四种
数据并行:
以文章中的例子来说:
我们有一个数据x:x.shape=(4,5)
同时我们有一个模型w:w.shape=(5,8)
根据小学二年级学过的矩阵运算得知,最后的输出y:y.shape(4,8)
数据并行就是把数据x切分成若干份,文章中切分成了两粉,每份的shape都是 (2,5)。这样我们就可以把第一个矩阵乘法放到GPU0 里面进行计算, 第二个矩阵乘法放到GPU1 里面进行计算。
聪明的盲僧已经发现了华点,那就是反向传播的时候如果每个GPU都在各自更新参数,那么最后的结果百分百会不一样的,也就是说分布训练就失去意义了。为了解决这个问题就需要进行allreduce(简单的说就是把所有数据收集到一起,然后统一进行反向传播更新参数,最后再把参数更新到每张卡上),但是术业有专攻;GPU擅长的是计算,对于通信来说是非常慢的,特别是GPU间的通信更是如此;所以这就是目前分布式训练的最大gap
模型并行:
根据上面的例子,我们很容易理解模型并行的意思,就不多做解释, 直接上图
流水线并行:
这种思想是对网络结构进行切分,假设一个网络结构有4层,那么就可以把前两层分给GPU0, 后两层分给GPU1
混合并行:
这里还是以文章的例子举例:
gpt3被分成了64个阶段(流水线并行);每个阶段都运行在6台主机上,所以每台主机都使用了1/6的数据进行并行;而每台主机都有八张显卡,每张显卡都把模型分成了8份。所以理论上来说每张卡都承担了整个训练的1/(64x6x8)= 1/3072。但请注意的是,这并不意味着我们就加速了3072倍计算量,实际上加速比远远低于这个数(可能只有数十倍)。
所以在当前并行运算更多的作用是为了让训练跑起来,而不是让训练加速
第十章:新的模型架构
上一章分布式训练中,介绍了几种常用的分布式方法,同时也了解了目前的瓶颈所在
这一章会介绍两种模型,以便进一步的提高模型性能:
混合专家模型
基于检索的模型
10.1 混合专家模型
简单的说一下就是把一个input的分给若干个"专家"回答,然后把"专家们"的回答统一汇总,再输出给用户。
比如说我们问gpt “如何迎娶白富美/高富帅,走上人生巅峰?”
这部分就可能涉及 “金融专家”、“情感专家”、“行为专家”、"礼仪/体态专家"等等,然后每个专家都会在他的领域给出专业的回答;由于有些"专家"的回答不那么重要,实际对应的概率也会相对低一些。最后体现出来的是回答所占的数据也会相应较少。
每个专家的门函数:(专家贡献答案的百分比)
每个专家的参数:
最终的公式:
最后训练的时候会针对参数进行优化并计算loss,而每个专家多多少少都会有一些贡献(概率),而有些概率可能会很低(0.01),我们可以把一些概率很低的专家给忽略掉,最后只计算剩下的一些专家和这些专家的参数,以达到节省计算资源的目的
取文章中的例子,原专家的分布如下:
优化过的专家分布如下:
这样我们就可以少计算两个专家的参数,从而节省了计算资源
但是这样也会有一个隐形的隐患,那就是其中一个专家的概率一开始就是1,那么其他的专家就一定为0,久而久之其他专家的梯度就为零,就陷入了一种过拟合。因此混合专家优先考虑的就是让所有专家都参与进来
用这种模型的另一个优点就是并行运算,因为我们很容易看出每个专家的参数都是不同的,所以我们可以把每个专家都放到不同的GPU上来训练。
未完待续…