分类 语言大模型 下的文章

一、简介

论文:LLaMA: Open and Efficient Foundation Language Models :https://arxiv.org/pdf/2302.13971
github:https://github.com/meta-llama/llama
发布时间: 2023 年 2 月 25

LLaMA 是一系列从 7 B到 65B 参数的基础语言模型。Meta 训练这些模型使用了数万亿个 token,并且证明了完全可以只使用公开可得的数据集来训练最先进的模型,而无需使用专有和不可获取的数据集。特别是,LLaMA-13B 在大多数基准测试中表现优于GPT-3(175B),而 LLaMA-65B 在竞争中与最佳模型 Chinchilla70B 和PaLM-540B 持平。

二、LLaMa 预训练

1.预训练数据

LLaMa 预训练数据大约包含 1.4T tokens,对于绝大部分的训练数据,在训练期间模型只见到过1次,Wikipedia 和 Books 这两个数据集见过2次。

表1所示是 LLaMa 预训练数据的含量和分布,其中包含了 CommonCrawl 和 Books 等不同域的数据。

微信截图_20240516170118.png

English CommonCrawl [67%]:对五个 CommonCrawl 数据集进行预处理,时间跨度从2017年到2020年,使用 CCNet 流水线。该过程在行级别进行数据去重,使用 fastText 线性分类器进行语言识别,以删除非英语页面,并使用 n-gram 语言模型过滤低质量内容。此外,还训练了一个线性模型,用于将页面分类为 Wikipedia 中的引用页面与随机抽样页面,并丢弃未被分类为引用的页面。

C4 [15%]:C4的预处理还包括去重和语言识别步骤:与 CCNet 的主要区别在于质量过滤,这主要依赖于标点符号的存在或网页中的词语和句子数量等启发式方法。

Github [4.5%]:使用 Google BigQuery 上可用的公共 GitHub 数据集。只保留了在 Apache、BSD 和 MIT 许可下发布的项目。此外,使用基于行长度或字母数字字符比例的启发式方法过滤低质量文件,并使用正则表达式删除了诸如头文件之类的样板文件。最后,对生成的数据集进行了文件级别的去重,使用完全匹配的方法

Wikipedia [4.5%]:添加了截至2022年6月至8月的 Wikipedia 数据,涵盖20种语言。处理数据以去除超链接、评论和其他格式样板。

Gutenberg and Books3 [4.5%]:添加了两个书的数据集,分别是 Gutenberg 以及 ThePile (训练 LLM 的常用公开数据集) 中的 Book3 部分。处理数据时执行重复数据删除,删除内容重叠超过 90% 的书籍。

ArXiv [2.5%]:处理了arXiv Latex文件,以添加科学数据到数据集中。移除了第一节之前的所有内容,以及参考文献。还移除了.tex文件中的注释,并且内联展开了用户编写的定义和宏,以增加论文之间的一致性。

Stack Exchange [2%]。作者添加了 Stack Exchange,这是一个涵盖各种领域的高质量问题和答案网站,范围从计算机科学到化学。作者从 28 个最大的网站保留数据,从文本中删除 HTML 标签并按分数对答案进行排序

2、Tokenizer

使用字节对编码(BPE)算法对数据进行分词,使用 SentencePiece 的实现。值得注意的是,作者将所有数字分割成单个数字。

三、网络结构

在最近关于大型语言模型的研究中,LLaMa 的网络基于 Transformer 架构。作者利用了随后提出的各种改进,这些改进在不同模型(如PaLM)中得到了应用。以下是与原始架构的主要区别,以及从哪里得到了这种变化的灵感(括号中)。
410cacf197384fcdbaecd11ead5b957f.png

1、Pre-normalization [受 GPT3 的启发]

均方根:Root Meam Square
为了提高训练稳定性,LLaMa 对每个 Transformer 子层的输入进行归一化,而不是对输出进行归一化。LLaMa 使用了 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

方差定义:
概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。
均方根:RMS:
是root mean square的缩写。RMS值实际就是有效值,就是一组统计数据的平方的平均值的平方根。

常规的 Layer Normalization:
微信截图_20240517145320.png
微信截图_20240517145409.png

2、SwiGLU 激活函数 [受 PaLM 的启发]:

