OLMo论文里的模型结构的小白解析

模型参数量

OLMo论文里的模型结构的小白解析_第1张图片
以7B为例,隐藏层为4086,attention heads为32 训练的token量为2.46T

训练策略

  • 超参数

在我们的硬件上优化训练吞吐量,同时最小化损失峰值和缓慢发散的风险来选择超参数

损失峰值:在机器学习中,"损失峰值"通常指的是训练过程中损失函数的值突然增加到非常高的水平。这可能是由于各种原因引起的,包括但不限于超参数设置不当、模型架构问题、训练数据问题等。损失峰值的出现可能表明训练过程中存在问题,例如梯度爆炸、梯度消失或者其他数值不稳定的情况。在选择超参数时,通常会尽量避免损失峰值的出现,以确保模型的稳定训练。选择超参数时要最小化损失峰值的风险,意味着希望训练过程中损失函数的值不会突然增加到不可接受的水平。

缓慢发散:"缓慢发散"通常指的是在训练过程中模型性能逐渐变差,损失函数逐渐增加的情况。与损失峰值不同,缓慢发散是指模型性能的渐进性恶化,而不是突然的、剧烈的增加。
在机器学习中,训练过程中可能会遇到模型随时间推移性能变差的情况。这可能是由于学习率设置不当、数据不平衡、过拟合等问题引起的。通过监测训练过程中的性能指标,可以及时发现并解决缓慢发散的问题,以确保模型能够在训练过程中逐渐收敛而不是逐渐恶化。
选择超参数时要最小化缓慢发散的风险,意味着希望避免训练过程中模型性能逐渐变差的情况,以确保模型在训练过程中能够有效地学习。

  • 模型设计策略

我们通过我们的循环内评估设置来消融选择,考虑到可用的计算资源(第2.3节)

循环内评估设置(In-loop evaluation setting): 指的是在训练循环中进行模型性能评估的一种设置。在训练过程中,周期性地对模型进行评估,以了解其在验证集或测试集上的性能。
消融选择(ablate choices): "消融"在这里表示通过实验逐步剔除或变化某些选择,以了解它们对最终模型性能的影响。这可以包括改变超参数、模型架构或其他训练设置。
因此,整体来看,"循环内评估设置来消融选择"表明在训练循环中通过定期评估模型性能,以逐步剔除或变化一些选择,从而更深入地了解这些选择对模型训练的影响。这是一种系统性的方法,旨在通过实验证据了解模型设计的影响。

  • 模型修改
  1. 无偏差。 在遵循LLaMA、PaLM等方法的基础上,我们在架构中排除了所有偏差项,以提高训练的稳定性。
  2. 非参数化层归一化。 我们采用了层归一化的非参数化公式(Ba等人,2016),其中在归一化中没有仿射变换,即没有“自适应增益”(或偏差)。我们认为这是最安全的选择,而且与我们考虑的其他变体相比,速度也是最快的:包括参数化层归一化和RMSNorm(Zhang和Sennrich,2019)。
  3. SwiGLU激活函数。 类似于LLaMA、PaLM等,我们使用了SwiGLU激活函数(Shazeer,2020),而不是ReLU。遵循LLaMA,激活隐藏大小约为8的三次方,但为了提高吞吐量,将其增加到最接近128的倍数(例如,对于我们的7B模型为11,008)。
  4. 旋转位置嵌入(RoPE)。 类似于LLaMA、PaLM等,我们用旋转位置嵌入(RoPE;Su等人,2021)替代了绝对位置嵌入。
  5. 词汇。 我们使用了GPT-NeoX-20B的基于BPE的分词器的修改版本(Black等人,2022),其中包含用于屏蔽个人可识别信息(PII)的附加标记。最终的词汇大小为50,280。然而,为了最大化训练吞吐量,我们将模型中相应的嵌入矩阵的大小增加到50,304,使其成为128的倍数。

无bias:意味着在模型的架构中没有包含偏差(biases)。在神经网络中,偏差通常是与每个神经元相关联的一个常数项,它在计算中引入了一个平移。这个平移可以帮助模型更好地适应训练数据。
在文中,作者提到排除了所有偏差项,为了改善训练的稳定性。有时候,特定的架构设计可能选择在神经网络中省略偏差,以简化模型或减少训练中的不稳定性。这是一种对神经网络架构的选择,以平衡模型的表达能力和训练的稳定性。
非参数化层归一化:在神经网络中,层归一化是一种常用的技术,用于在网络的每一层中对输入进行归一化处理,以加速训练和提高模型的泛化能力。

