【DataWhale学习笔记-蝴蝶书共读】大语言模型背后
从图灵测试到ChatGPT
1950年,艾伦•图灵(Alan Turing)发表论文《计算机器与智能》( Computing Machinery and Intelligence),提出并尝试回答“机器能否思考”这一关键问题。在论文中,图灵提出了“模仿游戏”(即图灵测试)的概念,用来检测机器智能水平。图灵测试的核心思想是,如果一个人(代号C)使用测试对象皆理解的语言去询问两个他不能看见的对象任意一串问题,其中一个是正常思维的人(代号B),另一个是机器(代号A)。如果经过若干询问以后,C不能得出实质的区别来分辨A与B的不同,则此机器A通过图灵测试。
1956年,人工智能正式成为了一个科学上的概念,而后涌现了很多新的研究目标与方向。虽然,图灵测试只是一个启发性的思想实验,而非可以具体执行的判断方法,但他却通过这个假设,阐明了“智能”判断的模糊性与主观性。从此图灵测试成为了 自然语言处理(Natural Language Processing,NLP) 任务的一个重要评测标准。图灵测试提供了一个客观和直观的方式来评估机器是否具有智能,即通过让机器与人类进行对话来判断其智能水平。这种方式可以避免对智能本质的哲学争论,也可以避免对智能具体表现形式的技术细节。因此,很多自然语言处理任务都可以用图灵测试来进行评测,例如对话系统、问答系统、文本生成等。
自然语言处理(Natural Language Processing,NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理包括很多不同的任务,如分词、词性标注、句法分析、语义分析、信息抽取、文本分类、文本摘要、机器翻译、问答系统、对话系统等。
图灵测试与自然语言处理任务有着密切而复杂的关系,可以从以下两个方面来概括:
- 一方面,图灵测试是自然语言处理任务的一个重要驱动力。图灵测试提出了一个具有挑战性和吸引力的目标,即让机器能够用自然语言与人类进行流畅、智能、多样化的对话。为了达到这个目标,自然语言处理领域不断地发展和创新各种技术和方法,以提高机器对自然语言的理解和生成能力。例如,为了让机器能够回答用户提出的问题,就需要研究问答系统这一自然语言处理任务;为了让机器能够根据用户提供的信息生成合适的文本,就需要研究文本生成这一自然语言处理任务;为了让机器能够适应不同领域和场景的对话,就需要研究领域适应和情境感知这一自然语言处理任务等等。
- 另一方面,图灵测试是自然语言处理任务的一个重要目标。图灵测试提出了一个具有前瞻性和理想性的愿景,即让机器能够达到与人类相同或者超越人类的智能水平。这个愿景激发了很多自然语言处理领域的研究者和开发者,使他们不断地探索和创新,以期实现真正意义上的自然语言理解和生成。例如,为了让机器能够理解用户提出的问题,就需要研究语义分析、知识表示、逻辑推理;为了让机器能够生成符合用户需求的文本,就需要研究文本规划、文本风格、文本评价;为了让机器能够与用户建立信任和情感的联系,就需要研究情感分析、情感生成、情感对话等等。
自然语言处理与人工智能发展历史有着密切而复杂的关系。它们相互促进、相互影响、相互依存、相互目标。自然语言处理在人工智能发展历史上有很多里程碑式的成果,比如:
- 1954年,IBM实现了世界上第一个机器翻译系统,将俄语翻译成英语。
- 1966年,约瑟夫·韦伊岑鲍姆开发了ELIZA,一种模拟心理治疗师的对话系统。
- 1972年,特里·温诺格拉德开发了SHRDLU,一种能够理解和生成自然语言的程序,用于控制一个虚拟的机器人在一个虚拟的世界中进行操作。
- 1988年,杰拉尔德·萨斯曼和詹姆斯·马丁创建了Text Retrieval Conference(TREC),一个旨在推动信息检索和自然语言处理技术发展的国际评测活动。
- 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 Model,NPLM):它可以通过学习大量的文本数据来预测下一个单词或字符的概率。其中,最早的神经网络语言模型是由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
LM,Language Model,语言模型,简单来说就是利用自然语言构建的模型。这个自然语言就是人常说的话,或者记录的文字等等,只要是人生产出来的文字,都可以看做语言。你现在看到的文字也是。模型就是根据特定输入,通过一定计算输出相应结果的一个东西,可以把它当做人的大脑,输入就是你的耳、眼听或看到的文字,输出就是嘴巴说出来或手写出来的文字。总结一下,语言模型就是利用自然语言文本构建的,根据输入的文字,输出相应文字的模型。
在深度学习的初期,最著名的语言模型是RNN,Recurrent Neural Network,中文叫循环神经网络。RNN 模型与其他神经网络不同的地方在于,它的节点之间存在循环连接,这使得它能够记住之前的信息,并将它们应用于当前的输入。这种记忆能力使得 RNN 在处理时间序列数据时特别有用,例如预测未来的时间序列数据、自然语言处理等。通俗地说,RNN 就像一个具有记忆功能的人,可以根据之前的经验和知识对当前的情况做出反应,并预测未来的发展趋势。如下图所示:
来自:https://colah.github.io/posts/2015-08-Understanding-LSTMs/
右边是左边的展开,A就是参数,X是输入,h就是输出,由于自然语言是Token by Token的,所以就组成了一个序列。那这个参数怎么学习呢?这就要稍微解释一下学习过程,请看下面的图:
RNN的演示代码
import torch.nn as nn
rnn = 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,维度d=32,h0就是初始化的输出,也就是output4个里面的第一个,这里output的四个64维的向量就分别表示4个输出,hn就是最后一个Token的输出,也可以看成是整个句子的表示。如果要输出词的概率,需要先扩充到词表大小,再进行归一化:
wo = torch.randn(64, 1000) # 假设词表大小N=1000
logits = output @ wo # 4×1000
probs = nn.Softmax(dim=1)(logits) # 4×1000,每一行概率和为1
这里的probs每一行就是词表大小的概率分布,和为1,意思是这个Token到词表每个Token的概率。
Transformer
一个刚开始在NLP领域,后来横跨到语音和图像领域,并最终统一几乎所有模态的架构。这是Google2017年发的一篇论文,标题叫《Attention Is All You Need》,其最重要的核心就是提出来的Self-Attention机制,中文也叫自注意力。简单来说,就是在语言模型建模过程中,把注意力放在那些重要的Token上。想来,Google在发表论文之初也没有料想到今天吧。
Transformer是一种Encoder-Decoder架构,简单来说就是先把输入映射到Encoder,这里大家可以把Encoder先想象成上面介绍的RNN,Decoder也可以想象成RNN。这样,左边负责编码,右边则负责解码。这里面不同的是,左边因为我们是知道数据的,所以建模时可以同时利用当前Token的历史Token和未来(前面的)Token;但解码时,因为是一个Token一个Token输出来的,所以只能根据历史Token以及Encoder的Token表示进行建模,而不能利用未来的Token。
Transformer的这种架构从更普遍的角度来看,其实是Seq2Seq架构,大家别慌,这简单来说就是序列到序列模型,也就是输入是一个文本序列,输出是另一个文本序列。翻译就是个很好的例子,我们看下面这个来自Google的GNMT(Google Neutral Machine Translation)的经典图片:
GNMT图示,来自GNMT GitHub:https://github.com/belvo/Google-Neural-Machine-Translation-GNMT-
Transformer的结构
Transformer,来自Transformer论文
这个图更多的是体现了内部结构。左边是Encoder的一个Block(一共N个),右边是Decoder的一个Block(一共N个),简单起见,我们可以假设N=1,那左边这个结构就是一个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则根据不同权重的注意提取知识。
GPT
GPT,Generative Pre-trained Transformer,没错了,就是ChatGPT的那个GPT,中文叫「生成式预训练Transformer」。生成式的意思就是类似语言模型那样,Token by Token生成文本,也就是上面提到的Decoder。预训练刚刚也提过了,就是在大量语料上训练的语言模型。GPT模型从1到4,一共经历了5个版本,中间有个ChatGPT是3.5版
GPT的基本结构
GPT基本结构,来自GPT论文
关于左边,我们上面已经介绍过了,用的就是Transformer的架构(GPT中是Decoder),具体里面的子模块可以不用关注。重点看看右边,这里有一个值得注意的地方,就是针对不同的任务输入,都拼接成文本序列,然后丢给Transformer Decoder再通过一个Linear+SoftMax输出结果。Linear是一种最基础的网络结构,SoftMax我们前面介绍过,主要用来把输出映射到概率分布(和为1)。这种拼接输入的方法在当时那个大模型时代非常流行的,紧跟其后的BERT也是类似的方式。这样统一的处理方法能够减少不同任务对模型的改动。反正不管什么任务,都想方设法搞成一个序列就行。
RLHF
RLHF,Reinforcement Learning from Human Feedback,从人类反馈中学习,听起来怎么平平无奇。确实,它的思想非常朴素简单,但却有着不可忽视的效果。刚刚我们已经提到了,GPT-3说未来要找新的方法,这其中就包括从人类中学习、强化学习微调、多模态等。时至今日,从InstructGPT到ChatGPT,再到GPT-4,它一步一步在实现这些新的方法。这里有一点需要提醒,这些方向并不是一开始就清晰地摆在那里的,中间还是有非常多的探索和阶段性成果(既有他们自己的研究,也有其他从业人员的研究)。千万不要看到结果觉得平平无奇,尤其是作为非行业人士(特别是有些媒体),这中间的艰难探索永远值得尊敬。另外,有时候即便知道了方法,要做出来,还做出效果来,这也是非常有难度的。而且本文由于科普性质,只能介绍一丢丢内容,虽然整体结构比较完整,但总体还是比较浅显(所以标题是「一点所以然」)。总的来说,要做出来很有难度,不过我们只是用的话,如前面所言,有手就行。
好了,言归正传,RLHF被人熟知应该主要是源自OpenAI的InstructGPT这篇论文,当然更大范围的熟知就是ChatGPT的发布。因为后者没有论文,也没有开源,所以我们也只能拿InstructGPT的管窥一窥ChatGPT的豹。当然,如果按照ChatGPT官方页面的说法,这个「管」可能还比较粗。如果用简单的语言来描述InstructGPT,其实就是用强化学习的算法微调一个根据人类反馈改进的语言模型。重要的是,它调出了效果——1.3B的InstructGPT堪比175B的GPT-3,如下图所示:
不同策略不同模型效果对比,来自InstructGPT论文
LLM
我们正在经历并进入一个新的时代,LLM作为一个外部「最强大脑」未来一定会非常容易被每个人获取,至于用来做什么,Depends Your Imagination。无论哪个行业,相信这都是一个令人振奋的信号,笔者本人就经常激动到夜不能寐。对于这种大变革,我们能做什么呢,我不知道,未来太多可能,但我相信最好的办法就是拥抱它。让我们HuggingLLM,一起创造时代、创造未来。我们相信世界必将会因此而变得更美好。
国内LLM介绍
阿里巴巴 千问Qwen
官方GITHUB
QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. (github.com)
智谱 ChatGLM-6B
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于General Language Model (GLM)架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。欢迎通过chatglm.cn体验更大规模的 ChatGLM 模型。
官方GITHUB
THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型 (github.com)
书生.浦语
InternLM 是在过万亿 token 数据上训练的多语千亿参数基座模型。通过多阶段的渐进式训练,InternLM 基座模型具有较高的知识水平,在中英文阅读理解、推理任务等需要较强思维能力的场景下性能优秀,在多种面向人类设计的综合性考试中表现突出。在此基础上,通过高质量的人类标注对话数据结合 RLHF 等技术,使得 InternLM 可以在与人类对话时响应复杂指令,并且表现出符合人类道德与价值观的回复
InternLM2 系列模型具有如下特性:
- 有效支持20万字超长上下文:模型在 20 万字长输入中几乎完美地实现长文“大海捞针”,而且在 LongBench 和 L-Eval 等长文任务中的表现也达到开源模型中的领先水平。 可以通过 LMDeploy 尝试20万字超长上下文推理。
- 综合性能全面提升:各能力维度相比上一代模型全面进步,在推理、数学、代码、对话体验、指令遵循和创意写作等方面的能力提升尤为显著,综合性能达到同量级开源模型的领先水平,在重点能力评测上 InternLM2-Chat-20B 能比肩甚至超越 ChatGPT (GPT-3.5)。
- 代码解释器与数据分析:在配合代码解释器(code-interpreter)的条件下,InternLM2-Chat-20B 在 GSM8K 和 MATH 上可以达到和 GPT-4 相仿的水平。基于在数理和工具方面强大的基础能力,InternLM2-Chat 提供了实用的数据分析能力。
- 工具调用能力整体升级:基于更强和更具有泛化性的指令理解、工具筛选与结果反思等能力,新版模型可以更可靠地支持复杂智能体的搭建,支持对工具进行有效的多轮调用,完成较复杂的任务。可以查看更多样例。
官方GITHUB
InternLM/InternLM: Official release of InternLM2 7B and 20B base and chat models. 200K context support (github.com)
最后插播一则广告,最近书生·浦语大模型实战营第二期正式启动,两周时间带你玩转大模型微调部署和评测,从零搭建多模态、RAG智能体应用。课程还有免费的A100算力使用
参考文档
hugging-llm/content/chapter1/ChatGPT基础科普——知其一点所以然.md at main · datawhalechina/hugging-llm (github.com)