LLaMa 使用 SwiGLU 激活函数替换 ReLU 以提高性能,维度从4d变为2/3 *4d。

SwiGLU 是2019年提出的新的激活函数,它结合了 SWISH 和 GLU 两种者的特点。SwiGLU 主要是为了提升Transformer 中的 FFN(feed-forward network) 层的实现。
微信截图_20240517154943.png

3、RoPE Rotary Embeddings [受 GPTNeo 的启发]:

LLaMa 没有使用之前的绝对位置编码,而是使用了旋转位置编码(RoPE),可以提升模型的外推性。关于 RoPE 的具体细节,可以参考下面的链接:

4、AdamW 优化器

LLaMa 使用了 AdamW 优化器进行训练,超参数为:β1 = 0.9,β2 = 0.95。
使用 cosine 学习率衰减策略,2000 步的 warm-up,最终学习率等于最大学习率的 10%,使用 0.1 的权重衰减和 1.0 的梯度裁剪。
微信截图_20240517164103.png

四、总结

总结一下 LLaMa 的技术要点:

1、模型结构:主体结构依然是 GPT,不同之处在于位置编码使用了旋转编码(RoPE),归一化使用了 RMSNorm,激活函数使用了 SwiGLU
2、训练优化:选择了小 LLM配大数据的思路,预训练使用了 1.4T 的 token,经过了充分的训练。

参考:
1.https://zhuanlan.zhihu.com/p/648774481

一般分三大类

  • Fine-Tuning:全量微调
  • PEFT:高效微调(SOTA PEFT),部分参数的微调方法
  • RLHF:基于人工反馈机制的强化方法

一、 Fine-Tuning:全参微调

定义:全微调是指对整个预训练模型进行微调,包括所有的模型参数。在这种方法中,预训练模型的所有层和参数都会被更新和优化,以适应目标任务的需求。
适用范围:这种微调方法通常适用于任务和预训练模型之间存在较大差异的情况,或者任务需要模型具有高度灵活性和自适应能力的情况。Full Fine-tuning需要较大的计算资源和时间,但可以获得更好的性能。

1.Fine tuning

经典的Fine tuning方法包括将预训练模型base-model与少量特定任务数据一起继续训练。在这个过程中,预训练模型的权重被更新,以更好地适应任务。所需的Fine-tuning量取决于预训练语料库和任务特定语料库之间的相似性。如果两者相似,可能只需要少量的Fine tuning。如果两者不相似,则可能需要更多的Fine tuning。

二、PEFT、高效微调(SOTA PEFT):部分参数的微调方法

微信截图_20240429141957.png

微调顶层:只微调预训练模型的顶层,以适应新的任务。
逐层微调:从底层开始,逐层微调预训练模型,直到所有层都被微调。
冻结底层:将预训练模型的底层固定不变,只对顶层进行微调。

P-tuning:( 2021年3月) 清华大学提出的可自动学习模版的P-tuning,这种方法通过引入连续提示(continuous prompts)的方式替代传统的离散文本提示(discrete text prompt),以更少的可训练参数量来适应特定下游任务。

在P-Tuning中,通常会为输入序列添加一个或多个可学习的向量(虚拟token),这些向量作为额外的“prompt”嵌入到模型的输入序列中,用于指导模型生成与特定任务相关的输出。相比于直接对整个模型进行微调,P-Tuning仅需要调整这部分新增的prompt参数,从而显著减少所需的计算资源和时间。

P-tuning2:(在每一层前面加入训练参数 2021年10月)基于Prefix Tuning,增加了多个Embedding层,连续的Prompts,在预训练的每一层都增加了prompts,适合GLM模型的微调

Adapter(在前面添加训练参数)Adapter Tuning:由Houlsby N等人在2019年提出,通过增加模型层数来引入额外的灵活性,但这也导致了额外的推理延迟
Prefix-tuning(在中间添加训练参数)由斯坦福大学提出,在原有模型基础上,增加一个可被训练的Embedding层,用于给提示词增加前缀,从而更好的让模型理解提示词的意图,通过修改输入的前缀来调整模型的行为,但这种方法难以训练,并且可能影响模型性能。
Prompt tuning:由谷歌提出,类似于Prefix-Tuning,通过修改输入提示来调整模型行为。
Lora(在旁边添加训练参数)(Low-Rank Adaptation):由微软在2021年提出,通过低秩矩阵分解来实现高效的参数调整。
QLora

