学习入门 Chatgpt原理 二

学习文章:人人都能看懂的chatGpt原理课
笔记作为学习用,侵删

Chatgpt是一个语言模型

语言模型是什么?

所谓语言模型,就是由计算机来实现类似于人的语言交流、对话、叙述能力,它集中体现在模型能够依赖上下文进行正确的文字输出(模型能 依赖上下文,进行正确的文字输出)

比如:请补全这条语句:掘金社区是一个便捷的技术交流____

可以填网站,也可以填平台,空格处要填什么字,填几个汉字,是根据空格周围的上下文来决定的。能够正确根据上下文在空格处填入恰当的文字,表明其语言能力强,否则表示语言能力弱

把上述这些预测空格内容的问题交给计算机建模来完成,就实现了语言模型的训练
语言模型就是由上述的方式来进行训练的。

Chatgpt如何处理文字输入的

chatgpt的输入输出,就是将文字输入进模型,再由模型预测出文字,本质就是一个文字接龙的语言模型。
而文字进入模型前,需要经过一个转换,转成gpt能理解的形式,在计算处理后,再将结果转换回文字。这种转换包括两个步骤TokenizerEmbedding
文字->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的预训练就是一个监督学习过程
为了实现文字接龙,我们可以使用transformer模型来生成下一个单词或短语。具体步骤如下: 1.准备数据集,将所有的单词或短语转换为数字表示,并将其分为训练集和测试集。 2.使用transformer模型进行训练,训练过程中需要使用self-attention机制来捕捉输入序列中的关系。 3.在训练完成后,使用模型来生成下一个单词或短语。具体方法是将前面的单词或短语输入到模型中,然后使用模型生成下一个单词或短语。 4.重复步骤3,直到生成所需长度的文本。 下面是一个使用transformer模型实现文字接龙的示例代码: ```python import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Input, Dense, Dropout, Embedding, LayerNormalization from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.preprocessing.sequence import pad_sequences # 准备数据集 # ... # 定义模型 input_layer = Input(shape=(max_len,)) embedding_layer = Embedding(input_dim=num_words, output_dim=embedding_dim)(input_layer) encoder_layer = TransformerEncoder(num_layers=num_layers, d_model=d_model, num_heads=num_heads, dff=dff, input_vocab_size=num_words, maximum_position_encoding=max_len)(embedding_layer) output_layer = Dense(num_words, activation='softmax')(encoder_layer) model = Model(inputs=input_layer, outputs=output_layer) # 训练模型 # ... # 使用模型生成下一个单词或短语 def generate_next_word(model, tokenizer, text): sequence = tokenizer.texts_to_sequences([text])[0] sequence = pad_sequences([sequence], maxlen=max_len, padding='post') prediction = model.predict(sequence)[0] next_word_index = tf.argmax(prediction).numpy() next_word = tokenizer.index_word[next_word_index] return next_word # 生成文本 text = 'I like to' for i in range(10): next_word = generate_next_word(model, tokenizer, text) text += ' ' + next_word print(text) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderlin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值