赞
踩
LLM本身基于transformer架构。
通常认为参数量超过10B的模型为大语言模型。由于参数量巨大,需要的训练数据量也极多,因此目前大部分的使用方式为:大公司整理大量常用数据集,训练一个各方面性能还不错的通用大模型,小公司在此通用模型上搜集小规模行业数据进行微调,最终得到行业专有模型/领域模型。当然,如果通用模型能直接拥有各行业知识是最好的,但以目前的数据量和算力等还未达到效果。
一般分为三种:自回归模型、自编码模型和序列到序列模型。
_自回归(Autoregressive model)_模型采用经典的语言模型任务进行预训练,即给出上文,预测下文,对应原始Transformer模型的解码器部分,其中最经典的模型是GPT。由于自编码器只能看到上文而无法看到下文的特点,模型一般会用于文本生成的任务。
_自编码(AutoEncoder model)_模型则采用句子重建的任务进行预训练,即预先通过某种方式破坏句子,可能是掩码,可能是打乱顺序,希望模型将被破坏的部分还原,对应原始Transformer模型的编码器部分,其中最经典的模型是BERT。与自回归模型不同,模型既可以看到上文信息,也可以看到下文信息,由于这样的特点,自编码模型往往用于自然语言理解的任务,如文本分类、阅读理解等。(此外,这里需要注意,自编码模型和自回归模型的唯一区分其实是在于预训练时的任务,而不是模型结构。)
序列到序列(Sequence to Sequence Model)模型则是同时使用了原始的编码器与解码器,最经典的模型便是T5。与经典的序列到序列模型类似,这种模型最自然的应用便是文本摘要、机器翻译等任务,事实上基本所有的NLP任务都可以通过序列到序列解决。
目前现有的LLM基本上全是Autoregressive model。
整个训练过程分为如下4个阶段。
预训练是整个流程中最重要的部分,也是消耗成本最多的环节。在这个阶段大模型的主体(基干)已经确定,堆砌大量的数据进行训练,模型找出其中的共性,将其压缩为一个模型。
目前主流的认知已经是:模型的参数量太小会制约性能,但也并不是越大越好。增加数据量并保持一个中~大参数规模目前看是一个平衡效果和使用成本的较优的方案。
大型语言模型中的几乎所有知识都是在预训练中学习的,只需要有限的指令学习数据就可以教会模型产生高质量的输出。
Base模型并不是一个一般场景/特定场景下好用的模型
Base模型中学习了很多我们所不需要甚至不想要的信息
所以我们需要一种方式来对其进行调整,只输出我们想要的内容,以及更好的适应特定场景中我们的问题。
使用相对少量的(1w-10w水平的问答对)、高质量的数据来继续训练LLM。由于微调阶段使用的数据量相对于预训练阶段和模型整体参数量来说都较小,所以必须保持一个较高的质量。其中混有的少比例脏数据可能会把模型带偏。
让标注员产生一个答案成本很高,但让他在不同答案之间选择哪个更好是成本明显降低的。这就产生了另一类标注方式,对于不同的回答对直接标记好坏倾向。这种标注方式能够帮助模型学习高层语义上的倾向。
对齐技术可以让AI系统在成功优化训练目标的同时,能够符合预期目的,且遵守人类提供的道德和安全标准。对齐技术通常指的是通过引入人工生成的预期效果样例以及使用强化学习(比如RLHF)来实现模型和预测的对齐。
RLHF(Reinforcement Learning from Human Feedback 人类反馈强化学习)
收集人类生成的对于预期行为的描述并且训练一个全监督微调模型(SFT: supervised finetuned model)
使用对不同的输出的评分,训练一个奖励模型(RM: reward model)
使用RM作为评分函数来微调SFT,从而最大化回答的评分(具体细节用PPO算法实现)
RLHF环节在整个LLM的过程中也是很难的,很不稳定
RL问题的求解过程的难度本就是(相对于DL等)更大的。
reward的具体数值设计也很玄学,不同回答之间“好”的差异的程度应该是有大有小的,过于简单的处理会导致reward model扭曲。
这个问题的reward非常稀疏,且是只在最后给出的这种最困难的类型。
实际应用中,RL问题面对的token序列都太长,长一点的回答会超过1000token,这对RL求解的过程挑战较大。
由于transformer架构包含encoder、decoder两部分。
但在实际使用时,可以针对使用场景进行不同结构的尝试。
如下图所示,有些LLM保持了原始的transformer架构,而有些LLM只使用了Encoder,有些只使用了Decoder。具体模型架构发展图如下。
在理论上Encoder是双向注意力机制,会存在低秩问题。所有Decoder-only是目前的主流形式。
Encoder架构在预测mask处文字的应用方面更有优势,Decoder架构在预测下一个单词应用方面更有优势。
在DecoderBlock中,mask-attention是为了解决训练时answer内容中前面的token不能观察到后面token的信息而引入的,在推理时所有输入均可以互相看到,并不需要mask-attention。又考虑到训练和推理时模型架构一致会使得效果更好,因此在后面的LLM中,Decoder-block只包含self-attention。
整理的各类文本(各种语言)首先需要根据段落和语句等裁剪成短文本段落。
然后将短文本段落分解成词序列,此过程为tokenization,转换的每个单元称为token。
最后将token转换成计算机更容易处理的数字信息(通过vocab进行转换)。
如何将文字分词并转换成数字也有一些细节可以深究。比如输入为 live in New York,分词结果可以是
–> live in / New York
–> live / in / New York
–> live / in / New / York
–> l / i / v / e / i / n / N / e / w / Y / o / r / k
输入为 乒乓球拍卖完了,分词结果可以是
–> 乒乓球 \ 拍卖 \ 完了
–> 乒乓 \ 球拍 \ 卖 \ 完了
其中主要包含_按词组进行分词_、按单词进行分词、_按照字母进行分词_等几种。不同的分词方式可能会产生不同的含义。
分词难点:
英文:一个单词会包含多种形式:does,done,doing,did。
中文:一个汉字可能会包含多种意思。
优点:速度快、成本低
缺点:适应性不强,不同领域效果差异大
基本思想是基于词典匹配,将待分词的中文文本根据一定规则切分和调整,然后跟词典中的词语进行匹配,匹配成功则按照词典的词分词,匹配失败通过调整或者重新选择,如此反复循环即可。代表方法有基于正向最大匹配和基于逆向最大匹配及双向匹配法。
优点:适应性较强
缺点:成本较高,速度较慢
这类目前常用的是算法是HMM、CRF、SVM、深度学习等算法,比如stanford、Hanlp分词工具是基于CRF算法。以CRF为例,基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。
优点:准确率高、适应性强
缺点:成本高,速度慢
例如有人员尝试使用双向LSTM+CRF实现分词器,其本质上是序列标注,所以有通用性,命名实体识别等都可以使用该模型,据报道其分词器字符准确率可高达97.5%。
常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。
目前LLM常用基于词典的分词方式。
按切分的粒度通常分成三大类,一是按词粒度来分,二是按字符粒度来分,三是按 subword(子词粒度来分,最常用)
词粒度的切分能够非常好地保留完整语义信息,但是如果出现拼写错误、英文中的缩写、不同表示形态等情况,鲁棒性一般。另一方面,词切分会产生非常巨大的词表,而且这都不能确保不会出现out of vocabulary
问题。
在词粒度分词法中,do、did、done、does和dies(拼写错误) 都是作为不同的词,因此最终统计的词表量会非常大。
字粒度最早应该是2015年Karpathy提出,英文就是以字母为单位(对于大小写不敏感的任务,甚至可以先转小写再切分)。汉语就是以汉字为单位。
在字粒度中,英文i want to play football.被分成i w a n t t o p l a y f o o t b a l l。拆成字母序列后,缺乏断点,难以理解原始语句的含义。且输入长度大幅增加,计算量灾难性增长。
Subword粒度是针对字粒度和词粒度的折中方式。针对常用词组,采用词粒度形式,对于罕见单词,采用字粒度形式,在一定程度上减少了词表的数量,又均衡了输入token的长度
比如 friendly and lovely.
词粒度:friendly / and / lovely,加上常见的friend和love,词典中会得到5个词。
Subword粒度:friend / ly / and / love / ly,词表中只包含4个词。
常用分词算法:
通常认为模型参数量越大,性能越强。但实际上并非如此,考虑到大模型存在参数冗余,token数量比参数数量更重要。
如图所示,LLaMA的65B效果可以比肩GPT-3的175B效果。
下图是一些常用架构的训练数据量。
词表的大小,对推理速度也会有很大的影响。
正如每个颜色(红、黑、绿…)都可以映射到RGB三维空间(255,0,0 0,0,0 0,255,0)进行表示,每个文本序列转化得到的token_ids也可以映射到一组高维空间进行表示。当映射到高维表示后,可以通过计算高维向量之间的距离来表示两个单词含义的相近程度。
embedding过程也是查表过程,因为它们之间也是一个一一映射的关系。每个token都有一个对应的高维表示,这种映射关系在模型训练的过程中一直在更新。
最终会将输入n个token_id,转换为[n, hidden_size]的向量矩阵。
简单来说,embedding可以使用one-hot编码(0,0,0…1…,0,0)进行区分即可。但是one-hot编码不利于计算token间的相似度,且embedding的长度实质上代表特征的维度数目(如果是ont-hot编码,则特征维度的数目需要和字典中的token数量相同),实际上训练后得到的结果为(0.5123, 0.12312,…,0.2315,09783)。
经过embedding转换之后,已经可以进行decoder处理了。但是此时的输入由于是整体输入,没有额外增加位置信息。同一个token在不同位置处查表得到的embedding相同,经过attention计算后的数据也相同,只是位置不一样。但通常认为某个token在一句话的不同位置应该表示出不同的含义,因此需要一个额外的操作引入位置信息,使其结果有所区别。
常用的位置编码方式有如下几种方式。
由位置编码延申出来的问题便是长度外推性。
大模型在训练时,通常会将段落分割成长度较小的语句,比如LLaMA1的最大token长度是2K,LLaMA2的最大token长度是4K。当输入长度不足时,会以空字符进行padding。
padding_side="left"和padding_side="right"均可以,结果没有区别,但代码实现上会有一点区别
DuTim:大部分的大模型(LLM)采用左填充(left-padding)的原因
但在实际使用时,比如用于聊天机器人时,会希望将整个聊天历史输入进去一起推理,得到更好的回复效果。此时就需要处理超过2048个token的输入,虽然transformer本身可以输入任意长度的输入,但是由于训练时并没有处理过长度超出2048的样例,因此处理效果会大打折扣。此时就需要进行长度外推或者对输入Prompt进行压缩,使得推理长度超出训练最大长度时,仍能保持推理结果质量。
为什么训练时不采用更大的长度?因为输入token越长,占用显存越大,计算量也更大。经测试,每增加1个token,显存占用增加1M左右。
考虑到一个较长的prompt中,必定会存在一些冗余信息,因此可以对prompt进行压缩,但prompt压缩如果处理的不够好,很有可能会改变原始输入的含义。
经过位置编码后的数据会经过N次DecoderBlock处理。最终得到输出状态hidden_status。
其中包含一个self-attention、Add(残差)、Norm和FFN模块。
self-attention模块是transformer的核心,主要包含Wq、Wk和Wv三个矩阵。
此计算相比其他模块最容易出现梯度爆炸现象!!!
去掉softmax后,复杂度可以得到大幅优化。
还有一些方法关注于减少transformer计算量。考虑到attention计算时,每个token信息会关注到其他所有位置的token信息,然而大部分其他的token都是与之无关的,因此可以稀疏attention计算减少计算量。
也有一些方法关注如何减少transformer的内存占用。比如MQA和GQA,其中LLaMa2就使用了GQA的方法减少attention内存,由于减少了内存加载的数量,因此也提高了计算速度。
MHA、GQA和MQA
根据模型参数可以推理出使用的方法
对于以transformer为基础的架构,IO瓶颈限制的重要性大于计算瓶颈限制。
因此出现了flashAttention–pageattention等技术。通过对矩阵分块处理减少IO次数,提高计算速度。
大batch size(模型训练时)加速效果非常明显
LLM中由于输入的token长度不同,不便于使用BatchNorm,通常使用LayerNorm。
LLaMA中采用了RMSNorm,计算量更小,推理速度快。
考虑到LayerNorm放置的位置不同,可以分为PreLayerNorm和PostLayerNorm。
常用大模型的Norm方式
FFN主要包含两个线性层和一个激活函数。
不同LLM使用了不同的激活函数。
对输出状态hidden_status采样最大值后可以得到最终输出的token,再转成对应单词即可。
采样参数如下所示
参数 | 默认值 | 含义 |
do_sample | True | 是否使用采样,为否则使用贪心解码 |
top_p | 0.95 | 已知生成各个词的总概率是1(即默认是1.0)如果top_p小于1,则从高到低累加直到top_p,取这前N个词作为候选 |
top_k | 50 | 保留前K个结果词作为候选 |
repetition_penalty | 1.0 | 重复处罚的参数。1.0意味着没有惩罚。 |
temperature | 1.0 | 可用于控制生成语言模型中生成文本的随机性和创造性,越小意味着选择最有可能的词的概率更高。相同的输入更可能出现相同的输出。而值越大,则出现其他结果的可能性越高。 |
LLaMA(Large Language Model Meta AI),由 Meta AI 发布的大型基础语言模型,有7B、13B、33B、65B(650 亿)四种版本。其数据集来源都是公开数据集,无任何定制数据集,保证了其工作与开源兼容和可复现,整个训练数据集包含约_1.4T 的 token_。
计算量相比Layer Norm更小,运行速度更快。Pre-RMSNorm相比Post-RMSNorm训练更加稳定
class RMSNorm(torch.nn.Module):
def __init__(self, dim: int, eps: float = 1e-6):
super().__init__()
self.eps = eps
self.weight = nn.Parameter(torch.ones(dim))
def _norm(self, x):
return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)
def forward(self, x):
output = self._norm(x.float()).type_as(x)
return output * self.weight
在Q、K上使用RoPE旋转式位置编码(外推性更强)
def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0):
freqs = 1.0 / (theta ** (torch.arange(0, dim, 2)[: (dim // 2)].float() / dim))
t = torch.arange(end, device=freqs.device) # type: ignore
freqs = torch.outer(t, freqs).float() # type: ignore
freqs_cis = torch.polar(torch.ones_like(freqs), freqs) # complex64
return freqs_cis
采用SwiGLU替换了原有的ReLU,平滑性更好。
使用causal mask保证每个位置只能看到前面的tokens。
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
保证100%免费
】前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。