🐒大模型开发(使用GPT)
type
status
date
slug
summary
tags
category
icon
password
参考资料:
1. 大模型开发工程师技术栈
📝基础知识点
GPT
Bert模型: 非任务导向的预训练方法
GPT模型: 输入提示无需对模型本身修改,基于统计学习和推理,已有的文本序列生成下一个最可能出现的单词,大规模文本数据上进行无监督预训练来学习语言的统计特征和语义表示,使用自回归 Generative Pre-training Transformer GPT是一种大模型 千亿级别 充分挖掘了大量未标注数据的潜力
GPT的发展
自然语言处理的许多任务,可以被视为“生成某种输出”的问题
大量的标注数据 缺乏通用的优化目标学习有用的文本表示
GPT 1引入了使用Transformer架构的无监督预训练方法,减少了对标注数据的依赖,让模型具备给定上文,能够继续续写下文的能力
GPT给出的解决方案就是使用相应的有标签数据进行微调
OpenAI在训练GPT3的同时,也训练了A、B、C、D四大基座模型,独立与GPT3,依次更吊
DALL·E
text-embedding-ada-002(文本向量化模型)微调往往修改的也是Embedding层
理解大模型(LLM)的涌现能力及推理能力
根据提示补全和创造文本这其实只是模型的原生能力
引爆这一轮技术革命的真正原因是:大语言模型的涌现能力
模型在没有针对特定任务进行训练的情况下,仍然能够在合理提示下处理这些任务的能力
常用的翻译、编程、推理、语义理解等,都属于大语言模型的涌现能力
激发大型语言模型的涌现能力有两种方法:提示工程prompt engineering和微调fine-tuning
开源大模型有:LLaMa, ChatGLM Alpaca MOSS miniGPT4和GPT4ALL,日新月异
📝Transformer
编码器用于学习输入序列的表示,解码器用于生成输出序列
- Transformer 中的注意力机制是如何工作的
- Decoder部分的生成式输出具体意味着什么
基本的概念
- Word Embedding: 文本中的每个单词都被转换为一个高维向量。这个转换通常是通过预训练的词嵌入模型(如Word2Vec、GloVe等)完成的
- Positional Embedding:确保编码后的词向量能准确地反映句子中词语的顺序,从而保留整个句子的原意
- Addition:词嵌入和位置嵌入相加,得到一个包含了文本信息和位置信息的新的嵌入表示。
编码器和解码器
- 编码器和解码器部分都有输入:
一般,有监督学习的场景下,编码器负责处理输入样本,而解码器处理与之对应的标签
但这里,有监督的学习环境中:编码器处理完输入样本后,它的输出会与解码器的输入进行某种形式的结合,以生成最终的翻译输出
Decoder不仅考虑了之前解码生成的词,还综合了Encoder的上下文信息,从而更准确地预测下一个词。
- 编码器:
Attention: 打个分数,以决定哪些更重要,会有一些新的数据生成
Add: 残差连接,简单的加法,经过注意力处理后的效果至少不逊于直接输入的原始数据。
Norm: “层归一化”, 为了让数据更稳定,便于后续处理。
双层的前馈神经网络: 经过注意力处理的数据映射回其原始的维度,保持维度,编码器会被多次堆叠
设计目的:
Transformer的编码器就是通过这些步骤来理解和处理输入的数据,然后输出一种新的,更容易理解的数据形式
- 解码器:
生成输出序列
带遮罩(masked)的注意力(Attention):只能关注到它之前已经生成的词,而不能看到未来的词
融合: 注意力机制下的融合,这个过程之后,解码器的操作与编码器部分大致相同
Transformer模型中的解码器(Decoder),其主要任务是预测下一个输出词,所以称它为生成式模型。
输出
- 线性层(Linear)。将向量映射到预先定义的词典大小,从而准备进行词预测。
- softmax函数计算每个词的生成概率。选取概率最高的词作为该时刻的输出。
注意力机制
- 词都会相互进行关系亲密性的确认。核心就是要做重构词向量,融合
- 三要素:
- Q:即query,可以理解为某个单词像其它单词发出询问
- K:即Key,可以理解为某个单词回答其它单词的提问
- V:即Value,可以理解为某个单词的实际值,表示根据两个词之间的亲密关系,决定提取出多少信息出来融入到自身
- 在Transformer模型中,Q、K和V是通过输入向量表示Transformer(x)与相应的权重矩阵Wq,Wk,Wv(训练这三个矩阵)进行矩阵运算得到的
这些权重矩阵最初是通过数学方法进行初始化的,然后在模型多轮训练的过程中逐渐更新和优化。目标是使得传入的数据与这些权重矩阵相乘后,能够得到最优化的Q、K和V矩阵。
- Q K V矩阵的意义
第一行包含了第一个词(与输入X的第一行对应)在查询其他词时所需的关键信息。
而在V矩阵的第一行,所包含的是第一个词自身携带的信息。
在通过Q和K确定了与其他词的关系后,这些存储在V中的信息被用来重构该词的词向量。
Q(查询)、K(键)和V(数值)矩阵是通过对输入序列的词嵌入进行线性变换得到的
- 得到了Q,K,V之后,softMax
Q*K的转置:词与词之间关系的紧密程度,血马大,衡量输入序列中不同位置上的词与词之间的关系紧密程度。
Attention机制中这种Q和K一问一答的形式,通过内积的方式,来衡量两个词之间的相似性
为什么对自己的提问也给了回答:不对自己的信息进行重构的话,它可能就没有办法理解代词,也就是因为这种操作,所以在Transformer中的注意力机制被叫做Self-Attention
Softmax函数来对每一行进行归一化处理:行中所有元素的和为1。
得到的就是位置 i 对其他位置的注意力权重分布,即模型在编码和解码时对不同位置的侧重程度
假如经过Softmax处理后,第一行变成了某种分数形式,例如:0.4,0.2,0.2,0.1,那么这意味着将用第一个词的40%的信息、第二个词的20%的信息....来构建目标词的新表示。这样,Softmax操作实质上是在量化地衡量各个词的信息贡献度。
最后一步: 重构V 与 V相乘
理解GPT的生成式
- Decoder中的Attention与Encoder中的Attention有什么不同,Mask (QK^T) 最终用于重构V矩阵的不依赖后面的词
理解什么是Cross Attention: 加上输入的
Q来自于解码器的输出,而K和V来自于编码器的输出,可以问编码器的信息
第一步是类似于“自己对话”的方式,这被称作Masked Self-Attention。这确保解码器在“猜”某个词时只参考前面的词。
接着是第二步,叫做Cross Attention或“交叉对话”。这里,解码器会“询问”编码器关于原始句子(例如:“我是一个学生”)的信息。这就像解码器问编码器:“你认为我接下来应该说什么?”然后编码器给出建议,例如:“接下来应该是‘I’”。这样,解码器就能更好地完成翻译任务。
所以,简单说,第一步是解码器和自己“对话”,确定应该问什么问题。第二步是向编码器“提问”,得到答案,并继续翻译。这就是Decoder的两步注意力机制的工作原理。
📝OpenAI开发实践
Completions
- OpenAI的在线大模型也并没有类似机器学习领域的随机数种子的参数设置,生成式大模型的输出结果往往是不确定且难以复现的。
虽然理论上,当
temperature
设为0时,模型会在每个步骤中始终选择概率最高的下一个token,使得输出变得更加确定和一致。但实际上,由于模型内部计算的精度限制、舍入误差等因素,仍然不能保证输出结果的完全一致性。- presence_penalty:精炼程度,[-2,2]中取值,数值越大,返回结果越精炼
- temperature:0-2之间,默认值为1,数值越大模型随机性越大,影响极大,建议[0.8,1.2],大值可以当成启发性。
- best_of:让模型预测多组结果,并择优进行输出。
OpenAI Chat
- Completion模型核心功能是根据提示(prompt)进⾏提示语句的补全。
- Chat模型升级的核心功能是对话,它基于大量高质量对话文本进行微调
• 用messages参数代替了prompt参数,使之更适合能够执行对话类任务
• 新增functions和function_call参数,使之能够在函数内部调用其他工具的API
- 其他核心参数完全一致,例如temperature、top_p、max_tokens、n、presence_penalty等参数的解释和使用方法都完全一致,且这些参数具体的调整策略也完全一致.
- 剔除了best_of参数,即Chat模型不再支持从多个答案中选择一个最好的答案这一功能
顺序不能乱
- CoT(
'请一步步思考并解决问题'
)和LtM('为了解决当前这个问题,请列举先要解决的问题,并逐步解决原问题。'
)
- 技巧:
- 使用Few-Shot提示法来格式化输出,给些样例
- system role进行Few-shot
如借助多轮user-assistant消息进行few-shot,使用system role进行Few-shot
Function calling
- 用外部API的能力,简单理解就是:根据业务场景,自动选择对应的功能函数,并格式化输出.
- Chat Completion模型具有函数调用(Function Calling)能力
- 函数库对象必须是一个字典。函数接受的参数,以 JSON Schema 对象的形式描述
- 借助JSON格式进行跨函数和跨编程环境的通信
- 使用示例
JSON Schema(参数)
构建外部函数的JSON Schema
真正调用的时候
- 注意:
构建外部函数库 --> 使用functions参数传递函数信息 --> 加载Function Calling功能
如果大模型的返回结果中包含function_call关键词,表示这条assistant消息需要调用外部函数。
这条消息仍然是assistant传来的消息,只不过这条消息不包含content,而是包含function_call关键词,function_call关键词也是messages参数可以包含的备选关键词之一。
📝优化
提示工程
- 提示工程和微调fine-tuning
- 优势:可以让模型永久的强化某方面能力。
- 劣势:需要重新训练模型部分,训练成本较大,需要精心准备数据,技术实施难度更大。
例如要进行本地知识库的定制化问答,最好的方法就是借助提示工程进行数据标注,然后再利用标注好的数据进行微调。
- 思维链(CoT):将复杂任务拆解为多个简单的子任务,step by step
- 通过 few-shot 的提示方式,产生大量可以用于微调模型的有标签的数据集。
- 提示工程的根本目的就是提升模型的推理能力。未见过的东西
- 优势:它是一种更加轻量级的引导方法,尝试和实施的门槛更低。
- 优劣势:受限于模型对话上下文限制,提示量有限
- 真正需要的
- 有效地指导模型思考。
- 依赖人工经验和技术创新构造复杂串联或嵌套的提示流程
- 方法:
- 代码提示工程
- • 在zero-shot、one-shot、few-shot 上,规模越大,效果越好,zero-shot可以理解为:不给大模型任何的提示,直接提问
组合泛化
- 组合泛化作为其特定领域涌现能力的基准
- (LtM提示法)是截至目前围绕模型推理能力提升的最为有效的提示学习方法
- 组合泛化是指利用既有的知识去理解或生成从未见过的组合。
- SCAN数据集:测试模型在组合泛化方面的能力。
顺序组合性、抽象化和泛化,它被设计的初衷是为了评估神经网络模型在组合泛化方面的能力
这个数据集存在一定的“黑箱”性质,标签不一定对应意义,能很好的测试出其能否找到这个隐藏的语法规则
难度大:
预测模型不能仅依赖于表面层次的统计规律或者局部的模式匹配来进行预测,必须理解和掌握数据的底层结构和规则。
具备强大的组合泛化能力,即只通过少量数据集的训练,就需要理解没有直接见过的组合指令并执行正确的行动序列。
- 简单理解就是将简单的指令翻译为一系列动作,例如指令 "walk twice" 应该被翻译为 "WALK WALK”
上一篇
PyTorch进阶
下一篇
大模型提高(训练量化微调)
Loading...