Skip to content

Commit

Permalink
Merge pull request #16 from gyfffffff/main
Browse files Browse the repository at this point in the history
白盒蒸馏基本完成;完善了格式
  • Loading branch information
ironartisan authored Nov 25, 2024
2 parents 4ea9504 + 4b53e39 commit 0699a23
Show file tree
Hide file tree
Showing 93 changed files with 924 additions and 508,320 deletions.
159 changes: 0 additions & 159 deletions docs/chapter2/GPT2_deploy/src/distill-gpt-2.py

This file was deleted.

25 changes: 12 additions & 13 deletions docs/chapter2/chapter2_2.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,13 @@
## 1. 什么是白盒蒸馏
对于开源的大模型,我们可以获得一切的模型推理时数据,包括token输出的概率分布。这种能够获得token输出概率分布的场景,可以被看作“白盒”场景。反之是黑盒场景。利用白盒所提供的数据进行蒸馏,是白盒蒸馏。

<!-- ## 何时使用白盒蒸馏
传统的蒸馏针对的场景是分类任务,或者是让一个小模型模仿黑盒LLM(如GPT4)的API。那么如何将白盒LLM的知识传授给小模型呢?这其实是有专门的方法的,也就是这一章要讲的白盒蒸馏。
如何模型在输出下一个token之前,会先输出一个token的概率分布,然后从中采样一个token作为输出token。如果能够获取token的概率分布,那么就可以做白盒蒸馏,否则只能黑盒蒸馏。 -->

接下来我们会介绍两种经典的大模型白盒蒸馏的方法,MiniLLM和GKD。
接下来我们会介绍经典的白盒蒸馏方法和代码实现。


# 2. MiniLLM

大模型能力的强大也伴随着参数量的膨胀,为了以合理的成本部署大模型,如何将大模型的知识蒸馏到小模型是一个问题。从前,面对有限的状态空间(比如有限的分类类别),教师模型和学生模型的参数量都足以学习每一种类别的模式;而在大模型自回归生成的场景下,学生模型参数变少后,天然地失去了和大模型同等的表达能力,从而传统的蒸馏可能效果不佳。

<!-- 传统的知识蒸馏是面向分类等有限状态空间设计的,通过最小化前向KL散度,就能够让学生模型(小模型)学到有限的状态空闲(比如有限的类别)。 -->

<!-- 这种蒸馏方式仍然适合大语言模型吗?大语言模型本质上是做自回归生成任务,每一步都是一个状态空间巨大的分类任务,每下一步都会基于之前的分类结果。MiniLLM的论文中指出,传统蒸馏方式不再适用与大语言模型蒸馏。 -->

<!-- 但是大语言模型本质上做的是自回归式生成任务,传统的知识蒸馏方法不再适用。 -->

MiniLLM是一种针对生成式语言模型的全新的KD方法,它是一种白盒蒸馏方法,这种方法使用逆向KL散度,理论上使得学生模型模仿教师模型概率较大的生成结果,忽略教师模型概率不大的生成结果。这样做一定程度放弃了模型生成的多样性,从而实现高性价比的LLM部署落地。

## 2.1 前向KL散度
Expand All @@ -44,7 +33,7 @@ $$KL(q_\theta ||p) = \sum_i q_\theta(i)log\frac{q_\theta(i)}{p(i)} = -\sum_i q_\

蒸馏时,使用逆向KL散度代替前向KL散度。最小化逆向KL散度时,老师分布大的地方,学生分布也同步变大,而老师分布小的地方,学生分布会更小。下面这张经典的图片可以看出前向和后向KL的差异。

![images\v2-543575cc0a0efdaccbd1d24570b8e9e4_b.png](images\v2-543575cc0a0efdaccbd1d24570b8e9e4_b.png)
![images/v2-543575cc0a0efdaccbd1d24570b8e9e4_b.png](images/v2-543575cc0a0efdaccbd1d24570b8e9e4_b.png)

这样直观上看,使用逆向KL散度更加符合生成模型的场景。

Expand All @@ -57,6 +46,16 @@ MiniLLM的论文中提出了另一个新颖的视角——逆向KL其实可以

由于这部分涉及较多数学公式推导和强化学习,有兴趣的同学可以查看论文自行学习。

# 3. BabyLlama(实践)
[BabyLlama](http://arxiv.org/abs/2308.02019)将蒸馏看作一种提高训练样本利用效率的有效方式。作为代码实践的例子,我们将看到它的蒸馏损失函数使用到了教师模型的soft-labels。

BabyLlama的代码包含了
1. 数据清洗和tokenizer训练
2. 教师模型训练
3. 蒸馏学生模型

但实际上白盒蒸馏也可以使用现成的开源模型和tokenizer。



## 参考资料
Expand Down
16 changes: 8 additions & 8 deletions docs/chapter2/chapter2_3.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
以下是一个简单的ICL例子:

<div align="center">
<img src="image-1.png" alt="alt text" width="550"/>
<img src="images/image-1.png" alt="alt text" width="550"/>
</div>

模型成功模仿了示例中的答题思路和答题格式。
Expand All @@ -45,7 +45,7 @@ y_3

训练之前,我们会收集如下含有提示词和标签的数据:
<div align="center">
<img src="image-3.png" alt="alt text" width="750"/>
<img src="images/image-3.png" alt="alt text" width="750"/>
</div>

## 1.2 ICL 微调
Expand Down Expand Up @@ -115,7 +115,7 @@ $$
\mathcal{L}^{LM}_{soft} = \Sigma_{x\in \mathcal{D}_{LM}} P(x|\theta^t)logP(x|\theta^s)
$$
这里的训练数据就是一般的网络文本:
![alt text](image-4.png)
![alt text](images/image-4.png)

### 硬损失
除了学习老师的经验,学生还要学习ground-truth,这就是硬损失的意义。
Expand Down Expand Up @@ -156,22 +156,22 @@ $$


## 2.2 Self-Instruct 范式
![alt text](image-5.png)
![alt text](images/image-5.png)

要使用Self-Instruct生成数据,我们只需要推理一个经过预训练的大模型(不要经过指令微调哦)就可以了。这是因为预训练的大预言模型具有续写的能力,利用这个能力可以收集新的数据。

首先,人工设计若干任务,针对每个任务,撰写一个初始数据。这形成了初始的数据池。

然后,随机从数据池中抽取8条指令,让大模型续写更多的指令。可以使用如下的模板:
![alt text](image-6.png)
![alt text](images/image-6.png)
生成指令,直到遇到“Task 16”字符串或达到最大生成字数或模型自动停止生成。

生成指令之后,下一步,就应该生成输入和输出了。但是在此之前,先让大模型自己判断这个生成的每一个指令是否是分类问题。这里还是利用了续写能力。
![alt text](image-7.png)
![alt text](images/image-7.png)

对于是分类问题的任务,先生成输出,在基于输出生成输入;而对于非分类问题,先生成输入,基于输入生成输出。
![alt text](image-9.png)
![alt text](image-8.png)
![alt text](images/image-9.png)
![alt text](images/image-8.png)


## 2.3 指令跟随蒸馏实践
Expand Down
Loading

0 comments on commit 0699a23

Please sign in to comment.