学习文章:人人都能看懂的chatGpt原理课
笔记作为学习用,侵删
Chatgpt是一个语言模型
语言模型是什么?
所谓语言模型,就是由计算机来实现类似于人的语言交流、对话、叙述能力
,它集中体现在模型能够依赖上下文进行正确的文字输出
(模型能 依赖上下文,进行正确的文字输出)
比如:请补全这条语句:掘金社区是一个便捷的技术交流____
可以填网站,也可以填平台,空格处要填什么字,填几个汉字,是根据空格周围的上下文
来决定的。能够正确根据上下文在空格处填入恰当
的文字,表明其语言能力强
,否则表示语言能力弱
。
把上述这些预测空格内容的问题交给计算机建模来完成,就实现了语言模型的训练
语言模型就是由上述的方式来进行训练的。
Chatgpt如何处理文字输入的
chatgpt的输入输出,就是将文字输入进模型,再由模型预测出文字,本质就是一个文字接龙
的语言模型。
而文字进入模型前,需要经过一个转换,转成gpt能理解的形式,在计算处理后,再将结果转换回文字。这种转换包括两个步骤Tokenizer
和Embedding
文字->Tokenizer->Embedding->chatgpt...
Tokenizer
例如,用户提问了一条文本,文字(带标点和各种特殊符号)共有 50 个字符,但耗费了 30 个 token,ChatGPT 根据输入生成一条回答,总计 200 个 token,逆转换为文字总共 300 个字,那么用户一共消费的 token 数就是 30+200=230 个。那什么是 token 呢?
token 是任何 NLP 神经网络 模型接收用户输入的最小粒度
。 token 本身就是一些字符的组合,如英文单词#cat、中文词汇鞋子、英文词缀ly、中文汉字珂等,都可以看作是一个 token。
将用户输入的文本转为token,就是Tokenizer
Tokenizer 算法 BPE 执行流程
Tokenizer目前最流行的方法就是字符对编码 BPE(Byte Pair Encoding) 算法
,BPE算法,根据一份token此表,将输入的文本拆解成若干个token,每个token都存在于词表。
一般地,模型训练所使用的词表中 token 数量大约从几万~几十万不等
假设这是一个token词表,
BPE就是将句子根据上面这份图表进行匹配,从文本中拆分出存在于词表中的 token,
The newest car has a lower price and the lowest fuel.
=>
#The, #new, est, #car, #has, #a, #low, er, #price, #and, #the, #low, est, #fuel,
同样地,ChatGPT 模型在回答用户问题,输出答案时,也是首先输出 token 序列
,再将 token 序列反转为正常的自然语言文本,这个操作叫做 D e-tokenization
。它与 Tokenization 是完全互逆的操作
还有一种基于字节的 BPE 算法(Byte-level BPE)
。这种方法,主要是为了克服基于字符的 token 词表,由于各种特殊字符数量太庞大导致效果变差。
简单的说就是字符数量太多,基于字符数量的token表也太大了,比如所有的字符在计算机中都是以 Unicode 编码格式实现的。Unicode 常用字符目前总量大约有十多万,如果直接基于字符形式,构造 token 词表的话,那么词表可能会变得非常庞大,达到几十万。
因此,Byte-level BPE 算法应运而生。BPE算法直接操作字符,而Byte-level BPE以字节为单位,所有的字节个数全部加起来不过 256,这对模型训练是一个巨大的利好。
Tokenizer 的好处
-
克服长尾效应 OOV
,比如有的词汇是常用,有的词汇是罕见的(自然语言的长尾效应),这时候如果将罕见的词汇作为token,会导致它有可能不在词表中,因此引入 Tokenizer,采用 BPE 算法可以避免低频词作为 token。
例如,根据上述训练例子得到的词表,#strangest 这个词在训练语料中词频较低,可能不出现在 token 词表中,但 “#strang” 和 “est” 一定以较高的频率出现在 token 词表中。 -
多语言支持
,早期的NLP只支持一种语言,针对英文的模型不能针对中文,而BPE算法,,包括 Byte-level BPE 算法的设计,使得一份词表中包含了多种语言的字符(所有字符串都是由Unicode编码实现的),支持模型的多语言处理功能
词嵌入(Embedding)
文本经过Tokenizer转换后,还需要经过Embedding进行转换。
文本经过Tokenizer转为token后,还需要通过embedding转为张量
,同时 embedding 也指被转换后得到的张量本身。
在神经网络中,张量 ( Tensor ) 是指多维数组,它可以存储和处理大量的数据,是神经网络中最基本的数据结构。张量一般以浮点数的作为元素进行填充。
token转为浮点数张亮的过程,就是词嵌入(Embdffing)
总结
Tokenizer 将模型输入的文字转换为 token 序列。
ChatGPT 使用了 BPE 算法实现 Tokenizer。
Embedding 将 token 序列映射为张量矩阵,方便模型进行张量矩阵运算。
注意力机制
openAI的GPT模型等,都采用注意力机制进行建模,注意力机制是NLP神经网络的灵魂机制。
就好比上学的时候老师说把注意力集中点,这里就用到了注意力机制,学生需要把注意力放在接收课堂知识上,而不是其他事。
在语言模型中就好比:一个AI模型,从接收的大规模数据中,剔除掉不相关,不重要的信息,重点关注与自身密切的信息。其核心在于收缩关注信息的范围,实现信息的压缩。
注意力机制的建模
权重模式:上面说到信息通过tokenizer生成token,最终通过embedding向量化转成向量交给gpt。
如果想让模型更加关注到重要的信息
,实际上可以认为,给 重要的信息 对应的 token embedding赋予更大的权重
自注意力机制 Self-Attention
计算权重,不同的模型、不同的 NLP 任务都有不同的形式。这项技术经过多年的发展,最终趋向于自注意力机制(Self-Attention) ,这也是 ChatGPT 所采用的形式。
注意力机制的好处
自注意力机制,擅长将每个token的上下文关联起来。注意力机制擅长计算长文本依赖。
比如提问 csdn是一个很xxx的__,这个空格填的应该跟第一个csdn有关,这种就属于跨token。自注意力机制擅长处理这种问题,寻找两者之间的关联关系。
而之前使用的是循环神经网络RNN模型来处理,该模型认为第i个token跟第i+1个token有关联,则无法跨域token,局限性较高。
其次,深度学习模型计算量巨大,为了能让gpt模型迅速出结果,采用了并行计算,(主要采用多核GPU进行计算(英伟达))
总结
- 注意力机制,主要是从大量信息中剔除无用信息,关注与自身密切信息,对信息进行压缩。
- 注意力机制在 NLP 领域的应用主要是 自注意力Self-Attention 形式,它是神经网络具备充分拟合能力的灵魂。
Chatgpt的结构,Encoder-Decoder 编码器-解码器结构
最早使用这套架构是翻译模型,比如机器翻译模型收到一个输入how are you,经过模型一般操作,输出你好吗,这种也称为seq2seq,即序列到序列,输入一条文字序列,输出一条文字序列。
在 NLP 领域,seq2seq 可以被应用于各种各样的文字序列任务上,也就成了 NLP 领域的一种标准建模方式。
encode像极了人大脑接收一条信息解码后给大脑思考,在decoder后,将思考结果转为信息输出
GPT舍弃了encoder,保留了decoder,
将输入tokenizer和embedding
后,变成 token embedding
,进入transformer
层,将transformer输出的K维向量(黄色部分)
进行解码
,得到需要的信息。
GPT 是一个解码器
GPT模型首先接收一串输入数据,经过 Transformer,这属于 encoder 部分,末尾模型输出预测的 token 字符,这属于 decoder 部分。与上面介绍的decoder和encoder结构有点出入,正常decoder和encoder是相互独立,中间有一个信号相连。而在GPT中,编码和解码为一体。
其中,左半边为编码器,右半边为解码器。而前述的 GPT 模型架构,其实就是原始结构的右半边。因此,我们也常说,GPT 系列模型仅仅使用了 decoder 部分。
总结
- ChatGPT 模型基于 encoder-decoder 模型架构进行建模。
- ChatGPT 模型采用核搜索、温控搜索结合的方式(解码方式)生成输出结果,并基于 temperature 调节生成结果的随机性,值越大,随机性越强,值越小,生成的内容越固定。
监督学习与chatgpt预训练
chatgpt是一个规模庞大的神经网络模型,上述介绍了gpt的模型结构,下面介绍如何使用数据训练一个chatgpt模型.
chatgpt模型的训练方式主要还是语言模型的预训练
,根据用户数据进行微调
,使用强化学习方法提升模型知识涌现能力。这几部分的本质都还是利用随机梯度下降法,使用数据进行有监督训练。
神经网络的训练过程
神经网络最常用的训练方式是监督学习
,通过给定的输入(gpt的输入文本),和输出(gpt的输出文本),结合两者的数据来学习一个函数,使得对于新的输入数据
,可以预测其对应的输出
。
在监督学习中,输入数据一般称为特征
,输出数据一般称为标签
或者目标向量
。
打个比方:监督学习就好像一位老师教学生做题一样,只给题目(输入),和答案(输出),让学生自己根据题目和答案得到解题思路(函数),掌握思路后,学生能根据该解题思路,对新的题目(输入),进行解答(输出)。
准备标注数据
,根据模型推理的结果和数据
,标注结果,然后通过损失函数对比两者的差异,再通过梯度下降法更新模型的参数,以此达到模型训练的目标。
通俗的说就是准备数据,然后模型推理出结果,再对结果标注,通过损失函数判断输入和输出是否符合预期,最后通过梯度下降法可以更新模型参数,使下次输出更加符合预期。
神经网络的输入和输出
监督学习模型训练过程中,必须依赖已经标注好的数据作为输入。并且会拿标注好的输出
和模型计算得到的输出进行对比,以此训练模型。
神经网络的预测推理
模型开始训练之前,需要随机初始化一套参数值,用于模型的推理(预测),在chatgpt中,用户每次调用chatgpt回答一次问题,都属于一次模型的推理或预测。
神经网络的损失函数
损失函数是机器学习中的一个重要概念,用于衡量模型预测的结果
和真实结果
之间的差距。
当预测得到的类别和真实的标注类别不一致时,就需要使用损失函数来衡量。
模型的训练,就是通过优化损失函数来更新模型的参数,使得模型结果更加准确。
梯度下降法
若随机设置模型的参数
,会导致模型对输入的标注数据的产生错误输出
,这个错误值的大小即为损失函数值
。
得到损失函数值后,接下来就是让模型能够根据给出的两条样本数据训练模型,更新模型的参数权重,使得下次能更加准确的进行判断,此时就需要用到梯度下降法
来更新模型的参数
梯度下降法
是一种常用的优化算法,用来求解函数的最小值,在机器学习中,通过使用其来更新模型的参数,使得损失函数最小化,让模型的预测结果更加准确。
ChatGPT 的预训练过程
chatgpt是经过两个训练步骤得到的,首先通过文本数据进行预训练(上面介绍的监督学习过程),再经过RLHF训练得到准确的模型,最后才能给到用户去使用
总结
- 监督学习就是根据数据,对模型参数进行拟合(根据输入输出和正确结果来调参),在神经网络模型中非常常用。
- 输入数据->预测结果->损失函数对比输入输出得到损失值(判断输出是否符合预期)->通过梯度下降法调节模型参数,使得下一次输出尽可能符合预期
- Chatgpt的预训练就是一个监督学习过程