在这些方法中,LORA因其优越的性能和较低的成本而备受推崇。

定义:部分微调是指在微调过程中只更新模型的顶层或少数几层,而保持预训练模型的底层参数不变。这种方法的目的是在保留预训练模型的通用知识的同时,通过微调顶层来适应特定任务。

适用范围:Repurposing通常适用于目标任务与预训练模型之间有一定相似性的情况,或者任务数据集较小的情况。由于只更新少数层,Repurposing相对于Full Fine-tuning需要较少的计算资源和时间,但在某些情况下性能可能会有所降低。

微调所有层:将预训练模型的所有层都参与微调,以适应新的任务。

1、P-tuning系列

P-tuning V1

英文名称: GPT Understands, Too
中文名称: GPT也懂
链接: https://arxiv.org/abs/2103.10385
作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang
机构: 清华大学, 麻省理工学院
日期: 2021-03-18

目标:大模型的 Prompt 构造方式严重影响下游任务的效果。离散化的 token 的搜索出来的结果可能并不是最优的,导致性能不稳定。本篇论文旨在探讨,如何提升预训练语言模型进行自然语言提示的有效性。

方法:作者提出了 P-Tuning,设计了一种连续可微的 virtual token(同 Prefix-Tuning 类似)。将 Prompt 转换为可以学习的 Embedding 层,用 MLP+LSTM 的方式来对 Prompt Embedding 进行处理。
微信截图_20240429140514.png

结论:弥合 GPT 和 NLU 应用程序之间的差距 (2021 年),P 调参后的 GPT 可以比在 NLU 调参的类似大小的 BERT 效果更好。
0240426110655.png
微信截图_20240429140632.png
主图:一个关于“英国的首都是 [MASK]”的提示搜索的例子。在蓝色区域表示上下文(“英国”),红色区域表示目标(“[MASK]”),橙色区域表示提示。在(a)中,提示生成器只接收离散的奖励;在(b)中,连续的提示嵌入和提示编码器可以通过可微的方式进行优化。
参考:https://kexue.fm/search/Prompt+Tuning/

P-tuning V2

英文名称: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
中文名称: P-Tuning v2:提示调整可以在各种规模和任务上普遍与微调相媲美
链接: http://arxiv.org/abs/2110.07602v3
作者: Xiao Liu, Kaixuan Ji, Yicheng Fu, Weng Lam Tam, Zhengxiao Du, Zhilin Yang, Jie Tang
机构: 清华大学, 北京人工智能学会, 上海启智研究院
日期: 2021-10-14

目标:研究的目的是探索如何通过优化提示调整方法,在各种模型规模和自然语言理解任务中实现普遍有效的目标。

方法:最显著的改进是在预训练模型的每一层应用连续提示,而不仅仅是输入层。深度提示调整增加了连续提示的容量,并缩小了不同设置下微调差距的范围,尤其适用于小型模型和复杂任务。

结论:研究发现,经过适当优化的提示调整方法可以在各种模型规模和自然语言理解任务中达到与微调相当的性能,而只需调整 0.1%-3% 的参数(P-tuning 调整 0.01% 参数)。P-Tuning v2 被认为可以作为微调的替代方法,并为未来研究提供了一个强有力的基准。

0426145459.png

5.png
主图:P-tuning 到 P-tuning v2 对比。橙色块(即 h0,…,hi)指的是可训练的提示嵌入;蓝色块是由冻结的预训练语言模型存储或计算的嵌入。

参考:
1.https://zhuanlan.zhihu.com/p/687481429
2.https://www.zhihu.com/tardis/zm/art/627642632?source_id=1003
3.https://zhuanlan.zhihu.com/p/675231376

大型语言模型的培训依赖于海量且多样化的数据资源。构建高品质的训练数据集对于这些模型的开发至关重要。尽管对于大规模模型的理论分析和解释仍不甚完善,且对于训练所用语言数据的精确说明和界定尚显不足,但广泛的研究共识认为,训练数据对于提升语言模型的性能和样本的泛化能力起着核心作用。为了增强模型的泛化和适应性,预训练数据应包含多种形式,如互联网内容、书籍、学术论文、百科全书以及社交媒体内容等,并且应尽可能广泛地覆盖不同的领域、语种、文化背景和不同的观点。

