transformer
核心是attention机制
通过三个矩阵来让模型学习出复杂的知识
Q = x * Wq
K = x * Wk
V = x * Wv
核心语义Q作为x的查询空间,K作为序列的token,去匹配相似度,即Q*KT,每个token和其他token的相关程度。
通过相似度,除于√d进行softmax计算所有相似度的权重,再乘上V获取token的空间语义
Attention(Q,K,V) = softmax(Q*KT/√d)V
之所以要除√d因为softmax对数值很敏感,需要将方差压缩到1,否则数值过大会导致其他结果都无限趋近于0。
多注意力机制
此外对于token进行多注意力机制,将token进行切分为多段,一般是8段,分别过Attention函数,过完后再合并起来,让模型分别去学习不同空间下的知识。
FFN
之后经过一个FFN前向网络让整个线性网络变成非线性网络,增加拟合能力。
这一整个模块重复多次,如大模型会有32层甚至更多,构成了transformer的encoder。
此外,输入的x通过wordEmbedding再加上序列位置信息计算出来后进入模型。wordEmbedding也是在transformer的训练过程中被训练出来的
transformer的decoder类似,在输入的时候,做了一个注意力掩码,即token只能看的见它之前的token,看不见之后的token。
后面的结果就和encoder类似。
损失函数
损失函数使用交叉熵,-∑logPi来计算。预测的越准确,loss越趋近于0,否则越趋近于无穷大. log函数优势导数简单便于计算。
而GPT类模型是decoder-only型的,通过输入token序列和当前输出的token序列一块来预测下一个token。
当输入token序列和当前输出的token序列超过窗口大小,一般做截断或者压缩等方式。
大模型训练一次成本很高,百万到上亿都有,因此更多用户使用开源的模型进行微调,即将模型调整出具有相关领域或者模式的新模型。
微调
一般有SFT和DPO两种
SFT就是有监督微调,给定输入和输出,让模型相对严格学习到输入输出知识。
SFT一般使用LoRA来训练,通过低秩的举证来改变模型。
K = x * (Wk + ΔW)来更新W,而ΔW = A B
A和B是矩阵,一般为秩为8,通过很少的参数即可微调整个大模型。LoRA一般不对整个模型W进行更新,而是对部分层进行更新,其效果和全层更新差别不大。
而DPO是偏好对齐,通过用户的偏好选择,通过 被偏好回答的概率 / 被拒绝回答的概率 的比例来更新模型的权重。
MoE
此外,通过MoE技术能够在很小的优化下让模型学习更多的知识。不同于多头注意力,是对W矩阵进行优化,MoE通过对于FFN进行优化,创建多个FFN,通过一个Gate选择分数最高的 1~2 个专家,其他不训练,这样,由于Gate的选择以及数据集的不同,不同的FFN就会训练出不同的知识能力,最终分化出一定的专业性。
kv cache
当模型训练完成后,通过kv cache技术可以加速推理的过程。每次推理,是当前Q乘[当前K,历史K],在乘[当前V,历史V],因此把历史的K和V缓存下来,可以减少大量的计算。通过Paged kv cache,将显存分片,利用碎片化的显存来缓存,提高了利用率。
量化
除此之外,Float32的模型很大,难以在低端机器上推理,通过量化技术,将Float32转化成INT4,核心是对模型的W进行缩放,把所有浮点缩放到-8 ~ +7(INT4)或者-128 ~ +127(INT8)上,通过整形数提高计算效率,推理完映射回Float32获取token的结果。
RAG
这样整个大模型基础理论就完成了。但是这时的大模型因为只学习训练的数据,对于实时或者专有的知识,效果很差,因此推出RAG技术,通过检索来增强模型回答准确定。检索可以是本地的知识库检索,也可以是远程的服务调用。
推生出langChain技术,和向量数据库技术。向量存储量知识库转化成向量分块存储在数据库中,在请求模型的时候会先在向量数据库进行匹配,以及注册的调用能力,一同拼成输入发给模型,让模型来决策该怎么做。
同时还有langGraph 技术构建有向图,让不同的agent处理不同的任务,最后生成一个结果。
与langGraph 不同,autogen主打agent的自主合作,通过定义不同agent,每次让模型选择后续由哪个agent进一步操作,来模拟真实的工作情况
多模态
另外当前只能输入文本,如何实现输入图片模型也能理解?这就涉及到多模态能力。
简单来说,文本训练后已经能转化成token序列,那图片只要也能转化成和文本相似的序列token,那模型也能理解,图像可以通过ViT训练成token,将图片按照像素进行划分,16*16像素作为一个patch,整个图片就拆成了patch序列,作为序列输入到模型里头
有了文本序列和图片序列,通过CLIP分别提取序列特征,在向量空间左对齐。
差不多就这些,先写到这里~