在传统的参数化层归一化方法中,通常会引入可学习的参数(例如缩放因子和偏置项),以便网络可以通过训练过程中自适应地学习归一化的方法。

而在非参数化层归一化方法中,没有引入可学习的参数,因此称为“非参数化”。在这种情况下,归一化过程不依赖于任何可学习的参数,而是根据输入数据的统计特性进行归一化。

在文中,提到了使用非参数化的层归一化方法,可能是因为作者认为这种方法更为简单或更加适合其模型的需求。
SwiGLU激活函数:SwiGLU引入了一种切换门(switch gate)机制,使得模型能够在输入数据之间动态地选择使用 GLU 或者其它激活机制。这种切换门的机制增加了模型的灵活性,让它可以根据输入数据的不同情况来自适应地选择使用 GLU 或者其他激活函数。GLU是一种门控激活函数,通常应用于序列到序列模型(如神经机器翻译)。它的基本思想是将输入分成两个部分,然后通过一个门控机制来控制两个部分的信息流。这种机制使得模型能够更好地捕捉输入序列中的长距离依赖关系。

在文中提到使用SwiGLU激活函数,可能是因为作者发现在他们的任务和模型结构中,SwiGLU相对于传统的激活函数(如ReLU)或GLU具有更好的性能或更好的适应性。这种选择通常是基于实验结果和任务需求的。
旋转位置嵌入(RoPE) :位置嵌入被用于为模型提供关于输入序列中元素位置的信息,因为传统的神经网络结构无法捕捉到元素在序列中的绝对位置。RoPE引入了旋转的概念,旨在提高模型对序列位置信息的表示能力。传统的位置嵌入是通过为不同位置的元素分配固定的嵌入向量来实现的,而 RoPE 通过引入旋转操作,使得模型能够更灵活地学习和表示序列中元素的相对位置。
词汇:模型的使用的词汇量
OLMo论文里的模型结构的小白解析_第2张图片

OLMo论文里的模型结构的小白解析_第3张图片

数据集(dolma----Data for Open Language Models’ Appetite)

论文:Dolma: an Open Corpus of Three Trillion Tokens for Language Model Pretraining Research
代码及工具包已开源

通过以下六个步骤的流程构建:(1)语言过滤,(2)质量过滤,(3)内容过滤,(4)去重,(5)多源混合,以及(6)标记化。

语言过滤: 这一步骤旨在筛选掉不符合目标语言或语言类型的文本。通过语言过滤,确保预训练数据集中的文本与所需的语言相符。

质量过滤: 质量过滤的目的是排除低质量、错误或不符合标准的文本。这可以包括语法错误、拼写错误、翻译错误等。质量过滤有助于提高数据集的整体质量。

内容过滤: 内容过滤用于移除不希望出现在数据集中的特定内容,可能是敏感信息、低价值的文本等。通过内容过滤,确保数据集符合特定的内容标准。

去重: 在去重步骤中,重复的文本被移除,以确保数据集中不包含重复的信息。这有助于减小数据集的大小,同时确保多样性。

多源混合: 多源混合阶段涉及将来自不同来源的文本数据合并到一个数据集中。这有助于提高数据集的多样性和覆盖面,使模型更能够泛化到不同领域和文本风格。

标记化: 标记化是将文本转换为模型可以理解的标记或令牌序列的过程。这个过程通常包括将文本分割成单词或子词,并为每个单词或子词分配一个唯一的标识符。标记化是为了将文本数据转换成模型可以处理的形式。

OLMo论文里的模型结构的小白解析_第4张图片

中间状态训练语言模型的额外分析和实验结果

一般包含
性能曲线: 对模型在不同训练步骤或迭代中的性能进行追踪。性能曲线可能包括训练损失、验证损失、准确率等指标的变化。这有助于了解模型在训练过程中的收敛情况以及模型的学习速度。

学习曲线: 观察模型在不同数据子集上的表现,以了解模型对训练数据的学习进度。这可以帮助识别模型是否过拟合或欠拟合,以及是否需要调整训练策略。

特征分析: 对模型隐藏层的表示进行分析,了解模型在不同训练阶段对输入数据的学习方式。这包括词嵌入的分布、隐藏层激活的分布等。

对抗性测试: 在不同训练阶段测试模型对对抗性攻击的鲁棒性。这有助于评估模型的安全性和稳健性。

