生成式人工智能与LLM
常见基础模型:GPT,LLaMa,BLOOM,PaLM,BERT
multi-modality:多模态
传给大模型的文字:prompt
prompt可用的空间:context window
prompt传给模型,模型预测下一个词,从而得到答案
使用模型生成文本:inference
prompt+生成的文本:completion
LLM用例和任务
下一个词预测是基础
流行的应用领域:将LLM与外部数据源连接,或者调用外部API来对LLM能力进行增强
这种方式可以为模型提供在预训练中没有被训练的信息,让模型能够与模型之外的世界进行互动
基础模型规模从数十亿个参数增长到数百亿数千亿,模型具有的语言理解能力也会相应增长,从而帮助处理,推理和解决给LLM的任务
较小模型可以很好地被调优(fine tune),从而在一些特定领域的任务上表现优异
LLM能力迅速增长归功于支持他们的架构
在transformer之前生成文本
RNN在其时代非常强大,但需要大量计算和内存执行生成任务,能力受到了限制。随着可以看到前面的词的数量增加,需要的资源指数增加
2017年attention的到来改变了状况,极大增强了再生能力
transformer
transformer力量在于学习句子中所有单词的相关性和上下文的能力

tokenize 分词:将单词转化为数字,每个数字代表字典中所有可能单词的一个位置
token id可以表示一个单词也可以表示单词的一部分 e.g.teach+er
训练模型时和生成文本时的分词器必须相同
分词之后被送入embedding,这个层是可训练的向量嵌入空间,每个token都被表示为一个向量,并在空间中占据一个独特的位置,词汇表中每个token id都对应一个多维向量,向量可以学习编码输入序列中单个token的含义和上下文

除了单词自身编码外还要添加位置编码,结果传向自注意力层
多头注意力可以学习语言的不同方面,比如实体和动作之间关系,句子的活动等
不可以提前决定注意力头将学习语言的哪些方面,每个头的权重都是随机初始化的,给定足够的训练数据和时间,每个头将学习语言的不同方面
注意力权重应用到输入数据上,输出被处理通过一个全连接的前向网络,这个层的输出是一个对数向量,与分词器字典中的每一个token的概率分数成比例,softmax之后取最大
使用transformer生成文本
翻译任务是序列到序列的任务
将法语翻译为英文


1. 首先使用与训练网络时使用的同样的分词器对输入词进行分词
2. 分词被加入到网络的编码器端的输入中,通过嵌入层,然后送入多头注意力层
3. 多头注意力层的输出被送入前向网络,形成编码器(encoder)的输出,此时离开编码器的数据是输入序列的结构和含义的深层表达,这种表示被插入到解码器中间,以影响解码器的自我注意机制
4. 接下来,一个序列开始token被添加到解码器(decoder)的输入中,触发解码器预测下一个token,根据从编码器提供的上下文理解来做的。
5. decoder的自注意力层的输出通过decoder的前向网络和softmax层,获得了第一个token。
6. 继续4.5.循环,直到模型预测出序列结束token
7. 最终的token序列可以被解析为单词,得到输出的句子
有多种方式使用softmax层输出来预测下一个token,可以影响生成文字的创造性
总结:完整的transformer架构由编码器和解码器组成
编码器(encoder)将输入序列编码为输入的结构和含义的深层表示
解码器(decoder)从输入token触发器开始工作,使用编码器的上下文理解生成新的token,循环
encoder/decoder可以单独使用。
仅训练encoder输入序列输出序列长度相等。可以执行分类任务比如情感分析
仅解码器模型是最常用的模型,可以推广到大多数任务,包括GPT,BLOOM,LLaMA
encoder-decoder训练后可以执行生成式文本,e.g.BART和T5
提示和提示词工程
可能需要多次修改prompt结构和内容,以使得模型按照想要的方式行动
开发和改进prompt的工作称为提示工程 (prompt engineering)
一个策略是在promt中包含希望模型执行的任务的例子,从而产生更好的结果
在上下文窗口提供例子被称为上下文学习(in context learning)
将输入数据包含在prompt中成为零样例推断(zero-shot inference)

换成小的模型,效果不是很好

给一个例子后效果好很多(one shot inference)

给好多例子到小模型效果也很好(few shot inference)

但是要注意上下文窗口长度限制
如果promt包含了5,6个样例返回结果还是不好,应该对模型尝试微调(fine tuning)
微调是指在模型上使用新数据进行额外训练,使得模型更好去完成希望执行的任务
最大的模型在零样例推断上表现出奇好,能成功推断完成许多未被训练的任务
小模型通常只擅长少数特定任务,完成训练过的相似任务
生成配置
模型在生成时的配置参数可以影响模型生成新单词的决策

这些推理参数与训练参数(训练时间内学习)不同,在推理时被调用,可以控制completion中最大token数量以及输出内容的创造性等
大部分模型在softmax之后使用greedy策略,但是会导致重复词语序列。使用控制手段可以生成更自然更有创造性的文本。random sampling是一种方法,即随机选取可能的词语
top k 和 top p 抽样技术可以帮助限制随机抽样并增加输出有意义词语的可能
top k是指示模型只从概率最高的k个token中选择
top p是只选择概率之和不超过p的预测词 e.g. p=0.3 cake=0.2,donut=0.1,cookie=0.06,那么只会从cake和donut中选择
temperature参数决定随机性,越高越随机。temperature是缩放因子,在模型最后一个softmax层应用,影响下一个token的概率分布形状

生成式人工智能项目周期

