关于我
从2022年末开始接触AIGC,便一直紧跟最近技术与实践落地。期间参与copilot项目研发,落地了多个垂类AIGC大模型应用,熟悉各种AIGC相关技术如Agent,Langchain,chatdoc,向量数据库等。
关于本系列
每个问题回答后面我都会放上参考的原文链接,方便大家深度阅读。有覆盖不到的问题,尽请留言,会在下期更新。
本期问题快浏
1. 大模型领域的Scalling law是什么意思
Scaling Law 是指在深度学习中,模型性能与计算量、模型参数量以及数据大小之间的关系。具体来说,当不受其他因素制约时,模型的性能与这三者呈现幂律关系。
-
核心结论:
- 对于仅有解码器的模型,计算量(Flops)、模型参数量(N)、数据大小(D,以 token 数表示)之间满足以下关系:C ≈ 6ND。
- 模型的最终性能主要与计算量 C、模型参数量 N 和数据大小 D 相关,而与模型的具体结构(层数、深度、宽度)基本无关。
- 固定模型的总参数量,调整层数、深度或宽度,不同模型的性能差距很小,大部分在 2% 以内。
-
幂律关系:
- 对于计算量 C、模型参数量 N 和数据大小 D,当不受其他两个因素制约时,模型性能与每个因素都呈现幂律关系。
- 为了提升模型性能,模型参数量 N 和数据大小 D 需要同步放大,但模型和数据分别放大的比例还存在争议。
-
适用范围:
- Scaling Law 不仅适用于语言模型,还适用于其他模态以及跨模态的任务。
- 这些规律可以帮助我们理解和预测大模型的性能表现,并指导模型设计和训练中的决策。
-
实际应用:
- 根据 Scaling Law,我们可以在计算效率最优的情况下,选择合适的模型规模和数据大小,以获得更好的性能。
- 在大模型的训练阶段,我们可以根据这些原则来设计和训练模型,以达到更好的性能。
References
- 解析大模型中的Scaling Law - 知乎
- 大模型中的Scaling Law是什么? - 阿里云开发者社区
- 大语言模型中的第一性原理:Scaling laws - 知乎
- 大模型中的Scaling Law是什么? - 阿里云开发者社区
- AI大模型深度洞察:为什么Scaling Laws重要? - 百家号
2. 大模型的Tokenizer的实现方法及原理?
大型自然语言处理(NLP)模型中的Tokenizer是一个关键组件,用于将文本转换为模型可以处理的数据。
-
Subword Tokenization(子词分词算法):
- 基于子词的分词方法是目前主流的方式,它在词切分和字切分之间取得了平衡。
- 基于词的切分会导致词表过大、信息丢失等问题。
- 基于字的切分会使每个token的信息密度降低,序列变得过长。
- 基于子词的切分是相对平衡的方案,它将高频词切分成完整的整词,低频词切分成有意义的子词(例如,将“dogs”切分为“dog”和“##s”)。
- 常见的基于子词的分词模型包括:BPE、WordPiece和Unigram。
-
分词流程:
- 归一化:对文本进行基础清洗,例如删除多余的换行和空格,转换为小写等。
- 预分词:将句子切分成更小的“词”单元,可以基于空格或标点进行切分。
- 基于分词模型的切分:使用不同的分词模型,例如BPE、WordPiece和Unigram。
- 后处理:添加特殊的分词逻辑,如[CLS]、[SEP]等。
-
Byte-Pair Encoding (BPE):
- BPE是最广泛采用的subword分词器。
- 训练阶段:从字符级的小词表出发,逐步合并pair并形成大词表。
- 编码方法:将文本切分成字符,再应用训练阶段获得的合并规则。
- 经典模型(例如GPT、GPT-2、RoBERTa等)使用BPE作为分词器。
References
- 大模型基础组件 - Tokenizer - 知乎
- 通俗易懂讲解大模型:Tokenizer_大模型的tokenizer是不是 ...
- Tokenizor简介一(BPE原理及python实现) - 知乎
- Tokenizer总结-CSDN博客
- 大模型中常用的分词器Tokenizer学习总结记录与代码实现
3. 为什么大模型这么消耗显存?
-
模型参数占用显存:大型语言模型通常具有巨大的参数量,这些参数需要存储在显存中以供推理使用。因此,在推理过程中,模型参数会占用相当大的显存空间。
-
输入数据占用显存:进行推理时,需要将输入数据加载到显存中。对于大型语言模型而言,输入数据通常也会占用较大的显存空间,尤其是对于较长的文本输入。
-
中间计算结果占用显存:在推理过程中,模型会进行一系列的计算操作,生成中间结果。这些中间结果也需要存储在显存中,以便后续计算使用。对于大型语言模型而言,中间计算结果可能会占用较多的显存空间。
-
内存管理策略:某些深度学习框架在推理时采用了一种延迟释放显存的策略,即显存不会立即释放,而是保留一段时间以备后续使用。这种策略可以减少显存的分配和释放频率,提高推理效率,但也会导致显存一直占用的现象。
References
- 多大的显存能够满足主流大模型的训练开销? - 知乎
- 为什么大模型推理时显存涨的那么多还一直占着? - 知乎
- 大模型训练推理显存计算简介 - 知乎
- 模型预测时GPU占用不断增长_forward模型不断增大-CSDN博客
4. 简要介绍下Transformer架构
Transformer 是一种神经网络架构,最早由谷歌在2017年的论文《Attention is All You Need》中提出。它引入了自注意力机制,并被广泛应用于序列到序列(seq2seq)任务。相比于传统的循环神经网络(RNN),Transformer摒弃了顺序处理的方式,充分利用了并行计算,从而减少了训练时间.
-
整体结构:
- Transformer由Encoder和Decoder两个部分组成,每个部分包含6个block。
- Encoder负责将输入句子编码为表示向量,而Decoder则负责生成目标语言的翻译
-
输入表示:
- Transformer中单词的输入表示由单词Embedding和位置Embedding相加得到。
- 单词Embedding可以通过Word2Vec、Glove等预训练算法获得,也可以在Transformer中训练得到。
- 位置Embedding用于表示单词在句子中的位置,因为Transformer不采用RNN的结构,需要保存单词的顺序信息.
-
自注意力机制:
- Transformer的关键部分是Self-Attention,它在Encoder和Decoder中都有应用。
- Self-Attention结构包括查询(Q)、**键值(K)和值(V)**的计算。
- 通过线性变换,Self-Attention将输入(单词表示向量矩阵X)转换为Q、K、V[^1^].
-
工作流程:
- 获取输入句子的每个单词的表示向量X。
- 将X传入Encoder,经过6个Encoder block得到句子的编码信息矩阵C。
- 将C传递到Decoder,逐步预测翻译后的单词.
References
- Transformer模型详解(图解最完整版) - 知乎
- 一文读懂 Transformer 神经网络模型-腾讯云开发者社区-腾讯云
- Transformer 架构逐层功能介绍和详细解释 - 腾讯云
- 如何最简单、通俗地理解Transformer? - 知乎
- 【通俗易懂】大白话讲解 Transformer - 知乎
5. 训练一个大模型需要哪些步骤?
-
数据预处理:
- 这类似于为孩子提供学习材料。首先,我们需要将原始文本数据(例如故事、课本)转换成计算机可以理解的数字形式(向量)。这个过程类似于将一本书的内容分解成单词,并用数字表示每个单词。
-
定义模型:
- 这就像为孩子选择一种学习方法。我们需要确定一个模型(学习框架或策略),该模型将决定我们如何从数据中学习。例如,我们可以选择使用卷积神经网络、循环神经网络等方法来处理和学习这些数字。
-
训练模型:
- 这就像让孩子通过学习来提高知识水平。我们让模型(类似于孩子)查看这些数字(教材),并从中尽可能地学习和理解信息。
-
评估模型:
- 最后,我们需要检查模型(类似于孩子)的学习效果。我们使用一些标准(类似于考试)来检查模型的预测结果,以评估其表现.
总之,模型训练是一个复杂而关键的过程,涉及数据预处理、模型选择、参数调整、验证与测试,以及模型优化与部署等多个步骤.
References
- 大模型训练的过程(通俗易懂)_大模型训练过程概述-CSDN博客
- 大模型训练:步骤与策略探讨-百度开发者中心
- 大模型训练的过程(通俗易懂)_大模型训练过程概述-CSDN博客
- 【LLM】从零开始训练大模型 - 知乎
- 一篇文章让你了解大模型项目的整个研发流程 - 知乎
6. 微调一个大模型需要哪些步骤?
微调大型语言模型(LLM)是调整其参数以适应特定任务的过程。这通常通过在与任务相关的数据集上训练模型来完成。微调的量取决于任务复杂性和数据集大小。
-
全微调(Full Fine-tuning):
- 对整个预训练模型进行微调,包括所有的模型参数。
- 适用于任务和预训练模型之间存在较大差异的情况,或者任务需要模型具有高度灵活性和自适应能力的情况。
- 需要较大的计算资源和时间,但可以获得更好的性能。
-
部分微调(Repurposing):
- 在微调过程中只更新模型的顶层或少数几层,保持底层参数不变。
- 目的是在保留预训练模型的通用知识的同时,通过微调顶层来适应特定任务。
- 适用于目标任务与预训练模型之间有一定相似性的情况,或者任务数据集较小的情况。
-
微调预训练模型的方法:
- 微调所有层:适应新任务,更新整个预训练模型的所有层。
- 微调顶层:只更新预训练模型的顶层,适应新任务。
- 冻结底层:固定预训练模型的底层,只对顶层进行微调。
- 逐层微调:从底层开始,逐层微调预训练模型,直到所有层都被微调。
- 迁移学习:将预训练模型的知识迁移到新任务中,提高模型性能。
-
Fine-tuning:
- 将预训练模型与少量特定任务数据一起继续训练。
- 需要根据预训练语料库和任务特定语料库之间的相似性来确定Fine-tuning量。
-
Prompt Tuning(P-tuning):
- 固定模型前馈层参数,仅更新部分embedding参数,实现低成本微调大模型。
- 利用输入提示或模板来指导预训练模型生成所需输出。
-
Prefix Tuning:
- 在输入token之前构造一段任务相关的virtual tokens作为Prefix,只更新Prefix部分的参数。
- 与全微调不同,只优化一小段可学习的continuous task-specific vector。
Related Questions
- 如何选择预训练模型?
- 有哪些常见的大型语言模型?
- 微调需要多长时间?