任务性能: 在不同阶段评估模型在特定任务上的性能,以了解模型在不同训练状态下的任务适应能力。
通过进行这些额外的分析和实验,研究者可以更全面地理解语言模型的训练过程,揭示模型的学习动态,以及不同阶段对模型性能和能力的影响。

评估

论文中提到了在线评估和离线评估,作用解释不太清晰,具体而言如下:

利用Catwalk,我们进行下游评估,以及在我们的新困惑度基准Paloma上进行内在语言建模评估。

在线评估(Online Evaluation): 在模型训练的过程中,通过定期执行评估任务,实时监控模型的性能。在线评估通常是在训练的“循环内”进行,即在模型训练的每个周期或一定步骤之后进行。它的目的是提供对模型训练进展的早期和连续的反馈。在线评估可以帮助在训练过程中及早发现问题、调整超参数,并了解模型的质量变化趋势。在给定步骤或时间间隔内执行的评估任务可以涵盖模型架构、初始化、优化器、学习率调度等方面的性能。

离线评估(Offline Evaluation): 在模型训练的某个阶段或完成后,对训练过程中生成的模型检查点进行详细评估。离线评估是在已有的模型状态下对其性能进行更深入、全面的分析。通常,离线评估包括对多个指标的测量,如模型在特定任务上的准确率、损失函数值、对抗性测试、语言建模评估等。在这个阶段,研究人员可以对模型的整体性能以及在各个任务上的表现进行更全面的了解。

在下游任务和困惑度评估中,我们使用我们固定的评估流程将结果与几个公开可用的模型进行比较。
循环内训练消融: 在整个模型训练过程中,我们进行下游评估以做出关于模型架构、初始化、优化器、学习率调度和数据混合等方面的决策。我们将这称为在线评估,因为它在每1000个训练步骤(或∼4B训练标记)中循环运行,提供对正在训练的模型质量的早期和持续信号。这些评估依赖于我们在第4.1节中详细介绍的离线评估中使用的许多核心任务和实验设置,这也反映了EleutherAI评估工具的任务和评估结构。
下游评估: 在许多先前的工作基础上(Brown等,2020;Black等,2022;Touvron等,2023a,b等),我们报告了一组下游任务的零样本性能。我们的评估套件包括9个核心任务,与Touvron等人(2023a)和Touvron等人(2023b)报告的常识推理任务集密切对应(请参见表6以获取任务列表)。鉴于正在评估的模型规模,这些任务是在模型开发初期选择的,因为它们在自然性方面具有(例如,都可以被公式化为文本完成评分任务)并且能够在整个训练过程中提供有意义的信号。
内在语言建模评估: 为了衡量OLMo-7B如何适应超出保留训练数据的语言分布,我们使用Paloma(Magnusson等,2023),这是一个新的困惑度基准,包括585个不同领域的文本。这些领域包括从nytimes.com到Reddit上的r/depression等,来自18个单独的数据源,例如C4(Raffel等,2020),以分层样本的方式进行选择。这允许更平等地包含在源语料库中代表不足的文本领域。

循环内训练消融
一般会包含:
1.模型架构调整: 在循环内,尝试不同的模型架构变体,例如改变层数、隐藏层维度、头数等。通过这种方式,研究人员可以了解模型结构的不同选择对性能的影响。
2.初始化策略: 调整模型参数的初始化策略,尝试使用不同的初始化方法,如正态分布、均匀分布、特定的预训练模型的参数等。这有助于了解模型在不同起始条件下的收敛性和性能。
3.优化器和学习率调度: 尝试不同的优化器(如Adam、SGD等)和学习率调度策略,以观察对模型训练收敛速度和性能的影响。
4.数据混合: 在循环内尝试不同的数据混合方式,如不同的采样策略、数据重加权等,以评估对模型泛化和性能的影响。
5.其他超参数调整: 调整其他可能影响模型性能的超参数,比如正则化项、激活函数等。
这些实验的目的是通过逐步调整或排除不同因素,深入了解模型的训练过程中不同组件的贡献,以指导模型设计和训练的决策。
下游评估是通过在预训练模型上执行一系列具体任务来评估其性能的过程。这里给出了下游评估的任务表
OLMo论文里的模型结构的小白解析_第5张图片

