本文分享自华为云社区《【云驻共创】华为云之昇思MindSpore大模型专题(第二期)-第一课:ChatGLM》,作者: 愚公搬代码。
前言
1.昇思MindSpore
昇思MindSpore是华为公司推出的一款全场景AI计算框架。它提供了自动微分、分布式训练和推理、模型部署等功能,支持多种硬件平台,包括CPU、GPU和Ascend AI 处理器。MindSpore采用图和算子相结合的编程模型,能够高效地处理复杂的深度学习任务。它具有灵活的设计、高效的性能和易于使用的接口,使开发者能够更快地开发和部署AI应用。MindSpore还支持自定义操作和算法,可以满足不同场景下的需求。
2.大模型
大模型是指具有数百万到数十亿个参数的深度学习模型。这些模型通常用于处理大规模数据集,并能够在各种任务上取得出色的性能。大模型通常需要大量的计算资源进行训练,并且需要更长的时间来收敛。然而,由于其具有更多的参数,大模型可以更好地捕捉数据中的复杂关系,从而提升模型的预测性能。大模型的应用范围非常广泛,包括自然语言处理、计算机视觉、语音识别等领域。
3.ChatGLM
ChatGLM是一种生成式语言模型,用于聊天和对话任务。它是基于OpenAI的GPT模型框架构建的,采用了大规模的预训练数据集来学习语言模式和生成文本的能力。ChatGLM可以理解上下文并生成连贯、自然的回复。它可以用于构建对话系统、智能客服、聊天机器人等应用,能够提供更加交互性和人性化的对话体验。ChatGLM模型的训练和优化过程需要大量的计算资源和数据,而且模型的生成性质也需要进行适当的监督和过滤,以确保生成的回复符合预期的行为准则和标准。
一、GLM Model Architecture
1.Evolution Tree of LLMs
Evolution Tree of LLMs(Language Model Megasuite的演化树)是指由OpenAI发布的一系列语言模型的历史和演化关系图。
OpenAI的LLMs系列是一系列基于深度学习的语言模型,旨在生成人类语言的自然文本。这些模型中的每一个都是通过对大量文本进行训练而得到的,可以用于自动回答问题、生成文章、翻译文本等自然语言处理任务。
Evolution Tree of LLMs图中展示了这些模型的发展历程。从最早的模型开始,每个后续模型都是在前一个模型的基础上进行改进和扩展。这些改进可能涉及模型的规模增加、训练数据的增加、架构的改进等。通过不断地改进和提升模型,OpenAI致力于推动语言模型的发展,使其在各种自然语言处理任务上表现更加出色。
Evolution Tree of LLMs图不仅展示了各个模型之间的关系,还反映了OpenAI在不同时间点的研究重点和技术进展。这个图可以帮助研究人员和开发者了解LLMs系列的发展历程,从而更好地理解和应用这些语言模型。
2.Autoregressive Blank Infilling
2.1 Autoregressive、Autoencoding、Encoder-Decoder
“Autoregressive”、"Autoencoding"和"Encoder-Decoder"是三种常见的神经网络模型结构,用于处理序列数据或生成模型。
Autoregressive(自回归)模型是一种生成模型,它将序列数据的生成建模为一个逐步预测每个元素的条件概率的过程。在每个时间步,模型根据之前生成的元素预测当前元素的概率分布。常见的Autoregressive模型包括语言模型,如OpenAI GPT模型,它可以生成与输入序列相似的新文本。
Autoencoding(自编码)模型是一类无监督学习方法,用于学习输入数据的紧凑表示。它由一个编码器和一个解码器组成。编码器将输入数据映射到低维表示,解码器将该低维表示恢复到原始数据空间。Autoencoding模型的目标是尽可能准确地重建输入数据,同时学习到有用的特征表示。常见的Autoencoding模型包括Variational Autoencoder (VAE)和Denoising Autoencoder。
Encoder-Decoder(编码器-解码器)模型是一种常用的序列到序列(Sequence-to-Sequence)模型,用于处理输入和输出都是序列数据的任务。它由两个部分组成:编码器和解码器。编码器将输入序列映射为固定大小的向量表示,解码器使用该向量表示生成输出序列。Encoder-Decoder模型可以在不同长度的输入和输出序列之间进行转换,例如机器翻译和文本摘要等任务。
GLM(自回归填空)模型是一种灵活且多样化的语言模型,可以根据给定的上下文生成缺失的部分内容。根据已知的部分文本内容生成可能的填空内容。它可以用于自动文本补全、问答系统、语义理解和生成等多个自然语言处理任务中。
2.1 OpenAI GPT系列模型
自然语言处理领域的GPT(Generative Pre-trained Transformer)系列模型是由OpenAI开发的一系列强大的自然语言处理模型。下面是GPT系列模型的发展历程:
GPT-1: GPT模型是于2018年发布的第一代模型。它使用了Transformer架构,预训练了一个大规模的语言模型,并使用无标签的文本数据进行模型训练。这个模型的特点是生成连贯的文本,能够完成一些基础的自然语言处理任务,如语言模型、文本分类和文本生成等。
GPT-2: 在2019年,OpenAI发布了GPT-2模型作为GPT的后续版本。GPT-2模型采用了更大的预训练模型,使用无标签的互联网文本进行训练。这个模型在生成文本方面取得了突破性的进展,可以生成高质量、连贯的文本,使得生成的文本内容更具有逼真性。由于考虑到模型被滥用可能带来的风险,OpenAI最初限制了GPT-2的访问,并未发布完整的模型。
GPT-3: GPT-3是在2020年发布的GPT系列的第三代模型。参数量达到了1750亿个,训练了十几万小时。GPT-3在文本生成、文本补全、问答系统等任务上表现出色,其生成的文本能够接近人类水平的表达能力。GPT-3还可以通过提供一些文本提示来理解并回答问题,具有较强的语言理解和推理能力。
GPT-4:在2023年,OpenAI发布了GPT-4,这是GPT系列的第四个模型。GPT-4比GPT-3系列大得多,具有1.8万亿个参数,而GPT-3只有1750亿个参数。GPT4是一种多模态模型,而GPT3系列是一种自然语言处理模型。自然语言模型只能听或看懂语言,而多模态模型可以处理多种媒体数据,并且将他们整合到统一的语义空间之中。GPT4可接收的文字输入长度达到了惊人的32000字,而GPT3系列,只能输入3000字。
2.3 Autoregressive Blank Infilling
Autoregressive Blank Infilling(ABI)是一种用于填充时间序列数据中缺失值的方法。在时间序列数据中,由于种种原因,可能会存在一些缺失值,这些缺失值会影响数据的完整性和准确性。ABI方法通过基于自回归模型,利用其他已有的数据来预测并填补缺失值。
ABI方法的基本思想是根据时间序列数据的自相关性,使用已有的数据点来逐个预测缺失值。具体来说,ABI方法使用AR模型(自回归模型)来建模时间序列数据中的缺失值和非缺失值之间的关系。然后,根据该模型,利用其他已有的数据点来预测缺失值的数值。
ABI方法在填充缺失值时,通常还会考虑一些其他因素,如数据的趋势、季节性和周期性等。通过综合考虑这些因素,ABI方法能够更准确地填充缺失值,从而提高数据的完整性和可靠性。
案例片段介绍如下:
顺序分为A部分和B部分:
-
A部分:带掩码跨度的序列
-
B部分:在A部分中被掩盖的原始跨度
如果多个跨度被遮罩,它们将在B部分中被打乱
B部分中的每个跨度都以[S]作为输入,以[E]作为输出。
该模型自回归生成B部分——它基于前一部分预测下一个令牌。
A部分可以自行处理,但不能处理B部分
B部分可以关注A及其在B中的经历
2.4 Multi-Task Pretraining
Multi-Task Pretraining是一种多任务预训练的方法。在传统的预训练方法中,语言模型通过在大规模文本数据上进行训练来学习语言的通用模式和表示。然而,在Multi-Task Pretraining中,模型同时在多个任务上进行训练,这些任务需要不同类型的语言理解能力。
Multi-Task Pretraining的思想是通过在多个任务上训练语言模型,可以学习到更加通用和鲁棒的语言表示。这是因为不同的任务需要不同的语言技能,如句法分析、语义理解或文档级连贯性。通过让模型接触多样化的任务,它可以学习捕捉不同任务之间的共同语言模式,并利用这些模式更好地泛化到新任务上。
Multi-Task Pretraining已被证明可以提高语言模型在下游任务上的性能。例如,预训练在多个任务上的模型在各种自然语言处理基准测试中取得了最先进的结果,如问答、文本分类和命名实体识别。
其中一种常见的Multi-Task Pretraining方法是基于Transformer的模型,如BERT(双向编码器表示来自Transformer的方法)和RoBERTa(经过优化的鲁棒BERT方法)。这些模型在掩码语言建模、下一个句子预测和其他辅助任务上进行预训练。
案例片段介绍如下:
通过改变遮盖内容的长度和数量,从而使模型能够基于natural language understanding, conditional generation, unconditional generation三类任务进行预训练,实现“三合一”
改变缺失跨度的数量和长度:
2.5 Finetuning
Finetuning是指在预训练的基础上,将模型进一步调整和优化以适应特定任务或特定数据集的过程。在机器学习中,预训练模型通常在大规模的数据上进行训练,学习到通用的模式和特征表示。然而,这些预训练模型可能不直接适用于特定的任务或数据集。
通过Finetuning,可以利用预训练模型的通用知识和特征表示来快速适应特定的任务或数据集。这通常涉及解冻预训练模型的一部分或全部层,并在目标任务上进行进一步的训练。通过在目标任务上微调模型参数,可以使其更好地适应任务的特定要求和数据特征。
Finetuning的过程通常包括以下步骤:
- 选择预训练模型:选择与目标任务相匹配的预训练模型,如BERT或GPT等。
- 初始化参数:将预训练模型加载到模型中,并冻结所有或部分层的参数。
- 构建任务特定层:根据目标任务的需求,构建一个或多个任务特定的层。
- 训练:使用目标任务的数据集,通过反向传播和梯度下降等优化算法,更新模型的参数。
- 调整超参数:对模型进行验证和评估,并根据结果调整超参数,如学习率、批大小等。
- 重复迭代:根据需要,多次迭代训练和调整模型,直到达到满意的性能。
Finetuning可以大大减少在特定任务上的训练时间和样本需求,同时利用预训练模型的知识提供了更好的初始参数和特征表示。它已经被广泛应用于自然语言处理、计算机视觉和其他领域中的许多任务,如文本分类、问答、命名实体识别等。
案例片段介绍如下:
GLM将NLG和NLU类下游任务统一为完型填空的生成式任务,如对于分类任务,将输入x写成一个填空问题c(x),后将生成的答案v(y)映射至标签y
2.6 LLM Reversal Curse
LLM(Large Language Model)是指一种非常大的语言模型,它由数十亿个参数组成,具有强大的语言理解和生成能力。大模型LLM可以实现诸如问答、摘要、对话生成等任务,被广泛应用于自然语言处理领域。
LLM Reversal Curse(逆转诅咒)是指在使用大模型LLM进行任务生成时,其生成结果出现明显的逆转或反转现象。具体而言,当模型用于生成某个任务的结果时,相比原始输入,生成的结果可能会出现与原始意图相反的内容或表达。
例如,在问答任务中,当用户提出一个问题时,大模型LLM应该生成一个准确且与问题相符的答案。然而,由于模型的复杂性和训练数据的特点,有时候模型会出现生成与问题相反甚至荒谬的答案的情况。
这种逆转诅咒可能是由于模型在训练过程中接触到了大量的噪声数据、错误标注的数据或具有偏见的数据,导致模型在生成过程中出现了一些意料之外的结果。
为了解决大模型LLM的逆转诅咒问题,需要进一步优化模型的训练数据、标注过程和生成算法,以提高模型的生成质量和准确性。
案例片段介绍如下:
3. 2D Positional Encoding
2D positional encoding是一种将2D网格或图像中元素的位置信息进行编码的技术。位置编码通常在自然语言处理任务中使用,例如机器翻译或语言建模,来表示句子中单词的顺序或位置。然而,它也可以应用于2D网格或图像。
对于2D网格或图像,位置编码可以用于编码每个元素的空间位置。这样,模型可以有一种对元素之间的相对位置的感知,并捕捉它们之间的空间关系。
一个常见的2D位置编码的方法是使用不同频率的正弦和余弦函数。其思想是创建一个根据网格或图像内位置而变化的正弦信号。然后将这个位置编码作为每个元素在网格或图像中的额外输入或特征。
位置编码可以使用以下公式定义:
PE(x,2i) = sin(x / (10000^(2i / d_model))) PE(x,2i+1) = cos(x / (10000^(2i / d_model)))
其中,PE(x, i)表示位置i处元素x的位置编码,d_model是模型的维度。
通过使用正弦和余弦函数的不同频率,位置编码可以捕捉位置信息中的不同模式或关系。
案例片段介绍如下:
模型输入的position ids分为两种,从而使得模型可以学习到片段生成的长度
Position 1: Part A中token的绝对位置
-
Part A:从1开始排列
-
Part B:每一个span对应Part A中[MASK]的位置
Position 2:intra-span position,masked span内部的相对位置
- Part A:0
- Part B:每个span的token从1开始排列
3.1 大模型训练最大挑战:训练稳定性
-
权衡利弊:训练稳定性(高精度低效)还是训练效率(低精度高效)
-
目前已开源训练过程大模型的解决方案
- FB OPT-175B:训练崩溃时反复调整学习率/跳过数据(权宜之计,损失性能)
- HF BLOOM 176B:embedding norm和BF16(损失性能,有限适配平台)
3.2 GLM-130B:稳定训练方法
GLM-130B是一个稳定训练方法,它是机器学习中的一种算法。GLM代表广义线性模型,130B表示这个算法的特定版本。
稳定训练方法是指通过一定的技巧和策略来增强模型的稳定性和鲁棒性,使其能够更好地处理噪声和异常数据。在训练过程中,稳定训练方法会对输入样本或特征进行一些改变或调整,以减少模型对于噪声的敏感性。
GLM-130B的稳定训练方法可能包括以下几个方面:
- 数据预处理:对输入数据进行去噪、归一化、特征选择等预处理操作,以减少噪声对模型训练的影响。
- 正则化:通过添加正则化项来限制模型的复杂度,防止过拟合,提高模型的泛化能力。
- 异常值处理:通过识别和处理异常值,减少它们对模型训练的影响。
- 随机化:引入随机化因素,如随机选择样本、随机初始化参数等,以增加模型的稳定性和抗噪能力。
- 交叉验证:使用交叉验证来评估模型的性能,并选择最佳的参数配置,避免对特定数据集过拟合。
- 集成学习:通过集成多个模型的预测结果,综合考虑它们的意见,提高整体模型的性能和稳定性。
案例片段介绍如下:
Attention score 层:Softmax in 32 避免上下溢出
调小 Embedding 层梯度,缓解前期梯度爆炸问题
word_embedding = word_embedding * alpha + word_embedding .detach() * (1 ‒ alpha)
3.2 GLM-130B:大量实验确定最优架构
有时候需要进行多次实验来确定最佳的架构设计。这些实验可能包括调整不同的参数、添加或移除不同的组件,以及测试不同的配置选项。GLM-130B是根据这些实验的结果和分析,确定出的最佳架构。
案例片段介绍如下:
DeepNorm:稳定训练 1000 层 Post-LN 的方法
旋转位置编码(RoPE):适用于 GLM 的相对位置编码
门控注意单元(GLU):FFN 层的替换,稳定提升模型性能
3.3 Post LayerNorm
Post LayerNorm(后层归一化)是一种神经网络层归一化的方法,用于解决深层神经网络中梯度消失和梯度爆炸问题。传统的 LayerNorm(层归一化)是在每个神经网络层的输入上进行归一化操作,而 Post LayerNorm 是在每个神经网络层的输出上进行归一化操作。
具体来说,在每个神经网络层的输入和激活函数之间,先进行 LayerNorm 的归一化操作,然后再进行激活函数的计算。这样可以使得每个神经网络层的输出都在相似的尺度上,避免了梯度消失和梯度爆炸的问题。
与之相比,传统的 LayerNorm 在每个神经网络层的输入上进行归一化操作,但在深层网络中,由于每层的输入分布不稳定,因此归一化操作的效果可能会下降。而 Post LayerNorm 能够在每个神经网络层的输出上进行归一化操作,保证了归一化的效果,提高了网络的稳定性和训练效果。
Post LayerNorm 是在 Transformer 网络中被提出的,并在各个任务上取得了显著的性能提升。它被认为是一种更加有效和稳定的归一化方法,在大规模深层网络的训练中具有重要的作用。
案例片段介绍如下:
重新排列层规范化和剩余连接的顺序
3.4 GLU
GLU(Gated Linear Unit)是一种门控线性单元,用于增强神经网络的表示能力。通过将GLU应用于MindSpore框架中的大型模型,可以进一步提升模型的性能和效果。
GLU的核心思想是将输入进行分割成两部分,然后通过门控机制控制两部分的信息传递。这种门控机制可以帮助模型更好地理解输入数据中的相关性,从而提高模型的表达能力和泛化能力。
在MindSpore框架中,GLU可以被用于各种任务,包括自然语言处理、计算机视觉和语音识别等。通过使用MindSpore大模型GLU,研究人员和开发人员可以更轻松地构建和训练复杂的模型,并获得更好的结果。
案例片段介绍如下:
用GeLU替换ReLU激活
3.5 并行策略:高效训练千亿模型
存下 GPT-3 模型需要 2.8T 显存存放训练状态 + 中间激活函数值
挑战:远超单卡显存(40GB),采取何种并行方式高效训练?
- 采用 ZeRO 优化器在数据并行组内分摊优化器状态 → ~25%
远超单卡显存,如何高效训练?
模型并行:将模型参数分布到多个 GPU 上
- 张量并行:切分参数矩阵,每 GPU 计算一部分 → 额外通信,降低计算粒度
- 流水线并行:将网络分成多段并行 → 引入流水线气泡
- ZeRO-3:将参数分布到数据并行组中,算之前先取回参数 → 额外通信时间
分析:流水线的气泡占比:
标签:万字,编码,训练,模型,位置,了解,ChatGLM,GPT,文本 From: https://www.cnblogs.com/huaweiyun/p/18070230