一、数据来源

大型语言模型所需的数据资源大致可分为通用数据和专业数据两类。通用数据涵盖了网页内容、图书、新闻报道、对话文本等,以其庞大的规模、多样性和易于获取的特点,为大型语言模型提供了基础的语言建模和泛化能力。而专业数据则包括多语言资料、科学文献、编程代码以及特定领域的专有信息等,这些在预训练阶段的引入,能够显著增强大型语言模型解决特定任务的能力。

1.通用数据

通用数据在大型语言模型训练数据中占比通常非常高,主要包括网页、书籍、对话文本等类型,为大型语言模型提供了大规模且多样的训练数据。

(1)网页数据
(Webpages)是通用数据中数量最大的一类。随着互联网的大规模普及,人们通过网站、论坛、博客、APP等各种类型网站和应用,创造了海量的数据。

维基百科:高质量。

(2)书籍
作为训练材料,语言模型得以接触丰富的词汇资源,这极大地提升了模型对不同领域和主题的理解力。与其他类型的语料相比,书籍通常提供了更加丰富和完整的长篇文本材料,它们是获取长文本书面语数据的主要,有时甚至是唯一来源。书籍中的完整句子和段落结构使得语言模型能够学习并理解上下文之间的联系,这对于模型把握句子的复杂结构、逻辑关系以及语义连贯性至关重要。书籍内容包括了多种文体和风格,如小说、科学论著、历史文献等,训练时使用这些书籍数据能够让模型掌握多样的写作风格和表达技巧,从而增强模型在处理各类文本时的能力。

2.专业数据

专业数据虽在大型通用语言模型的训练数据中所占比重不高,但其对于提升模型在特定下游任务中的表现具有关键性作用。专业数据的类型繁多,而目前大型语言模型训练中常用的专业数据主要包括以下三类:

(1). 多语言数据:
这类数据包含了除英语以外的多种语言资源,它们对于构建能够理解和生成多语言文本的模型至关重要。多语言数据的引入能够帮助模型更好地服务于全球用户,提高其跨语言的交流能力和文化敏感性。

(2). 科学文本:
科学文本包括但不限于学术论文、研究报告、专业期刊等,这些文本通常包含专业术语和复杂概念。通过训练模型理解和处理这类文本,可以显著提高模型在学术研究和专业知识领域的应用能力。

(3). 代码:
代码数据涉及各种编程语言的源代码,这对于开发能够理解和生成代码的模型尤为重要。模型通过学习代码的结构和语法,可以在软件开发、代码审查和自动编程等任务中发挥作用。

二、数据处理

1.书籍

书籍按照格式一般分为:word、pdf(扫描版、非扫描版)、txt、网页。

txt和网页版本相对好处理。word版本也好处理一些,占比最多和最难处理的就是pdf格式,pdf格式书籍又分为扫描版、非扫描版,扫描版需要做ocr识别,准确率会更低,本文不在研究。主要研究非扫描版的pdf格式。

较好的预训练数据要求:
1.知识层次划分
同一个知识点要在一个样本中,不要切分,例如可以按照章节切分

2.段落之间要有换行符\n (有争议)
多个段落拼接要有换行符"\n",

3.同一段落不要切分
pdf识别成txt过程中,容易将一个段落切分成多个,需要识别拼接。

4.模型支持长度
如果模型预处理最长能处理4096个token,那么样本的长度在4096以内。

5.特殊符号处理
将\t 、URL、图片链接、表格、表情符号、流程图等和语义无关的都清洗掉

比较好的样本如下:


