本文借助llama这个模型快速入门LLM的推理过程,技能细节很多都是通用的,也得当其他的LLM。本篇也可以作为CV快速入门NLP简易指南。
本文借助llama这个模型快速入门LLM的推理过程,很多技能细节都是通用的,也得当其他的LLM。这篇文章之前发过一次,现在整理下内容重新发下。
这篇也算是总结的性子,仅需要的知识点都列出来,简朴介绍一番。大概说的不够详细,想看具体细节的小同伴可参考文中引用的相关详细文章。
本篇也可以作为CV快速入门NLP简易指南(固然也是老潘的个人笔记)。固然只是推理哈,不涉及到练习,仅是从部署的角度思量这个模型,个人也不是NLP专家,如对文中内容有疑问,欢迎讨论。
什么是LLM
llama是LLM(LLM指大语言模型)模型的一种结构,llama这种模型的任务就是在阅读前n个单词后预测句子中下一个单词,输出取决于过去和现在输入,与未来无关。
过程大概是这样,每次输入模型会带上上一次输出的结果(不同于CV模型,CV模型输入只需要一次即可,一次推理即可得到结果):
LLM-天生
一般来说,LLM模型重要由两个块组成:
- 编码器(左侧):编码器接收输入并构建其表示情势(特征)。这意味着该模型被优化为从输入中获取理解(比如输入文本判断这段话是高兴还是难受)。
- 解码器(右侧):解码器使用编码器的表示情势(特征)以及其他输入来天生目标序列。这意味着该模型被优化用于天生输出。
编码器息争码器
这些部分都可以根据任务独立使用:
- Encoder-only models:适用于需要理解输入的任务,例如句子分类和命名实体识别。
- Decoder-only models:适用于天生性任务,如文本天生。
- Encoder-decoder models or sequence-to-sequence models:适用于需要输入的天生性任务,例如翻译或摘要。
LLAMA属于Decoder-only models,只有decoder层。
llama相关的知识点
llama的decoder部分的结构取自transformer,关于transformer的介绍知乎上太多,这里不赘述了,想详细理解transformer的建议看知乎上的其他良好文章以及b站沐神的解说。
transformer的结构如下:
transformer
对于llama来说,只用了decoder部分,重点关注这几个概念:
- Tokenization 分词器
- Embedding 嵌入层
- Positional Encoding 位置编码
- Self-attention 自注意力机制
- Multi-head attention 多头注意力与采用掩码机制的多头注意力
- Batch Norm & Layer Norm 批尺度化/层尺度化 llama用的是RMSNorm
- ResNet 残差网络
具体的可以查阅相关的博文,这里同样不进行赘述,只会简朴描述下过程。拿到llama模型后,重要关注:
- 模型的结构,包含哪些算子哪些op,模型复杂度
- 模型的前后处理处罚,前后处理处罚实现细节,模型的执行方式
- 模型各种参数配置以及其他一些细节
llama的整个执行过程分了好多步,涉及到很多前后处理处罚,前后处理处罚又涉及到很多细节的步骤,之后也会介绍。
先过一下知识点。
分词器、token、embeding
重要是分词、编码、Tokenizer(tokenization)、embed(embedding)的过程。
分词过程
图片来自 https://zhuanlan.zhihu.com/p/631463712 详细可以参考这篇
什么是分词?也就是Tokenizer的作用。
分词器可将原始文本转换为由token组成的文本的初始数值表征。
分词器之以是是模型的重要构成部分之一,是因为模型可借此妥善应对人类语言的复杂性。例如,分词器可将凝集性语言中的词分解为更易管理的组成部分、处理处罚原始语料库中不存在的新词或外来词/特殊字符,并确保模型天生紧凑(尽大概精简)的文本表征。
每种语言都有可选用的数量众多且各不相同的分词器。大部分基于 Transformer 的架构均使用经过练习的分词器,这些分词器旨在充分收缩典型序列的长度。WordPiece(应用于 BERT)、SentencePiece(应用于 T5 或 RoBerta)等分词器同样具有多个变体,这是因为众多的语言和不同的专业范畴(如医疗康健语料库)采用了这些分词器,且这些分词器在练习方式上也有所不同(选用不同的最大标记数,或以不同的方式处理处罚大小写)。
然后看回代码。
首先看tokenizer,运行llama的时候我们会调用tokenizer = AutoTokenizer.from_pretrained(args.model, use_fast=False)。
如果我们模型传入的是llama的某个模型(llama-7b)那么返回的就是LlamaTokenizer:
- class LlamaTokenizer(PreTrainedTokenizer):
- """
- Construct a Llama tokenizer. Based on byte-level Byte-Pair-Encoding.
- ...
复制代码 这个类是LLAMA模型的分词器(tokenizer)的实现,基于字节级的字节对编码(Byte-Pair Encoding)。这个分词器的重要功能是将文本字符串转换为模型可以理解的数字序列,反之亦然。这里假设输入为 ‘“this is a python code:”’ 。
具体我们看干了些啥,创建好tokenizer之后我们执行:input_ids = tokenizer.encode(args.text, return_tensors="pt").to(dev),这里又分两步:
- 第一步是 Converts a string in a sequence of tokens (string), using the tokenizer. Split in words for word-based vocabulary or sub-words for sub-word-based vocabularies (BPE/SentencePieces/WordPieces). 这里调用 self.sp_model.encode(text, out_type=str),sp_model就是sentencepiece中的一个函数,执行完出来变为 [‘▁"’, ‘this’, ‘▁is’, ‘▁a’, ‘▁python’, ‘▁code’, ‘:"’]
- 第二步将token string转变为 token id -> Converts a token string (or a sequence of tokens) in a single integer id (or a sequence of ids), using the vocabulary. 具体就是个for循环,对之前分好的tokens一个一个转。
最后我们得到:
- input_ids
- tensor([[ 0, 376, 1366, 338, 263, 3017, 775, 6160]], device='cuda:0')
- input_ids.shape
- torch.Size([1, 8])
复制代码 至于怎样转换为embedding,之后会调用:
inputs_embeds = self.embed_tokens(input_ids),其中embeds的shape是torch.Size([1, 8, 4096])。
在自然语言处理处罚(NLP)中,嵌入(Embedding)是一种将离散变量(如单词、短语、或者文档)转换为一连向量的方法。这种转换的目标是让盘算性能更好地理解和处理处罚自然语言数据。embedding矩阵的本质是一个查找表 ,每个单词会定位这个表中的某一行,而这一行就是这个单词学习到的在嵌入空间的语义。
更多信息可以参考:
- https://zhuanlan.zhihu.com/p/626308831
- https://zhuanlan.zhihu.com/p/631463712
自注意力 Self-Attention
Transformer模型的一个关键特点是使用了称为注意力层的特殊层。“Attention Is All You Need”。
这一层会告诉模型,在处理处罚每个单词的表示时,要对你传递给它的句子中某些单词特殊关注(而且忽略其他单词)。
把这个概念放到背景中,思量从英语翻译成法语的任务。给定输入“你喜欢这门课程”,翻译模型还需要关注相邻单词“你”,以获得正确翻译动词“like”的情势,因为在法语中,“like”根据主语不同而有不同厘革情势。然而,句子别的部分对于该单次翻转来说没有用处。同样地,在翻转“This”时,模型也需要注意到单次“course”,因为“This”根据相关名字是否男性或女性而有不同意思表达方式。再次强调,在更复杂的句子(和更复杂的语法规则)中,模型需要特殊关注大概出现在句子较远位置上以正确翻译每个单次的单词。
同样的概念适用于与自然语言相关的任何任务:一个单次本身具故意义,但是该意义深受上下文影响,这可以是正在研究的单次之前或之后的任何其他单次(或多个)。
MHA
来自 https://twitter.com/akshay_pachaar/status/1741074200662856102/photo/1
Self-attention是Transformer的焦点,其允许模型思量到序列中的其他标记,以便更好地理解每个标记的上下文。每个标记的新表示情势是由它自己和其他标记的交互得到的。
具体可以参考:
- https://zhuanlan.zhihu.com/p/420820453
位置编码
由于Transformer的结构没有思量到标记的顺序,以是我们需要加入位置编码来给模型提供词元在序列中的位置信息。这些编码会被添加到词嵌入向量中。
多头注意力(Multi-head Attention)
多头注意力是对自注意力机制的扩展。它将自注意力分解为多个“头”,每个头在不同的表示空间中学习和应用自注意力。这允许模型同时捕获到各种不同类型的信息。在有掩码的多头注意力中,掩码被用于克制模型查看某些不应该看到的信息,例如在天生新的标记时克制查看未来的信息。现在基本都使用MHA,一般不用单头。
批尺度化(Batch Norm) & 层尺度化(Layer Norm)
这些都是用于正规化激活的技能,可以加速学习,进步模型的性能。
批尺度化是在整个批次的数据上进行尺度化,而层尺度化则是在单个数据样本上进行尺度化。RMSNorm是一种新的归一化方法,是对LayerNorm的一个改进,没有做re-center操作(移除了其中的均值项),可以看作LayerNorm在均值为0时的一个特例。
残差网络(ResNet)
老熟人了。通过在网络中添加跳跃连接(或称为“skip”连接),可以使得模型更容易地学习到恒等映射,从而避免了练习深度网络时常见的梯度消散问题。在Transformer中,每个子层(如自注意力层和前馈神经网络层)都有一个对应的残差连接,而且每个子层的输出都会进行层尺度化。
怎样学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,以是实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“开始把握AI的人,将会比较晚把握AI的人有竞争上风”。
这句话,放在盘算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。资助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的本领和经验解答大家在人工智能学习中的很多狐疑,以是在工作繁忙的情况下还是对峙各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋侪无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
|