Skip to content

Commit a08e9ee

Browse files
committed
merge
2 parents 0227099 + 29b5ecd commit a08e9ee

File tree

96 files changed

+510295
-133
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+510295
-133
lines changed

.gitignore

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,5 @@ cython_debug/
159159
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
160160
.idea/
161161
.DS_Store
162-
GPT2_deploy/GPT-2/*
163-
gpt2-large-deploy1/*
164-
gpt2deploy3/*
165-
reasoning-teacher/*
166-
GPT2_deploy/teacher_completion_data.tar/*
167-
GPT2_deploy/data/*
162+
docs/chapter2/models/GPT-2/*
163+
MetaICL/

Snipaste_2024-11-14_10-57-25.png

79.6 KB
Loading

docs/chapter2/2_1蒸馏基础.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# 知识蒸馏的思想
2+
3+
4+
先训练一个大的网络模型(Teacher Network),再根据该网络模型来训练小的网络模型(Student Network)。教师网络较大且臃肿,可能是多个网络的集成,同时也包含了很多信息。知识蒸馏的具体学习方法是:学生网络将教师网络的输出结果当成正确答案来训练,而网络剪枝主要通过剪掉参数或神经元来压缩网络,这也是网络剪枝与知识蒸馏方法的区别所在。该方法的好处是,教师网络的输出结果对于小网络模型来说更容易学习;一些没有用于学生网络训练而用于教师网络训练的样本依然可以很好地被学生网络识别出来。
5+
6+
![](images/Figure%202.png)
7+
8+
之所以要进行知识蒸馏,因为大部分人工智能算法都很大,教师网络一般是用海量数据与资源训练出来的,而真正落地运用的终端的算力却非常有限,如智能手表、手机、移动端、IoT设备、无人驾驶汽车等,因此需要进行知识蒸馏。
9+
10+
知识蒸馏的技巧:在softmax函数上加入temperature
11+
12+
Softmax函数:
13+
$$
14+
y_i = \frac{exp(y_i)}{\sum_i exp(y_i)}
15+
$$
16+
该函数将网络的最终输出变成一个介于0到1的概率的分布。
17+
18+
加入温度后的softmax函数
19+
$$
20+
y_i' = \frac{exp(y_i / T)}{\sum_i exp(y_i / T)}
21+
$$
22+
其中,$T$ 表示温度(Temperature)。新的函数会使得网络新输出的结果比起原结果更平滑、更接近,学生网络可以学习到更相近的输出值,有利于学生网络的学习。
23+
24+
![图片来自同济子豪兄视频](images/Figure%203.png)
25+
26+
27+
# LLM的知识蒸馏
28+
29+
自2017年起,在自然语言处理领域,预训练大模型的参数规模呈指数级别增长,但终端场景的算力比较有限。目前来说,要想调用大模型的功能,需要先把大模型部署到云端或某个数据中心,再通过API远程访问。这种方法会导致网络延迟、依附网络才能应用模型等问题的存在,因此轻量化神经网络具有必要性。模型压缩可以将大型、资源密集型模型转换为适合存储在受限移动设备上的紧凑版本。此外它可以优化模型,以最小的延迟更快地执行,或实现这些目标之间的平衡。
30+
31+
轻量化神经网络分为四个主要的技术路线:
32+
33+
- 压缩已经训练好的大的模型,如知识蒸馏、权值量化、网络剪枝(包括权重剪枝和通道剪枝)、注意力迁移等;
34+
- 直接训练轻量化网络,如squeezeNet, MobileNet, Mnasnet, ShuffleNet, Xception, EfficientNet等;
35+
- 通过一些数值方法加速卷积运算,常用加速方法包括winograd卷积、低秩分解等;
36+
- 硬件部署。衡量一个轻量化网络是否足够好有以下一些角度:参数量、计算量、内存访问量、耗时、能耗等。因而知识蒸馏属于上述的第一种方法。
37+
38+
![](images/Figure%204.png)
39+
40+
当使用LLM作为教师网络时,根据是否强调将LLM的涌现能力(Emergent Abilities, EA)蒸馏到小型语言模型中来进行分类,可以把知识蒸馏分为两类:标准知识蒸馏(Standard KD)和基于涌现能力的知识蒸馏(EA-based KD)。
41+
42+
涌现能力是指在较小的模型中不出现,而在较大的模型中出现的能力,则可以称之为“涌现能力“, 这种现象也叫做规模效应;
43+
比如与 BERT(330M)和 GPT-2(1.5B)等较小模型相比,GPT-3(175B)和 PaLM(540B)等 LLM 展示了独特的行为,这些LLM在处理复杂的任务时表现出令人惊讶的能力。
44+
(An ability is emergent if it is not present in smaller models but is present in larger models.)。
45+
46+
标准知识蒸馏旨在使学生模型学习LLM所拥有的常见知识,如输出分布和特征信息。这种方法类似于传统的知识蒸馏,但区别在于教师模型是LLM。相比之下,基于涌现能力的知识蒸馏不仅仅是将LLM的常见知识转移到学生模型中,还涵盖了蒸馏它们独特的涌现能力。具体来说,基于涌现能力的知识蒸馏又分为了上下文学习(ICL)、思维链(CoT)和指令跟随(IF)。
47+
48+
![](images/Figure%205.png)
49+
50+
有关分类模型的蒸馏、小模型蒸馏的开源项目可以参考:
51+
https://github.com/datawhalechina/awesome-compression/blob/main/docs/ch06/ch06.md
52+
53+
根据蒸馏方法可以把知识蒸馏分为两类:一种是白盒蒸馏,教师模型一般是内部可见的模型,学生可以学习教师输出时的内部信息(logits等)来学习输出策略;另一种是黑盒知识蒸馏(Black-box KD),教师模型只有输出内容可见,因此这种蒸馏则会把学习的重点放在教师输出的内容和输出的特殊行为上,比如学习CoT等涌现能力。不论哪一种蒸馏,都是将大模型知识注入小模型的方式。
54+
55+
![](images/Figure%206.png)
56+
57+
58+
59+
参考文献:
60+
61+
[1] Knowledge Distillation [https://arxiv.org/pdf/1503.02531.pdf]
62+
63+
[2] Do Deep Nets Really Need to be Deep? [https://arxiv.org/pdf.1312.6184.pdf]
64+
65+
[3] A Servey on Model Compression for Large Language Models [https://arxiv.org/pdf/2308.07633.pdf]

docs/chapter2/2_2白盒蒸馏.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# 白盒蒸馏
2+
3+
## 1. 什么是白盒蒸馏
4+
对于开源的大模型,我们可以获得一切的模型推理时数据,包括token输出的概率分布。这种能够获得token输出概率分布的场景,可以被看作“白盒”场景。反之是黑盒场景。利用白盒所提供的数据进行蒸馏,是白盒蒸馏。
5+
6+
<!-- ## 何时使用白盒蒸馏
7+
传统的蒸馏针对的场景是分类任务,或者是让一个小模型模仿黑盒LLM(如GPT4)的API。那么如何将白盒LLM的知识传授给小模型呢?这其实是有专门的方法的,也就是这一章要讲的白盒蒸馏。
8+
9+
如何模型在输出下一个token之前,会先输出一个token的概率分布,然后从中采样一个token作为输出token。如果能够获取token的概率分布,那么就可以做白盒蒸馏,否则只能黑盒蒸馏。 -->
10+
11+
接下来我们会介绍两种经典的大模型白盒蒸馏的方法,MiniLLM和GKD。
12+
13+
14+
# 2. MiniLLM
15+
16+
大模型能力的强大也伴随着参数量的膨胀,为了以合理的成本部署大模型,如何将大模型的知识蒸馏到小模型是一个问题。从前,面对有限的状态空间(比如有限的分类类别),教师模型和学生模型的参数量都足以学习每一种类别的模式;而在大模型自回归生成的场景下,学生模型参数变少后,天然地失去了和大模型同等的表达能力,从而传统的蒸馏可能效果不佳。
17+
18+
<!-- 传统的知识蒸馏是面向分类等有限状态空间设计的,通过最小化前向KL散度,就能够让学生模型(小模型)学到有限的状态空闲(比如有限的类别)。 -->
19+
20+
<!-- 这种蒸馏方式仍然适合大语言模型吗?大语言模型本质上是做自回归生成任务,每一步都是一个状态空间巨大的分类任务,每下一步都会基于之前的分类结果。MiniLLM的论文中指出,传统蒸馏方式不再适用与大语言模型蒸馏。 -->
21+
22+
<!-- 但是大语言模型本质上做的是自回归式生成任务,传统的知识蒸馏方法不再适用。 -->
23+
24+
MiniLLM是一种针对生成式语言模型的全新的KD方法,它是一种白盒蒸馏方法,这种方法使用逆向KL散度,理论上使得学生模型模仿教师模型概率较大的生成结果,忽略教师模型概率不大的生成结果。这样做一定程度放弃了模型生成的多样性,从而实现高性价比的LLM部署落地。
25+
26+
## 2.1 前向KL散度
27+
前向KL散度是传统蒸馏时使用的损失函数,这里我们再复习一下它的概念:
28+
29+
假设老师分布为$p$, 学生分布为$q_\theta$, $\theta$ 是学生模型的参数。
30+
31+
前向KL散度可以看成是两个分布相似程度的定义(注意KL散度具有不对称性,不是距离):
32+
33+
$KL(p||q_\theta) = \sum_i p(i)log\frac{p(i)}{q_\theta(i)}$。
34+
35+
<!-- 一般都要最小化KL散度。 -->
36+
37+
从定义可以看出,在$p$分布为$0$的地方,$q$分布无论为多少,都不影响这一项为$0$,所以当我们最小化前向KL散度时,$q$会在老师概率分布小的地方分配大的概率。对应到大模型生成上,就是在老师模型输出可能性很小的地方,学生模型却放大了这种可能性,显然这是不符合模型生成预期的。
38+
39+
## 2.2 逆向KL散度
40+
41+
reversed KL:
42+
43+
$$KL(q_\theta ||p) = \sum_i q_\theta(i)log\frac{q_\theta(i)}{p(i)} = -\sum_i q_\theta(i)log\frac{p(i)}{q_\theta(i)}$$
44+
45+
蒸馏时,使用逆向KL散度代替前向KL散度。最小化逆向KL散度时,老师分布大的地方,学生分布也同步变大,而老师分布小的地方,学生分布会更小。下面这张经典的图片可以看出前向和后向KL的差异。
46+
47+
![images\v2-543575cc0a0efdaccbd1d24570b8e9e4_b.png](images\v2-543575cc0a0efdaccbd1d24570b8e9e4_b.png)
48+
49+
这样直观上看,使用逆向KL散度更加符合生成模型的场景。
50+
51+
52+
53+
## 2.3 基于策略梯度的优化
54+
MiniLLM的论文中提出了另一个新颖的视角——逆向KL其实可以等价于强化学习,并进行了公式推导。策略梯度是一种强化学习算法:将期望的回报写成一个可导的函数,然后求使得这个函数的最大的策略(比如使用梯度上升)。
55+
56+
<!-- 虽然直观上使用逆向KL散度就能更好地蒸馏模型,但实际在最优化损失函数时会遇到对短生成的偏爱以及reward hacking等问题。 -->
57+
58+
由于这部分涉及较多数学公式推导和强化学习,有兴趣的同学可以查看论文自行学习。
59+
60+
61+
62+
## 参考资料
63+
- MiniLLM: Knowledge Distillation of Large Language Models
64+
- https://github.com/microsoft/LMOps/tree/main/minillm
65+
- https://blog.csdn.net/ningmengzhihe/article/details/130679350

0 commit comments

Comments
 (0)