内在语言建模评估
内在语言建模评估是指通过一种被称为"困惑度"(perplexity)的度量来评估语言模型在其训练数据之外的文本上的性能。这种评估通常用于衡量语言模型对未知文本的泛化能力。
具体来说,内在语言建模评估的主要步骤如下:
1.困惑度(Perplexity): 困惑度是一种用于评估语言模型性能的指标。对于给定的文本序列,困惑度衡量了模型在预测下一个词时的不确定性。较低的困惑度表示模型更好地适应了给定文本。这里用的困惑度引用的是一种已有困惑度指标。
2.新颖文本集合: 对于内在语言建模评估,研究者会准备一个包含模型之前未见过的文本的新颖文本集合。这些文本可以来自于不同的领域、主题或语体,以确保评估模型在未知数据上的表现。
3.模型评估: 使用新颖文本集合,对语言模型进行评估。通常,模型会在给定文本序列的情况下,尝试预测下一个词的概率分布。通过计算模型在新颖文本上的困惑度,可以了解模型在未知数据上的预测性能。
这种评估方法的目的是衡量语言模型在训练过程中是否能够捕捉到通用的语言结构和规律,以便在之前未见的文本上表现良好。较低的困惑度通常被视为模型更好地适应了不同领域和主题的语言,展示了其更强大的泛化能力。

LMo-7B是具有明确去污染处理的最大语言模型,用于困惑度评估。按照Paloma中描述的方法,我们排除了任何在预训练文档中泄漏了Paloma评估数据段落的情况。如果没有去污染处理,其他模型可能会低估困惑度(即高估模型对样本外数据的拟合)。
没有去污染处理的情况下,其他模型可能会低估困惑度,实际上是在强调一个模型评估中的偏差源。

为什么要去污染
语言模型的困惑度是一个衡量其在给定数据上的预测性能的指标。低困惑度意味着模型更好地适应了给定的数据。然而,在实际评估中,可能存在一个问题,即模型在训练中可能过于适应了特定的文本或任务,导致对新颖、未见过的数据的泛化能力较差。

提到“没有去污染处理”,意味着在评估中没有对模型接触到的来自评估数据的信息进行清理。如果模型在预训练阶段接触到了评估数据,可能会导致模型在评估时对这些数据的表现过于乐观,因为模型在训练中已经“看到”了一些评估数据。

如果其他模型没有进行去污染处理,它们在评估时可能会高估对样本外数据的拟合(拟合得过于好),导致困惑度较低。低困惑度可能会误导人认为模型在未知数据上的性能比实际情况更好。

因此,为了确保更准确的困惑度评估,作者选择对模型进行去污染处理,移除在预训练文档中泄漏了评估数据的部分,以减少模型对评估数据的过于乐观的学习。这样可以更客观地评估模型在未知数据上的泛化能力。

训练

我们使用ZeRO优化器策略(Rajbhandari等,2019),通过PyTorch的FSDP框架(Zhao等,2023)来训练我们的模型,该框架通过在多个GPU上分片模型权重及其对应的优化器状态来降低内存消耗。在7B规模下,这使得我们能够在我们的硬件上每个GPU使用4096个标记的微批量进行训练(详见第3.4节)。对于OLMo-1B和-7B模型,我们使用约4M标记的恒定全局批量大小(2048个实例,每个实例的序列长度为2048标记)。对于OLMo-65B模型(目前正在训练),我们使用一个批量大小的预热,从约2M标记(1024个实例)开始,然后每100B标记翻倍,直到达到约16M标记(8192个实例)。

ZeRO优化器策略
这里使用的FSDP框架,一般效果有
模型分片: ZeRO将模型权重划分为多个部分,每个部分被称为一个分片。每个分片在不同的GPU上存储,从而将模型的内存占用分摊到多个设备上。

分片的独立优化: 每个分片都有独立的优化器状态,包括梯度、动量等。这使得每个GPU只需要关注自己的分片,减少了不同GPU之间的通信。

交叉分片通信: 当需要进行全局同步(例如执行梯度累积或更新模型参数)时,ZeRO使用交叉分片通信的方式,仅在需要时进行跨GPU的通信,而不是在每个训练步骤都进行。

动态分片调整: ZeRO可以根据训练过程中的需要动态地调整分片的数量,以适应模型和硬件的变化。
批量大小预热
这一策略通常用于解决训练初期的挑战,其中较大的批量大小可能导致模型不稳定或训练不收敛。

在 batch size warmup 中,初始阶段使用较小的批量大小,然后随着训练的进行逐渐增加批量大小,直到达到一个预定的目标大小。这有助于模型在训练初期更好地适应数据,减少训练过程中的不稳定性,并提高模型的收敛速度。

