关于h5的网站,请人做网站需要注意什么条件,微信营销推广软件,建设网站宽度最好是多少1. 从图灵测试到ChatGPT
1950年#xff0c;艾伦•图灵(Alan Turing)发表论文**《计算机器与智能》#xff08; Computing Machinery and Intelligence#xff09;#xff0c;提出并尝试回答“机器能否思考”这一关键问题。在论文中#xff0c;图灵提出了“模仿游戏”艾伦•图灵(Alan Turing)发表论文**《计算机器与智能》 Computing Machinery and Intelligence提出并尝试回答“机器能否思考”这一关键问题。在论文中图灵提出了“模仿游戏”即图灵测试**的概念用来检测机器智能水平。图灵测试的核心思想是如果一个人代号C使用测试对象皆理解的语言去询问两个他不能看见的对象任意一串问题其中一个是正常思维的人代号B另一个是机器代号A。如果经过若干询问以后C不能得出实质的区别来分辨A与B的不同则此机器A通过图灵测试。 1956年人工智能正式成为了一个科学上的概念而后涌现了很多新的研究目标与方向。虽然图灵测试只是一个启发性的思想实验而非可以具体执行的判断方法但他却通过这个假设阐明了“智能”判断的模糊性与主观性。从此图灵测试成为了 自然语言处理Natural Language ProcessingNLP 任务的一个重要评测标准。图灵测试提供了一个客观和直观的方式来评估机器是否具有智能即通过让机器与人类进行对话来判断其智能水平。这种方式可以避免对智能本质的哲学争论也可以避免对智能具体表现形式的技术细节。 因此很多自然语言处理任务都可以用图灵测试来进行评测例如对话系统、问答系统、文本生成等。 自然语言处理Natural Language ProcessingNLP是计算机科学人工智能语言学关注计算机和人类自然语言之间的相互作用的领域。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理包括很多不同的任务如分词、词性标注、句法分析、语义分析、信息抽取、文本分类、文本摘要、机器翻译、问答系统、对话系统等。 图灵测试与自然语言处理任务有着密切而复杂的关系可以从以下两个方面来概括
一方面图灵测试是自然语言处理任务的一个重要驱动力。图灵测试提出了一个具有挑战性和吸引力的目标即让机器能够用自然语言与人类进行流畅、智能、多样化的对话。 为了达到这个目标自然语言处理领域不断地发展和创新各种技术和方法以提高机器对自然语言的理解和生成能力。例如为了让机器能够回答用户提出的问题就需要研究问答系统这一自然语言处理任务为了让机器能够根据用户提供的信息生成合适的文本就需要研究文本生成这一自然语言处理任务为了让机器能够适应不同领域和场景的对话就需要研究领域适应和情境感知这一自然语言处理任务等等。另一方面图灵测试是自然语言处理任务的一个重要目标。图灵测试提出了一个具有前瞻性和理想性的愿景即让机器能够达到与人类相同或者超越人类的智能水平。 这个愿景激发了很多自然语言处理领域的研究者和开发者使他们不断地探索和创新以期实现真正意义上的自然语言理解和生成。例如为了让机器能够理解用户提出的问题就需要研究语义分析、知识表示、逻辑推理为了让机器能够生成符合用户需求的文本就需要研究文本规划、文本风格、文本评价为了让机器能够与用户建立信任和情感的联系就需要研究情感分析、情感生成、情感对话等等。 自然语言处理与人工智能发展历史有着密切而复杂的关系。它们相互促进、相互影响、相互依存、相互目标。自然语言处理在人工智能发展历史上有很多里程碑式的成果比如
1954年IBM实现了世界上第一个机器翻译系统将俄语翻译成英语。1966年约瑟夫·韦伊岑鲍姆开发了ELIZA一种模拟心理治疗师的对话系统。1972年特里·温诺格拉德开发了SHRDLU一种能够理解和生成自然语言的程序用于控制一个虚拟的机器人在一个虚拟的世界中进行操作。1988年杰拉尔德·萨斯曼和詹姆斯·马丁创建了Text Retrieval ConferenceTREC一个旨在推动信息检索和自然语言处理技术发展的国际评测活动。2011年苹果公司推出了Siri一种基于自然语言处理技术的智能个人助理。同年IBM的Watson战胜了《危险边缘》节目的冠军选手展示了自然语言处理技术在问答领域的强大能力。2013年谷歌公司推出了Word2Vec一种基于神经网络的词向量表示方法开启了自然语言处理领域的深度学习时代。2016年Facebook发布了FastText的文本分类算法它可以在处理大规模文本分类任务时取得很好的效果。2017年Google发布了一篇很可能是AI历史上最重要的一篇论文《Attention is all you need》在论文中作者提出了Transformer——一个具有多头注意力机制的模型在文本特征提取方面取得了优异的效果。2018年Google发布了BERT预训练模型它在多项NLP任务上取得了最佳效果引领自然语言处理进入了预训练时代。2020年OpenAI发布的GPT-3模型有多达1750亿的参数可以在提供少量样本或不提供样本的前提下完成大多数NLP任务。 以上这些能力成果依赖于自然语言处理技术NLP的不断发展。NLP领域涉及到的技术非常广泛但其中最基础的就是——词嵌入也叫词向量Word Embedding以及与此相关的文本表征技术。它本质上是找到一种编码方式实现从自然语言中到数学空间的映射。 我们为什么需要词向量呢当我对计算机说出“我爱你。”的时候计算机无法真正理解我说了什么。要想让计算机理解我说的话必须要对“我爱你。”这句话进行编码Encoding——比如我们可以让数字“1”代表“我”数字“2”代表“爱”数字“3”代表“你”数字“0”代表“句号”。经过编码之后计算机才能理解这句话然后再进行计算和处理。词向量就是以单词为为单位进行编码那么如何进行编码才是最优的方式呢从1940年代开始人们就希望寻找解决这个问题的模型和方法下面选择最经典的词袋模型和神经网络概率模型做一些简单一点的介绍。
词袋模型Bag of Words,BOW从名字来看词袋模型就像是一个大袋子把所有的词都装进来。文本中的每个单词都看作是独立的忽略单词之间的顺序和语法只关注单词出现的次数。在词袋模型中每个文本可以表示为一个向量向量的每个维度对应一个单词维度的值表示该单词在文本中出现的次数。神经概率语言模型Neural Probabilistic Language ModelNPLM它可以通过学习大量的文本数据来预测下一个单词或字符的概率。其中最早的神经网络语言模型是由Yoshua Bengio等人于2003年发表的《A Neural Probabilistic Language Model》提出的它在得到语言模型的同时也产生了副产品词向量。 早期的词向量都是静态的一旦训练完就固定不变了。随着NLP技术的不断发展词向量技术逐渐演变成基于语言模型的动态表征。语言模型不仅可以表征词还可以表征任意文本。 时间来到了2022年终于轮到我们的主角要隆重登场了。2022年11月30日OpenAI发布了一款真正的智能聊天机器人ChatGPT一经发布立刻就点燃了AI圈。仅仅五天就达到了100万用户。OpenAI不得不紧急扩容用户发现ChatGPT不仅仅只会插科打诨和人类聊天它还能写论文讲笑话编段子生成演讲稿写请假条模仿导师写推荐信甚至帮你写代码写营销策划案等等。拥有了ChatGPT就像你身边配备了一个功能强大的秘书。到了2023年1月大量用户开始涌入仅仅两个月的时间ChatGPT成为了史上最快达到1亿用户的应用。 无论是ChatGPT还是其他后来的模仿者它们其实都是语言模型准确来说——大语言模型。使用时无论是调用API还是开源项目总有一些参数可能需要调整。对大部分内行人士来说应该都不成问题但对外行就有点玄乎了。基于此本文将简要介绍ChatGPT相关技术基本原理行文将站在外行人角度尝试将内容尽量平民化。虽然不能深入细节但知晓原理足以很好使用了。
本文共分为四个部分
LM这是ChatGPT的基石的基石是一个最基本的概念绕不开逃不过没办法。Transformer这是ChatGPT的基石准确来说它的一部分是基石。GPT本体从GPT-1一直到现在的GPT-4按OpenAI自己的说法模型还是那个模型只是它长大了变胖了不过更好看了。关于这点大家基本都没想到。现在好了攀不上了。RLHFChatGPT神兵利器有此利刃ChatGPT才是那个ChatGPT不然就只能是GPT-3。
1. LM LMLanguage Model语言模型简单来说就是利用自然语言构建的模型。这个自然语言就是人常说的话或者记录的文字等等只要是人生产出来的文字都可以看做语言。你现在看到的文字也是。模型就是根据特定输入通过一定计算输出相应结果的一个东西可以把它当做人的大脑输入就是你的耳、眼听或看到的文字输出就是嘴巴说出来或手写出来的文字。总结一下语言模型就是利用自然语言文本构建的根据输入的文字输出相应文字的模型。 具体是怎么做的呢方法有很多种比如我写好一个模板「XX喜欢YY」如果XX我YY你那就是我喜欢你反过来就是你喜欢我。我们这里重点要说的是概率语言模型它的核心是概率准确来说是下一个词的概率。这种语言模型的过程是通过已经有的词预测接下来的词。我们举个简单的例子比如你只告诉模型「我喜欢你」这句话当你输入「我」的时候它就知道你接下来要说「喜欢」了。为什么因为它脑子里就只有这四个字你没告诉它其他的呀。 好接下来我们要升级了。假设你给了模型很多很多句话多到现在网上能找到的资料都给了它。这时候你再输入「我」我敢打赌它大概不会说「喜欢」了。为什么简单见多了世面眼里怎么可能只有喜欢你三个字。但因为我们考虑的是最大概率很有可能它每次都会输出同样的话。对没错如果每次都只选择下个最大概率的词你就是会得到同样的话。这种方法叫做Greedy Search中文叫贪心搜索很贪很短视所以语言模型都会在这个地方做一些策略让模型每一步多看几个可能的词而不是就看那最高的一个这样继续往下找的时候你会发现到下一步时刚刚最大概率的词如果加上这一步的词它的路径两步概率乘积概率可能没有刚刚小一点概率的词的路径概率大。举个例子请看下面这幅图 图1如何预测下一个词 先看第一步如果只选概率最大的那个词那就变成「我想」了但是别急我们给「喜欢」一点机会同时考虑它们两个。再往下看一步最大概率的都是你我们也选两个最后有这么几句以及我们附上它们的概率
「我喜欢你」概率0.3×0.80.24「我喜欢吃」概率0.3×0.10.03「我想你」概率0.4×0.50.2「我想去」概率0.4×0.30.12 多看一步大不一样看看概率最大的成谁了久违了再说一句「我喜欢你」。上面这种方法叫做Beam Search中文叫集束搜索简单来说就是一步多看几个词看最终句子比如生成到句号、感叹号或其他停止符号的概率。刚刚我们的例子中num_beams2只看了2个看的越多约不容易生成固定的文本。 好了其实在最开始的语言模型中大家基本就到这里上面介绍这两种也叫解码策略。当时更多被研究的还是模型本身我们经历了从简单模型到复杂模型到巨复杂模型的变迁过程。简单模型就是把一句话切成一个个词然后统计概率这类模型叫做Ngram语言模型是最简单的语言模型这里的N表示每次用到的上下文长度。还是举个例子看下面这句话「我喜欢在深夜的星空下伴随着月亮轻轻地想你」。常用的N2或3等于2的叫Bi-Gram等于3的叫Tri-Gram
Bi-Gram我/喜欢 喜欢/在 在/深夜 深夜/的 的/星空 星空/下……Tri-Gram我/喜欢/在 喜欢/在/深夜 在/深夜/的 深夜/的/星空 的/星空/下…… 前者下一个词是根据上一个词来的后者是根据上两个词来的就是这个区别。这里有个小知识需要说明一下实际中我们往往不叫一个词为「词」而是「Token」你可以将其理解为一小块可以是一个字也可以是两个字的词或三个字的词取决于你怎么Token化。也就是说给定一个句子时我有多种Token化方式可以分词也可以分字英文现在都是分子词。比如单词ElvégezhetitekToken化后变成了
[El, ##vé, ##ge, ##zhet, ##ite, ##k]中文现在基本都是字词的方式。我们不直接解释为啥这么做但是可以想一下完全的字或词的效果拿英文举例更直观。如果只是用26个英文字母虽然词表很小加上各种符号可能就100来个但粒度太细每个Token几乎完全没法表示语义如果用词这个粒度又有点太大尤其英文还有不同时态其实它们意思差不多只是后面不一样。所以子词就应运而生——它把一个词拆成一定大小的语义单位每个单位既可以表示一定含义又能灵活组合。中文稍微简单一些就是字词字就是一个字能独立表示意义比如「是」、「有」、「爱」词是这个词拆开就不太对劲了比如「长城」、「情比金坚」。当然中文你非要搞成一个一个字也不是不可以。我们主要还是从效果上来看。 Ngram模型有个致命缺陷——它的表示是离散的稍微解释一下在计算机中只能用1和0表示某个词。假设词表大小为50000刚刚在Bi-Gram中「我喜欢」这个Gram就是49999个0和1个1组成的稀疏向量。这种表示方法使用起来有很多缺点关于这部分内容后面的《相似匹配Embedding》部分会展开讲解。对Embedding就是一种稠密表示方法简单来说一个Token后面就都说Token了是很多个小数一般可以是任意多个专业称呼为Embedding的维度根据所用的模型和设定的参数来确定一般数字越多模型越大表示能力越强。你说我就喜欢用一个小模型搞一个很大的维度那我只能说效果可能要让你失望了911在乡村土路上可能跑不过拖拉机。 接下来我们就假设每个词是一个一维向量简单解释一下在这种设定下怎么预测下一个Token。其实还是算概率但这次和刚刚有点不一样了刚刚离散的那个就是统计出来有多少次除以总词数就是出现概率。但是稠密向量要稍微换个方式也就是说给你一个d维的向量你最后要输出一个长度为N的向量N是词表大小N中每一个值都是一个概率值表示Token的概率加起来为1。写成简单的计算表达式如下
X [0.001, 0.002, 0.0052, ..., 0.0341] # d维加起来和1没关系大小是1×d
Y [0.1, 0.5, ..., 0.005, 0.3] # N个加起来1大小是1×N
W·X Y # W自然可以是 d×N 维的矩阵上面的W就是模型的参数其实X也可以看作是参数自动学习到。因为我们知道了输入和输出的大小所以中间其实可以经过任意随意的计算总之就是各种张量三维以上数组运算只要保证最后的形式不变就行。这中间的各种计算就意味着各种不同的模型。 在深度学习的初期最著名的语言模型是RNNRecurrent Neural Network中文叫循环神经网络。RNN 模型与其他神经网络不同的地方在于它的节点之间存在循环连接这使得它能够记住之前的信息并将它们应用于当前的输入。这种记忆能力使得 RNN 在处理时间序列数据时特别有用例如预测未来的时间序列数据、自然语言处理等。通俗地说RNN 就像一个具有记忆功能的人可以根据之前的经验和知识对当前的情况做出反应并预测未来的发展趋势。如下图所示 图2RNN来自https://colah.github.io/posts/2015-08-Understanding-LSTMs/ 右边是左边的展开A就是参数X是输入h就是输出由于自然语言是Token by Token的所以就组成了一个序列。那这个参数怎么学习呢这就要稍微解释一下学习过程请看下面的图 图3语言模型输入输出 第一行就是X第二行就是YSOS表示Start of SentenceEOS就不多解释了。注意上面的h并不是那个输出的概率而是hidden state如果需要概率可以将h再做一个张量运算归一化到整个词表即可。简单的演示一下代码
import torch.nn as nnrnn nn.RNN(32, 64)
input torch.randn(4, 32)
h0 torch.randn(1, 64)
output, hn rnn(input, h0)
output.shape, hn.shape
# (torch.Size([4, 64]), torch.Size([1, 64]))上面nn.RNN就是RNN模型输入是一个4×32的向量换句话说4个Token维度d32h0就是初始化的输出也就是output4个里面的第一个这里output的四个64维的向量就分别表示4个输出hn就是最后一个Token的输出也可以看成是整个句子的表示。如果要输出词的概率需要先扩充到词表大小再进行归一化
wo torch.randn(64, 1000) # 假设词表大小N1000
logits output wo # 4×1000
probs nn.Softmax(dim1)(logits) # 4×1000每一行概率和为1这里的probs每一行就是词表大小的概率分布和为1意思是这个Token到词表每个Token的概率。 因为我们知道接下来的Token是啥就是上面图里的第二行Y那我这里得到最大概率的那个Token如果正好是这个Token说明预测对了参数就不用怎么调整反之模型就会调整前面的参数上面RNN、h0、input的参数和下面的wo。你可能会疑惑为啥input也是参数其实上面的input我们偷了懒本来的参数是1000×32的大向量4个是那四个Token对应位置的那一行向量。这个1000×32的向量其实就是词向量每个词一行开始时随机初始化然后通过训练调整参数。 训练完成后这些参数就不变了然后就可以用和上面同样的步骤来预测了也就是给定一个Token预测下一个Token。如果是Greedy Search每次你给定同样Token时生成的就一样。其余的就和前面讲的接上了。 好了语言模型就介绍到这里上面的代码看不懂没关系能get到意思就行这里面细节非常多但大概意思已经到位了。你只需要大概了解每个Token是怎么表示、怎么训练和预测出来的就行。
2. Transformer 接下来出场的是Transformer一个刚开始在NLP领域后来横跨到语音和图像领域并最终统一几乎所有模态的架构。这是Google2017年发的一篇论文标题叫《Attention Is All You Need》其最重要的核心就是提出来的Self-Attention机制中文也叫自注意力。简单来说就是在语言模型建模过程中把注意力放在那些重要的Token上。想来Google在发表论文之初也没有料想到今天吧。 Transformer是一种Encoder-Decoder架构简单来说就是先把输入映射到Encoder这里大家可以把Encoder先想象成上面介绍的RNNDecoder也可以想象成RNN。这样左边负责编码右边则负责解码。这里面不同的是左边因为我们是知道数据的所以建模时可以同时利用当前Token的历史Token和未来前面的Token但解码时因为是一个Token一个Token输出来的所以只能根据历史Token以及Encoder的Token表示进行建模而不能利用未来的Token。 Transformer的这种架构从更普遍的角度来看其实是Seq2Seq架构大家别慌这简单来说就是序列到序列模型也就是输入是一个文本序列输出是另一个文本序列。翻译就是个很好的例子我们看下面这个来自Google的GNMTGoogle Neutral Machine Translation的经典图片 图4GNMT图示来自GNMT GitHubhttps://github.com/belvo/Google-Neural-Machine-Translation-GNMT- 刚刚已经说了Encoder和Decoder可以采用RNN最终就是Encoder所有Token最终输出一个向量作为整句话的表示。说到这里整句话又怎么表示呢刚刚上面我们也提到过如果RNN这种结构可以把最后一个Token的输出作为整个句子的表示。当然了很符合直觉地你也可以取每个Token向量的平均值或第一个和最后一个的平均值或后面N个的平均值。这些都可以问题不大不过一般取平均的情况比较多效果要好一些。除了平均值也可以求和、取最大值等我们就不多深入讨论了。现在重点来了看Decoder的过程仔细看其实它在生成每一个Token时都用到了Encoder每一个Token的信息以及它已经生成的Token的信息。前面这种关注Encoder中Token的信息的机制就是Attention注意力机制。直观点解释当生成Knowledge时「知识」两个字会被赋予更多权重其他也是类似。 让我们带着上面的记忆看一下Transformer的结构如下图所示 图5Transformer来自Transformer论文 这个图更多的是体现了内部结构。左边是Encoder的一个Block一共N个右边是Decoder的一个Block一共N个简单起见我们可以假设N1那左边这个结构就是一个Encoder右边的就是Decoder。也可以把它们就想象成一个RNN这样有助于从宏观上把握。现在想象完了我们回到现实Transformer 用到的东西和RNN并没有关系通过上图也可以看出来它主要用了两个模块Multi-Head Attention和Feed Forward。对于前者我们不妨回顾一下GNMT的Attention它是Decoder中的Token和Encoder中每一个Token的重要性权重。Multi-Head Attention中用到一个东西叫SelfAttention和刚刚说的Attention非常类似只不过它是自己的每一个Token和自己的每一个Token的重要性权重。简单来说就是“一句话到底哪里重要”。这玩意儿可以说是非常精髓了无论是ChatGPT还是其他非文本的模型几乎都用到了它可以说是真正的一统江湖。Multi-Head是啥意思呢简单来说就是把刚刚的这种自己注意自己重复Multi次Multi个Head每个注意到的信息不一样这样就可以捕获到更多信息。比如我们前面提过的这句话「我喜欢在深夜的星空下伴随着月亮轻轻地想你」有的Head「我」注意到「喜欢」有的Head「我」注意到「深夜」有的Head「我」注意到「想你」……这样看起来是不是更加Make Sense。对于Feed Forward大家可以把它当做「记忆层」大模型的大部分知识都存在这里面Multi-Head Attention则根据不同权重的注意提取知识。 实际中大多数NLP任务其实并不是Seq2Seq的最常见的主要包括这么几种句子级别分类、Token级别分类也叫序列标注、相似度匹配和生成而前三种应用最为广泛。这时候Encoder和Decoder就可以拆开用了。左边的Encoder在把句子表示成一个向量时可以利用上下文信息也就是说可以把它看作是双向的右边的Decoder不能看到未来的Token一般只利用上文是单向的。虽然它们都可以用来完成刚刚提到的几个任务但从效果上来说Encoder更加适合非生成类任务Decoder更加适合生成类任务。在NLP领域一般也会把它们分别叫做NLUNatural Language Understanding自然语言理解任务和NLGNatural Language Generation自然语言生成任务。 首先介绍NLU任务。句子级别分类是给定一个句子输出一个类别。因为句子可以表示为一个向量经过张量运算自然可以映射到每个类的概率分布。这和前面语言模型提到过的搞法没有本质上的区别只不过语言模型的类别是整个词表大小而分类的类别是看具体任务的有二分类、多分类、多标签分类等等。Token级别的分类是给定一个句子要给其中每个Token输出一个类别。这个和语言模型就更像了只不过把下一个Token换成是对应的类别比如命名实体识别就是把句子中的实体人名、地名、作品等你关注的词一般是名词给提取出来。它们的类别一般是类似如果以人名PER举例的话类似这样B-PER表示开始、I-PER表示中间。举个例子「刘亦菲好看」此时Token是字对应的类别为「B-PER、I-PER、I-PER、O、O」O表示Other。注意对于分类任务类别我们一般也叫它标签。相似匹配任务一般是给定两个句子输出是否相似其实也可以看作是特殊的分类问题。 接下来介绍NLG任务。除了生成外常见的任务还有文本摘要、机器翻译、改写纠错等。这里Seq2Seq的结构就比较常见了体现了一种先理解再输出的感觉。而纯生成类任务比如写诗、写歌词、写小说几乎都是Decoder结构。这一类任务稍微麻烦一些的是自动评测除生成的其他任务还好一般都会提供参考答案reference可以看模型输出的和参考之间重叠程度或相似程度。但纯生成任务就有点麻烦这个好不好有时候其实很难衡量。不过针对有具体目标的如任务机器人对话生成还是可以设计一些是否完成任务、达到目标之类的评测方法。但对于没有具体目标的比如闲聊这评测起来就见仁见智了很多时候还是靠人工过一遍。 Transformer这个架构基于Seq2Seq可以同时处理NLU和NLG任务而且这种Self Attention机制的特征提取能力很强。这就使得NLP取得了阶段性的突破深度学习开始进入了微调模型时代。大概的做法就是拿着一个开源的预训练模型然后在自己的数据上微调一下让它能够搞定特定的任务。这个开源的预训练模型往往就是个语言模型从大量数据语料上使用我们前面讲的语言模型的训练方法训练而来。NLU领域的第一个工作是Google的BERT相信不少人即便不是这个行业的也大概听过。BERT就是用了Transformer的Encoder架构有12个Block看上面那个图这每一个Block也可以叫一层1亿多参数它不预测下一个Token而是随机把15%的Token盖住然后利用其他没盖住的Token来预测盖住的Token。其实和根据上文预测下一个Token是类似的不同的是可以利用下文信息。NLG领域的第一个工作是OpenAI的GPT用的是Transformer的Decoder架构参数和BERT差不多。它们都发表于2018年然后分别走上了两条不同的路。
3. GPT GPTGenerative Pre-trained Transformer没错了就是ChatGPT的那个GPT中文叫「生成式预训练Transformer」。生成式的意思就是类似语言模型那样Token by Token生成文本也就是上面提到的Decoder。预训练刚刚也提过了就是在大量语料上训练的语言模型。GPT模型从1到4一共经历了5个版本中间有个ChatGPT是3.5版接下来我们分别介绍它们的基本思想。 GPT-1和BERT一样走的是下游任务微调套路也就是固定住预训练模型不动然后在不同下游任务上微调一个模型如下图所示 图6GPT基本结构来自GPT论文 关于左边我们上面已经介绍过了用的就是Transformer的架构GPT中是Decoder具体里面的子模块可以不用关注。重点看看右边这里有一个值得注意的地方就是针对不同的任务输入都拼接成文本序列然后丢给Transformer Decoder再通过一个LinearSoftMax输出结果。Linear是一种最基础的网络结构SoftMax我们前面介绍过主要用来把输出映射到概率分布和为1。这种拼接输入的方法在当时那个大模型时代非常流行的紧跟其后的BERT也是类似的方式。这样统一的处理方法能够减少不同任务对模型的改动。反正不管什么任务都想方设法搞成一个序列就行。 GPT这篇文章还有几个点在当时看起来可能没啥感觉但现在回看却有点意思就像乔布斯说的dot。第一个是预训练层数和任务表现的关系如左下图所示第二个是训练参数数量和模型性能关系。 图7左图是GPT参数量与效果图右图是Zero-Shot能力来自GPT论文 上图可以得出两个基本结论第一预训练模型中的每一层都包含用于解决目标任务的有用功能说明多层有更多能力第二随着参数的增加Zero-Shot获得更好的性能。简单总结来看就是模型大了不仅能学到更多知识有助于解决下游任务还表现出了Zero-Shot能力。 Zero-Shot是指直接给模型任务输入让它输出任务结果Few-Shot是给模型提供一些示例然后再给出任务让它给出输出结果。 好了有了上面的结论很自然会怎么样是不是想看看更多层更多参数的表现如何于是半年多后GPT-2来了参数量从GPT的110M增加到了1.5B十倍于前者。更有意思的是在GPT论文的博客中有一个「未来工作」位于第一个的就是扩大规模还有两个分别是提升微调和更好地理解为什么生成式预训练能提升理解NLU能力。 GPT发表于2018年6月GPT-2发表于2019年2月就是前者的升级版一个是扩大规模再就是Zero-Shot。如果说前者是观察到了这个现象那后者就是进一步研究这个现象。请看下面这张图 图8参数量和Zero-Shot表现来自GPT-2论文 纵坐标是不同任务的评估指标横坐标是参数量效果一目了然。进一步验证了前面的想法那下一步要做的就是继续扩大规模……不过且慢在此之前我们不妨看一下GPT-2中的Token生成策略也就是生成下一个Token时的方法。前面第一部分我们提到过比较优秀的Beam Search不过它有两个比较明显的问题第一是生成的内容容易重复第二是高质量的文本和高概率并不一定相关人更加喜欢有「不一样」的内容而不是完全可预测的比如张爱玲说过「孤独的人有他们自己的泥沼」这种独一无二的文字用高概率的词大概率是得不到的。简单来看这两个问题其实可以归结为一个点生成的内容确定性太大。 现在我们介绍一种基于采样的方法简单点来说就是基于已有的上下文随机选择下一个Token。不过随机也有问题那就是可能生成不连贯的文本很容易理解对吧。这里有个Trick可以缓解这个问题——进一步增加高概率词的可能性降低低概率词的可能性。这样就不太容易随机到很低概率很可能不连贯的生成。具体的做法是用过一个temperature的参数调整输出的概率分布这个参数值越大分布就看起来越平滑也就是高概率和低概率的差距拉小了对输出不那么确定当然越小的话高概率和低概率的差距更明显了对输出比较确定。如果趋近于0那就和Greedy Search一样了。这在深度学习中是一种比较常见的方法感兴趣的读者可以进一步读一下这个StackOverflow的解释。 除了刚刚的Trick这篇论文在2018年介绍了一种新的采样方案很简单但实际很有效果就是GPT-2里使用到的Top-K采样。简单来说就是在选择下一个Token时在Top-K个里面选Top-K0时就是所有词表范围。这个方法不错不过还有个小问题就是Top-K个其实是一种硬截断根本不管第K个概率是高还是低。极端情况下如果某个词的概率到了0.99K稍微大一点就必然会囊括进来一些很低概率的词。这会导致不连贯。
于是2020年的这篇论文提出了另外一种采样方案Top-PGPT-2里也有这个策略。这种策略是在累计概率超过P的词里进行选择。这样对于概率分布比较均匀的情况可选的词就会多一些可能要几十个词的概率和才会超过P对于概率分布不均匀的情况可选的词就少一些可能2-3个词的概率就超过了P。 Top-P看起来更加优雅一些两者也可以结合使用不过大部分时候当我们需要调的时候调一个就好包括前面的tempreture参数。如果要调多个请确保理解每个参数的作用。最后需要说明的是任何一种采样策略都不能100%保证每一次生成的效果都很好也没办法避免生成重复的话可以考虑使用类似后处理的方法缓解。也没有一种策略是在任何场景下都适用的需要根据实际情况灵活选择。 GPT-3是2020年7月发表的在当时也是个大新闻因为它的参数量已经达到了其他任何模型在当时望尘莫及的量级175B是GPT-2的100多倍。而且没有开源。伸手党有点尴尬。GPT-3是觉得既然有Zero-Shot能力那能不能不微调呢碰到一个任务就微调这多麻烦。你看看人类只要几个例子Few-Shot和一些简单的说明就可以处理任务了是不是。怎么办GPT-2不是进一步确认了Zero-Shot能力了吗上继续上加大参数量于是就有了175B的GPT-3。也就是说各种任务来吧我不调参数顶多就要几个例子下一步连这个也不要了我就能给你搞定它。其实现在回头看这篇论文是具有里程碑意义的因为它从根本上触动了原有的范式而且是革命式地触动。关于这点我之前写过一篇文章GPT-3 和它的 In-Context Learning | Yam感兴趣的读者可以进一步阅读。可惜当时没读出来现在回忆还是因为175B在当时看起来太大了而且也太贵了几百万美元呢效果再好又能咋样玩儿不起啊。这不光是小部分人没意识到可能是除了OpenAI团队之外的整个世界都没意识到。先看下面这个图 图9X-Shot在不同参数量级的表现来自GPT-3论文 这张图可以提供几个信息
X-Shot在不同量级差别巨大大模型就是有超能力。大模型下One-Shot效果明显大幅度提升增加Prompt会进一步大幅度提升。Few-Shot的边际收益在递减。大概8-Shot以下时Prompt作用明显但从One-Shot到8-ShotPrompt的作用也在递减。超过10-Shot时Prompt基本没作用了。 总而言之大模型具有In-Context能力这种能力使得它不需要针对不同任务再进行适应性训练微调它用的就是它自己本身的理解力。这本来应该很让人震惊甚至有一丢丢惊恐不过大家可能都先被它的价格和规模震惊到了。接下来我们再直观感受一下利用这种In-Context能力完成任务的方式如下图所示 图10如何使用In-Context能力完成任务来自GPT-3论文 看起来一点都不复杂你只要按照它的格式把输入构建好放进去就可以了。这也是本项目之所以存在的一个很重要的原因——AI已经平民化了现在你只要有手可能以后没手也行通过使用LLMLarge Language Model就可以做出AI应用了。 最后值得一提的是GPT-3中的展望他们真的是沿着「展望」在往前推进而不是写一下就完事了。在论文的“局限”小节中他们提出了GPT-3目前的一些问题其中有两点要特别指出因为它们是下一代InstructGPT也是ChatGPT的姐妹版以及更高级版本的方向。
自监督训练就是开始语言模型的方法范式已到极限新的方法迫在眉睫。未来的方向包括从人类中学习目标函数、强化学习微调或多模态。不确定Few-Shot是不是在推理时学习到新的任务还是识别出来了在训练时学到的任务。最终甚至不清楚人类从零开始学习与从之前的样本中学习分别学到什么。准确理解Few-Shot的工作原理是一个未来的方向。 第一点在下一节就会提到主要说说第二点。这里说的意思是当我们给出一些示例时Few-Shot我们还无法精准确定是在推理时「学习」到新任务的处理方法这种情况下如果没有示例就没有能力这里的「学习」要打引号因为它不调整参数还是在训练时已经具备了这个能力示例只是让它「回想」起之前学的。这里有点绕拿人来举例可能不太恰当希望能说明问题比如说你在读到一首诗时自己也诗兴大发写了一句。你说这句诗是因为你读到这首诗时「领悟」到的还是你本来就有这个积累记忆现在只是因为读这首诗而被勾了出来你看这涉及到大脑、思维、意识等领域知识而人类至今还没有搞清楚它们的原理所以我们现在还不知道答案。
4. RLHF RLHFReinforcement Learning from Human Feedback从人类反馈中学习听起来怎么平平无奇。确实它的思想非常朴素简单但却有着不可忽视的效果。刚刚我们已经提到了GPT-3说未来要找新的方法这其中就包括从人类中学习、强化学习微调、多模态等。时至今日从InstructGPT到ChatGPT再到GPT-4它一步一步在实现这些新的方法。这里有一点需要提醒这些方向并不是一开始就清晰地摆在那里的中间还是有非常多的探索和阶段性成果既有他们自己的研究也有其他从业人员的研究。千万不要看到结果觉得平平无奇尤其是作为非行业人士特别是有些媒体这中间的艰难探索永远值得尊敬。另外有时候即便知道了方法要做出来还做出效果来这也是非常有难度的。而且本文由于科普性质只能介绍一丢丢内容虽然整体结构比较完整但总体还是比较浅显所以标题是「一点所以然」。总的来说要做出来很有难度不过我们只是用的话如前面所言有手就行。 好了言归正传RLHF被人熟知应该主要是源自OpenAI的InstructGPT这篇论文当然更大范围的熟知就是ChatGPT的发布。因为后者没有论文也没有开源所以我们也只能拿InstructGPT的管窥一窥ChatGPT的豹。当然如果按照ChatGPT官方页面的说法这个「管」可能还比较粗。如果用简单的语言来描述InstructGPT其实就是用强化学习的算法微调一个根据人类反馈改进的语言模型。重要的是它调出了效果——1.3B的InstructGPT堪比175B的GPT-3如下图所示 图11不同策略不同模型效果对比来自InstructGPT论文 上面一共五根线我们稍微解释一下上面两根PPO的就是InstructGPT设置下的结果中间那根SFT可以理解成GPT-3微调理论上来说实际也是这样微调后的效果要好于Few-Shot更好于Zero-Shot下面两根是GPT-3的结果。当然这个评测方式可能有一点值得商酌。 好了现在咱们看看它是如何做的RLHF在其中又是起了什么作用如何起作用的。还是那张被到处张贴的图如果要统计引用率我感觉这张图绝对不低。 图12InstructGPT工作流程来自InstructGPT论文 这张图比较直观的展示了InstructGPT的整个流程。共三个步骤
Step1SFTSupervised Fine-Tuning有监督微调。顾名思义它是在有监督有标注数据上微调训练得到的。这里的监督数据其实就是输入Prompt输出相应的回复只不过这里的回复是人工编写的。这个工作要求比一般标注要高其实算是一种创作了。Step2RMReward Model奖励模型。具体来说一个Prompt丢给前一步的SFT输出若干个4-9个回复由标注人员对这些回复进行排序。然后从4-9个中每次取2个因为是有序的就可以用来训练这个奖励模型让模型学习到这个好坏评价。这一步非常关键它就是所谓的Human Feedback引导下一步模型的进化方向。Step3RLReinforcement Learning强化学习使用PPO策略进行训练。PPOProximal Policy Optimization近端策略优化是一种强化学习优化方法它背后的主要思想是避免每次太大的更新提高训练的稳定性。具体过程如下首先需要初始化一个语言模型然后丢给它一个Prompt它生成一个回复上一步的RM给这个回复一个打分这个打分回传给模型更新参数。这里的这个模型在强化学习视角下就是一个策略。这一步有个很重要的动作就是更新模型时会考虑模型每一个Token的输出和第一步SFT输出之间的差异性要让它俩尽量相似。这是为了缓解强化学习可能的过度优化。 就这样对就这样RLHF都表现在上面了效果大家都知道了。虽然ChatGPT没有发表相关论文但我们基本都相信它也是基于类似的思路实现的。当然这里面细节非常多即便知道了这个思路也不一定能复现出来。这在深度学习时代很正常里面的各种小设计、小细节实在是太多了。当它们堆积到一定量时造成的差别是很难一下子弥补的如果别人不告诉你那你只能自己慢慢做实验去验证。 下面我们强行解释一波RLHF是如何起作用的为什么它现在能成为一个基本的范式。其实强化学习用在NLP领域一直以来都有研究正好笔者本人也由于一些原因一直关注在关注文本生成以及强化学习在文本生成方面的研究。这里可能有两个难点一个是训练的稳定性另一个就是奖励函数的设计。前者有PPO策略和与SFT的差异衡量得到不小的改进。后者如果从客观角度考虑设计一个规则就不那么容易了。我也曾设想过很多类似的方法比如加入一些语法规则限制甚至是类似最省力法则这样的规则。 最省力法则齐夫在《Human Behavior and the Principle of Least Effort an introduction to human ecology》一书中提出的简单来说就是语言具有惰性会朝着使用较少的词语表达尽可能多的语义这个方向进行演化。 InstructGPT使用了人类反馈直接作为「规则」也就是把这种「规则」给隐式化当做黑盒。我们只管结果好坏至于中间有什么规则有多少种规则怎么起作用统统不关心。这是和深度学习类似的思路相比而言自己之前的想法可能有些Naive了毕竟语言学本身也是有不少争议没有搞清楚比如语言能力是不是人生来具有的能力InstructGPT的做法更加简单、直接而且有效。 剩下要解决的就是怎么衡量「好坏」毕竟最终总是要个结果的既然要结果就要有标准。读者不妨思考一下如果换做你会如何设计一些指标来衡量两段输出内容的好坏。这一步看似容易其实特别不容易因为指标的设计会影响到模型的学习方向最终就会影响到效果。因为这个输出的好坏衡量标准就太多了虽然看起来是对给出的几个结果进行排序上面的第二步但其实这个过程中间隐藏了大量人类的认知模型训练过程其实就是和第二步这个衡量过程对齐的过程。所以如果第二步指标没设计好第三步就是白费力气。尤其是对于InstructGPT这样针对几乎所有任务的设计衡量就更加不容易。试举一例比如一个摘要任务我们可能最关注的是能否准确概括原文信息而一个生成任务可能就关注流畅性和前后逻辑一致性。InstructGPT里面有10种任务要分别针对每种任务去搞指标那就比较麻烦了而且效果还不一定好因为这些指标并不一定都是一个方向。还有就是万一又有了一个新任务难道要再去设计一套指标全部重新训练一遍模型 我们看看InstructGPT是怎么设计衡量指标的我觉得这是InstructGPT这篇论文最宝贵的地方也是最值得我们思考和实践的地方。为此笔者早早就专门花时间仔细研读了相关的资料并写了一篇专门介绍其标注的文章ChatGPT 标注指南任务、数据与规范 | Yam感兴趣的读者可以进一步阅读。不过这方面的报道和研究好像比较少。 不多说了我们继续。首先InstructGPT用了三个大的通用指标有帮助、真实性和无害性有点类似阿西莫夫的机器人三定律。也就是说我不管你是什么任务你都得朝着这三个方向靠。这个想法真值得点赞。现在我们看到这个结果了自然感觉好像没什么但要是事先不知道要去设计出来大部分人还是很容易陷入被任务影响的境地。其实OpenAI团队在In-Context Learning上的坚持也是一样这个我们前面在讲GPT一节时已经提到过了。别人告诉你那个结果时你可能觉得好像不觉得有什么甚至很多研究机构、研究人员都有想过。但在有效果之前笃信一条罕有人走的路且一直坚定不移地走下去这是很不容易的。 有了刚刚的三大指导方针接下来就是细化使其具有可操作性。比如对于第一条有帮助性InstructGPT给了下面一些属于「有帮助」行为的示例
用清晰的语言写作。回答他们想问的问题即使问错了。对国际性敏感比如 “football” 不应该指美式足球“总统” 不一定指美国总统。如果指令Instruction太困惑要求澄清并解释指令为什么困惑。不给出过长或冗长的答案或重复问题中的信息。不要在给定的内容之外假设无关的额外上下文除非是关于世界的事实除非这是任务的隐含部分。比如要求 “礼貌地回复这封电子邮件{email body}”输出不应该假设 “我这次不能来但下周末有空”。但如果被要求 “给苏格拉底写一封电子邮件”那么可以放心地使用该假设。 我相信实际上这个列表可能很长有很多项会在实际标注过程中被依次添加进去直到能覆盖绝大多数情况为止即对于大部分要标注的数据根据提供的细则很容易就判断出来是否「有帮助」。现在不妨停下来再思考一下如果一开始就奔着这些细则设计奖励规则——只是想想就觉得不太现实。其他两个指标也有一些示例我们这里不再赘述感兴趣的读者可以阅读这段前面的那篇文章以及它后面的参考资料有些文档在论文里并没有被提及。 有了细则还没完接下来要解决的是前面提到的指标之间的冲突权衡问题。因为这是个比较任务比较哪个输出好当涉及多个指标时一定会出现一个结果A指标好于另一个结果但B指标却可能相反的情况。指标越多这个就越复杂好在只有三个。对此InstructGPT也给出了指导方针
对大部分任务无害和真实比有帮助更加重要。然而如果a一个输出比另一个有帮助很多b该输出只是稍微不那么真实 / 无害c该任务似乎不属于「高风险领域」如贷款申请、医疗、法律咨询等。这时候更有帮助的得分更高。当选择同样有帮助但以不同方式不真实 / 有害时问自己哪个输出更可能对用户在现实世界中受任务影响最大的人造成伤害这个输出应该排名较低。如果任务中不清楚这点则将这些输出标记为并列。 对于边界Case的总体指导原则是你更愿意从试图帮助你完成此任务的客户助理那里收到哪种输出这是一种设身处地的原则把自己假想为任务提出者然后问自己期望得到哪种输出。 现在看看这些是不是也觉得这一步没那么容易了它们虽然看起来没那么「技术性」但要很好地完成却需要优秀的设计能力、宏观把控能力和细节感知力。我更加相信这些细则是自底向上逐步构建起来的而不是一开始就设想好的。它一定是在实践中不断遇到疑惑然后经过仔细分析权衡后逐步加入一条条规则最终逐步构建起来的一整套系统方案。个人觉得这一套东西可能是比数据还要珍贵的财产它所产生的壁垒只能用时间不断实践来堆积。 InstructGPT/ChatGPT相比GPT-3有更强的Zero-Shot能力Few-Shot很多时候已经不太用的着了但是Prompt还是需要的由此还催生了一个新的行当——Prompt工程。不过据OpenAI的CEO所言过几年Prompt工程也不需要了可能生成图片时还要一点点我们要做的就是直接通过自然语言和AI进行交互。我们无法判断他说的会不会真的实现但有一点可以肯定AI的门槛必定会进一步降低过几年可能一个初中生都能通过已有的一些服务创造出不错的AI应用。
5. LLM 我们正在经历并进入一个新的时代LLM作为一个外部「最强大脑」未来一定会非常容易被每个人获取至于用来做什么Depends Your Imagination。无论哪个行业相信这都是一个令人振奋的信号笔者本人就经常激动到夜不能寐。对于这种大变革我们能做什么呢我不知道未来太多可能但我相信最好的办法就是拥抱它。让我们HuggingLLM一起创造时代、创造未来。我们相信世界必将会因此而变得更美好。