admin 发布的文章

一、SentencePiece 简介

SentencePiece 在大模型领域主要用于文本的 分词 和 编码。

1、分词

是将文本分割成一个个独立的词语或符号。传统的中文分词方法,例如 BMM 分词、隐马尔可夫(H M M ) 分词,都是基于规则的,需要人工制定分词规则。而 SentencePiece 则是基于 无监督学习 的,它可以自动学习文本的语义和结构,并根据学习结果进行分词。

2、编码

是将分词后的词语或符号转换为数字形式,以便计算机能够处理。SentencePiece 使用了一种称为 字节对编码 的方法,它可以将每个词语或符号编码成一个或多个字节。字节对编码的优点是能够有效地利用空间,并且可以将词语或符号之间的关系编码到编码中。

3、优势:SentencePiece 在大模型领域具有以下优势:

分词效果好,能够准确地识别词语和符号的边界。
编码效率高,能够节省空间。
能够将词语或符号之间的关系编码到编码中,有利于模型学习。
因此,SentencePiece 已经被广泛应用于各大模型,例如 Google 的 BERT、GPT-3,以及阿里巴巴的 M6 等。

简单来说,SentencePiece 就是大模型领域的一个 分词和编码工具。它可以帮助大模型更好地理解和处理文本。

4、自监督训练原理

SentencePiece 的自监督训练模型原理是通过 无监督学习 的方式,学习文本的语义和结构,并根据学习结果进行分词和编码。

具体来说,SentencePiece 的训练过程可以分为以下几个步骤:

数据准备:首先需要准备一个文本语料库,语料库中的文本可以是任何类型,例如新闻文章、书籍、代码等。
模型训练:使用无监督学习算法训练 SentencePiece 模型,模型的输入是文本语料库,输出是分词后的文本。
模型评估:使用评估指标评估模型的性能,例如分词准确率、召回率等。
SentencePiece 使用的无监督学习算法是一种称为 Masked Language Modeling (MLM) 的算法。MLM 的基本思想是:将文本中的部分词语或符号进行遮蔽,然后让模型预测被遮蔽的词语或符号。通过这种方式,模型可以学习文本的语义和结构。

在 SentencePiece 中,MLM 的具体实现如下:

随机选择文本中的部分词语或符号进行遮蔽。
将被遮蔽的词语或符号替换为一个特殊符号,例如 [MASK]。
将处理后的文本输入模型,让模型预测被遮蔽的词语或符号。
通过这种方式,模型可以学习到被遮蔽词语或符号与周围词语或符号之间的关系,从而提高分词和编码的准确性。

SentencePiece 的自监督训练模型具有以下优势:

不需要人工制定分词规则,能够自动学习文本的语义和结构。
分词效果好,能够准确地识别词语和符号的边界。
编码效率高,能够节省空间。
SentencePiece 的自监督训练模型已经被广泛应用于各大模型,例如 Google 的 BERT、GPT-3,以及阿里巴巴的 M6 等。

二、TikToken 简介

Tiktoken 的功能与 SentencePiece 类似,都是用于文本的 分词 和 编码。

Tiktoken 是一个基于 BPE 算法的 快速分词器,它专门针对 GPT-4 和 ChatGPT 等大模型进行了优化。Tiktoken 的主要特点如下:

速度快:Tiktoken 的分词速度比 SentencePiece 快很多,可以满足大模型训练和推理的需求。
效果好:Tiktoken 的分词效果与 SentencePiece 相当,能够准确地识别词语和符号的边界。
易用性:Tiktoken 提供了简单的 API 接口,方便使用。
Tiktoken 与 SentencePiece 的主要区别 如下:

分词算法:Tiktoken 使用 BPE 算法进行分词,而 SentencePiece 使用的是无监督学习算法。
速度:Tiktoken 的分词速度比 SentencePiece 快很多。
模型:Tiktoken 专门针对 GPT-4 和 ChatGPT 等大模型进行了优化,而 SentencePiece 则是通用的。

速度探究
所以大家一定对为什么这么快很好奇,查阅tictoken的源码得知,tictoken对CoreBPE类进行了基于RUST的重写,包括真·多线程,regex,缓存caching,哈希各个方面的优化,具体的下面逐一解释:

3.1 regex优化
正则是耗时的大头,解决办法是用一些不那么花哨的方法,比如用 regex crate可解析的形式的regex要比寻常方法快3倍以上。

一旦明确了使用crate可解析的regex,可以选择用regex crate 或者 fancy_regex crate

regex crate 和 fancy_regex crate也有相互关系,fancy_regex使用的re.find_it会竞争re的可变缓存空间,造成性能下降,而regex的find_iter有不同的代码路径,不会造成这个问题。为此,通过给绝大部分的regex线程做一个克隆线程来避免。

3.2 threading
rayon并没有比python自带的threads和释放GIL的情况下快,所以直接用python线程计数等来完成threads

这里我多说一下,python自带的GIL是指如果没有额外操作,只是使用了类似:

3.3 caching
tokenizer中使用LRU cache是很有必要的,可以加速查找速度,作者使用了RWLock来保护cache安全,对于RWLock,全称是"reader-writer spin lock",和普通的spinlock不同,它对"read"和"write"的操作进行了区分。如果当前没有writer,那么多个reader可以同时获取这个rwlock。如果当前没有任何的reader,那么一个writer可以获取这个rwlock。

3.4 hash
作者使用了FxHashMap替代传统的HashMap达到了一定的性能提升,简单说明一下,FxHashMap的散列算法质量不高,但速度非常快,特别是对整数键而言,并且发现它的性能优于rustc内的所有其他散列算法。

以上就是tictoken进行的性能优化。

一、点乘(Dot Product)、点积 内积