这种方法的选择通常取决于训练任务、模型架构和数据集等因素。在深度学习中,一开始使用较小的批量大小可能有助于模型更好地学习数据的特征,避免过度拟合或其他训练不稳定性问题。随着训练的进行,逐渐增加批量大小可以充分利用硬件资源,提高训练速度。

为了提高吞吐量,我们使用混合精度训练(Micikevicius等,2017),通过FSDP的内置设置和PyTorch的amp模块。后者确保某些操作,如 softmax,始终以完整精度运行,以提高稳定性,而所有其他操作则以半精度和 bfloat16 格式运行。在我们的具体设置下,每个GPU上本地的分片模型权重和优化器状态保持在完整精度。在每个转换器块内,只有在每个GPU上在正向和反向传播期间生成全尺寸参数时,权重才会被转换为 bfloat16。梯度在全精度上跨GPU进行下降。

如何设置半精度和全精度
稳定性问题: Softmax 操作通常在计算概率分布时使用,而概率值往往很接近0或1。在半精度下,这些值可能因为数值精度限制而丢失信息,导致不稳定的计算。因此,为了提高计算的稳定性,选择在完整精度下运行 softmax 操作。
计算效率: 大多数深度学习任务中,模型的大部分计算是由卷积、矩阵乘法等操作组成的。这些操作在半精度和 bfloat16 格式下执行通常不会显著影响模型的性能,并且可以显著减少内存占用和计算开销。
分片模型权重和优化器状态的保持: 在每个GPU上保持模型权重和优化器状态的完整精度有助于维护模型的整体精度。这是因为权重的更新和优化器状态的维护可能涉及到累积操作,而这些操作可能受到数值精度的敏感。
权重转换为 bfloat16: 在每个转换器块内,权重只在需要的时候(在正向和反向传播期间生成全尺寸参数时)被转换为 bfloat16。这是一种权衡,以确保在前向传播中使用更低精度进行计算,同时在梯度的反向传播中保留足够的精度。
梯度在全精度上跨GPU进行下降: 梯度在全精度上进行下降,以确保在优化过程中保持足够的精度,避免过度积累数值误差。

使用了AdamW优化器,采用了Loshchilov和Hutter(2019)提出的AdamW的超参数设置,具体设置如表4所示。对于所有的模型尺寸,学习率在训练的前5000个步骤(约21B个标记)进行预热,然后在余下的训练过程中线性衰减至峰值学习率的十分之一。在预热期后,对梯度进行截断,以保证参数梯度的总L2-范数不超过1.0。

AdamW优化器的优点
权重衰减的正确实现: AdamW 在权重衰减的处理上更为准确。在Adam中,权重衰减通常是通过更新步骤中直接减去一个小的正值来实现的。但是,这可能导致学习率衰减过快,因为它会减小所有参数,而不仅仅是权重。AdamW通过在更新步骤中应用权重衰减,即在计算梯度时对权重进行缩放,更准确地实现了权重衰减。
解决Adam的偏置修正问题: Adam优化器在训练初期可能受到偏置修正(bias correction)的影响,导致学习率较小。AdamW通过保留权重衰减项的不带修正的形式,有效地缓解了这个问题,提高了在训练初期的优化性能。
更稳定的训练: AdamW的权重衰减机制和对偏置修正的处理改进,有助于提高训练的稳定性。它可以减轻训练初期的梯度更新不稳定性,有助于更快地收敛到合适的模型。

每个文档的标记被连接在一起,每个文档的末尾添加一个特殊的EOS标记,然后我们将连续的2048个标记分组形成训练实例。每次训练运行时,训练实例都以完全相同的方式进行洗牌。通过我们发布的工件,可以重建数据的顺序和每个训练批次的确切组成。
我们发布的所有模型都经过至少2万亿个标记的训练,这相当于在我们的训练数据上进行的一个epoch。有些模型通过使用不同的洗牌顺序启动数据的第二个epoch进行了额外的训练。根据先前的研究(Muennighoff等人,2023),重复这么少量的数据应该对模型的影响微乎其微。

训练数据一致性: 通过训练实例的洗牌策略,保持了训练数据在每次运行中的一致性。
模型训练量和鲁棒性考虑: 模型经过2万亿标记的训练,有些模型甚至进行了更多的训练,以增加模型的鲁棒性。

结果部分参阅论文,后续学习后或进行补充

你可能感兴趣的:(10天学完OLMo,语言模型)