预训练模型

预训练模型

预训练简介

预训练:通过子监督学习从大规模数据里获取与具体任务无关的预训练模型的过程。

预训练任务:

  1. 掩码语言模型(编码器):将一些位置的token替换成特殊的[MASK]字符,预测这些被替换的字符

    image-20240602212830234

    只计算掩码部分的loss,其余部分不计算loss

  2. 因果语言模型(解码器):输入完整序列,基于上文预测当前token

    image-20240602213105457

    eos代表句子结束

  3. 序列到序列模型:编码器解码器方式,预测部分放到解码器里面

    只计算解码器的loss,不计算解码器部分

文本摘要

文本摘要:输入长文本,将长文本转成简短的摘要

任务类别:单文档单语言摘要

评价指标:Rouge-1(基于1-gram) Rouge-2(基于2-gram) Rouge-L(基于LCS)

原始文本 1-gram 2-gram
今天不错 今 天 不 错 今天 天不 不错
今天太阳不错 今 天 太 阳 不 错 今天 天太 太阳 阳不 不错

Rouge-1 P = 4/4 R=4/6 F = 2PR(P+R)

Rouge-2 P = 2/3 R=2/5

LCS(最长公共子序列) P = 4/4 R=4/6

数据处理

input和labels分开处理,labels最后一定要有eos_token

labels不仅是标签,还是解码器的输入

数据集:

对话机器人

参数微调fine-tuning

beat-fit

只对bias求梯度,其他的参数冻结

prompt-Tuning

image-20240605211808432

冻结主模型所有参数,在训练数据前加入一小段prompt,只训练prompt的embedding层。

hard prompt:指定prompt

1
2
3
4
5
6
config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM, prompt_tuning_init=PromptTuningInit.TEXT, 
prompt_tuning_init_text = "下面是一段人与机器人的对话。",
num_virtual_tokens = len(tokenizer("下面是一段人与机器人的对话。")["input_ids"]),
tokenizer_name_or_path = "Langboat/bloom-389m-zh")


soft prompt:不指定prompt,让模型自行学习 ,对模型需要进行适配多轮才能有好效果

P-Tuning

image-20240605212049075

在Prompt-Tuning基础上,对prompt部分进行进一步的编码计算,加速收敛。

1
2
3
4
5
6
7
from peft import PromptEncoderConfig, TaskType, get_peft_model, PromptEncoderReparameterizationType

config = PromptEncoderConfig(task_type = TaskType.CAUSAL_LM, num_virtual_tokens = 10,
encoder_reparameterization_type = PromptEncoderReparameterizationType.LSTM,
encoder_dropout = 0.1, encoder_num_layers = 2, encoder_hidden_size =1024
)
config

Prefix-Tuning

past_key_values:Transformer模型中历史计算过的key和value的结果,会存在重复计算,可将结果缓存。

通过past_key_values的形式将可学习的部分放到了模型中的每一层,这部分内容又称为前缀。

image-20240605214006018


预训练模型
https://wendyflv.github.io/2024/06/02/预训练模型/
作者
Wendyflv
发布于
2024年6月2日
许可协议