llm严重依赖模型大小和架构(rnn,transformer)
使用指令对LLM进行微调--介绍
LLM训练之后有了丰富知识,但是可能不知道如何回应问题,指令微调有助于改变它的行为,帮助更好完成任务
用一个小数据集对模型进行微调,让它学会遵循指令
但是微调之后可能会忘记之前从大数据集中学到的内容
两种值得做的微调:指令微调,
指令微调对所有参数进行更改也很费力,可以使用参数有效的微调(PEFT),LoRA是其中一种
使用promting技术不能很好解决问题的时候可以使用LoRA或其他PEFT技术
指令微调
fine tune with instruction prompts
few shot inference对于小模型来说效果可能也不是很好,而且占用上下文窗口空间
预训练:通过自我监督学习,在大量非结构化文本数据上训练LLM
微调:有监督的学习过程,使用标签示例数据集来更新LLM权重,标签示例是一组prompt-compltion对的数据,微调过程延续了模型的训练,提高对特定任务生成好的completion的能力
模型微调示例
所有模型权重都要被更新的指令微调:全面微调。和预训练一样,全面微调需要足够计算和内存来存储和处理训练期间被更新的所有梯度,优化器和其他组件
微调的步骤:
1. 准备训练数据:一个既包含指令又包含数据集中示例的prompt
2. 像普通有监督学习一样,将数据集分为训练,验证和测试集
3. 微调过程中从训练数据集中选择提示,传给LLM,生成completion
4. 将completion与训练数据中指定的回应进行比较(completion结果的分布和训练标签的分布),使用交叉熵函数计算token分布之间的损失,使用计算出的损失来更新模型权重,是标准的反向传播。
5. 对许多批次的提示完成对进行这种操作,在几个周期内更新权重,使模型在任务上的性能得到提升
6. 用验证数据集评估性能
7. 用测试数据集完成性能评估
预训练模型经过微调过程产生新版本基础模型,称为指令模型,在感兴趣任务上表现更好
对单一任务进行微调
如果只执行单一任务,可以对基础模型进行微调,提高感兴趣任务的性能
即使例子相对较少,也可以取得好的结果(500-1000)和与训练期间数十亿文本形成鲜明对比
对单一任务微调可能出现灾难性遗忘,是因为全面微调会改变原始LLM权重,可能会降低其他任务性能
避免灾难性遗忘:
1. 确定灾难性遗忘是否真的影响到使用场景,进行多任务微调
2. 执行参数有效的微调(PEFT),保留原始LLM权重,只训练少量特定任务的适配器层和参数
多任务微调
是单任务微调的拓展
训练数据集由多个任务的示例输入和输出组成 从而避免灾难性遗忘

缺点是需要大量数据
指令模型差异取决于微调过程使用的数据集和任务
flan模型是被用于微调的一组具体指令


模型评估
rouge 和 bleu是两种用于不同任务的广泛使用用的评估指标
rouge(召回率导向的摘要评估)主要用于通过将自动生成的摘要与人工生成的摘要进行比较,来评估摘要的质量
bleu(双语评估)用于评估机器翻译文本质量,同样与人工生成翻译比较
rouge 1

rouge 2


不同任务的rouge 分数不可以比较
bleu


rouge和bleu计算成本较低,迭代模型时可以用他们作为简单参考
基准
GLUE SuperGLUE HELM MMLU涵盖了广泛的任务和场景
参数高效微调(PEFT)

全面微调对存储压力大
参数高效微调只更新一部分参数,一些路径技术冻结了大部分模型权重,专注于微调现有模型参数的子集,另一些添加少量新参数和层,不动原有参数。因此训练的参数数量远小于原始LLM参数数量
PEFT也不容易灾难性遗忘
新的参数与原始LLM权重结合进行推理,PEFT权重针对每个任务进行训练,轻松替换用于推理,从而有效将原始模型适应到多个任务
多种方法进行微调:

选择性方法只微调原始LLM参数的子集,可以选择只训练某些组件,特定层,单个参数类型
重新参数化方法使用原始LLM参数,但通过创建原始网络权重的新的低秩转换来减少要训练的参数数量,比如LoRA
加法方法保留所有原始LLM权重进行微调,并且引入新的可训练组件:适配器方法在模型的架构中添加新的可训练层,通常在编码器或解码器组件的注意力或前馈层之后。软提示方法保持模型架构的固定和冻结,并专注于操纵输入以获得更好性能,这可以通过向提示词嵌入添加可训练参数或保持输入固定并重新训练嵌入权重来完成
PEFT:LoRA
low rank adaptation 低秩适应:参数高效微调技术
全面微调中计算注意力的每个参数都被更新,LoRA冻结所有原始模型参数,在原始权重旁注入一对秩分解矩阵,从而减少微调期间需要训练的参数数量。
较小矩阵的维度设置为使其乘积是一个与他们正在修改的权重相同维度的矩阵
保持原始权重,使用与前面内容相同的监督学习过程训练较小矩阵
对于推理,两个低秩矩阵相乘,创建一个与冻结权重具有相同维度的矩阵,将这个加到原始权重上,使用更新的值替换模型中的它们。
仅将LoRA应用到自注意力层通常足以对任务进行微调和性能提升

例子:使用LoRA参数高效 其中r成为秩,为可变参数

使用LoRA训练很多任务,需要他们时切换权重,避免存储多个全尺寸的LLM

rouge分数和全面微调差距不大。计算大大减少

不同秩的影响
PEFT:软提示
22万+

被折叠的 条评论
为什么被折叠?