点乘也称为标量积或内积,是两个等长向量之间的运算。它将两个向量的对应元素相乘,然后将乘积相加,得到一个标量值。点乘只适用于向量。

点积是点乘的另一种说法,通常在数学和物理学中使用,但在深度学习中,点乘和点积可以互换使用。

内积通常指的是点乘,是两个向量之间的运算,得到一个标量值。内积的概念也可以扩展到矩阵,称为矩阵乘法,但矩阵乘法的结果是一个矩阵,而不是一个标量。

1、对应元素相乘,求和

dot:只能张量中向量(一维)操作,结果是一个标量。比如两个embedding求相似度。

import torch
x = torch.tensor([1,2,3])
y = torch.tensor([1,1,2])
z = torch.dot(x,y)
print(z)
## 结果:tensor(9)

k = x*y
m = torch.mul(x,y) 
print(k)
print(m)

2、 对应元素相乘,不求和

*和 mul 操作是一样的,要求x,y具有相同的维度(一维向量,二维矩阵都可以)

import torch
x = torch.tensor([[3,3],[3,3]])
y = torch.tensor([[1,2],[3,4]])
k = x*y
m = torch.mul(x,y)  #x.mul(x)
print(k)
print(m)

## tensor([[ 3,  6],
           [ 9, 12]])
## tensor([[ 3,  6],
           [ 9, 12]])

3、 矩阵相乘

@和torch.mm和torch.matmul 作用一样

矩阵相乘有torch.mm和torch.matmul两个函数。其中前一个是针对二维矩阵,后一个是高维。当torch.mm用于大于二维时将报错。
a = [B,E]
b = [E,B]
c = torch.mm(a,b)
C 维度是[B,B]

4、torch.matmul重点解读

matmul 有广播机制

(1)两个 1 维,向量内积

a = torch.ones(3)
b = torch.ones(3)
print(torch.matmul(a,b))  # tensor(3.)

(2)两个 2 维,矩阵相乘

a = torch.ones(3,4)
b= torch.ones(4,3)
print(torch.matmul(a,b))  
# tensor([[4., 4., 4.],
#        [4., 4., 4.],
#        [4., 4., 4.]])

(3)一个 1 维,二个 2 维,矩阵和向量相乘

注意:相靠近的那个维数要相同,比如(7)和(7,8,5),又比如(7,8,5)和(5)

a = torch.ones(3)
b= torch.ones(3,4)
print(torch.matmul(a,b))  # tensor([3., 3., 3., 3.])

a = torch.ones(3,4)
b = torch.ones(4)
print(torch.matmul(a,b))  # tensor([4., 4., 4.])

(4)、高维情况

i)其中一个1维,另一个N维(N>2): 类似3),即需要靠近的那个维数相同,比如(7,)和(7,8,11),又比如(7,8,11)和(11,)

ii)都高于2维,那么除掉最后两个维度之外(两个数的维数满足矩阵乘法,即,(m,p)和(p,n)),剩下的纬度满足pytorch的广播机制。

a=torch.ones(5,3,4,1)
b=torch.ones(  3,1,1)
print(torch.matmul(a,b))

一般分三大类

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

一、大模型微调需要的参数量

当模型的参数量大小为 B ,模型所占用的硬盘空间为 的 2 倍, 推理所需的显存一般是 ** 的 2 倍。对于全参数微调所需显存,目前来说普遍的说法是约为推理所需显存的 4 倍(包括模型推理(1倍)、梯度(1倍)、优化器状态(AdamW 2倍,SGD 1倍))

例如:当模型的参数量大小为 7B ,模型所占用的硬盘空间为14G,推理所需的显存一般是14G多15G,对于全参数微调所需显存,目前来说普遍的说法是约为推理所需显存的 4 倍,也就是60G左右。

一、 Fine-Tuning:全参微调

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

1.Fine tuning

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

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

微信截图_20240429141957.png

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

Lora(在旁边添加训练参数)(Low-Rank Adaptation):由微软在2021年提出,通过低秩矩阵分解来实现高效的参数调整。
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,通过修改输入提示来调整模型行为。

QLora

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

1、LoRA

LoRA是一种用于微调大型预训练语言模型(如GPT-3或BERT)的方法。它的核心思想是在模型的关键层中添加小型、低秩的矩阵来调整模型的行为,而不是直接改变整个模型的结构。

这样做的好处是,可以在不增加太多额外计算负担的情况下,有效调整模型,同时保持其原有的性能。

LoRA的工作原理如下:

数学原理:原参数矩阵,加上一个小的、简单的低秩矩阵(B*A升维之后,+W),来生成新的参数矩阵。
在 Transformer 的 multi-head attention 中使用 LoRA.

选择要调整的权重矩阵:在大型模型(如GPT)中,我们首先确定要微调的权重矩阵。通常,这些矩阵位于模型的多头自注意力(Multi-head Self-Attention)和前馈神经网络(Feed-Forward Neural Network)部分。

引入两个低秩矩阵:接着,我们引入两个低秩矩阵,记为A和B,这两个矩阵的维度比原始权重矩阵小得多,例如,如果原始矩阵的尺寸是dd,那么,A和B的尺寸可能是dr和r*d,其中r是一个远小于d的数。

计算低秩更新:通过计算这两个低秩矩阵的乘积,生成一个新的矩阵AB,这个新矩阵的秩(即r)远小于原始权重矩阵的秩。这个乘积实际上是一个低秩近似,可以视为对原始权重矩阵的一种调整。

结合原始权重:最后,这个新生成的低秩矩阵AB被加到原始的权重矩阵上。这样,原始的权重矩阵得到了微调,但大部分权重保持不变。这个过程可以用数学公式表示为:新权重 = 原始权重 + AB。

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