{"text": "气管旁淋巴结,再进入颈深下淋巴结。\n第一章喉的应用解剖学及生理学313\n颈深淋\n结上群/1酱它百订日喉前淋巴结\n颈总动脉\n颈内静脉气管前淋巴结\n(1)喉矢状断面内面观(2)喉的淋巴
引流\n八、喉的神经\n喉的神经为喉上神经和喉返神经(图5-1-11、图5-1-12),两者均为迷走神经分支。\n结状神经节喉上神经喉上神经喉上神经喉上神经喉内支喉上神经喉外支迷走神经迷走押经迷走神经迷走神经图5-1-11喉的神经(正面观)图5-1-12喉的神经(背面观)\n喉上神经(superior laryngeal nerve)是迷走神经在结状神经节发出的分支,下行约2cm到达舌骨大角平面处分为内、外两>支。内支主要司感觉,外支主要司运动。内支和喉上动、静脉伴行穿过舌甲膜,分布于声门上区黏膜,司该处黏膜的感觉。外支在胸骨甲状肌肌健附着的深面行走,支配环甲肌的运动。\n喉返神经(recurrent laryngeal nerve)是喉的主要运动神经。迷走神经进入胸腔后在胸腔上部分出喉返神经,左侧喉返神经绕主动脉弓,右侧绕锁骨下动脉,继而上行,走行于甲状腺深面的气管食管沟处发出数个分支支配颈段气管食管>黏膜,主干在环甲关节后方入喉。支配除环甲肌以外的喉内各肌的运动,但亦有一些感觉支司声门下区黏膜的感觉。\n九、小儿喉部的解剖特点\n小儿喉部的解剖与成入有不同之处,其主要特点是:\\朴岔1.小儿
喉部黏膜下组织较疏松,炎症时容易发生肿胀。小儿喉腔尤其是声门区又特别窄小,所以小儿发生急性喉炎时容易发生喉阻塞,引起呼吸困难。2.小儿喉的位置较成入高,3个月的婴儿,其环状软骨弓相当于第4颈椎下缘水平;6岁时降至第5颈椎。3.小儿喉软骨尚未钙化,较成人软,行小儿甲状软骨和环状软骨触诊时,其感觉不如成人的明显。\n第二节喉的生理学\n喉的生理功能主要有四个方面,现分述如下:\n1呼吸功>
能喉是呼吸通道的重要组成部分,喉的声门裂又是呼吸通道最狭窄处,正常情况下中枢神经系统通过喉神经控制声带运动,调节声门裂的大小。当人们运动时声带外展,声门裂变大,以便吸入更多的空气。反之,
安静时声门裂变小,吸入的空气减少。\n2.发声功能喉是发声器官,人发声的主要部位是声带。喉如何发出各种声音的机制较为复杂,目前多数学者认为:发声时中枢神经系统通过喉神经使声带内收,再通过从肺呼出气体使声带发生振动形成基频,经咽、口、鼻腔的共鸣,舌、软腮、齿、颊、唇的构音器官运动,从而发出各种不同声音和言语。\n关于声带如何振动有不同的学说,目前比较公认的是“体-被覆层(body-cover)"黏膜波学说。其主要原理是:声带内收,声门闭合;声韧带和其下肌层构成声带体部(body),起固定声带、保持声带一定张力、维持声门一定阻力的作用。由于声门下气流的压力作用,冲开上皮层和浅固有>层构成的被覆层(cover),引起声门开放,由千伯努利效应(Bernoulli effect)声带靠拢声门又闭合,再开放、再闭合反复进行。被覆层在开放关闭时形成的黏膜波可经动态喉镜观察到。由于声带有规律地关闭产>生一系列振动,造成空气疏密相间的波动,形成声门波,即形成人发音的基频。\n3.保护下呼吸道功能喉对下呼吸道有保护作用。吞咽时,喉被上提,会厌向后下盖住喉入口,形成保护下呼吸道的第一道防线。两
侧室带内收向中线靠拢,形成第二道防线。声带也内收、声门闭合,形成第三道防线。在进食时,这三道防线同时关闭,食管口开放,食物经梨状窝进入食管。偶有食物或分泌物进入喉腔或下呼吸道,则会引起剧烈的反射性咳嗽,将其咳出。\n4.屏气功能当机体在完成某些生理功能时,例如咳嗽、排便、分挽、举重物等时,需增加胸腔和腹腔内的压力,此时声带内收、声门紧闭,这就是通常所说的屏气。屏气多随吸气之
后,此时呼吸暂停,胸腔固定,脯肌下移,胸廓肌肉和腹肌收缩。声门紧闭时间随需要而定,咳嗽时声门紧闭时间短,排便、分挽、举重物等时声门紧闭时间较长。"}