-
Efficient Finetuning
-
prefix tuning
针对每种任务,学习prefix vector
启发于prompting,调整上下文内容让模型去输出自己想要的内容
核心就是找到一个上下文去引导模型解决NLP生成任务
传统情况下,我们为了得到想要的结果,会人工去设计一些模版,这被称为硬模板
这种人工设计模版的方式往往需要大量尝试,所以另一种可以通过模型学习的,添加一组没有明确意义的prompt tensor的方式被提出,叫做软模板
实际实现中,就是添加了一个embedding层,形状为prefix_tokens * target_dims,
这个target_dims在p-tuing中就是直接等于hidden_size.
但是prefix-tuning在实验过程中发现这样效果并不好,于是改成在每层都加入prefix_layer,其实就是在每层的attention计算的时候,给K,V tensor(x Wk, x Wv之后的结果)前面拼接prefix tensor
通过上面等式的变换,等式的前部分是不加入prefix向量的初始attention计算的公式,后半部分则是上下文向量无关的部分。通过一个类似门的机制来计算前后两部分的比重
其实就是在原有attention中加入了一个Q tensor和k v的prefix tensor计算attention的过程,结果用门控机制做加和
关于Embedding部分,实现在了一个PrefixEncoder中,作者实验结果中得出,如果仅仅对prefix tensor做优化,结果不稳定,加入一个MLP层会更好,MLP结构就是(hs ->low_dim)+激活函数+(low_dim->hs),就是先降维再升维,训练完后仅保留MLP输出的结果
class PrefixEncoder(torch.nn.Module):
"""
The torch.nn model to encode the prefix Input shape: (batch-size, prefix-length) Output shape: (batch-size, prefix-length, 2*layers*hidden) """ def __init__(self, config: ChatGLMConfig):
super().__init__()
self.prefix_projection = config.prefix_projection
if self.prefix_projection:
# Use a two-layer MLP to encode the prefix
kv_size = config.num_layers * config. hidden_dim* 2
self.embedding = torch.nn.Embedding(config.pre_seq_len, kv_size)
self.trans = torch.nn.Sequential(
torch.nn.Linear(kv_size, config.hidden_size),
torch.nn.Tanh(),
torch.nn.Linear(config.hidden_size, kv_size)
)
else:
self.embedding = torch.nn.Embedding(config.pre_seq_len,
config.num_layers * config. hidden_dim * 2)
def forward(self, prefix: torch.Tensor):
if self.prefix_projection:
prefix_tokens = self.embedding(prefix)
past_key_values = self.trans(prefix_tokens)
else:
past_key_values = self.embedding(prefix)
return past_key_values
关于Embedding的维度,输出是hs * layer_nums*2,因为每一层都要加入prefix,所以乘上layer_nums,由于要给K V都拼接,所以乘2
self.prefix_projection用于区分是否要加入MLP结构,这也是区分Prefix tuning和p-tuningV2的一个方式,p-tuning v2中认为中重参数化的方式收益很小,选择不加入MLP层,其他部分基本和Prefix tuing一致。
具体插入过程,在huggingface实现中,是通过past_key_values的方式给巧妙地传递到每层的
Adapter tuing
Lora系列
Efficient Inference
Quantization基础
Post-training quantization (训练完后做量化然后做推理)
Quantization-aware traing(将量化的过程融合到训练里,减少量化损失)