1.llm_aigc
下载本文pdf:https://github.com/daiwk/collections/blob/master/pdfs/llm_aigc.pdf
各种学习相关代码
https://github.com/daiwk/llms_new
从word2v到Transformer
LSTM
fasttext&word2vec
注:w2v训练时的内积不是2个emb-in的内积,而是emb-in和emb-out的内积
Dictionary::readWord
:空格分割,一次读出来一个wordDictionary::add
:每个word求个hash,加进词典时,id就是从0开始的序号,同时记录一下词频Dictionary::threshold
:按词频排序,扔掉低频词Dictionary::initNgrams
:每个词,加上前缀BOW(<)和后缀(>),然后先扔进这个词的subwords里,然后再调用Dictionary::computeSubwords
把这个词的ngrams也扔进它的subwords里
整个词表,是word数+bucket这么大,其中bucket表示可容纳的subwords和wordNgrams的数量,默认200w
为什么Word2Vec训练中, 需要对负采样权重开3/4次幂?
Distributed Representations of Words and Phrases and their Compositionality里提到
通过对权重开3/4次幂,可以提升低频词被抽到的概率。在保证高频词容易被抽到的大方向下,通过权重3/4次幂的方式,适当提升低频词、罕见词被抽到的概率。如果不这么做,低频词,罕见词很难被抽到,以至于不被更新到对应的Embedding。
BPE/WordPiece分词
【Subword】深入理解NLP Subword算法:BPE、WordPiece、ULM
Transformer原理
http://jalammar.github.io/illustrated-transformer/
Transformers Assemble(PART I) 讲了3篇
Transformers Assemble(PART II) 又讲了三篇
为什么层次化softmax没人用了
Transformer 结构中最后一层 softmax 为什么不再使用 层次化softmax了呢?
主要还是计算资源的问题。
Mikolov发明word2vec的几个版本大概在13-14年前后。那个时候GPU非常少见,印象里面CMU的NLP组没有GPU,Stanford NLP lab只有6块K40。
大规模直接算softmax是在google的14年那篇seq2seq做MT的文章。为了快,把一个softmax并行在4块GPU上,每个GPU负责四分之一。那个年代,大多数NLP组全组都不会有4块GPU。
hierarchical softmax是softmax的近似,suboptimal的。当如今计算资源足够大的时候,当然包括时间和显存 (BERT 和 Elmo 都没有用hierarchical),hierarchical softmax就逐渐退出了历史舞台。
Transformer会不会规划未来
Do Language Models Plan for Future Tokens?
在训练期间的梯度既会为当前token位置的损失优化权重,也会为该序列后面的token进行优化,那么这二者会以怎样的比例分配资源?
预缓存假设(pre-caching hypothesis):在时间步计算与当前时间步的推理任务无关但可能对未来时间步有用的特征
面包屑假设(breadcrumbs hypothesis):与时间步最相关的特征已经等同于将在时间步最有用的特征。
设计了一种合成场景,其中只能通过显式的预缓存完成任务,即模型必须为下一token预先计算信息,**否则就无法在一次单向通过中准确计算出正确答案。**发现明显的证据说明transformer可以学习预缓存,即当必须预计算信息来最小化损失时,它们就会这样做。
但在真实语言数据上,语言模型并不会显著地准备用于未来的信息。相反,它们是计算对预测下一个token有用的特征——事实证明这对未来的步骤也很有用。
PLM:仅编码器/仅解码器/编码器+解码器
仅编码器的BERT
BERT小学生级上手教程,从原理到上手全有图示,还能直接在线运行
主要讲了下面3篇:
Language Models as Knowledge Bases?
Linguistic Knowledge and Transferability of Contextual Representations
What does BERT learn about the structure of language?
A Primer in BERTology: What we know about how BERT works
摘要:目前,基于 Transformer 的模型已经广泛应用于自然语言处理中,但我们依然对这些模型的内部工作机制知之甚少。在本文中,来自麻省大学洛威尔分校的研究者对流行的 BERT 模型进行综述,并综合分析了 40 多项分析研究。他们还概览了对模型和训练机制提出的改进,然后描画了未来的研究方向。
Pre-trained Models for Natural Language Processing: A Survey
ALBERT、XLNet,NLP技术发展太快,如何才能跟得上节奏?
绝对干货!NLP预训练模型:从transformer到albert
ALBERT一作蓝振忠:预训练模型应用已成熟,ChineseGLUE要对标GLUE基准
BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南!
multi-head att 实现
输入原始的query(即from_tensor)之后, 把[batch, from_seq, emb]
变成[?, emb]
,其中?=batch*from_seq
然后再接一个fc,把[?, emb]
变成[?, head_num * per_head]
,一般head_num * per_head=emb
。
因为?=batch*from_seq
,所以可以直接做如下变换
实际就是把?
拆开成batch, from_seq
,整个变成[batch, from_seq, head_num, per_head]
,然后做了个 transpose,把1和2互换了下,得到[batch, head_num, from_seq, per_head]
然后key也做完全一样的操作(不过处理的是to_tensor,如果是self-attention,那to_tensor=from_tensor), 得到[batch, head_num, to_seq, per_head]
:
然后就算了,注意这里对key取了转置,也就是[batch, head_num, from_seq, per_head]
乘以[batch, head_num, per_head, to_seq]
,得到的结果是[batch, head_num, from_seq, to_seq]
:
然后看下value的操作:
再确认一点,是[batch, head_num, from_seq, to_seq]
,而是[batch, head_num, to_seq, per_head]
,所以context_layer是[batch, head_num, from_seq, per_head]
最后,再搞一下,变回[batch, from_seq, head_num * per_head]
:
如上过程是,其中。包装在了函数attention_layer
之中,我们注意到原文还有一个大小为的,也就是大小为,再看看源码。。也就是说,正常的bert里,attention_heads
就只有一个元素,然后接了个hidden_size
的fc,而前面的代码里也提到了hidden_size
正好就是,所以这就是。
关于 mask,可以看看这个https://juejin.im/post/5b9f1af0e51d450e425eb32d
摘抄一下:
什么是padding mask呢?回想一下,我们的每个批次输入序列长度是不一样的!也就是说,我们要对输入序列进行对齐!具体来说,就是给在较短的序列后面填充0。因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。 具体的做法是,把这些位置的值加上一个非常大的负数(可以是负无穷),这样的话,经过softmax,这些位置的概率就会接近0!
而sequence mask是为了使得decoder不能看见未来的信息。也就是对于一个序列,在time_step为t的时刻,我们的解码输出应该只能依赖于t时刻之前的输出,而不能依赖t之后的输出。因此我们需要想一个办法,把t之后的信息给隐藏起来。 那么具体怎么做呢?也很简单:产生一个上三角矩阵,上三角的值全为1,下三角的值权威0,对角线也是0。把这个矩阵作用在每一个序列上,就可以达到我们的目的啦。
masked-language-model的实现
如下,其中hidden_size
就是是:
其中的gather如下:
注意调用时传的是如下参数
BERT的可解释性
What does BERT learn about the structure of language?
探索BERT深层次的表征学习是一个非常有必要的事情,一是这可以帮助我们更加清晰地认识BERT的局限性,从而改进BERT或者搞清楚它的应用范围;二是这有助于探索BERT的可解释性
更复杂的BERT
Bert时代的创新(应用篇):Bert在NLP各领域的应用进展
中文BERT
WWM
哈工大讯飞联合实验室发布基于全词覆盖的中文BERT预训练模型
https://github.com/ymcui/Chinese-BERT-wwm
论文:Pre-Training with Whole Word Masking for Chinese BERT
ERNIE
参考中文任务全面超越BERT:百度正式发布NLP预训练模型ERNIE
ERNIE: Enhanced Representation through Knowledge Integration
使用entity-level masking和phrase-level masking两种mask方法
输入的每个样本由5个 ';' 分隔的字段组成,数据格式:
token_ids
sentence_type_ids:两句话,第一句都是0,第二句都是1
position_ids
seg_labels:分词边界信息: 0表示词首、1表示非词首、-1为占位符, 其对应的词为 CLS 或者 SEP;
next_sentence_label
例如:
和bert在mask上的区别:
一个句子的不同level的mask方式:
ERNIE 2.0: A CONTINUAL PRE-TRAINING FRAMEWORK FOR LANGUAGE UNDERSTANDING
跨语言
XLM
Massively Multilingual Sentence Embeddings for Zero-Shot Cross-Lingual Transfer and Beyond,XLM的主要思想还是来自于这篇文章,借用了BERT的框架最后成了XLM。本文提出了LASER(Language-Agnostic SEntence Representations)
XLM:facebook提出Cross-lingual Language Model Pretraining,加了language emb
无监督的方法:只依赖单语种数据(monolingual data)
有监督的方法:对平行语料使用新的跨语言loss
Facebook最新语言模型XLM-R:多项任务刷新SOTA,超越单语BERT
XLM-R
Unsupervised Cross-lingual Representation Learning at Scale
来自facebook。针对多种跨语言的传输任务,大规模地对多语言语言模型进行预训练可以显著提高性能。在使用超过 2TB 的已过滤 CommonCrawl 数据的基础上,研究者在 100 种语言上训练了基于 Transformer 的掩模语言模型。该模型被称为 XLM-R,在各种跨语言基准测试中,其性能显著优于多语言 BERT(mBERT),其中 XNLI 的平均准确度为+ 13.8%,MLQA 的平均 F1 得分为+ 12.3%,而 FQ 的平均 F1 得分为+ 2.1% NER。XLM-R 在低资源语言上表现特别出色,与以前的 XLM 模型相比,斯瓦希里语(Swahili)的 XNLI 准确性提升了 11.8%,乌尔都语(Urdu)的准确性提升了 9.2%。研究者还对获得这些提升所需的关键因素进行了详细的实证评估,包括(1)积极转移和能力稀释;(2)大规模资源资源的高低性能之间的权衡。最后,他们首次展示了在不牺牲每种语言性能的情况下进行多语言建模的可能性。XLM-Ris 在 GLUE 和 XNLI 基准测试中具有强大的单语言模型,因此非常具有竞争力。
更长序列
transformer-xl
Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
最简单的处理长文本方法:对长文本直接切成多个segment,每个segment独立过transformer,segment间是没有信息流动的
transformer-xl的处理方法:参考RNN的隐藏记忆单元,对上一个segment计算的隐藏状态序列进行fixed和cached,并在模型处理下一个新的segment时将其缓存为可重用的扩展上下文。
如图,第k+1层的第i个元素,用到了第k层的第i-1, i-2, ...,i - segment_len+1这几个元素,所以对于最顶层的来讲,实际看到的窗口就更长了。为此还提出了相对位置编码,即使用两个token的相对距离代替之前的绝对位置。
此外,Stabilizing Transformers for Reinforcement Learning说明了为什么标准的transformer架构很难在强化学习中优化。研究者同时提出了一种架构Gated Transformer-XL(GTrXL),可以很好地提升transformer架构和变体的稳定性,并加速学习,可以超过LSTM,在多任务学习 DMLab-30 基准上达到 SOTA 的水平。
XLNet
20项任务全面碾压BERT,CMU全新XLNet预训练模型屠榜(已开源)
XLNet: Generalized Autoregressive Pretraining for Language Understanding
代码:https://github.com/zihangdai/xlnet
自回归(autoregressive, AR):主要的论文有这几篇:Semi-supervised sequence learning、Deep contextualized word representations、Improving language understanding by generative pre-training。通过一个autoregressive的模型来估计文本语料库的概率分布。也就是给定一个文本序列,AR将likelihood因式分解(factorize)成一个前向的乘积,或者是一个后向的乘积。由于 AR 语言模型仅被训练用于编码单向(uni-directional)语境(前向或后向),因而在深度双向语境建模中效果不佳。而下游语言理解任务通常需要双向语境信息,导致 AR 语言建模无法实现有效预训练。
自编码(autoencoding, AE):相关的预训练模型不会进行明确的密度估计(explicit density estimation),而是从残缺的(corrupted)输入中重建原始数据。例如bert,使用一定比例的
[MASK]
,然后预测被mask掉的是什么东西。由于目标并不是密度估计,所以在重建的时候,可以考虑双向的上下文信息。但存在如下两个问题:finetune时的真实数据缺少预训练期间使用的
[MASK]
这些mask信息,这导致预训练和微调效果的差异(pretrain-finetune discrepancy)。输入中要预测的token是被mask掉的,所以无法像AR那样使用乘积rule来建立联合概率分布。也就是说,给定未mask的 token,BERT假设预测的token之间彼此独立,这其实是对自然语言中普遍存在的高阶、长期依赖关系的一种过度简化。
基于这些优缺点,提出了一种泛化的自回归预训练模型XLNet:
Permutation Language Model(PLM):在自回归LM模式下,最大化所有可能的因式分解顺序的对数似然,学习双向语境信息;
把原来的
[MASK]
这个token干掉了,转而用attention mask来搞引入了排列:即原来是1234,可以输入3241,这个时候改一下mask就行
引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制,实践已经证明这两点对于长文档任务是很有帮助的
更多的任务
MT-DNN
Multi-Task Deep Neural Networks for Natural Language Understanding
其他改进
RoBERTa
参考重回榜首的BERT改进版开源了,千块V100、160GB纯文本的大模型
RoBERTa: A Robustly Optimized BERT Pretraining Approach
修改了一些超参
删掉nsp任务
更大的batchsize和学习率
RoBERTa中文预训练模型,你离中文任务的「SOTA」只差个它
https://github.com/brightmart/roberta_zh
DeBERTa
Deberta: Decoding-enhanced bert with disentangled attention
disentangled attention mechanism:每个词使用2个向量,编码内容,编码相对位置,i和j间的attention如下:
预训练:使用enhanced mask decoder,把绝对位置信息引入解码层,来预估被mask掉的token
finetune:virtual adversarial training
ELECTRA
2019最佳预训练模型:非暴力美学,1/4算力超越RoBERTa
ELECTRA: 超越BERT, 19年最佳NLP预训练模型
ELECTRA: pre-training text encoders as discriminators rather than generators
使用新的预训练task:RTD(replaced token detection):
使用一个生成网络采样出token,替换一些原有的token
训练一个判别模型,预估一个token是否是被替换的
RTD比MLM更sample-efficient,因为RTD只做二分类,而MLM需要做全词表的softmax
sentence Transformers
Matryoshka representation learning
俄罗斯套娃嵌入模型旨在将更重要的信息存储在早期的维度中,将不太重要的信息存储在后面的维度中。俄罗斯套娃嵌入模型的这一特点允许我们截断模型产生的原始 (大) 嵌入,同时仍保留足够的信息以在下游任务上表现良好。
https://sbert.net/examples/training/matryoshka/README.html
训练时:
预测时
注意,如果嵌入已经归一化,那么在截断后它们将不再归一化,因此你可能需要重新归一化。
更小的BERT
BERT 瘦身之路:Distillation,Quantization,Pruning
albert
刚刚,Google发布24个小型BERT模型,直接通过MLM损失进行预训练
谷歌ALBERT模型V2+中文版来了:之前刷新NLP各大基准,现在GitHub热榜第二
超小型BERT中文版横空出世!模型只有16M,训练速度提升10倍
https://github.com/brightmart/albert_zh
预训练小模型也能拿下13项NLP任务,谷歌ALBERT三大改造登顶GLUE基准
ALBERT 模型在 GLUE、RACE 和 SQuAD 基准测试上都取得了新的 SOTA 效果,并且参数量还少于 BERT-large。
ALBERT: a lite bert for self-supervised learning of language representations
通过对词嵌入矩阵进行因式分解,再为下游任务共享不同层的所有参数,这样可以大大降低 BERT 的参数量。
还提出了一种新型句间连贯性损失函数,它可以强迫模型学习句间的连贯性表达,从而有利于各种下游 NLP 任务。
ALBERT 通过两个参数削减技术克服了扩展预训练模型面临的主要障碍。
对嵌入参数化进行因式分解:将大的嵌入矩阵分解为两个小的矩阵,从而将隐藏层的大小与词汇嵌入的大小分离开来。这种分离使得隐藏层的增加更加容易,同时不显著增加词汇嵌入的参数量。
跨层参数共享:避免参数量随着网络深度的增加而增加。
两种技术都显著降低了 BERT 的参数量,同时不对其性能造成明显影响,从而提升了参数效率。ALBERT 的配置类似于 BERT-large,但参数量仅为后者的 1/18,训练速度却是后者的 1.7 倍。这些参数削减技术还可以充当某种形式的正则化,可以使训练更加稳定,而且有利于泛化。
为了进一步提升 ALBERT 的性能,还引入了一个自监督损失函数,用于句子级别的预测(SOP)。SOP 主要聚焦于句间连贯,用于解决原版 BERT 中下一句预测(NSP)损失低效的问题。
albert_tiny:
input_ids先查word_embeddings(\(V\times E=21118*128)
),得到dim=128的表示,再查word_embeddings_2(\(E\times M =128*312\)
),得到dim=312的表示。
搞positionembedding时,并不用输入0 1 2...,只需要做一些slice的变换就行了
然后会通过create_attention_mask_from_input_mask把input_ids和input_mask搞一下,得到attention_mask去和attention做mask,主要是算loss啥的,把后面的mask掉不算
distillbert
1.4w个stars。。
https://huggingface.co/transformers
DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
tinybert
TinyBERT:模型小7倍,速度快8倍,华中科大、华为出品
TinyBERT: Distilling BERT for Natural Language Understanding
提出了一个two-stage learning framework,在pre-training阶段和task-specific阶段都进行distill。
相比baseline,只有28% parameters和31%的inference时间
在glue上,7.5x小,infer上有9.4x快。
NEZHA: Neural Contextualized Representation for Chinese Language Understanding
https://github.com/huawei-noah/Pretrained-Language-Model
reformer
哈希革新Transformer:这篇ICLR高分论文让一块GPU处理64K长度序列
Reformer: The Efficient Transformer
https://github.com/google/trax/blob/master/trax/models/research/reformer.py
大型的 Transformer 往往可以在许多任务上实现 sota,但训练这些模型的成本很高,尤其是在序列较长的时候。在 ICLR 的入选论文中,我们发现了一篇由谷歌和伯克利研究者发表的优质论文。文章介绍了两种提高 Transformer 效率的技术,最终的 Reformer 模型和 Transformer 模型在性能上表现相似,并且在长序列中拥有更高的存储效率和更快的速度。论文最终获得了「8,8,6」的高分。在最开始,文章提出了将点乘注意力(dot-product attention)替换为一个使用局部敏感哈希(locality-sensitive hashing)的点乘注意力,将复杂度从 O(L2 ) 变为 O(L log L),此处 L 指序列的长度。此外,研究者使用可逆残差(reversible residual layers)代替标准残差(standard residuals),这使得存储在训练过程中仅激活一次,而不是 n 次(此处 n 指层数)。最终的 Reformer 模型和 Transformer 模型在性能上表现相同,同时在长序列中拥有更高的存储效率和更快的速度。
大幅减少GPU显存占用:可逆残差网络(The Reversible Residual Network)
LTD-bert
内存用量1/20,速度加快80倍,腾讯QQ提出全新BERT蒸馏框架,未来将开源
Q-bert
AAAI 2020 | 超低精度量化BERT,UC伯克利提出用二阶信息压缩神经网络
Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT
Adabert
推理速度提升29倍,参数少1/10,阿里提出AdaBERT压缩方法
AdaBERT: Task-Adaptive BERT Compression with Differentiable Neural Architecture Search
仅解码器的GPT
GPT
2018年的Improving language understanding by generative pre-training,生成式预训练(Generative pre-training, gpt),用transformer的decoder,参数量117m(0.1b),无监督预训练和有监督微调。
微调阶段为每种下游任务专门设计:
分类:输入一段文本,经过transformer,最后接一个Linear
entailment(蕴含):输入2段文本,premise(假设)和hypothesis(假说),经过transformer,最后接一个Linear
相似度:输入2段文本a和b,a+b过transformer,b+a过transformer,再合起来接一个Linear
多选题:输入context+答案1过transformer+Linear,答案2、答案3同样操作,将3个输出合在一起求softmax
GPT2
2019年的Language models are unsupervised multitask learners模型结构小改,增加数据,参数量变大为15亿(1.5b),无监督语言建模。
layernorm前移到每个sub-block之前
additional layernorm在最后的self-attention block才加上
修改初始化方法,以考虑残差路径上的累积并缩放残差层的权重
15亿参数最强通用NLP模型面世!Open AI GPT-2可信度高于所有小模型
中文GPT2
https://github.com/imcaspar/gpt2-ml
https://colab.research.google.com/github/imcaspar/gpt2-ml/blob/master/pretrained_model_demo.ipynb
huggingface的distill gpt-2:https://github.com/huggingface/transformers
编码器+解码器
T5
谷歌T5模型刷新GLUE榜单,110亿参数量,17项NLP任务新SOTA
谷歌最新T5模型17项NLP任务霸榜SuperGLUE,110亿参数量!
Exploring the limits of transfer learning with a unified text-to-text transformer
将所有NLP任务都建模成text-to-text的生成任务,
mT5(mt5: A massively multilingual pre-trained text-to-text transformer)是T5的变种,基于新的Common Crawl的数据集(包括101种语言)上预训练
MASS
MASS: Masked Sequence to Sequence Pre-training for Language Generation
bert只使用了Transformer的encoder部分,其下游任务也主要是适用于自然语言理解(NLU),对于类似文本摘要、机器翻译、对话应答生成等自然语言生成(NLG)任务显然是不太合适的。MASS 采用了编码器-解码器框架,并尝试在给定部分句子的情况下修复整个句子。MASS输入句子包含了一些连续的 Token,并且中间会带有一些连续的Mask,模型的任务是预测出被Mask掉的词是什么。相比 BERT 只有编码器,MASS 联合训练编码器与解码器,能获得更适合机器翻译的表征能力。
训练步骤主要分为两步:
Encoder: 输入为被随机mask掉连续部分token的句子,使用Transformer对其进行编码;这样处理的目的是可以使得encoder可以更好地捕获没有被mask掉词语信息用于后续decoder的预测;
Decoder: 输入为与encoder同样的句子,但是mask掉的正好和encoder相反,和翻译一样,使用attention机制去训练,但只预测encoder端被mask掉的词。该操作可以迫使decoder预测的时候更依赖于source端的输入而不是前面预测出的token,防止误差传递。
BART
多项NLP任务新SOTA,Facebook提出预训练模型BART
BART是一个适用于seq2seq模型的去噪自编码器。预训练包括两个阶段:
使用任意噪声函数破坏文本
用seq2seq模型来重建原始文本
LLM概述
PLM(pretrained language models),即bert等
LLM简史
2017年的Learning to generate reviews and discovering sentiment尝试用rnn来实现智能系统
2018年的gpt1:Improving language understanding by generative pre-training,生成式预训练(Generative pre-training, gpt),用transformer的decoder,参数量117m(0.1b),无监督预训练和有监督微调。确定对自然语言文本建模的基本原则为预测下一个单词。
2019年的gpt2:Language models are unsupervised multitask learners模型结构小改,增加数据,参数量变大为15亿(1.5b),无监督语言建模,无需使用标记数据进行显式微调。
提出“由于特定任务的有监督目标与无监督目标(语言建模)相同,只是在序列的子集上进行评估,因此,无监督目标的全局最小值也是有监督目标的全局最小值”,即每个NLP任务可以看作世界文本子集的单词预测问题,如果模型有足够能力来复原世界文本,无监督语言建模可以解决各种问题。
仅无监督与监督微调的SOTA相比效果还是不太行。虽然GPT2模型规模相对较小,但如对话等任务在其基础上做微调还是能拿到很好的效果的,例如DIALOGPT : Large-scale generative pre-training for conversational response generation、End-to-end neural pipeline for goal-oriented dialogue systems using GPT-2
2020年的gpt3:Language models are few-shot learners,175b(1750亿)参数,当参数量到达千亿时出现了『涌现』现象,发现可以in-context learning(这点在3.3亿的BERT和15亿的gpt2中看不到)。预训练和ICL有相同的语言建模范式:预训练预测给定上下文条件下的后续文本序列,ICL预测正确的任务解决方案,其可被格式化为给定任务描述和示范下的文本序列。
GPT-3的两种改进方法:
使用代码数据训练:GPT-3主要问题是缺乏对复杂任务的推理能力,2021年openai提出了Codex(Evaluating Large Language Models Trained on Code),在github代码上微调的GPT。A neural network solves and generates mathematics problems by program synthesis: Calculus, differential equations, linear algebra, and more发现Codex能解决非常困难的编程问题,还能在数学问题上有显著提升。Text and code embeddings by contrastive pre-training提出了训练文本和代码emb的对比学习,在线性探测分类、文本搜索、代码搜索等任务上有所提升。GPT-3.5就是在基于代码的GPT(code-davinci-002)的基础上开发的。
与人类对齐:2017年openai就在learning from human preference的博客中提出了应用强化学习来学习由人类标的偏好比较,此后2021年7月openai发表了PPO。2020年GPT-2用RL进行微调,Deep reinforcement learning from human preferences,Learning to summarize from human feedback也做了相似工作。2022年提出了RLHF的InstructGPT(Training language models to follow instructions with human feedback),其中的SFT就对应于常说的指令微调。在openai的博客Our approach to alignment research中提出了训练AI系统的3个有前途的方向:使用人类反馈、协助人类评估、做对齐研究。
2022年的ChatGPT:用类似InstructGPT的方式进行训练,专门对对话能力进行优化,将人类生成的对话(扮演用户和AI两个角色)与InstructGPT数据集结合起来以对话形式生成。
2023年的GPT-4:将文本输入扩展到多模态信号。此外,
提升安全性:在RLHF训练中加入额外的安全奖励信号,采用多种干预策略如Anthropic提出的Red teaming language models to reduce harms: Methods, scaling behaviors, and lessons learned提到的红队评估(read teaming)机制以减轻幻觉、隐私和过度依赖问题。
改进的优化方法:使用可预测扩展(predictable scaling)的机制,使用模型训练期间的一小部分计算量以预测最终性能。
迭代部署的工程方案:Lessons learned on language model safety and misuse,遵循5阶段的开发和部署生命周期来开发模型和产品。
LLM列表(持续更新中)
百亿:除了LLaMA(最大650亿)和NLLB(最大545亿),大多数在100亿-200亿之间,通常需要数百甚至上千个GPU或TPU。
千亿:OPT、OPT-IML、BLOOM和BLOOMZ与GPT-3(175B)大致相同,GLM有1300亿,Galactica有1200亿,通常需要数千个GPU或者TPU。
ckpt? | 模型 | 发布时间 | 大小 | 预训练数据规模 | 硬件 | 训练时间 |
---|---|---|---|---|---|---|
Y | 2019.10 | 11B | 1万亿tokens | 1024 TPU v3 | - | |
N | 2020.05 | 175B | 3000万亿tokens | - | - | |
N | 2020.06 | 600B | 1万亿tokens | 2048 TPU v3 | 4天 | |
Y | 2020.10 | 13B | 1万亿tokens | - | - | |
Y | 2021.04 | 13B | 1.1TB | 2048 Ascend 910 | - | |
Y | 2021.06 | 198B | 2.6TB | - | - | |
N | 2021.07 | 12B | 1000万亿tokens | - | - | |
N | 2021.07 | 10B | 3750亿tokens | 384 v100 | - | |
N | 2021.08 | 178B | 3000亿tokens | 800 GPU | - | |
N | 2021.09 | 82B | 3000亿tokens | 1024 A100 | 13.4天 | |
N | 2021.09 | 137B | - | 128 TPU v3 | 60小时 | |
N | 2021.10 | 245B | 1800亿tokens | 2128 GPU | - | |
Y | 2021.10 | 11B | - | 512 TPU v3 | 27小时 | |
N | 2021.12 | 52B | 4000亿tokens | - | - | |
N | 2021.12 | 175B | - | - | - | |
N | 2021.12 | 280B | 3000亿tokens | 4096 TPU v3 | 920小时 | |
N | 2021.12 | 260B | - | - | - | |
N | 2021.12 | 1200B | 2800亿tokens | 1024 TPU v4 | 574小时 | |
N | 2022.01 | 137B | 7680亿tokens | 1024 TPU v3 | 57.5天 | |
N | 2022.01 | 530B | 2700亿tokens | 4480 80G A100 | - | |
N | 2022.02 | 41B | 9670亿tokens | - | - | |
N | 2022.03 | 175B | - | - | - | |
N | 2022.03 | 70B | 1.4万亿tokens | - | - | |
Y | 2022.03 | 16B | 5770亿tokens | - | - | |
Y | 2022.04 | 20B | 825GB | 96 40G A100 | - | |
Y | 2022.04 | 11B | - | 256 TPU v3 | 4小时 | |
N | 2022.04 | 540B | 7800亿tokens | 6144 TPU v4 | - | |
Y | 2022.05 | 20B | 825GB | 96 40G A100 | - | |
Y | 2022.05 | 175B | 1800亿tokens | 992 80G A100 | - | |
Y | 2022.07 | 54.5B | - | - | - | |
N | 2022.08 | 20B | 1.3万亿tokens | 128 A100 | 120天 | |
N | 2022.09 | 70B | 64 TPU v3 | - | - | |
N | 2022.09 | 10B | 3000亿tokens | 128 A100 40G | 24天 | |
N | 2022.10 | 540B | - | 512 TPU v4 | 5天 | |
N | 2022.10 | 540B | - | 512 TPU v4 | 37小时 | |
N | 2022.10 | 540B | - | - | - | |
Y | 2022.10 | 130B | 4000亿tokens | 768 40G A100 | 60天 | |
Y | 2022.10 | 11B | - | - | - | |
Y | 2022.11 | 176B | 3660亿tokens | 384 80G A100 | 105天 | |
Y | 2022.11 | 13B | - | - | - | |
Y | 2022.11 | 120B | 1060亿tokens | - | - | |
Y | 2022.11 | 176B | - | - | - | |
Y | 2022.12 | 175B | - | 128 40G A100 | - | |
Y | 2023.02 | 65B | 1.4万亿tokens | 2048 80G A100 | 21天 | |
N | 2023.03 | - | - | - | - | |
Y | 2022.09 | 13B | 8500亿tokens | 1536 Ascend 910 | 60天 | |
N | 2023.03 | 1085B | 3290亿tokens | 512 Ascend 910 | 100天 | |
Y | 2023.04 | 12B | 3000亿tokens | 256 40G A100 | - |
可以直接把对应的md丢给gpt,叫它导出一个excel,然后就可以自定义排序或者画散点图看了
LLM数据集
llm中文数据集:https://juejin.cn/post/7238921093553438779
Books:
BookCorpus:超过11000本电子书,用于GPT和GPT-2。
Gutenberg:超过70000本文学作品,包括小说、散文、诗歌、戏剧、历史、科学、哲学和其他公共领域,用于MT-NLG和LLaMA。
Books1和Books2:比BookCorpus大得多,但未公开,用于GPT-3。
CommonCrawl:最大的开源网络爬虫数据库之一,百万亿字节,有大量噪音和低质信息,需要过滤,有如下4个子集:
C4:包括en(806G,训练T5、LaMDA、Gopher、UL2)、en.noclean(6T)、realnewslike(36G)、webtextlike(17G)、multilingual(38T,训练mT5)。
CC-Stories:31G,内容以故事的形式展示
CC-News:76G
RealNews:120G
Reddit Links:Reddit上的帖子,高赞通常比较有用,可以拿来创建高质量数据集。
WebText:由Reddit上的高赞链接组成,未公开,对应的开源版是OpenWebText。
Pushshift.io:实时更新的数据集,包括Reddit自创建以来的历史数据,有数据存储,也有实用工具,供用户搜索、总结和统计分析。
Wikipedia:大部分文章使用写作风格,并支持引用,英语版本用于大多数LLM,如GPT-3、LaMDA、LLaMA,还有多语言版。
Code:包括开源许可证的公共代码库(如github)和与代码相关的问答平台(如StackOverflow),Google公开了BigQuery数据集,CodeGen用的BIGQUERY是其的一个子集。
LLM开源库
transformers:huggingface的库
deepspeed:微软的库,与pytorch兼容,训练了MT-NLG、BLOOM等模型,包括各种分布式训练优化技术,如内存优化(ZeRO、梯度检查点等)和管道并行。
megatron-lm:英伟达的库,同样包括各种分布式训练技术,包括模型和数据并行、混合精度训练和FlashAttention。(Megatron-lm: Training multi-billion parameter language models using model parallelism、Efficient large-scale language model training on GPU clusters using megatron-lm和Reducing activation recomputation in large transformer models)
jax:google的库,允许用户在带有硬件加速(GPU或TPU)的情况下进行数组的高效运算,可以在各种设备高效计算,支持自动微分和即时编译等功能。
colossal-AI:HPC-AI Tech的库,基于pytorch,可以使用[PatrickStar](Patrickstar: Parallel training of pre-trained models via a chunk-based memory management)提出的方法优化异构内存管理,分布了基于LLaMA的ColossalChat
BMTrain:openBMB的库,强调代码简洁、低资源占用和高可用性
[FastMoE](Fastmoe: A fast mixture-of-expert training system):专门用于MoE模型的训练库,基于pytorch,简化了将transformer转换为MoE模型的过程
semantic-kernel:微软的开源库
一些综述
人大的大模型综述:https://github.com/RUCAIBox/LLMSurvey,自己存了一份pdf,(!!!本文大部分内容按这个来组织!!!)
扩展法则(scaling law)
openai的扩展法则
2020年,openai的Scaling laws for neural language models通过拟合模型在不同数据大小(2000w到230亿个token)、不同的模型大小(7.68亿到15亿个非嵌入参数)的性能,提出了在计算预算的条件下,是用nats表示的交叉熵损失,模型性能与模型规模、数据集规模以及训练计算量间存在如下幂律关系:
其中,表示非嵌入参数数量,表示训练token数量,表示FP-days。
Chinchilla扩展法则
DeepMind在Training compute-optimal large language models中提出了Chichilla扩展法则来指导LLM最优计算量的训练。通过变化更大范围的模型大小(7000w到160亿参数)和数据大小(50亿到5000亿个token)进行实验,拟合了如下的扩散法则:
其中,通过在约束条件下优化损失,将计算预算最优地分配给模型大小和数据大小的方法:
其中,,是由计算出的扩展系数。
随着计算预算的增加,
openai的扩展法则更偏向于将更大预算分给模型大小,因为其对比各模型时使用了固定的训练数据量和学习率等超参,低估了数据量的作用。每增加10倍的计算量,应该让数据集大小增加为约1.8倍,模型参数量增加为约5.5倍。即模型参数量更加的重要。
Chinchilla扩展法则认为模型大小和数据大小要同比例增加,即和取值差不多。因为其在无视模型大小的前提下,发现设置与数据量差不多match的学习率能获得更好的loss。每增加10倍的计算量,应该让数据集大小增加为约3.16倍,模型参数量也增加为约3.16倍。即数据集大小和模型参数量一样重要。
然而,有一些能力(如涌现)无法根据扩展法则进行预测,只有当模型达到一定规模时才会出现。
scaling law的一些讨论
Scaling Laws 又失灵了?谷歌新研究:扩散模型不是越大越好
Bigger is not Always Better: Scaling Properties of Latent Diffusion Models
涌现能力
涌现能力:在小型模型中不存在而在大型模型中产生的能力,当规模达到一定程度时,性能显著提升,超出随机水平(参考 Emergent Abilities of Large Language Models)。与物理学中的相变现象类似(物质从一种相(状态)转变为另一种相的过程,通常伴随着能量的吸收或释放,并且涉及不同的物理性质,例如固体、液体和气体之间的转变)。
普林斯顿DeepMind用数学证明:LLM不是随机鹦鹉!「规模越大能力越强」有理论根据
A Theory for Emergence of Complex Skills in Language Models:
LLM的3种典型涌现能力及其对应代表模型:
上下文学习(in-context learning)
GPT-3(Language models are few-shot learners)提出,只要提供一个自然语言指令和/或几个任务演示,语言模型就能通过完成输入文本的词序列的方式来为测试实例生成预期输出,不用额外的梯度更新。
ICL能力小模型不具备:1750亿的GPT-3有ICL能力,但GPT-1和GPT-2无此能力。
ICL能力取决于具体下游任务:130亿的GPT-3能在算术任务上有ICL,但1750亿的GPT-3在波斯语QA上无能为力。
指令遵循(instruction following)
使用自然语言描述的混合多任务数据集进行微调(指令微调),LLM在未见过的以指令形式描述的任务上表现出色,具有更好的泛化能力。例如Multitask prompted training enables zero-shot task generalization、Training language models to follow instructions with human feedback、Finetuned language models are zero-shot learners。
在Finetuned language models are zero-shot learners的实验中,当模型大小达到680亿时,经过指定微调的LaMDA-PT开始在未见过的任务上显著优于未微调的模型,而80亿或更小的模型则没有这个现象。
在Scaling instruction-finetuned language models的实验中,PaLM至少在620亿参数上才能在4个评估基准的各种任务上表现良好。
逐步推理(multi-step reasoning)
对于涉及多个推理步骤的复杂任务(如数学),可以使用思维链(Chain-of-Thought, CoT)提示策略(Chain of thought prompting elicits reasoning in large language models),让LLM通过利用中间推理步骤的提示机制来解决这类任务。
Chain of thought prompting elicits reasoning in large language models发现,CoT在模型大于600亿的PaLM和LaMBDA变体中能够提升在算术推理基准任务的效果,而当模型大于1000亿时,相比标准提示的优势更明显。
How does GPT Obtain its Ability? Tracing Emergent Abilities of Language Models to their Sources
LLM关键点
如何让LLM能够通用且有能力?
扩展
更大的模型、数据规模和更多的训练计算,但计算预算是有限的,可以用扩展法更高效地分配计算资源,如Chinchilla在相同计算预算下增加训练token数,优于更大模型规模的Gopher,同时需要数据清理。
训练
分布式的训练框架:包括DeepSpeed(Deepspeed: System optimizations enable training deep learning models with over 100 billion parameters)和Megatron-LM(Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism和Efficient large-scale language model training on GPU clusters using megatron-lm)
优化技巧:有助于提升训练稳定性和模型性能,如重新开始以克服训练损失激增(Palm: Scaling language modeling with pathways)和混合精度训练(BLOOM: A 176b-parameter open-access multilingual language model)。
能力引导
当LLM执行某些特定任务时,可能不会显式地展示出其通用求解器的能力,设计合适的任务指令或具体的ICL策略可以激发这种能力,例如
通过包含中间推理步骤的CoT提示
使用自然语言表达的任务描述,对LLM进行指令微调
对齐微调
由于预训练语料库包括高质量和低质量的数据,LLM可能生成有毒、偏见甚至有害的内容,要让LLM和人类价值观保持一致,如有用性、诚实性和无害性。RLHF相关工作如Training language models to follow instructions with human feedback和Deep reinforcement learning from human preferences能够产生高质量、无害的回答(例如拒绝回答侮辱性问题)。
工具操作
LLM本质是基于海量文本语料库进行文本生成训练的,对于不适合以文本形式表达的任务表现不佳(如数字计算),且其能力受限于预训练数据,无法获取最新信息。可以利用外部工具:
典型LLM简介
llm榜单:
https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard
MoE原理
GPT系列
GPT3
2020年的gpt3:Language models are few-shot learners,175b(1750亿)参数,当参数量到达千亿时出现了『涌现』现象,发现可以in-context learning。
CODEX
Evaluating Large Language Models Trained on Code
能够解析自然语言,并生成代码。CODEX是gpt3在github上收集的代码语料上进行finetune得到的,并且在微软的copilot中使用。
WebGPT
WebGPT: Browser-assisted question-answering with human feedback
https://openai.com/blog/webgpt/
为了回答开放性问题,使用基于文本的浏览器对gpt3进行finetune,包括如下3个步骤:
学习使用人类示范(demonstration)数据来模仿人类的浏览行为
学习一个reward函数来预测人类偏好
用强化学习和拒绝采样来优化reward函数
重要性采样的关键是降低方差:因为相同的样本量,用分布采样得到的结果方差较大(或者是不好采样),而用采样的样本得到的结果方差较小,用来估计原分布
拒绝采样:引入易于采样的分布,然后从中随机地筛掉某些样本(根据接受概率接受或者拒绝样本),使得剩下的样本服从分布
拒绝采样的步骤:
从辅助分布中采样得到样本
计算接受概率,其中是一个常数,满足对于所有成立
以概率接受样本,即生成一个随机数,如果,则接受样本;否则拒绝样本。
重复上述步骤,直到获得足够数量的样本。
InstructGPT
Training language models to follow instructions with human feedback
sft+rm+rl,在最小性能降低的情况下,提升了生成结果的真实性,并降低了毒害性
ChatGPT&GPT-4
2022.11.30推出了ChatGPT,基于GPT3.5,即InstructGPT的兄弟
2023.3推出了GPT-4,多模态LLM,能输入图像和文本
LLaMA系列
LLaMA
2023年2月发布,LLaMA: Open and Efficient Foundation Language Models,开源的LLaMA-13B比 GPT3 175B在很多任务上都更好
https://github.com/meta-llama/llama
之前的工作考虑的是在训练预算有限的前提下,如何提升模型性能(2022年deepmind的Training Compute-Optimal Large Language Models的Chinchilla),llama考虑在预测时的预算。例如chinchilla是一个10b的模型在200b的token上训练,但其实一个7b的模型当用了1T的token后,性能仍在提升。LLama-13b比gpt3在大多数benchmark上好,但size只有1/10,在一个GPU上就能跑。
llama只用公开数据训练,而Chinchilla、PaLM、GPT-3都有自己的未公开数据集。其他的OPT、GPT-NeoX、BLOOM、GLM虽然也只用公开数据集,但打不过PaLM-62B或者Chinchilla
预训练数据
English CommonCrawl(67%):使用CCNet pipeline,去重、用fasttext把非英文的页面删了,用n-gram把低质内容删了。此外,还训了一个线性模型,对页面进行分类:作为维基百科的引用 vs 随机采样的页面,最后把不属于引用这个类别的页面删了
C4(15%):与CCNet类似,主要区别在质量过滤是基于启发式的规则,如标点符号的存在,或者词数和句子数
github(4.5%):使用Google BigQuery里的公开github数据集,只用Apache、BSD和MIT证书的。低质判断是启发式规则,如字母数字占比、行的长度等,用正则删掉head等样式,最终以文件粒度进行去重。
wikipedia(4.5%):2022年6-8月的数据,包括20种语言
Gutenberg and Books3(4.5%):两个书籍数据集,对有90%以上内容重复的书籍做去重。
Arxiv(2.5%):拿原始的tex文件,删掉first section之前的东西,还有一些注释、宏
Stack Exchange(2%):高质量的问答网站,按答案的分数排序
tokenizer:BPE,使用sentencepiece的实现。将所有numbers切成单个数字,回退到字节去处理未知的utf8字符(fallback to bytes to decompose unknown UTF-8 characters)
总共有1.4T的token,对大部分训练数据,每个token在训练时只用了一次,除了维基和book大概用了两次。
附:gpt4说:当我们说"一个token只训练一次",我们其实是在说在一个epoch(一个完整遍历训练集的过程)中,我们只遍历一次完整的数据集。如果一个特定的token在数据集中出现多次,那么在一个epoch中,这个token就会被用来训练模型多次。
网络结构
SwiGLU激活函数(PaLM):取代ReLU,Glu variants improve trans- former,把PaLM里的改了
说白了就是输入,SwiGLU激活完是,其中swish又叫silu,是
然后再过一个,得到就是最终的ffn输出
以下是transformers里的实现:https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/modeling_llama.py
这个是llama官方代码的实现:https://github.com/meta-llama/llama/blob/ef351e9cd9496c579bf9f2bb036ef11bdc5ca3d2/llama/model.py#L337-L345
Rotary embeddings(GPTNeo):删掉原来的绝对位置编码,加上rotary positional embedding(RoPE),网络的每一层都加,参考Roformer: Enhanced transformer with rotary position embedding
pre-normalization(gpt3):提升训练稳定性,对每个子层的输入做norm,而非输出。此外,使用的是RMSNorm函数(Root mean square layer normalization)取代标准的layer-norm
layernorm计算单个样本在单层中所有激活的均值和标准差,并使用这些统计数据来归一化该层的激活。
RMSnorm只计算激活的平方根均值(RMS),而不是标准差。这样做的一个好处是计算上更简单,因为它省去了计算均值的步骤,只关注激活的规模(scale)而非其准确的分布。,其中是该层的神经元个数,而且也不用求均值
优化器:AdamW,cosine学习率schedule,最终学习率是最大学习率的10%。0.1的weight decay和1.0的gradient cliping,使用2000steps的warmup
训练加速
对causal multi-head attention加速:实现在http://github.com/facebookresearch/xformers中,降低内存使用和运行时间,参考self-attention does not need memory,以及Flashattention: Fast and memory-efficient exact attention with io-awareness。思想是
不存储attention weights
不计算被mask的key/query得分
减少xxx:
LLaMA2
2023年7月,Llama 2: Open Foundation and Fine-Tuned Chat Models
基于公开数据集预自监督地训练一个llama-2
llama-2-chat模型:
sft后得到初始版本
使用RLHF迭代地更新(拒绝采样+ppo)
https://zhuanlan.zhihu.com/p/636784644
使用了GQA(grouped query attention)(参考Gqa: Training generalized multi-query transformer models from multi-head checkpoints)
LLaMA3
2024年4月
开源大模型Llama 3王者归来!最大底牌4000亿参数,性能直逼GPT-4
Llama 3超大杯有何惊喜?Meta会一直开源吗?当初为何笃信元宇宙?扎克伯格新访谈回应一切
Llama 3细节公布!AI产品总监站台讲解:Llama系列超庞大生态系统
三个版本:8B 和 70B 参数的模型,还有一个 405B 参数的密集模型(还在训练之中),8B版本基本上与Llama-2的最大版本一样强大。
Llama 3的主要亮点:
基于超过15T token训练,比Llama 2数据集的7倍还多;
支持8K长文本,改进的tokenizer有128K token的词汇量;
训练效率比 Llama 2 高 3 倍;
带有 Llama Guard 2、Code Shield 和 CyberSec Eval 2 的新版信任和安全工具;
在大量重要基准中均具有最先进性能;
新能力范畴,包括增强的推理和代码能力;Llama-2 只能使用非常特定的工具,而 Llama-3 能使用好得多的工具。无需人工编程就能让其使用谷歌执行搜索,类似的功能还有编程和运行代码等。
https://github.com/meta-llama/
https://github.com/meta-llama/llama3
多模态llama3
https://github.com/InternLM/XTuner
中文llama3
https://github.com/CrazyBoyM/llama3-Chinese-chat
https://huggingface.co/shenzhi-wang/Llama3-8B-Chinese-Chat
Alpaca
Alpaca: A Strong, Replicable Instruction-Following Model
Stanford的羊驼(Alpaca)模型,有70亿(7b)参数,没有使用RLHF,而是使用监督学习的方法,参考Self-Instruct: Aligning Language Model with Self Generated Instructions(代码https://github.com/yizhongw/self-instruct)
数据集是通过查询基于GPT-3的text-davinci-003模型的结果,得到的52k的指令-输出对(instruction-output pairs)。
因此,Alpaca本质上使用的是一种弱监督(weakly supervised)或以知识蒸馏(knowledge-distillation-flavored)为主的微调,即“用 LLM 来训练 LLM”。
https://github.com/tatsu-lab/stanford_alpaca
Vicuna
通过ShareGPT收集的用户对话数据,对llama进行finetune得到的13B模型。效果接近chatgpt的92%,而且训练消耗比较低,大概只要300美元。
Guanaco
QLoRA: Efficient Finetuning of Quantized LLMs也是对llama进行微调,使用了QLoRA,能够在一台48G的GPU上微调65B的模型。只需要在单台GPU上finetune 24小时就能达到99.3%的chatgpt的效果。
https://github.com/artidoro/qlora
https://github.com/TimDettmers/bitsandbytes
QLoRA将一个固定的4 bit量化的预训练权重转成low Rank Adapters来更新梯度
Koala
Koala: A dialogue model for academic research
使用用户与闭源大模型交互的用户输入和模型返回数据进行训练
Mistral
7B参数比最好的13B模型(llama-2-13B)要更好,而且比llama-34B在reasoning、数学、代码生成都更好。
使用grouped-query attention来做更快的infer
使用滑动窗口attention来用更低的infer消耗来高效地处理任意长度的序列。
https://mistral.ai/news/mixtral-of-experts/ 提出了moe的8x7b
Mixtral 8x7B(Mistral MoE) 模型解析
Mistral开源8X22B大模型,OpenAI更新GPT-4 Turbo视觉,都在欺负谷歌
https://huggingface.co/mistral-community/Mixtral-8x22B-v0.1
phi-3
Phi-3 Technical Report: A Highly Capable Language Model Locally on Your Phone
PaLM系列
PaLM
2022年4月提出了第一个PaLM:Palm: Scaling language modeling with pathways,直到2023年3月还是private的。是一个540B(5400亿)参数的模型,在包含了780B的tokens的高质量数据集上预训练。使用Pathways的6144块TPU v4进行训练。
U-PaLM
Transcending scaling laws with 0.1% extra compute提出了8B,62B和540B的U-PaLM模型,用UL2R来对PaLM进行继续训练,用的是UL2的mixture-of-denoiser objective(UL2: Unifying Language Learning Paradigms)
Flan-PaLM
Flan-PaLM(Scaling instruction-finetuned language models)是instrunction-finetuned版本的U-PaLM。使用了更多的任务、更大的模型,以及CoT数据。使用了473个数据集,146类的task,总共1836个task。
https://huggingface.co/google/flan-t5-xl
PaLM-2
PaLM 2 Technical Report是一个更计算高效型的LLM,有更好的多语种和reasoning能力,在很多任务上都比PaLM好,并且在infer上比PaLM要更快更高效。
Med-PaLM
Nature的Large language models encode clinical knowledge提出了Med-PaLM,在PaLM上用parameter-efficient方法进行instruction prompt tuning,使用少量的典型范例(exemplars)让LLM对齐到新领域。
Med-PaLM2(Towards expert- level medical question answering with large language models)通过med-domain的finetuning和ensemble refinement prompting,效果比Med-PaLM要好。
其他LLM
FLAN
Finetuned language models are zero-shot learners
通过instruction tuning,大模型能很好地提升在没见过任务上的zero-shot能力。对一个137B的预训练模型在60个NLP数据集上使用instruction template进行instruction tuning。
一些instruction template:
https://github.com/google-research/flan
Gopher
T0
ERNIE 3.0
RETRO
参数量仅为4%,性能媲美GPT-3:开发者图解DeepMind的RETRO
http://jalammar.github.io/illustrated-retrieval-transformer/
Improving language models by retrieving from trillions of tokens
GLaM
LaMDA
OPT
Chinchilla
Galactica
CodeGen
AlexaTM
Sparrow
MoD
BLOOM
GLM
Pythia
Orca
StarCoder
KOSMOS
Gemini
Gemini 1.0
Gemini: a family of highly capable multimodal models
Gemini 1.5
谷歌Gemini 1.5深夜爆炸上线,史诗级多模态硬刚GPT-5!最强MoE首破100万极限上下文纪录
Gemini 1.5: Unlocking multimodal understanding across millions of tokens of context
更大的上下文窗口
此前的SOTA模型能处理**20万(200K)的token,Gemini 1.5能稳定处理100万(1M)的token(极限为1000万(10M)**的token),能够处理11小时的音频、1小时的视频、超过3w行的代码库、超过70w个单词
gemma
https://blog.google/technology/developers/gemma-open-models/
Gemma: Open Models Based on Gemini Research and Technology
代码:
架构&训练方法
moe: +
codegemma
专门处理代码补全和代码生成任务的 7B 预训练变体
用于代码聊天和指令跟随的 7B 指令调优变体
在本地计算机上运行快速代码补全的 2B 预训练变体
CodeGemma: Open Code Models Based on Gemma
RecurrentGemma
RecurrentGemma: Moving Past Transformers for Efficient Open Language Models
基于Griffin架构,将门控线性递归与本地滑动窗口注意力混合在一起,在生成长序列时实现快速推理,相比gemma:
减少内存用量:内存要求越低,就越能在内存有限的设备(例如单个 GPU 或 CPU)上生成较长的样本。
吞吐量较高:能够以明显较高的batch_size执行推理,这意味着每秒可以生成更多tokens,尤其是在生成长序列时。
训练:
在线推理的C++实现
https://github.com/google/gemma.cpp
Claude
全球最强大模型一夜易主,GPT-4时代终结!Claude 3提前狙击GPT-5,3秒读懂万字论文理解力接近人类
The Claude 3 Model Family: Opus, Sonnet, Haiku
对齐:使用Constitutional AI(Constitutional AI: Harmlessness from AI Feedback), explicitly specifying rules and principles based on sources like the UN Declaration of Human Rights.
基于Collective Constitutional AI(Collective Constitutional AI: Aligning a Language Model with Public Input),added an additional principle to Claude’s constitution to encourage respect for disability rights
grok
马斯克开源Grok-1:3140亿参数迄今最大,权重架构全开放,磁力下载
https://github.com/xai-org/grok-1
上下文窗口提升16倍,达到128k
不使用通用的Python语言+Pytorch框架,采用分布式训练架构,使用Rust、JAX+Kubernetes构建。
提出了自定义训练协调器,可自动检测到有问题的节点,然后剔除。
优化了checkpointing、数据加载和训练重启等流程,最大限度地减少故障停机时间。
Grok-1.5V: https://x.ai/blog/grok-1.5v
Gecko
谷歌DeepMind发布Gecko:专攻检索,与大7倍模型相抗衡
Gecko: Versatile Text Embeddings Distilled from Large Language Models
Octopus
超越GPT-4,斯坦福团队手机可跑的大模型火了,一夜下载量超2k
Octopus v2: On-device language model for super agent
https://huggingface.co/NexaAIDev/Octopus-v2
参数量不到10亿的OctopusV3,如何媲美GPT-4V和GPT-4?
Octopus v3: Technical Report for On-device Sub-billion Multimodal AI Agent
Octopus v4: Graph of language models
Cohere Command R+
开源模型打败GPT-4!LLM竞技场最新战报,Cohere Command R+上线
https://huggingface.co/CohereForAI/c4ai-command-r-plus
https://huggingface.co/CohereForAI/c4ai-command-r-plus-4bit
1040亿的参数量,相比于Grok-1(3140亿)还差了一些,但Command R+并非Grok那种MoE架构,所以这1040亿参数是实打实的完全用于推理,而Grok-1的活跃参数为860亿。相比commend R:
高级检索增强生成(RAG)与引用以减少幻觉
10种主要语言的多语言覆盖,支持全球业务运营
工具的运用以自动化复杂的业务流程
CT-LLM:以中文为中心的LLM
Chinese Tiny LLM: Pretraining a Chinese-Centric Large Language Model
当前,绝大多数LLM基本上都是以英文语料库训练得到的,然后经过SFT来匹配不同的语种。本文作者考虑以中文为基础的预训练模型是否可以激活对其它语言的能力。
作者从头开始训练中文大模型,在训练过程中「主要纳入中文文本数据」,最终作者得到了一个2B规模的中文Tiny LLM(CT-LLM)。结果表明,该模型在中文任务上表现出色,且通过SFT也能很好的支持英文。
OpenELM
苹果卷开源大模型,公开代码、权重、数据集、训练全过程,OpenELM亮相
OpenELM: An Efficient Language Model Family with Open-source Training and Inference Framework
https://github.com/apple/corenet
Arctic
仅需Llama3 1/17的训练成本,Snowflake开源128x3B MoE模型
全球最大开源模型再刷爆纪录!4800亿参数MoE击败Llama 3、Mixtral
https://huggingface.co/Snowflake/snowflake-arctic-instruct
Qwen
4月26日,Qwen开源了其第一个千亿参数大模型Qwen1.5-110B,这应该也是国内第一个千亿规模的开源大模型。其包含1100亿参数,更重要的是这是一个Dense模型,而非MoE模型。从各项评测来看,Qwen1.5-110B足以与Llama3-70B相抗衡,部分指标也取得了更高的水平。
预训练
数据收集
数据获取
通用文本数据:
网页:例如CommonCrawl,同时需要过滤和处理以提高质量
对话文本:公共对话数据如PushShift.io,对于在线社交媒体的对话数据,可以转换成树形结构,每句话与回应其的话相连。多方的对话树可以划分为预训练语料库中的多个子对话。过度引入对话数据可能会有潜在风险(OPT: open pre-trained transformer language models):陈述性指令和直接疑问句被错误地认为是对话的开始,导致指令的有效性下降。
书籍:更正式的长文本,利于学习语言知识、建模长期依赖关系、生成叙述性和连贯的文本。
专用文本数据:
多语言文本:BLOOM的预训练语料中包括了46种语言,PaLM包含了122种
科学文本:如arxiv论文、科学教材、数学 网页等,通常需要特定的标记化和预处理。
代码:一是编程问答社区,二是开源代码仅为。对应长距离依赖和准确的执行逻辑,可能是复杂推理能力的来源。将推理任务格式化为代码形式还能帮LLM生成更准确的结果(如Language models of code are few-shot commonsense learners和Autoformalization with large language models)
数据预处理
质量过滤:有一些基于分类器的方法,例如维基百科的数据为正样本,负采样其他数据训练二分类器,但这种方法会删除方言、口语和社会语言的高质量文本,可能导致有偏、减少多样性。还有启发式的方法,主要包括:
基于语言的过滤:如果该llm主要用于某种语言,可以把其他语言删了
基于度量的过滤:利用生成文本的评估度量(如perplexity)来检测和删除不自然的句子
基于统计的过滤:如标点符号分布、符号和单词比例、句子长度等
基于关键词的过滤:删除噪声或无用元素,如HTML标签、超链接、模板、攻击性词语等。
去重:Scaling laws and interpretability of learning from repeated data中发现重复数据会降低多样性,可能导致训练不稳定。下面3个级的去重都很有用
句子级:删掉包含重复单词和短语的句子,因为可能在语言建模中引入重复模式(The curious case of neural text degeneration)(后面的章节会讲)
文档级:通过文档间的表层特征(如n-gram或单词重合率)来删掉重复文档
数据集级:训练集中删掉测试集可能出现的重复文本,防止训练集和评估集间的重叠
隐私去除:删掉可识别个人信息(PII),如基于关键词(姓名、地址、电话号码)识别。另外,Deduplicating Training Data Mitigates Privacy Risks in Language Models发现LLM在隐私攻击下的脆弱性可能归因于预训练语料中存在重复PII数据。
分词:可以直接利用已有分词器,也可以使用专门为预训练语料库设计的分词器,如SentencePiece,而且BPE(byte pair encoding)能确保分词后的信息不会丢失,但其中的如NFKC(Unicode normalization forms)的归一化技术可能会降低分词的性能。
预训练语料的重要性
混合来源:不同领域和场景的数据能让LLM有更强大的泛化能力。需要仔细设置数据分布,Gopher对数据分布消融,发现增加书籍数据可以提升捕捉长期依赖的能力,增加c4数据集比例可以提升其在c4验证集上的效果,但单独训练过多的某个领域数据会影响LLM在其他领域的泛化能力。
数据量:模型性能方面,数据大小也能看到与模型大小类似的扩展法则。LLaMA发现,用更多数据训练更长时间,较小的模型也能实现良好性能。
数据质量:Gopher、GLaM和T5都发现,在清理后的数据上训练能提升llm效果。数据的重复可能导致『双下降现象』(Scaling laws and interpretability of learning from repeated data和Deep double descent: Where bigger models and more data hurt),甚至会导致训练不稳定。此外,Scaling laws and interpretability of learning from repeated data还发现,重复数据会降低LLM从上下文复制的能力,从而影响ICL中的泛化能力。
注:双下降指的是随着模型复杂性的增加,可能loss先下降,然后再升高,最后又下降:
当模型的复杂性低于数据的复杂性时,增加模型的复杂性可以帮助减少训练误差。
当模型的复杂性超过数据的复杂性时,增加模型的复杂性反而可能导致训练误差增加。这是因为模型开始过拟合数据,捕获数据中的噪声而非实际的模式。
当模型的复杂性远大于数据的复杂性时,训练误差可能再次开始减少。这是因为模型有足够的能力来对数据的噪声进行平滑,同时仍然能够捕获数据的实际模式。
架构
主流框架
编码器-解码器架构(encoder-decoder):标准Transformer,如T5、BART,只有少数LLLM还用这种结构,如Flan-T5
因果解码器架构(causual decoder):也叫decoder-only,单向注意力掩码,输入和输出token通过解码器以相同方式进行处理,以GPT系列为代表,现有大部分LLM都是这种架构,如OPT、BLOOM、Gopher等。
前缀解码器架构(prefix decoder):修正因果解码器的掩码机制,使其能对前缀token执行双向注意力,并且仅对生成的token执行单向注意力(和encoder-decoder类似),即Unified language model pre-training for natural language understanding and generation提出的uni-lm。What language model architecture and pretraining objective works best for zero-shot generalization?建议不从头开始预训练,而是继续训练因果编码器,然后将其转换成前缀编码器以加速收敛。例如U-PaLM从PaLM演化而来,还有GLM-130B也是这种架构。
https://github.com/microsoft/unilm
对于这3种架构,都可以用MoE进行扩展,每个输入的一小部分神经网络权重被稀疏激活,如Switch Transformer和GLaM。Unified scaling laws for routed language models发现,通过增加专家数量或总参数大小,性能会有显著改进。
讨论:为什么现在的LLM都是Decoder only的架构?
https://www.zhihu.com/question/588325646/answer/2940298964
泛化性能强:ICML 22的What language model architecture and pretraining objective works best for zero-shot generalization.在最大5B参数量、170B token数据量的规模下做了一些列实验,发现用next token prediction预训练的decoder-only模型在各种下游任务上zero-shot泛化性能最好;另外,ACL23的Why Can GPT Learn In-Context? Language Models Implicitly Perform Gradient Descent as Meta-Optimizers等工作表明,decoder-only模型相当于基于给出的几个示例隐式地进行梯度下降,对应的in-context learning泛化能力更强,
秩的讨论:Attention is not all you need: pure attention loses rank doubly exponentially with depth的讨论,和相乘后()再加上softmax后,秩不超过,而decoder-only中有一个下三角矩阵的mask,所以输入的是一个下三角矩阵,而下三角矩阵的行列式是对角线之积,且有softmax,对角线肯定大于0,所以是满秩的(行列式不为0-->矩阵经过变换后不会有一行或者一列全为0-->当前矩阵满秩)
预训练任务难度更大:相比encoder-decoder,decoder-only架构里每个位置能接触到的信息更少,故难度更高,当模型大小和数据量够的时候,上限更高
隐式学习了位置信息:Transformer Language Models without Positional Encodings Still Learn Positional Information,encoder里对语序的区分能力较弱,需要结合position encoding,而causual attention隐式地具备了这种建模位置的能力。
工程效率:支持复用kv-cache,对多轮对话更友好,**『DIN的FLOPS』**一节里有讲
组件配置
标准化(norm)
LN(layer norm)能缓解LLM训练不稳定的问题,其位置很重要。
前置LN:最初Transformer使用后置LN,但大多数LLM采用前置LN以实现更稳定的训练,尽管会有一些性能损失(On layer normalization in the transformer architecture)。Sandwich-LN在残差连接前添加额外的LN,虽然能避免数值爆炸,但有时会无法稳定LLM的训练,可能导致训练崩溃(GLM-130B: an open bilingual pre-trained model)
RMS Norm:训练和性能都不错,在Gopher和Chinchilla里使用
Deep Norm:比LN有更好的训练稳定性,和后标准化一起用在GLM-130B里
此外,在emb后直接加额外的LN能提升训练稳定性,但会导致显著的性能下降(What language model to train if you have one million GPU hours?),在后来的LLM中被移除(BLOOM: A 176b-parameter open-access multilingual language model)。
激活函数
FFN中的激活函数:
GeLU:大部分都是这个
GLU(gated linear units)的变体:应用在PaLM和LaMDA等模型中,如SwiGLU和GeGLU有更好的效果,但在FFN中的参数量比GeLU要大50%
原始Transformer中
T5中把bias干掉了
然后,$\operatorname{GELU}(x)=x \Phi(x)$,同时$\operatorname{Swish}_\beta(x)=x \sigma(\beta x)$,接下来
对应起来就是
位置编码
Transformer的self-attention有转换不变性,故要位置编码以引入绝对或相对位置信息来建模序列。
绝对位置编码:
正弦函数:原始Transformer中使用
可学习的位置编码:LLM中常用
相对位置编码:Exploring the limits of transfer learning with a unified text-to-text transformer提出,其实是在Self-attention with relative position representations一文提出的,根据k和q之间的偏移量生成emb
Alibi:Train short, test long: Attention with linear biases enables input length extrapolation提出,使用k和q之间距离的惩罚来给注意力分数加bias,What language model architecture and pretraining objective works best for zero-shot generalization发现其有更好的零样本泛化能力和更强的外推能力,能够在比训练序列更长的序列上表现良好。
RoPE:Roformer: Enhanced transformer with rotary position embedding提出,k和q之间的分数用相对位置信息计算,利于建模长序列,在PaLM、LLaMA、GLM-130B中都有应用。
注意力机制和Bias
稀疏注意力:Generating long sequences with sparse transformers),计算复杂度更低,GPT-3用了
FlashAttention:Flashattention: Fast and memory-efficient exact attention with IO-awareness,考虑显存访问
移除bias:PaLM和Galactica中将bias删了,能够增加训练稳定性。
小结
归一化位置
sublayer表示FFN或self-attention模块
方法 | 公式 |
---|---|
post Norm | |
pre Norm | |
Sandwich Norm |
归一化方法
方法 | 公式 |
---|---|
Layer Norm | |
RMSNorm | |
Deep Norm |
激活函数
方法 | 公式 |
---|---|
ReLU | |
GeLU | |
Swish | |
SwiGLU | |
GeGLU |
位置嵌入
:q和k之间的注意力分数
:基于q和k之间偏移的可学习标量
:旋转角度为的旋转矩阵
方法 | 公式 |
---|---|
绝对位置编码 | |
相对位置编码 | |
RoPE | |
Alibi |
预训练任务
语言建模
语言建模是仅解码器LLM的常见目标,给定token序列,旨在基于序列中前面的token,自回归地预估目标token:
前缀解码器架构使用的是前缀语言建模任务,其loss不涉及对前缀内token的预测,故预训练时涉及的序列中token较少,故当预训练token数相同时,前缀语言模型的性能往往略低于传统语言模型任务。
另外,自回归的loss:
训练时:是可以并行的,因为每个位置的label是已知的,可以并行算,
预测时:是串行的,因为得预测完了第t个词,才能去预测第t+1个词。
去噪自编码
DAE是BERT待模型的常见任务,即MLM(masked language model),输入是一些有随机替换区间的损坏文本,目标是恢复被替换的token :
在T5和GLM-130B中使用,自回归地恢复替换区间。
Transformer的FLOPS和访存带宽
https://zhuanlan.zhihu.com/p/624740065
的shape是,的shape是,那么矩阵乘法需要次的乘法,也需要同样多次的加法,所以FLOPS是
假设batchsize是,序列长度,原来的emb是,即输入的是,一般,对应的Q、K、V矩阵都是,有个头,每个头的维度
attention的FLOPS
attention的公式:
计算3个Q、K、V:要算三次和的矩阵乘法,所以是:
输入:和3个
输出:,再把最后一维拆成份,再把中间两维互换一下,得到
计算Q和K的相似度:要算一次和的矩阵乘法,
输入:和
输出:
把相似度用到V上:要算一次和的矩阵乘法,,
输入:和
输出:
最后过一个线性映射:要算一次的和的矩阵乘法,
输入:和
输出:
因为,单纯计算attention总共就是
FFN的FLOPS
FFN的公式:
在原始Transformer中,的shape是,的shape是,
第一个线性层:
输入:和
输出:
第二个线性层:
输入:和
输出:
所以一层Transformer,即attention+FFN的计算量为
有两点需要注意的:
对NLP任务来讲,一般是个比较固定的值,如512,而变大,效果会更好,所以一般是,所以复杂度取决于的大小。
但有些模型的初始设置不是这样的,例如GPT3的175B模型里,,当然,算力够的话也可以把变大
DIN的FLOPS
特殊地,对于推荐中的DIN那种,看当前item和历史s个item的相关性,即q的序列长度只有1,不考虑多头,而这其实也是decoder预测下一个词时过一层Transformer的复杂度
已经有3个序列长度为的QKV的cache,要算第个词和这个词的attention
计算第个词的3个Q、K、V:要算三次$1\times d$和的矩阵乘法,所以是:
输入:和3个
输出:
计算Q和K的相似度:要算一次和的矩阵乘法,【这里的K是历史长度的序列拼上当前词,当然对DIN来讲要去掉当前词,这里先忽略这个】
输入:和
输出:
把相似度用到V上:要算一次和的矩阵乘法,,【同样地,这里的V是历史长度的序列拼上当前词,当然对DIN来讲要去掉当前词,这里先忽略这个】
输入:和
输出:
最后过一个线性映射:要算一次的和的矩阵乘法,
输入:和
输出:
第一个线性层:
输入:和
输出:
第二个线性层:
输入:和
输出:
总共是
Transformer的访存
GPU架构的介绍参考https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/和https://www.zhihu.com/question/319355296/answer/2193938981,GPU对比CPU如下:
任务模式
CPU由专为顺序串行处理而优化的几个核心组成
GPU则拥有一个由数以千计的更小、更高效的核心(专为同时处理多重任务而设计)组成的大规模并行计算架构。同时CPU相当的一部分时间在执行外设的中断、进程的切换等任务,而GPU有更多的时间并行计算。
功能定位
CPU不但要承担计算任务还有承担逻辑控制等任务。
GPU在渲染画面时需要同时渲染数以百万记的顶点或三角形,故GPU的设计是可以充分支持并行计算。
系统集成
GPU作为一类外插设备,在尺寸、功率、散热、兼容性等方面的限制远远小于CPU,这样可以让GPU有较大的显存和带宽。
以A100为例,整体架构如下
PCIE层:通过PCIE接口以外设的方式集成到服务器上。
中间一坨绿色的部分是GPU的计算核心SM(Streaming Multiprocessor),在A100中,一个SM有64个用于计算的Core,共108个SM(图里是GA100,有128个SM),故共6192个Core。
中间蓝色部分是L2缓存
NVLink:多个GPU间进行通信的组件,会优化GPU间的通信,提升传输效率。
两侧的HBM2是显存,目前的A100的显存有两种40G and 80G
A100的SM如图所示,
GPU的显存分成两部分:
Global Memory:整体架构图中的两侧HBM2部分,例如A100 80G就有80G的global memory,2TB/s带宽,访问速度比较慢
Shared Memory:SM图中浅蓝色的L1 Data Cache,例如A100中每个SM中有192KB,访问速度比较快
从图中可见,A100的FP16有312T的FLOPS
以矩阵乘法为例,,
计算时间:
访存时间为:,因为首先要读取和这两个矩阵,然后结果还要写入这个矩阵里。假设是fp16,占2bytes,那就还要乘以2
假设,以计算Q和K的相似度为例,对比一下训练和预测时的计算耗时和访存耗时
训练时:==>计算是瓶颈
FLOPS:
计算耗时:
访存耗时:
预测时:==>访存是瓶颈
FLOPS:
计算耗时:
访存耗时:
一些常见的名词:
H2D:host to device,从cpu拷贝到gpu
D2H:device to host,从gpu拷贝到cpu
模型训练
mfu(Model Flops Utilization)模型算力利用率是分布式训练效率的优化目标。
一个模型定义好之后,前向和反向的计算量就是固定(不考虑动态图的话)的,除以每个step的latency就是mfu。以nanoGPT中的代码为例:
一般分布式训练参数量越多->卡数越多->通信占比越高->MFU越低,所以要优化通信效率。
优化设置
batchsize:通常用比较大的batchsize,提高训练稳定性和吞吐量。GPT-3和PaLM在训练时动态增加batshzie,最终达到百万级别,batchsize从3.2w逐渐增加到320w个token。
学习率:
预热(warm-up):在训练的初始0.1%到0.5%的steps中,用线性预热策略逐渐增加学习率到最大值(到之间,GPT-3是)
衰减(decay):后续steps中余弦衰减,逐渐降低到最大值的约10%,直到收敛
稳定训练:
权重衰减和梯度裁剪:权重衰减率设为0.1,梯度裁剪阈值设为1.0
梯度检查点:容易出现loss突增,PaLM和OPT从发生突增前的一个ckpt重新开始训练,并跳过可能有问题的数据
缩减emb梯度:GLM发现emb的异常梯度通常会导致loss突增,故缩减emb梯度以缓解
混合精度训练
FP16
Mixed precision training提出了用16位float(FP16)训练,减少内存使用和通信开销。A100等GPU具有的FP16计算单元是FP32的两倍,故FP16的计算效率能进一步提高。
推理(预测):所有参数都是fp16,相对fp32,存储变成一半,速度提升1倍。
训练:参数和梯度用fp32存储,但是在计算前会转成fp16,计算后再转回fp32。主要为了防止溢出,loss要乘一个scale,然后在fp16的梯度要除以scale。
以adam优化器为例,对于每1个参数来说,fp16的训练占用20bytes显存,包括
fp16的参数:2bytes
fp16的梯度:2bytes(其实不一定是必须的,在ZeRO的论文中有分析)
优化器状态(optimizer state):16bytes
fp32参数(4bytes)
fp32梯度(4bytes)
fp32 variance【历史梯度平方和】(4bytes)
fp32 momentum【历史梯度滑动平均】(4bytes)
而在预测时只要存一个fp16的参数(2bytes)就行,所以预测的显存是训练的1/10,对应1.3B参数量的gpt2-xl,训练要占用,预测只要2.6GB
BF16
FP16可能导致计算精度的损失从而影响模型性能,BLOOM里用BF16(brain floating point)比FP16分配更多指数位和更少的有效位,在准确性方面更好
https://blog.csdn.net/orangerfun/article/details/133106913
bf16的指数位和fp32一样多
可扩展的训练
需要提高训练吞吐量和加载更大模型到显存中
3D并行
如下三种并行(数据并行、流水线并行、张量并行)的组合
数据并行(Data Parallelism)
将模型参数和优化器状态复制到多个GPU上,每个GPU只处理分给它的数据,不同GPU算出的梯度进行聚合得到batch的梯度,再更新所有GPU上的模型。高度可扩展,增加GPU数就能提高训练吞吐。
torch的ddp
可以一起搞的技巧——梯度累积,当显存不够跑较大的batchsize时,训练效果可能会很差,可以先跑多个mini-batch的前向和反向,把梯度累积起来,再更新一次参数,在数学上等价于跑一个较大的batchsize。
也可以用torch的no_sync():
流水线并行(Pipeline Parallelism)
将LLM的不同层分配到多个GPU上,一般Transformer模型中会将连续的层加载到同一GPU上,以减少在GPU间传输已计算的隐层状态或梯度的成本。简单的实现会导致GPU利用率降低,因为每个GPU要等前一个完成计算,导致不必要的气泡开销,如下方法可以提高流水线效率:
PipeDream:PipeDream: Fast and Efficient Pipeline Parallel DNN Training,填充多个数据batch+异步梯度更新?看下paper先。。。
1) GPipe
Gpipe主要思想:
图a:把模型不同layers顺序放在4张卡上,0->3卡流水线前向计算loss,3->0再反向计算gradients
图b:从时间顺序上看,每张卡有3/4时间是空闲的,GPU利用率非常低
图c:配合梯度累积,多个mini-batch可以同时跑在流水线里面,每张卡则有3/(3+4)的时间空闲(Bubble)
流水线并行的问题是中间有Bubble。当卡数,梯度累积次数,则
GPT里用Weight Tying提升效果,输入和输出共享vocab embedding
2) 重计算
重计算(recomputation)是对于pipeline parallelism非常重要的一个优化,最开始在Training Deep Nets with Sublinear Memory Cost一文中提到,在flash attention中也用了。
因为要做pipeline+梯度累积,前向过程中的激活值要保存,以留给反向过程使用,保存很多份的激活值对显存造成了很大压力。recomputation(也叫checkpointing)用时间来换空间(反向的时候进行一次激活值的重计算),可以缓解显存问题。
pytorch的实现。大致逻辑是包了一个autograd.Function
,前向时保存一些inputs/rng_state(RNG state是Random Number Generator state的缩写,随机数生成器的状态。在深度学习和其他计算任务中,随机数生成器用于初始化参数、决定正则化技术如dropout的行为,以及在训练过程中选择样本等。RNG状态是指随机数生成器当前的内部状态,它可以用来在需要时重现或恢复特定的随机数序列,确保实验或模型训练的可重复性),反向时重新计算
张量并行(Tensor Parallelism)
Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism
分解LLM的张量(参数矩阵),例如矩阵乘法,可以按列分成两个子矩阵和,从而改为,将和放到不同GPU上,然后就可能通过跨GPU通信将两个GPU的结果merge。
Megatron-LM:能扩展到更高维度的张量
Colossal-AI:
特别针对序列数据提出序列并行(Sequence Parallelism: Long Sequence Training from System Perspective),详见下一节
参考https://zhuanlan.zhihu.com/p/622036840
原始矩阵乘法是[m,k], [k, n] -> [m, n]
,有如下两种矩阵分解的等效:
列并行(column parallelism):第一个矩阵不变,第二个矩阵竖着劈成两半,即
[m,k], [k, n/2] -> [m, n/2]
concat([m, n/2], [m, n/2]) -> [m, n]
行并行(row parallelism):两个矩阵都横着劈成两半,即。从2推广到k,其实就是split-k算法,把两个矩阵都分成k个小块,两两相乘后,最后reduce_sum一下。因为每个线程计算的矩阵更小了,开销小,可以通过加大线程数来提升并行效率。
[m, k/2], [k/2, n] -> [m, n]
elemwise_add([m, n], [m, n]) -> [m, n]
行并行还可以扩展到推荐里,假设user有k/2维,item也是k/2维,concat在一起,然后过一个k*d的mlp,即[1,k] * [k, d] -->[1,d]
,那么可以按行并行的方法,拆成2个[1, k/2]
和[k/2,d]
相乘,再相加。这样item侧的[k/2,d]
可以把全库缓存过来,在线实时算user,排序时把对应item向量抽出来,和user加起来就行
megatron对transformer进行了如下优化:
MLP第一个nn按列分割,第二个nn按行分割,中间省了一次通信
Attention按照head来分割(类似列分割),后面接的nn按行分割,中间也省了一次通信
图里面的通信算子
是前向identity,反向all-reduce
是前向all-reduce,反向identity
综合来看,一层transformer layer如下
具体的计算量可以参考https://colossalai.org/docs/features/1D_tensor_parallel/#introduction:
ZeRO
ZeRO: Memory Optimization Towards Training A Trillion Parameter Models
fp16那一节中,optimizer state的显存占用,在前向和反向的时候都不用,只有最后optimizer step的时候才用。
===>zero的思想:把optimizer state分shard存在不同的卡上,只在最后gather时才用。
ZeRO(Zero Redundancy Optimizer)在DeepSpeed库中提出,解决数据并行中的内存冗余问题。数据并行其实并不需要每个GPU都存整个模型、梯度和优化器参数,ZeRO在每个GPU仅保存部分数据,当需要其余数据时从其他GPU检索。3种解决方案:
优化器状态分区:zero1,对显存最大开销的部分进行shard
梯度分区:zero2
参数分区:zero3
前两种方案不会增加通信开销,第三种方案增加约50%通信开销,但能节省和gpu数成比例的内存。
详见官方博客:ZeRO & DeepSpeed: New system optimizations enable training models with over 100 billion parameters
需要指定deepspeed的配置:
启动:
facebook的开源库FSDP(full sharded data parallel)(Fairscale: A general purpose modular pytorch library for high performance and large scale training)里基于pytorch实现了类似ZeRO的技术。
还有一些paper也能降低内存,如
Reducing activation recomputation in large transformer models
Training deep nets with sublinear memory cost
序列并行
序列并行(Sequence Parallelism: Long Sequence Training from System Perspective),可以进一步分解Transformer的注意力操作。
Reducing Activation Recomputation in Large Transformer Models这个也是
对比TP:
SP:
综合对比各种并行
几个缩写:params(p)/gradients(g)/optimizer states(os)/activation(a)
并行方法 | 显存效率 | 计算效率 | 限制 |
---|---|---|---|
DP(数据并行) | p/g/os都复制在每张卡上,显存效率很低 | 计算和通信可以overlap,如果都在一个minipod内扩展性很好;梯度累积可以提高计算效率 | batchsize不能太大,否则模型效果有损;batchsize/dp不能太小,不然打不满tensorcore |
ZeRO(解决DP的显存冗余) | zero1/2/3把os/g/p分别shard到每张卡上,显存效率很高 | 需要做prefetch来减少通信对计算效率的影响 | 同DP |
PP(流水线并行) | 切分p,提高显存效率;a需要存多次,降低显存效率 | 通信次数最少,只发生在多层之间的切分点,但是有Bubble | 每个Stage之间需要负载均衡,对模型结构和卡数有限制 |
TP(张量并行) | p/g/os/a被shard在每张卡上,显存效率也很高;有些层如layernorm是复制的,可以用sequence parallel优化 | 梯度不需要同步,提高计算效率;每层插入了4次通信,而且是跟计算有依赖的,会降低计算效率;每层的计算量进行了切分,也会降低计算效率 | 一般是单机内8卡使用nvlink时用TP |
把神经网络看成是输入和权重的矩阵乘法,那么,DP和PP其实是对的拆分,而TP则是对的拆分
整体对比可以看
一般这么整合:
把机器分成N组,不同组之间用DP
一组机器有M台机器,不同机器之间用PP
一台机器有K张卡,不同卡之间用TP
编译优化
pytorch的TorchDynamo
https://pytorch.org/docs/stable/torch.compiler_deepdive.html
最简单的用法torch.compile()
flash attention
Flashattention: Fast and memory-efficient exact attention with io-awareness
FlashAttention其实是对的一种加速实现。
一般的实现:需要先 用矩阵存的结果,然后对按行做softmax得到新的,再用乘以得到最后结果。
FlashAttention通过一些特殊技巧,不需要算出这个临时变量,通过分块计算,让临时变量总是可以放在cache里,从而
减少Global Memory的大小
加速attenttion的计算,因为读cache比访问Global Memory快多了。
推理速度优化
量化
ZeroQuant-V2: Exploring Post-training Quantization in LLMs from Comprehensive Study to Low Rank Compensation和Compression of generative pre- trained language models via quantization
int4量化:GLM中用了
vLLM
https://github.com/vllm-project/vllm
Efficient Memory Management for Large Language Model Serving with PagedAttention
并行推理方法
Efficiently scaling transformer inference
LayerSkip
LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding
其他的一些加速库
lightseq
LightSeq: A High Performance Inference Library for Transformers
LightSeq2: Accelerated Training for Transformer-based Models on GPUs
https://github.com/bytedance/lightseq
PPL.LLM
https://github.com/openppl-public/ppl.llm.serving
微调
指令微调(instruct tuning):增强/解锁LLM的能力,
对齐微调(alignment tuning):将LLM的行为与为类的价值观或偏好对齐。
高效微调方法:用于模型快速适配
指令微调
收集或构建指令格式(instruction-formatted)的实例
使用这些示例进行有监督微调
详见综述Is prompt all you need? no. A comprehensive and broader view of instruction learning
构建格式化实例
指令格式的实例包括一个任务描述(即指令)、一对输入输出和少量示例(可选)
格式化已有数据集
收集来自不同领域(文本摘要、文本分类、翻译等)的实例来创建有监督的多任务训练数据集。用自然语言的任务描述来格式化这些数据集是很方便的。
使用人类撰写的任务描述来增广带标的数据集,通过解释任务目标来指导LLM理解任务。
众包平台(如PromptSource)有效地创建、共享和难不同数据集的任务描述
通过指令微调特殊设计的任务描述,反转已有实例的输入-输出对,例如“请基于以下答案生成一个问题”,如
利用启发式任务模板将大量无标注的文本转换为带标注的实例。如Learning instructions with unlabeled data for zero-shot cross-task generalization
格式化人类需求
来自公共NLP数据集的训练实例虽然进行了格式化,但任务描述缺乏多样性或与人类真实需求不匹配,故InstructGPT采用真实用户提交给其API的查询作为任务描述。此外,为了丰富任务多样性,通常
标注者为真实生活中的任务编写指令,如开放式生成、开放式问答、头脑风暴、聊天等
另一组标注人员直接对这些指令进行回答
将**指令(采集的用户查询)和期望输出(人工编写的答案)**pair对作为一个训练实例
还有一些半自动化的方法将现有实例输入到LLM中生成多样的任务描述和实例来构建实例,如
构建实例的关键
增加指令:
扩大任务数量:可以极大提高LLM的泛化能力。但随着任务增加,模型性能最初是连续增长,但任务数量达到一定水平时,性能基本不提升了。Scaling instruction-finetuned language models猜测,一定数量的代表性性任务就能够提供足够充足的知识了。
增强任务描述的多样性:从如长度、结构、创造力等方面入手,如Multitask prompted training enables zero-shot task generalization
每个任务的实例数量:通常少量实例就可以让模型有不错的泛化能力,当某些任务的实例数量进一步增加(至数百个)时可能会过拟合。如Super-NaturalInstructions: Generalization via Declarative Instructions on 1600+ NLP Tasks
设计格式:
任务描述:LLM理解任务的最关键部分
适当数量的示例:能产生实质性的改进,也减轻对指令工程的敏感性。如Scaling instruction-finetuned language models
指令中的其他部分:如避免事项、原因、建议,影响很小,甚至有负面影响,如Cross-task generalization via natural language crowd- sourcing instructions
包含推理数据集的CoT实例:Scaling instruction-finetuned language models和OPT-IML: scaling language model instruction meta learning through the lens of generalization提到同时用包含和不包含CoT的样本微调,能在各种下游任务取得好的效果,包括需要多级推理能力的任务(常识问答、算术推理)和不需要多级推理的任务(如情感分析和抽取式问答)。
指令微调策略
相比预训练而言,指令微调有多个不同:
训练目标函数:如seq2seq的loss
优化参数设置:更小的batchsize和学习率
平衡数据分布:平衡不同任务间的比例:
实例比例混合策略(Exploring the limits of transfer learning with a unified text-to-text transformer),把所有数据集合并,然后从混合数据集中按比例采样每种实例。
设置最大容量:限制数据集中能包含的最大实例数,防止较大数据集挤占整个采样集合,通常设置为几千或几万,如Exploring the limits of transfer learning with a unified text-to-text transformer和OPT-IML: scaling language model instruction meta learning through the lens of generalization。
结合指令微调和预训练:
在指令微调时加入预训练数据:,如OPT-IML, 可以看成是对模型的正则化。
混合预训练数据(纯文本)和指令微调(指令格式)数据,用多任务方式从头训练:Exploring the limits of transfer learning with a unified text-to-text transformer和Ext5: Towards extreme multi-task scaling for transfer learning。将指令格式数据集作为预训练语料库的一小部分来预训练,同时获得预训练和指令微调的优势,如GLM-130B和Galactica。
指令微调效果
性能改进
不同规模的模型都能从指令微调中受益,随着参数规模增加,性能也有提升。Multitask prompted training enables zero-shot task generalization发现,指令微调后的小模型甚至能比未经微调的大模型效果更好
指令微调在不同模型架构、预训练目标和模型适配方法上都有稳定改进效果,由Scaling instruction-finetuned language models发现
指令微调是提升现有LM(包括小型PLM)能力的一个通用方法,同样由Scaling instruction-finetuned language models发现
LLM所需的指令数据数量明显少于预训练数据,故指令微调的成本较低。
任务泛化性
赋予LLM遵循人类指令执行特定任务的能力(通常被视为一种涌现能力):Scaling instruction-finetuned language models发现,指令微调鼓励LLM理解用于完成任务的自然语言指令,,即在未见过的任务上也能执行。
使LLM具有更强的解决现实世界任务的能力:指令微调能帮助LLM缓解一些弱点(如生成重复内容或补全输入但完不成成相应任务),由Scaling instruction-finetuned language models和Training language models to follow instructions with human feedback发现。
指令微调后的LLM能泛化到其他语言的相关任务上:Crosslingual generalization through multitask finetuning提出的BLOOMZ-P3基于BLOOM在纯英文的P3任务集合上进行微调,在多语言的句子实例任务中,相比BLOOM有超过50%的性能提升,同时仅用英文指令就能产生不错效果,减少针对特定语言的指令工程的工作量。
对齐微调
Training language models to follow instructions with human feedback和Alignment of language agents提出,LLM可能编造虚假信息、产生有害的、误导性的和有偏见的表达,因为LLM在预训练时没有考虑人类的价值观或偏好。
Improving alignment of dialogue agents via targeted human judgements和Training language models to follow instructions with human feedback提出了人类对齐,使LLM的行为能够符合人类期望。
Training language models to follow instructions with human feedback、A general language assistant as a laboratory for alignment和Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback发现,和适配微调(如指令微调)相比,对齐微调要考虑的标准并不同,这可能会在某种程度上损害LLM的通用能力,即对齐税。
对齐的标准
有用性:以简洁且高效的方式帮助用户解决任务或回答问题。需要进一步阐明问题时,应该有通过提出恰当的问题来获取额外信息的能力,并有合适的敏感度、洞察力和审慎度(from A general language assistant as a laboratory for alignment)。
诚实性:又称为正确性,提供准确内容,传达适当的不确定性很重要,避免任何形式的欺骗或信息误传。LLM了解其能力和知识水平(知道自己不知道什么)。A general language assistant as a laboratory for alignment)认为,与有用性和无害性相比,诚实性是一个更客观的标准,故诚实性对齐依赖的人力可能更少。
无害性:生成的语言不得是冒犯性或者歧视性的,能检测到隐蔽的出于恶意目的的请求。当被诱导去执行危险行为(如犯罪)时,应该礼貌拒绝。Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback提出,某个行为是否有害及有害程度因个人和社会而异。
对齐的标准很主观,难以直接作为LLM的优化目标。比较有前景的方法是Red teaming language models to reduce harms: Methods, scaling behaviors, and lessons learned和Red teaming language models with language models提出的红队攻防,用对抗的方式手动或自动地探测LLM,使其生成有害输出,再更新模型防止此类输出。
收集人类反馈
选择标注人员
教育水平要求高:Sparrow要求本科学历的英国人,Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback中的高优任务有一半是美国硕士
意图一致性筛选:InstructGPT通过标注人员和研究人员意图一致性来选择标人员。研究者先自己标少量数据,然后衡量自己和标注人员间标的一致性,选择一致性最高的标注人员来进行后续标注。
选择优秀标注者:Teaching language models to support answers with verified quotes中,研究人员评估标注人员的表现,选出如高一致性之类的一组优秀标注人员继续合作,Learning to summarize from human feedback发现,在标注时提供详细的标注指令和实时的指导是有帮助的。
收集反馈
基于排序的方法:
只选最佳候选:Fine-tuning language models from human preferences和Recursively summarizing books with human feedback在这种早期工作中,标注人员用比较粗略的方式评估模型生成的结果,如只选择最佳候选。一方面不同人意见不同,另一方面这种方法忽略了没被选中的样本。
elo评分系统:Improving alignment of dialogue agents via targeted human judgements和Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback提出了elo评分系统,两两比较所有候选输出结果,生成一个偏好排序。
基于问题的方法:回答研究人员设计的特定问题,这些问题覆盖不同的对齐标准以及其他对LLM的约束条件。例如WebGPT中,标注人员要回答关于检索到的文档对回答给定输入是否有帮助的选择题。
基于规则的方法:
Sparrow不仅选择标注人员挑选的最佳回复,还设计一系列规则来测试模型生成的回复是否符合有用、正确、无害的标准,让标注者对模型生成的回复违反规则的程度进行打分。
GPT-4用一组基于GPT-4的zero-shot分类器作为基于规则的奖励模型,自动确定模型生成的输出是否违反一组人类编写的规则。
RLHF
详见RLHF章节
高效微调
全量参数都微调成本很大,有更高效的方法,称为参数高效微调(parameter-efficient fine-tuning)。
适配器微调(adapter tuning)
Parameter-efficient transfer learning for NLP提出,在Transformer中引入一个小型神经网络模块(适配器),LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models也提出了瓶颈架构:
将原始特征压缩到较小维度(然后进行非线性变换)
恢复到原始维度
一般是串行插入的方式,集成到每个Transformer层里,分别放到注意力层和前馈层之后。Towards a unified view of parameter- efficient transfer learning提出了并行适配器,即与注意力层和前馈层并行。
微调时,原参数不变,仅更新适配器模块参数。
前缀微调(prefix tuning)
Prefix-tuning: Optimizing continuous prompts for generation。
在每个Transformer层前添加一系列前缀,即一组可训练的连续向量。前缀向量具有任务的特异性,可以看作虚拟的token emb。
重参数化技巧:
学习一个将较小矩阵映射到前缀参数矩阵的MLP函数,而不是直接优化前缀,有助于稳定训练。
优化后,舍弃映射函数,只保留派生的前缀向量以增强与特定任务相关的性能。
由于只训练前缀参数,故能实现参数高效的模型优化
P-tuning v2: Prompt tuning can be comparable to fine- tuning universally across scales and tasks提出了p-tuning v2,为了自然语言理解在Transformer中引入逐层提示向量,还利用多任务学习来联合优化共享的提示。
提示微调(prompt tuning)
在输入层加入可训练的提示向量,基于离散提示方法(How can we know what language models know?和Autoprompt: Eliciting knowledge from lan- guage models with automatically generated prompts),通过包含一组软提示token来扩充输入文本,再用扩充后的输入来解决特定的下游任务。将任务特定的提示emb与输入文本的emb相结合,输入模型中。
GPT understands, too:提出了P-tuning,用自由形式来组合上下文、提示和目标token,用双向LSTM学习软提示token的表示,适用于自然语言理解和生成的架构。
The power of scale for parameter-efficient prompt tuning:提示微调,直接在输入前加入前缀提示。训练时只有提示emb会根据特定任务进行监督学习。这种方法在输入层只包含少量可训练参数,故其效果高度依赖底层语言模型的能力。
低秩适配(LoRA)
Lora: Low-rank adaptation of large language models通过增加低秩约束来近似每层的更新矩阵,假设参数矩阵,一般是
冻结,通过低秩分解矩阵来近似更新
其中和是用于任务适配的可训练参数,是降低后的秩。
LoRA的优点:
大大节省内存和存储(如VRAM,Video Random Access Memory)
可以只保留一个大型模型副本,同时保留多个用于适配不同下游任务的特定低秩分解矩阵。
用更有原则的方法设置秩:
基于重要性分数的分配:Adaptive budget allocation for parameter-efficient fine-tuning提出的AdaLoRA
小结
LoRA已经有广泛的应用,如LLaMA和BLOOM,
Alpaca-LoRA:Instruct-tune llama on consumer hardware,通过LoRA训练的Alpaca的轻量级微调版本。
LLaMA-Adapter:Llama-adapter: Efficient fine-tuning of language models with zero-init attention将可学习的提示向量插入每个Transformer层中,提出零初始化的注意力,通过减轻欠拟合提示向量的影响以改善训练,还能扩展到多模态设置,如视觉问答。
LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models比较了串行适配器微调、并行适配器微调和LoRA,在GPT-J(6B)、BLOOM(7.1B)和LLaMA(7B)上评估:这些方法在困难任务上效果不如GPT-3.5,但在简单任务上表现相当,LoRA表现相对较好且使用的可训练参数明显较少。
huggingface开源了Peft: State-of-the-art parameter-efficient fine-tuning methods,包括LoRA/AdaLoRA、前缀微调、P-Tuning、提示微调,支持GPT-2和LLaMA,还支持视觉Transformer如ViT和Swin Transformer。
让大模型不再「巨无霸」,这是一份最新的大模型参数高效微调综述
Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey
lora变种
DoRA: Weight-Decomposed Low-Rank Adaptation
LoRA可以认为是对Finetune微调的一种低秩近似,通过增加Rank,LoRA可以达到类似Finetune的微调效果。因此之前多数研究都把LoRA和Finetune在微调准确性上的差异归结为二者的优化参数量不同。
但经过分析发现,lora的学习模式和FT很不一样,更偏向于大开大合,即方向和幅度呈很强的正相关,可能对更精细的学习有害
dora通过同时关注权重更新时的大小和方向变化,实现了比LoRA更加接近finetune微调效果:
w拆成magnitude()乘以direction()
magnitude不变,direction里的用lora更新
注意,这里的norm是column-wise的norm,即输入的矩阵,每一列的元素算一个norm(平方和开根号)得到一个数,最终就是的矩阵
使用
上下文学习
GPT-3提出ICL,将任务描述和(或)示范(demonstration)以自然语言文本形式表达。
上下文学习形式
以任务描述作为开始,从任务数据集中选择一些样例作为示范。
以特别设计的模板形式将它们按照特定的顺序组合成自然语言提示。
将测试样例添加到LLM的输入中以生成输出。
形式化地看,表示由个样例组成的一组示范,表示把第个任务样例转换为自然语言提示的函数。给定任务描述、示范和新的输入查询,LLM生成的输出如下:
真实答案留白,由LLM预测。
更多的可以参考综述A survey for in-context learning
指令微调可以提高LLM执行目标任务的ICL能力,尤其是零样本场景(仅使用任务描述)。
示范设计
示范选择
启发式方法:
基于knn的检索器来选择与查询语义相关的样例:如What makes good in-context examples for gpt-3?和Does GPT-3 generate empathetic dialogues? A novel in-context example selection method and automatic evaluation metric for empathetic dialogue generation。但只是针对每个样例单独选择,而不是对整个样例集合进行评估。
同时考虑相关性和多样性的选择策略:Complementary Explanations for Effective In-Context Learning
基于LLM的方法:
直接用LLM来选择:Finding supporting examples for in-context learning:LLM可以直接根据添加样例后的性能提升评估每个样例的信息量,以进行选择。
两阶段检索:Learning to retrieve prompts for in-context learning:提出EPR,先用无监督方法召回相似样例,再用密集检索器(用LLM标记的正负样例训练)进行排序。
RL方法:Active example selection for in-context learning,将示范选择任务建模为RL问题,LLM是奖励函数,为训练策略模型提供反馈。
用LLM来生成示范:Chatgpt outperforms crowd-workers for text-annotation tasks发现LLM在文本标方面表现很好,故可以直接将LLM作为无人工干预的示范生成器,如Self-generated in-context learning: Leveraging auto-regressive language models as a demonstration generator和Selective in-context data augmentation for intent detection using pointwise v-information
An explanation of in-context learning as implicit bayesian inference提到,ICL中选择的示范样例应该包含足够的有关待解决任务的信息,并与测试查询相关。
示范格式
将选择的示范进行整合以及格式化:
收集包含人工编写的任务描述的大规模数据集:Cross-task generalization via natural language crowd- sourcing instructions,能够提升已见任务的性能,也能在一定程度泛化到未见任务。
半自动化方法:Self-instruct: Aligning language model with self generated instructions使用由人工编写的任务描述组成的种子集合来指导LLM为新任务生成任务描述。
自动生成高质量的示范格式:
Auto-CoT:Automatic chain of thought prompting in large language models使用零样本提示(let's think step by step)以生成中间推理步骤
least-to-most提示:Least-to-most prompting enables complex reasoning in large language models先询问LLM来执行问题分解,再利用LLM根据已解决的中间答案依次解决子问题。
示范顺序
LLM有时会被顺序偏差影响,例如Calibrate before use: Improving few-shot performance of language models提出LLM会倾向于重复示范结尾附近的答案===>结尾很重要!!
启发式方法:What makes good in-context examples for gpt-3?根据在emb空间中示范与查询的相似度来排列,相似度越高,距离结尾越近。
基于信息论的方法:
Self-adaptive in-context learning使用最小化压缩和传输任务标签所需的码长来整合更多任务信息,需要额外的标记数据作为用来评估特定示范顺序性能的验证集。
Fantastically ordered prompts and where to find them: Overcoming few-shot prompt order sensitivity使用全局和局部熵度量来为不同的示范顺序打分,且为了消除对额外标注数据的需要,这篇文章从LLM本身采样来获取验证集。
底层机制
预训练如何影响ICL
ICL与预训练任务设计:GPT-3发现ICL能力随模型增大而增强,但Metaicl: Learning to learn in context发现小规模的PLM也能通过特别设计的训练任务从而表现出强大的ICL能力(例如输入是任务实例+查询,预测标签),甚至能超越规模更大的模型。
ICL与预训练语料:
On the effect of pretraining corpora on in-context learning by a large-scale language model发现ICL的性能主要取决于预训练语料的来源而非规模
Data Distributional Properties Drive Emergent In-Context Learning in Transformers分析训练数据分布的影响,发现当训练数据可以被聚类成多个不常见的类,而不是均匀分布时,模型会有ICL能力
An explanation of in-context learning as implicit bayesian inference从理论上解释,认为ICL是在具备长程连贯性的文档上进行预训练的产物。
LLM如何实现ICL
将ICL视为隐式微调:Why can GPT learn in-context? language models secretly perform gradient descent as meta-optimizers和Transformers learn in-context by gradient descent
ICL可以看成是通过前向计算,LLM生成关于示范的元梯度,并通过注意力机制隐式地梯度下降。
LLM的某些注意力头能执行与ICL能力密切相关的任务无关的原子操作(如复制、前缀匹配等)
将ICL视为算法学习过程:Transformers as algorithms: Generalization and implicit model selection in in-context learning、What learning algorithm is in-context learning? investigations with linear models,基于这个解释框架,LLM能通过ICL有效地学习简单的线性函数,甚至是如决策树的复杂函数
预训练阶段:LLM本质上通过其参数对隐式模型进行编码
前向计算阶段:通过ICL中提供的示例,LLM可以实现如sgd的学习算法,或者直接计算出闭式解以更新这些模型
思维链提示(CoT)
CoT是一种改进的提示策略,旨在提高LLM在复杂推理任务中的性能,如算术推理(Training verifiers to solve math word problems、Are NLP models really able to solve simple math word problems?和A diverse corpus for evaluating and developing english math word problem solvers)、常识推理(Commonsenseqa: A question answering challenge targeting commonsense knowledge和Did aristotle use a laptop? A question answering benchmark with implicit reasoning strategies)、符号推理(Chain of thought prompting elicits reasoning in large language models)。
ICL只使用输入输出对来构造提示,而CoT将最终输出的中间推理步骤加入提示。
使用CoT的ICL
一般在小样本和零样本这两种设置下和ICL一起用
小样本思维链
将每个示范<输入,输出>
替换为<输入,CoT,输出>
。小样本CoT可以看成ICL的一种特殊提示,但相比ICL的标准提示,示范的顺序对性能影响相对较小。
思维链提示设计:
使用多样的CoT推理路径:Making Large Language Models Better Reasoners with Step-Aware Verifier,对每个问题给出多个推理路径。
使用具有复杂推理路径的提示:Complexity-based prompting for multi-step reasoning
Auto-CoT:上述方法都需要标注CoT,Automatic chain of thought prompting in large language models利用Large language models are zero-shot reasoners提出的zero-shot-CoT
通过特别提示LLM来生成CoT推理路径(例如“Let’s think step by step”)
将训练集里的问题分成不同簇,选择最接近每个簇质心的问题,就可以代表整个训练集里的问题。
增强的思维链策略:如何生成多个推理路径,并在得到的答案中寻找一致性
self-consistency:Self-consistency improves chain of thought reasoning in language models,在生成CoT和最终答案时新的解码策略。先用LLM生成多个推理路径,再对所有答案进行集成(例如投票)。
更通用的集成框架:Rationale-Augmented Ensembles in Language Models发现多样化的推理路径是COT推理性能提高的关键,因此将self-consistency延伸至提示的集成。
通过训练打分模型来衡量生成的推理路径的可靠性,如On the advance of making language models better reasoners
零样本思维链
不在提示中加入人工标注的示范,而是直接生成推理步骤,再利用生成的CoT来得出答案。Large language models are zero-shot reasoners。
先通过“Let’s think step by step”来提示LLM生成步骤
再通过“Therefore, the answer is”来提示得到最终答案
这种方法在模型规模超过一定大小时可以显著提高性能,但在小规模的模型中效果不佳,即涌现能力。
Flan-T5和Flan-PaLM(Scaling instruction-finetuned language models)进一步地使用CoT进行指令调整,有效增强了在未见任务上的零样本性能。
进一步讨论CoT
思维链何时适用于LLM:
LLM为何能进行思维链推理:
思维链能力的来源:
提示中组成部分的影响:
能力评测
基础评测
语言生成
语言建模
条件文本生成
代码合成
存在问题
可控生成
专业化生成
知识利用
闭卷问答
开卷问答
知识补全
存在问题
幻觉(Hallucination)
知识实时性
复杂推理
知识推理
符号推理
数学推理
存在问题
不一致性
数值计算
高级评估
与人类对齐
与外部环境互动
工具使用
公开基准
MMLU:
BIG-bench:
HELM:
比较有用的数据集
中文glue
ChineseGLUE:为中文NLP模型定制的自然语言理解基准
超30亿中文数据首发!首个专为中文NLP打造的GLUE基准发布
https://github.com/CLUEbenchmark/CLUE
https://www.cluebenchmarks.com/
https://github.com/brightmart/nlp_chinese_corpus
中文阅读理解数据集
首个中文多项选择阅读理解数据集:BERT最好成绩只有68%,86%问题需要先验知识
Investigating Prior Knowledge for Challenging Chinese Machine Reading Comprehension
物理常识推理任务数据集
PIQA: Reasoning about Physical Commonsense in Natural Language
「在不使用刷子涂眼影的情况下,我应该用棉签还是牙签?」类似这种需要物理世界常识的问题对现今的自然语言理解系统提出了挑战。虽然最近的预训练模型 (如 BERT) 在更抽象的如新闻文章和百科词条这种具有丰富文本信息的领域问答方面取得了进展,但在更现实的领域,由于报导的偏差,文本本质上是有限的,类似于「用牙签涂眼影是一个坏主意」这样的事实很少得到直接报道。人工智能系统能够在不经历物理世界的情况下可靠地回答物理常识问题吗?是否能够捕获有关日常物品的常识知识,包括它们的物理特性、承受能力以及如何操纵它们。
在本文中,研究者介绍了一个关于物理常识推理任务和相应的基准数据集 PIQA(Physical Interaction:Question Answering)进行评估。虽然人类应对这一数据集很容易 (95% 的准确率),但是大型的预训模型很难 (77%)。作者分析了现有模型所缺乏的知识为未来的研究提供了重要的机遇。
常识推理数据集WinoGrande
WinoGrande: An Adversarial Winograd Schema Challenge at Scale
研究者提出了 WINOGRANDE,一个有着 44k 个问题的大规模数据集。该数据集在规模和难度上较之前的数据集更大。该数据集的构建包括两个步骤:首先使用众包的方式设计问题,然后使用一个新的 AFLITE 算法缩减系统偏见(systematic bias),使得人类可以察觉到的词汇联想转换成机器可以检测到的嵌入联想(embedding association)。现在最好的 SOTA 模型可以达到的性能是 59.4 – 79.1%,比人脸性能水平(94%)低 15-35%(绝对值)。这种性能波动取决于训练数据量(2% 到 100%)。
本论文荣获了 AAAI 2020 最佳论文奖,文中提出的 WINOGRANDE 是一个很好的迁移学习资源;但同时也说明我们现在高估了模型的常识推理的能力。研究者希望通过这项研究能够让学界重视减少算法的偏见。
对话数据集
Towards Scalable Multi-domain Conversational Agents: The Schema-Guided Dialogue Dataset
BelleGroup
https://huggingface.co/BelleGroup 里有很多中文的instruct和输出的数据集
OpenEQA
从文字模型到世界模型!Meta新研究让AI Agent理解物理世界
RLHF & InstructGPT
OpenAI魔改大模型,参数减少100倍!13亿参数InstructGPT碾压GPT-3
https://openai.com/blog/deep-reinforcement-learning-from-human-preferences/
Training language models to follow instructions with human feedback
https://huggingface.co/blog/zh/rlhf
预训练一个语言模型 (LM) ;
聚合问答数据并训练一个奖励模型 (Reward Model,RM),也叫偏好模型;
用强化学习 (RL) 方式微调 LM。
sft
确保任务多样性的情况下,由标注人员编写prompt和一些生成式任务的期望输出。
openai:instructGPT使用小版本的GPT-3,并对“更可取”(preferable)的人工生成文本微调
Anthropic:1000w-520亿参数的transformer,并按“有用、诚实和无害”的标准在上下文线索上蒸馏原始LM
DeepMind:在Teaching language models to support answers with verified quotes提出的GopherCite模型中,用的是2800亿的模型Gopher(Scaling language models: Methods, analysis & insights from training gopher)
不管是PreTraining阶段还是SFT阶段,loss函数都是一样的,只是计算的方式存在差异,PreTraining阶段计算的是整段输入文本的loss,而SFT阶段计算的是response部分的loss。
rm
接收一系列文本并返回一个标量奖励,数值上对应人的偏好。我们可以用端到端的方式用LM建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。
模型选择:RM可以是另一个经过微调的LM,也可以是根据偏好数据从头开始训练的LM。Anthropic 提出了一种特殊的预训练方式,即用偏好模型预训练 (Preference Model Pretraining,PMP) 来替换一般预训练后的微调过程,PMP对样本的利用率更高。
训练文本:RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。Anthropic 的数据主要是通过 Amazon Mechanical Turk 上的聊天工具生成的,并在 Hub 上 可用,而 OpenAI 使用了用户提交给 GPT API 的 prompt。
训练奖励数值:人工对 LM 生成的回答进行排名。起初我们可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音,通过排名可以比较多个模型各自的输出并构建更好的规范数据集,这些不同的排名结果将被归一化为用于训练的标量奖励值。
目前成功的RLHF使用了和要对齐的LM具有不同大小的LM:
OpenAI:175B的LM和6B的RM
Anthropic:使用的 LM 和 RM 从 10B 到 52B 大小不等
DeepMind:使用了 70B 的 Chinchilla 模型分别作为 LM 和 RM
rl
直接微调整个 10B~100B+ 参数的成本过高 ,参考低秩自适应LoRA和DeepMind的Sparrow LM。目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。
策略 (policy):一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM
行动空间(action space): LM 的词表对应的所有词元 (一般在 50k 数量级)
观察空间 (observation space): 是可能的输入词元序列,也比较大 (词汇量^输入标记的数量)
奖励函数:偏好模型和策略转变约束 (Policy shift constraint) 的结合。
ppo确定的奖励函数如下:
提示输入初始LM和当前微调的LM,分别得到输出文本和
将来自当前策略的文本传给RM得到标量奖励
将两个模型的生成文本进行比较计算差异的惩罚项,一般是输出词分布间的KL散度的缩放,即,
惩罚项的好处:
用于惩罚策略在每个训练batch中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。
如果没有这一项,可能导致模型在优化中生成乱码文本,以愚弄奖励模型提供高奖励值。
根据PPO,按当前batch的奖励进行优化。PPO是置信域优化(TRO,Trust Region Optimization)算法,用梯度约束确保更新步骤不会破坏学习过程的稳定性。
DeepMind对Gopher用了类似的奖励设置,但用的是A2C来优化梯度。
rl流程概述
https://zhuanlan.zhihu.com/p/635757674
Fine-Tuning Language Models from Human Preferences
Secrets of RLHF in Large Language Models Part I: PPO
Rollout and Evaluation:从prompt库里抽样,使用语言模型生成response,然后使用奖励模型(Reward Model, RM)给出奖励得分。这个得分反映了生成的response的质量,比如它是否符合人类的偏好,是否符合任务的要求等。
Make experience:收集了一系列的“经验”,即模型的行为和对应的奖励。这些经验包括了模型生成的response以及对应的奖励得分。这些经验将被用于下一步的优化过程。
Optimization:使用收集到的经验来更新模型的参数。具体来说,我们使用PPO算法来调整模型的参数,使得模型生成的response的奖励得分能够增加。PPO算法的一个关键特性是它尝试保持模型的行为不会发生太大的改变,这有助于保证模型的稳定性。
官方代码example
Rollout:根据策略(LM)生成轨迹(文本)。
输入:Batch Prompt、LM
输出:Prompt+Response
Evaluate:对生成的轨迹进行评估(RM)。
输入:Prompt+Response、RM
输出:Reward
Old Policy Sampling:计算并存储旧策略的概率、价值等值,
输入:Ref_model、Actor、Critic、Prompt+Response
输出:Ref Logprobs、Old Logprobs、Old Values
KL Penalty:计算当前策略和原始LM之间的KL散度,用作对策略改变过快的惩罚项。
输入:Ref Logprobs、Old Logprobs、Reward
输出:Token Reward
Generalized Advantage Estimation (GAE):G。基于old value(shape是(
batch_size
,response_length
))和reward估计优势函数A,它结合了所有可能的n-step 进行advantage估计输入:Token Reward、Old Values
输出:Advantages、Returns
New Policy Sampling:
输入ref_model、actor、critic,从新的策略中采样概率等信息,
输出new logprobs、new values和logits,供actor loss、critic loss以及entropy loss用。
Critic Loss:Critic的目标是估计状态的价值函数,Critic loss就是价值函数预测值和实际回报之间的差距。
输入:New Values、Returns
输出:critic梯度更新
Actor Loss:Actor的目标是优化策略,Actor loss就是基于优势函数的策略梯度。
输入:Old Logprobs,New Logprobs、Advantages
输出:actor梯度更新
Entropy Loss:为了增加探索性,通常会添加一个基于策略熵的正则项,它鼓励策略保持多样性。
输入:Logits
输出:entropy loss
Policykl:这是对策略迭代过程的一个度量,它度量新策略和旧策略之间的差距。
输入:Old Logprobs、New Logprobs
输出:是否early stop
在PPO中,策略优化的过程涉及到两个策略:一个是"旧的"策略,这是我们在开始每次优化迭代时使用的策略,另一个是"新的"策略,这是我们在优化过程中不断更新的策略。
自己整理重画的
几个重要的loss
actor & actor loss
Actor 是策略,它决定文本会被怎么样生成,是从策略网络拷贝来的模拟整个智能体在环境中行动的网络。
优势函数表示在给定的状态下采取某个行动比遵循当前策略的期望回报要好多少。
Actor Loss如下,用重要性采样比较在旧策略和新策略下行动的概率(Old Logprobs,New Logprobs),然后将这个比值(也就是 Importance Sampling 的权重)与优势函数Advantages相乘,得到了对 Actor Loss 的一个估计。
critic & critic loss
critic是专门用来预测actor轨迹每一步价值的网络,actor上加几个线性层能够给每个token预测一个值。任务是估计状态的价值函数,也就是预测从当前状态开始,通过遵循某个策略,期望能得到的总回报。
Critic Loss是最小化它的预测价值与实际回报之间的差距,常用mse
通过最小化Critic Loss,Critic的预测能力会逐渐提升。因为Critic的预测结果会被用来估计每个行动的优势(Advantage),这个优势值又会被用来计算策略的更新(Actor Loss)。
KL Penalty
用于保证经过强化学习后的模型(新策略actor)不会过于偏离原始预训练模型(ref model)。
GAE
GAE是一种多步优势估计方法。它通过引入一个权衡参数,在单步TD误差和多步TD误差之间进行权衡,从而减小估计的方差,提高学习的稳定性。其中是时间步的TD误差。
entropy loss
一个策略的熵越大,意味着这个策略选择各个动作的概率更加“平均”。在actor的loss里加熵,使得策略的熵尽可能大,从而有更多机会探索可能带来更好奖励的文本轨迹。
新实现:
Policy kl
在PPO中,KL散度被用作一种约束,以确保在优化过程中新策略不会偏离旧策略太远。这是为了防止过度优化,因为过度优化可能会导致策略性能的大幅下降。
我们希望在优化目标函数的同时,满足以下的KL散度约束:
在代码中,每个mini batch都会进行early stop的判定,如果计算出的KL散度大于 ,那么就会停止这一轮的优化,以保证新策略不会偏离旧策略太远。
两个采样
Old Policy Sampling(无bp)
是make experience的过程,计算并存储旧策略的概率、价值等值,来为后面更新的过程服务。
Old Logprobs:从“旧的”策略[即在这个batch数据中初始的LM(initial actor)]中计算每个token在旧的策略下的概率Old Logprobs。
Old Values:旧策略中每个时间步(每个token的预测结果)的价值,这个值由critic网络进行预测,critic网络就是需要这个值的原因是advantage的计算依赖于Old Values。
Ref Logprobs:最最原始的LM对于每个时间步的概率预测,一般就是固定不变的gpt3,计算这个值的目的是限制actor的更新,防止其偏离原始gpt3太远,他的实现在下一个步骤中。
New Policy Sampling(有bp)
在新的策略(更新后的actor)下对轨迹(文本)计算概率的过程,计算Actor Loss,即策略梯度的损失。
Old Logprobs是一次性一个batch的数据计算的,这是因为在一个batch中旧策略都是不变的;而New Logprobs是一个mini batch计算一次,这是因为新策略每个mini batch变一次。
开源rlhf库
https://iclr-blog-track.github.io/2022/03/25/ppo-implementation-details/
影响PPO算法性能的10个关键技巧(附PPO算法简洁Pytorch实现)
openai的lm-human-preferences(gpt2的finetune)
https://github.com/openai/lm-human-preferences
huggingface的TRL
https://github.com/huggingface/trl
CarperAI的trlx
https://github.com/CarperAI/trlx
allenai的RL4LMs
https://github.com/allenai/RL4LMs
RLHF变种
自我奖励
Self-Rewarding Language Models
LLM常见难题
重复生成
https://www.zhihu.com/question/616130636
https://mp.weixin.qq.com/s/cSwWapqFhxu9zafzPUeVEw
长上下文
以中文为例,大部分模型每个token对应的中文字数都>1.5个字,所以200k的token就对应30w字的上下文
对长文本的几个要求:
在文本比较长的时候,还能保证通顺,ppl要足够低
能attention到前面提过的细节,不能自我矛盾
注意:如果训练时是2k长度的语料,而推理设定8k窗口,那么PPL会急剧上升,因为
RoPE不能很好地处理没有训练过的位置编码
推理时注意力机制所处理的token数量远超训练时的数量,导致注意力机制的崩坏
两阶段训练方式
直接输入连续长文本(如书籍)
多个中等文本拼接,再通过attention mask来限制各段文本之间注意力,让它们可以在各自的位置上各训各的,互不干扰。甚至实际上即使不做attention mask,效果也挺好。
如果简单地增加长度,例如从4k变到32k,长度增加8倍,为了加速计算需要缓存中间结果(如QK的结果是的空间复杂度),所以显存会扩大倍。一般的做法是2阶段:
第一阶段:用2k或者4k训练一个基础模型,让模型学好文本内容和短位置关系
第二阶段:用比第一阶段小的数据量优化模型在长上下文的效果,具体做法见下节
针对位置编码的插值类方法
线性插值
Extending Context Window of Large Language Models via Positional Interpolation
NTK-Aware Interpolation
NTK-by-parts
Dynamically NTK Scaled RoPE
针对attention score的缩放方法
YaRN
logn
lossless long context
专访月之暗面杨植麟:lossless long context is everything
longRoPE
LongRoPE:超越极限,将大模型上下文窗口扩展超过200万tokens
llm+db
长文本杀不死RAG:SQL+向量驱动大模型和大数据新范式,MyScale AI数据库正式开源
https://github.com/myscale/myscaledb
记忆能力
Localizing Paragraph Memorization in Language Models
对应代码:https://github.com/googleinterns/localizing-paragraph-memorization
我们能否定位出语言模型中用于记忆其训练数据中整段文字的权重和机制?
尽管记忆现象分布在模型的多个层级和组件中,但记忆段落的梯度在空间上有可辨别的模式,即在较低模型层级的梯度比非记忆example的梯度大。
通过仅微调高梯度的权重,可以使模型遗忘记忆的example。
定位了一个特别参与段落记忆的低层注意力头,它主要关注在语料库级单词频率分布中最不频繁出现的独特、罕见的token。
总的来说,相较非记忆的续写,记忆续写不仅更难以遗忘,也更难以损坏。
越狱
长文本之罪:Claude团队新越狱技术,Llama 2到GPT-4无一幸免
ReadAgent
「有效上下文」提升20倍!DeepMind发布ReadAgent框架
高质量数据
Llama架构比不上GPT2?神奇token提升10倍记忆?
Physics of Language Models: Part 3.3, Knowledge Capacity Scaling Laws
制造人工合成数据,通过控制数据中知识的数量和类型,来严格调控数据中的知识比特数 (bits)。使用不同大小和架构的 LLM 在人工合成数据上进行训练,并给出数学定理,来精确计算训练好的模型从数据中学到了多少比特的知识。有如下几个发现:
如果训练时间充足,不论使用何种模型架构,模型的存储效率均可以达到2bit/param(即平均每个模型参数可以存储2比特的信息)。而且发现transformer中的知识并非主要存储在MLP层,因为即便移除所有MLP层,模型仍能达到 2bit/param 的存储效率。
如果训练时间不充足,GPT2模型能比LlaMA/Mistral存储超过30%的知识,主要是因为GatedMLP(MoE)会导致训练不稳定,因此对同样的知识,需要更长的训练时间。
压缩/量化的影响:将训练好的模型从float32/16压缩到int8,对知识的存储毫无影响。LLM可以达到“信息论极限”的1/4——因为int8只有8比特,但平均每个参数可以存储2比特的知识。
高质量数据的影响:如果我们的预训练数据中,有1/8来自高质量知识库(如百度百科),7/8来自低质量数据(如common crawl或论坛对话,甚至是完全随机的垃圾数据),会发现:
即使对高质量数据的训练时间保持一致,低质量数据的存在本身可能会让模型对高质量知识的存储量下降20倍,即便将高质量数据的训练时间延长 3倍,知识储量仍会降低3倍
解法:只需给所有的预训练数据加上自己的网站域名token即可,模型的知识存储量可以立即回升10倍,模型不需要任何先验知识来识别哪些网站上的知识是金子,而可以在预训练过程中,自动发现高质量知识的网站,并自动为这些高质量数据腾出存储空间。
可解释AI
Usable XAI: 10 Strategies Towards Exploiting Explainability in the LLM Era
https://github.com/JacksonWuxs/UsableXAI_LLM
多智能体
《综述:全新大语言模型驱动的Agent》——4.5万字详细解读复旦NLP和米哈游最新Agent Survey
Agent > GPT5?吴恩达最新演讲:四种 Agent 设计范式(通俗易懂版)
一些其他比较重要的工作
几篇出现频率比较高的论文
Scaling instruction-finetuned language models 引用数800+
How can we know what language models know? 引用数800+
Chain of thought prompting elicits reasoning in large language models引用1800+
Anthropic的一些工作
Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback
Studying Large Language Model Generalization with Influence Functions
Measuring Faithfulness in Chain-of-Thought Reasoning
ChatGLM
ACL22 GLM: General Language Model Pretraining with Autoregressive Blank Infilling
iclr23 GLM-130B: An Open Bilingual Pre-trained Model
训练&预测架构
pathways
Pathways: Asynchronous Distributed Dataflow for ML
下载了,pdf
这个回答分析得不错 https://www.zhihu.com/question/524596983/answer/2420225275
Google的大规模稀疏模型设计
DESIGNING EFFECTIVE SPARSE EXPERT MODELS
代码:https://github.com/tensorflow/mesh/blob/master/mesh_tensorflow/transformer/moe.py
megatron-lm
https://zhuanlan.zhihu.com/p/646406772
deepspeed
https://zhuanlan.zhihu.com/p/343570325
ray-llm
https://github.com/ray-project/ray/releases/tag/ray-2.4.0
medusa-llm
decoder的并行化: https://zhuanlan.zhihu.com/p/368592551
https://sites.google.com/view/medusa-llm
用了tree-attention
MOD
Mixture-of-Depths: Dynamically allocating compute in transformer-based language models
Google的几大LLM加速工具
maxdiffusion
https://github.com/google/maxdiffusion
JetStream
https://github.com/google/JetStream
maxtext
https://github.com/google/maxtext
多模态(图像)
【IEEE Fellow何晓东&邓力】多模态智能论文综述:表示学习,信息融合与应用,259篇文献带你了解AI热点技
Multimodal Intelligence: Representation Learning, Information Fusion, and Applications
vilbert
ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks
研究人员提出了一种名为 ViLBERT(图文 BERT)模型。这是一个可以学习任务未知的、图像内容和自然语言联合表征的模型。研究人员将流行的 BERT 架构扩展成一个 multi-modal two-stream 模型上。在这个模型上,模型用两个分开的流处理图像和文本输入,但他们彼此用联合注意力层交互。研究人员在两个代理任务上,使用 Conceptual Captions 数据集(数据集很大,而且是自动收集的数据)预训练这个模型,然后将模型秦阿姨到多个建立好的图像-文本任务上。这些任务包括图像问答、图像常识推理、引述表达、指称成分,以及基于捕捉的图像提取。这些只需要在基本架构上进行微小的补充。研究人员观察到,相比现有的针对任务的特定模型,新模型在这些任务上都有了相助的性能提升——在每个任务上都取得了 SOTA。
VLbert
Visual-Linguistic BERT,简称 VL-BERT
此预训练过程可以显著提高下游的视觉-语言任务的效果,包含视觉常识推理、视觉问答与引用表达式理解等。值得一提的是,在视觉常识推理排行榜中,VL-BERT 取得了当前单模型的最好效果。
VL-BERT: Pre-training of Generic Visual-Linguistic Representations
之前的视觉-语言模型分别使用计算机视觉或自然语言处理领域中的预训练模型进行初始化,但如果目标任务数据量不足,模型容易过拟合从而损失性能。并且对于不同的视觉-语言任务,其网络架构一般是经过特殊设计的,由此很难通过视觉-语言联合预训练的过程帮助下游任务。
VL-BERT 的主干网络使用 TransformerAttention 模块,并将视觉与语言嵌入特征作为输入,其中输入的每个元素是来自句子中的单词、或图像中的感兴趣区域(Region of Interests,简称 RoIs)。在模型训练的过程中,每个元素均可以根据其内容、位置、类别等信息自适应地聚合来自所有其他元素的信息。在堆叠多层 TransformerAttention 模块后,其特征表示即具有更为丰富的聚合与对齐视觉和语言线索的能力。
为了更好地建模通用的视觉-语言表示,作者在大规模视觉-语言语料库中对 VL-BERT 进行了预训练。采用的预训练数据集为图像标题生成数据集,Conceptual Captions,其中包含了大约 330 万个图像标题对。
VL-BERT 的预训练主要采用三个任务:
屏蔽语言模型(Masked Language Modeling),即随机屏蔽掉语句中的一些词,并预测当前位置的词是什么;
屏蔽 RoI 分类(MaskedRoIClassification),即随机屏蔽掉视觉输入中的一些 RoIs,并预测此空间位置对应 RoI 的所属类别;
图像标题关联预测(Sentence-Image Relationship Prediction),即预测图像与标题是否属于同一对。
在预训练结束后,使用微调来进行下游任务的训练。本文中主要在三个视觉-语言下游任务中进行微调,即视觉常识推理(VisualCommonsenseReasoning)、视觉问答(VisualQuestionAnswering)与引用表达式理解(ReferringExpressionComprehension),下面将分别介绍。
视觉常识推理任务即给定图片与相关问题,机器不仅需要回答问题,还需要提供理由来证明答案的正确性。此任务(Q->AR)被分解为两个子任务,即视觉问答(Q->A,给定图片与问题,输出正确答案),以及视觉推理(QA->R,给定图片、问题与答案,输出正确的理由)。
BEiT系列
BEiT
BEIT: BERT Pre-Training of Image Transformers
BEiT v2
BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers
BEiT v3
Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks
ViT&Swin-Transformer
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
对于一张的图像,假设每个patch是,那就分成个patch(即),每个patch的维度是,最后加上[CLS]
这个token,就是。
stable diffusion
High-Resolution Image Synthesis with Latent Diffusion Models
输入图像,经过编码器得到z,z通过前向扩散不断加噪声得到(正向扩散)
输入条件,经过条件编码器(原文是BERT,到了DALL-E2就改成CLIP了)得到
在的指导下不断去噪(反向扩散),得到新的,再通过解码器得到最终生成的图像
其中的正向扩散和反向扩散一般用U-Net
代码库:https://github.com/CompVis/latent-diffusion/tree/main
粗略看了下代码,带condition的训练原理大概是训练语料中有图+文本(例如imagenet的class_label,这里可以映射到一个classid也可以直接拿明文),然后condition和图片一起作为输入去训练auto-eocnder和ldm
在/latent-diffusion/ldm/data/imagenet.py
这个代码里,把class_label加进来了
stable diffusion 3
Stable Diffusion 3论文终于发布,架构细节大揭秘,对复现Sora有帮助?
DALL-E系列
DALL-E3:
Improving Image Generation with Better Captions
现有的文本->图像模型面临的一个基本问题是:训练数据集中的文本-图像pair对中的文本质量较差。
学习一个图像文本生成器,可以生成详细、准确的图像描述
将此文本生成器应用到数据集以生成更详细的文本
在改进的数据集上训练文本 - 图像模型
PALM-E
PaLM-E: An Embodied Multimodal Language Model
InstantID
InstantID: Zero-shot Identity-Preserving Generation in Seconds
https://github.com/InstantID/InstantID
小红书开源「InstantID」效果炸裂,迅速蹿上Github热榜
用户只需上传一张照片,就能轻松定制出多种风格的 AI 写真
曾爆火的 InstantID又有了新玩法:风格化图像生成,已开源
InstantStyle: Free Lunch towards Style-Preserving in Text-to-Image Generation
https://github.com/InstantStyle/InstantStyle
VAR
GPT超越扩散、视觉生成Scaling Law时刻!北大&字节提出VAR范式
Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction
https://github.com/FoundationVision/VAR
cobra
首个基于Mamba的MLLM来了!模型权重、训练代码等已全部开源
Cobra: Extending Mamba to Multi-Modal Large Language Model for Efficient Inference
https://github.com/h-zhao1997/cobra
Hyper-SD
加速扩散模型,最快1步生成SOTA级图片,字节Hyper-SD开源了
Hyper-SD: Trajectory Segmented Consistency Model for Efficient Image Synthesis
TextSquare
8B文字多模态大模型指标逼近GPT4V,字节、华师、华科联合提出TextSquare
TextSquare: Scaling up Text-Centric Visual Instruction Tuning
多模态(视频)
videobert
VideoBERT: A Joint Model for Video and Language Representation Learning,VideoBert模型。
SORA
OpenAI首个AI视频模型炸裂登场,彻底端掉行业饭碗!60秒一镜到底惊人,世界模型真来了?
https://openai.com/research/video-generation-models-as-world-simulators
一锤降维!解密OpenAI超级视频模型Sora技术报告,虚拟世界涌现了
Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models
Sora之后,OpenAI Lilian Weng亲自撰文教你从头设计视频生成扩散模型
https://lilianweng.github.io/posts/2024-04-12-diffusion-video/
整体感觉:
latent diffusion的隐空间
vit和swin transformer的patch
现有方法
现有的视频生成方法大多只能用于少数分类的视频、比较短的视频,或者固定长度的视频。
recurrent networks
2018年的World models
generative adversarial networks
autoregressive transformers
前两类太古老了,sora把后面两个(autogressive transformers和diffusion models)结合在一起了,而且能同时处理不同时长、分辨率的视频和图像
将视频转成spacetime latent patches
Vivit
Vivit: A video vision transformer
整体受ViT的启发
先分patch,再分别过时间的transformer(temporal transformer)和空间的transformer(spatial transformer)
具体的分patch方式如上图
latent空间上的patch
参考stable-diffusion,即High-Resolution Image Synthesis with Latent Diffusion Models,把patch切分改成在latent空间上进行
将视频映射成隐空间(latent space)的表示
把隐空间的表示切分成spacetime patches
其实类似的思想已经有不少工作了
VideoGPT:Videogpt: Video generation using vq-vae and transformers,结合了VQ-VAE,而且是自回归的transformer
预估时,可以通过在一个合适大小的grid里排列随机初始化的patches(we can control the size of generated videos by arranging randomly-initialized patches in an appropriately-sized grid.)来控制生成视频的大小。估计是参考了下面这篇:
论文参考了这个Patch n'Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution,可以使下面提到的DiT适应各种分辨率/持续时间/宽高比。
几种视频token方式的对比
claude-2-100k的回答。。
MAGVIT: Masked Generative Video Transformer:使用了3D向量量化(3D VQ)自动编码器来将视频量化为离散token
设视频有帧,其形状为。
3D VQ编码器会把视频量化为一个token序列,其中,是码本,是token序列长度。
3D VQ解码器则可以从latent token 重构回视频像素。
Genie: Generative Interactive Environments:使用了2D向量量化(2D VQ)方法
每一帧图像I先通过一个2D VQ编码器f编码为一个token序列,其中,是2D码本。
然后,对时间序列上的token 应用一个1D卷积网络,以捕获时间信息。
再通过2D VQ解码器解码回每一帧图像。
Vivit: A video vision transformer:使用tubelet-embedding
均匀地在时间轴上抽样个帧,然后把每帧处理成个patch,最终把所有patch连接起来
Diffusion Transformer
Scalable diffusion models with transformers提出了DiT,替换stable diffusion中的u-net
DiT=VAE编码器+ ViT + DDPM + VAE解码器
sora是一个扩散模型,输入加了噪声的patches,还可以加上一些如text prompt的条件,预测原本『干净』的patches。
之前的做法大多将视频全裁成相同长度和大小的,例如4s的,sora可以直接用原始视频
语言理解
参考DALL-E3 (Improving Image Generation with Better Captions),训练了一个highly descriptive的视频描述生成器,拿这个生成器给训练集中的所有视频重新生成描述,再拿来训练。
此外,还用上了GPT,将用户输入的短的prompt改写成更长更详细的视频描述用于生成。
使用图像/视频作为prompt
图像转动画:可以让静止的图像动起来
扩展视频:可以对视频进行扩展(extend),在时间轴上向前或者向后进行延展(比如同样是一个石头落地,能生成4个视频,每个视频里的石头从不同的地方飞过来,落在同一个地面上)
编辑视频:输入视频和一个文本prompt,能够对视频进行编辑,例如把场景从沙漠替换成树林,类似Sdedit: Guided image synthesis and editing with stochastic differential equations
连接视频:输入两个看似毫不相关的视频,能通过很自然的方式把这两个视频衔接在一起
生成图像
图像就是一帧的视频,可以通过在时间范围为一帧的空间grid中排列高斯噪声patches(arranging patches of Gaussian noise in a spatial grid with a temporal extent of one frame)来生成图像,同样能生成不同分辨率的图像,最多
涌现的模拟能力
3D一致性:随着镜头的移动,视频中的人物或物体在3d空间中能在移动中保持一致
Long-range coherence and object permanence(远程连贯性和物体持久性):sora能对短期和长期依赖关系进行建模,例如:
可以保留人物体,即使它们被遮挡或离开当前帧。
可以在单个样本中生成同一角色的多个镜头,并在整个视频中保持其外观的不变
与世界交互:例如画家可以在画布上留下新的笔触,并随着时间的推移而持续存在,人吃东西能留下齿痕
模拟数字世界:可以同时通过基本策略控制《我的世界》中的玩家,同时以高保真度渲染世界及其动态,只需要在prompt里提到“我的世界”的标题就可以实现。
存在的问题
不能准确地模拟许多基本相互作用的物理过程,例如玻璃破碎。
其他交互(例如吃食物)并不总是会产生对象状态的正确变化,例如长时间样本中出现的不连贯性或对象的自发出现。
open-sora(Colossal-AI)
Open-Sora全面开源升级:支持16s视频生成和720p分辨率
模型架构
v1版本:https://github.com/hpcaitech/Open-Sora/blob/main/docs/report_v1.md
v2版本:https://github.com/hpcaitech/Open-Sora/blob/main/docs/report_02.md
VAE部分
sora用了spatial-temporal VAE来降低temporal的维度,但并没有开源且高质量的spatial-temporal VAE:
因此,使用https://huggingface.co/stabilityai/sd-vae-ft-mse-original的2D VAE
对于24fps的1min视频,有帧,用4倍的VAE下采样和2倍的patch size下采样,有大约的token。对这些token算全部的attention的计算开销很大,所以参考Latte: Latent Diffusion Transformer for Video Generation(代码https://github.com/Vchitect/Latte)的方案,使用spatial-temporal attention来减小计算量。
以下是latte的4个变种
STDiT(sequential)和latte的变种3类似,STDiT(parallel)和latte的变种4类似,在的视频上,发现效果如下,最终采用了STDiT(sequential)。
生成部分
PixArt-α: Fast Training of Diffusion Transformer for Photorealistic Text-to-Image Synthesis使用T5作为条件的DiT结构,能生成高质量的图像。用PixArt-α对模型初始化,并对插入的temperal attentioin用0初始化,能够让模型一开始就保留图片生成的能力。插入的attention让参数量从580M涨到了724M。
训练
参考PixArt-α和Stable Video Diffusioin(Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets),采用了progressive的训练策略:
大规模图像预训练:前面提到的,直接使用https://huggingface.co/stabilityai/sd-vae-ft-mse-original的2D VAE
大规模视频预训练:在质量相对差的366K的预训练数据集(HD-VG-130M数据集)上训练,这里的16指的是16帧
高质量视频数据微调:在高质量的20K的数据集(Pexels数据集)上训练、和。
由于使用了scaled position embedding,这个策略极大地减少了训练消耗。此外,对于16帧的训练,每3帧降采样一次,对于64帧的训练每2帧降采样一次。
数据标注方法:抽取3帧,然后设计prompt,用LLaVA生成高质量的标题:
学习率:1e-4太大了,改成了2e-5
batchsize比较大的时候,fp16比bf16更不稳定,而且可能导致生成错误,所以对于使用bf16
提供了便捷的视频数据预处理脚本,可以轻松地在自己的数据集上快速生成训练所需的视频 / 文本对,包括公开视频数据集下载,长视频根据镜头连续性分割为短视频片段,使用开源LLaVA生成精细的提示词。
open-sora(北大版)
超10秒高分辨率,北大Open Sora视频生成更强了,还支持华为芯片
MORA
Sora不开源,微软给你开源!全球最接近Sora视频模型诞生,12秒生成效果逼真炸裂
复刻Sora的通用视频生成能力,开源多智能体框架Mora来了
Mora: Enabling Generalist Video Generation via A Multi-Agent Framework
minigpt4-video
AI视频理解天花板,全新MiniGPT4-Video刷爆SOTA!宝格丽宣传片配文一绝
mini-gemini
刷爆多模态任务榜单!贾佳亚团队Mini-Gemini登热榜,代码、模型、数据全部开源
模型地址:https://huggingface.co/collections/YanweiLi/mini-gemini-6603c50b9b43d044171d0854 数据地址:https://huggingface.co/collections/YanweiLi/mini-gemini-data-660463ea895a01d8f367624e
Mini-Gemini: Mining the Potential of Multi-modalityVision Language Models
VLM(vision lm)虽然有很多,但和gemini、gpt-4等的差距还是比较大,作者认为主要原因是高分辨率视觉标记不够、vision推理数据质量不高。
作者利用额外的视觉编码器进行高分辨率细化,构建了一个高质量的数据集。构建了一个Mini-Gemini架构,支持一系列从2B到34B的密集和MoE LLM,在zero-shot测试集上超过了私有模型。
https://github.com/dvlab-research/MiniGemini
Vidu
当前最强国产Sora!清华团队突破16秒长视频,懂多镜头语言,会模拟物理规律
采用了和 Sora 完全一致的 Diffusion 和 Transformer 融合的架构,底层基于All are Worth Words: A ViT Backbone for Diffusion Models的 U-ViT 架构。
基于 U-ViT 架构,2023 年 3 月,团队在开源的大规模图文数据集 LAION-5B 上训练了 10 亿参数量的多模态模型 ——UniDiffuser,并将其开源(参见清华朱军团队开源首个基于 Transformer 的多模态扩散大模型,文图互生、改写全拿下)。
UniDiffuser 主要擅长图文任务,能支持图文模态间的任意生成和转换。UniDiffuser 的实现有一项重要的价值 —— 首次验证了融合架构在大规模训练任务中的可扩展性(Scaling Law),相当于将 U-ViT 架构在大规模训练任务中的所有环节流程都跑通。
这些在图文任务中积累的工程经验为视频模型的研发打下了基础。因为视频本质上是图像的流,相当于是图像在时间轴上做了一个扩增。因此,在图文任务上取得的成果往往能够在视频任务中得到复用。Sora 就是这么做的:它采用了 DALL-E 3 的重标注技术,通过为视觉训练数据生成详细的描述,使模型能够更加准确地遵循用户的文本指令生成视频。这种效应也必然会发生在「Vidu」上面。
根据此前的消息推测,「Vidu」也复用了生数科技在图文任务的很多经验,包括训练加速、并行化训练、低显存训练等等,从而快速跑通了训练流程。据悉,他们通过视频数据压缩技术降低输入数据的序列维度,同时采用自研的分布式训练框架,在保证计算精度的同时,通信效率提升 1 倍,显存开销降低 80%,训练速度累计提升 40 倍。
世界模型
怒斥Sora之后,LeCun放出「视觉世界模型」论文,揭示AI学习物理世界的关键
100万token,一次能分析1小时YouTube视频,「大世界模型」火了
WORLD MODEL ON MILLION-LENGTH VIDEO AND LANGUAGE WITH RINGATTENTION
https://github.com/LargeWorldModel/LWM
Q*
From r to Q*: Your Language Model is Secretly a Q-Function
LLM+推荐
综述
https://github.com/nancheng58/Awesome-LLM4RS-Papers
A Survey on Large Language Models for Recommendation How Can Recommender Systems Benefit from Large Language Models: A Survey Recommender Systems in the Era of Large Language Models (LLMs)
中科大LDS实验室的tutorial:XadC3O-large-language-models-for-recommendation-tutorial-slides.pdf
对应的datafun talk:当"狂飙"的大模型撞上推荐系统
生成式推荐综述:
Large Language Models for Generative Recommendation: A Survey and Visionary Discussions
A Review of Modern Recommender Systems Using Generative Models (Gen-RecSys)
DSI
参考知乎:https://zhuanlan.zhihu.com/p/470182510
参考Transformer memory as a differentiable search index,提出的可微搜索索引(differentiable search index, DSI),拆成两个阶段:
indexing:建立文档和doc_id的一一映射
retrieval:根据query生成候选doc_ids
Indexing方法
Inputs2Target:即doc_tokens->doc_id
Target2Inputs:即doc_id->doc_tokens
bidirectional:同时用上两面两个任务,并且在开始时加一个前缀,表明任务的方向
span corruption:参考T5(Exploring the limits of transfer learning with a unified text-to-text transformer),将doc_id当做前缀和doc_tokens拼起来,2个好处:
在索引时进行通用的预训练
实现doc_id作为去噪目标和输入的平衡
文档的表示
Direct Indexing:直接用文档的前L个单词当做文档的表示,并且保留单词的顺序。
Set Indexing:去掉文档中的重复的单词及停用词,然后和Direct Indexing一样的处理。
Inverted Index:随机对文档中的连续的k个单词(一个文档块)进行采样,并将它们与doc_id相关联
doc_id的表示
非结构化的原子标识符:直接对所有的文档使用一个随机但互不相同的的整数标识。假设一共有N篇文档需要检索,假设原来解码器输出有V个单词,现在有V+N个单词。
朴素的结构化字符串标识符:也使用一个随机的整数,但将这个整数当做一个字符串输出,用受限的beam search搜索前k个文档,因为需要保证输出的是数字。
语义结构化的标识符:先用BERT产出每个doc的emb,然后递归10-means,第一次得到0-9作为第1个数字,第二次的0-9作为第2个数字,可以得到一个树,文档的最终标识符就是从根节点到当前结点的路径对应的编号组合。只要一个节点的文档数大于,就继续分裂,当叶子的文档数小于c时,每个文档随机分配一个1到的id,拼到doc_id的最后。
训练方法
用seq2seq,即teacher forcing+交叉熵,有如下两种方式:
先对indexing进行预训练(memorization),再进行将query映射为docid的微调
用多任务的方式同时进行,两个任务用不同的标识符,这样做效果会好很多
后来有一篇Bridging the Gap Between Indexing and Retrieval for Differentiable Search Index with Query Generation,对应的github:https://github.com/ArvinZhuang/DSI-QG,他也同时尝试复现DSI:https://github.com/ArvinZhuang/DSI-transformers,主要有如下两个地方:
准备数据,doc_id
训练和预测
对解码空间的限制:
vq-vae & rq-vae
vq-vae
Neural discrete representation learning
https://github.com/zalandoresearch/pytorch-vq-vae
用在推荐:
Learning Vector-Quantized Item Representation for Transferable Sequential Recommenders
https://github.com/RUCAIBox/VQ-Rec
rq-vae
Autoregressive Image Generation using Residual Quantization
TIGER
Recommender Systems with Generative Retrieval
序列推荐的一些paper:
TIGER(Transformer Index for GEnerative Recommenders)
HSTU
如何评价Meta最新推荐论文: 生成式推荐打败深度分层架构推荐?
背景
大规模推荐系统依赖高基数(high cardinality)、异质特性(heterogeneous features),每天要处理上百亿用户行为数据。将推荐系统重新定义为生成模型框架内的序列转化任务,提出HSTU(Hierarchical Sequential Transduction Unit),专为高基数、非稳态的流式推荐数据设计。
在公开数据集比基线NDCG+65.8%
在8192的序列长度上的处理速度比基于flash attention2的transformer快5.3-15.2倍。
1.5万亿(1.5 trillion)参数,线上ab测试指标+12.4%
在Breaking the curse of quality saturation with user-centric ranking中提到了NCE(normalized cross-entropy)指标:
可以发现,对于一个预训练好的模型来说,随着时间的变化,NCE的变化是很剧烈的,即数据分布是会漂移的,并不像nlp/cv一样有ground truth,所以传统推荐模型其实很难达到比较好的scaling能力。
需要克服的3个挑战:
推荐系统中的特征缺少显式的结构。序列建模(bert4rec、S3-rec等)在小规模数据集上效果不错,但工业界则需要异构特征(高基数的id、交叉特征、统计特征、历史点击率等)。
推荐系统使用十亿规模的动态词表,而nlp用的是10w的静态词表,要对上万候选进行target-aware操作(din、Cold等),训练和推理的代价很高。
大规模序列模型的计算成本是瓶颈。GPT-3在300B token的数据集上用上千个GPU训练1-2个月,而在推荐场景一天就有十亿级的活跃用户和十亿级的候选进行交互,用户序列在极端情况下有近10w(Twin: Two- stage interest network for lifelong user behavior modeling in ctr prediction at kuaishou),所以推荐系统每天要处理的tokens数量甚至比语言模型1-2个月处理的数量要大几个数量级
本文将用户action看成一个新的模态,2个主要的insights:
给定一个新的特征空间,核心的召回排序任务能被直接转换成生成式模型问题(序列直推任务,sequential transduction tasks)
这种范式能够系统性地解决传统推荐中的特征冗余、计算冗余、推理冗余,提升效率
Sequential Transduction Tasks
transductive learning(直推式学习) vs inductive learning(归纳式学习)https://www.zhihu.com/question/68275921/answer/529156908:
归纳式学习:训练只使用训练集,不使用测试集,训出的模型对测试集做预测,如监督学习。
直推式学习:训练时使用训练集,还使用测试集的特征,但不使用测试集的label,
异构特征的统一表示
稀疏特征:itemid、类目、城市、语言、社区等
先选出最长的时间序列作为主时间序列,例如用户的交互序列。
剩下的特征随时间变化较慢,如关注作者的属性。对于连续出现的片段(consecutive segment),只保留最开始的入口,这样对于主时间序列而言,并不会增加太多的序列长度。
数值型特征:这里指的是序列特征里每个item的统计特征,比如用户在时刻t对某个item的ctr。直接删了,因为DIN里提到随着序列长度增加,target-aware的序列建模方式能够捕捉到这种数值性特征
假设用户消费了9个item,
绿色的有7个时间步,全保留,作为主序列;
蓝色的有7个时间步,但只有G0和G1两种取值,所以对于连续的G0只保留第0个(出现在t1),扔到主序列的最前面去,连续的G1也只保留第0个(出现在t8),插到主序列最后一个的前面
黄色的全是H0,第0个出现在t7,所以保留t7,往主序列t8前面插入
将数值型特征替换为target-aware的cross attention得到causal-masked的特征
通过t0、t1、t2(包括t2)的特征生成t2的样本,以此类推
召回和排序的重定义
输入token序列,输出的token序列是通过mask序列得到的。
token对应的动态、非稳态词表是,用户交互的内容是
召回:预估,通过时间步i的用户特征预估,一般是直接选择来最大化特定的reward,和标准的自回归有两个不同:
的label并不一定是,因为用户可以对是负反馈
可能是比如人口属性等(因为是merge的序列,可能把城市之类的merge进来当做一个时间步),这个时候未定义的,要把它mask掉,即
排序:推荐中的排序需要在尽量早的阶段进行target-aware的交互,而标准的自回归这种交互往往比较迟,例如在encoder的输出才用上了softmax。因此,设计了一种target-aware的cross-attention
把action和x穿插起来得到新序列
对于action的位置,
对于content位置,使用一个小的nn将预估值转换成多任务的预估值(感觉是输入0-n,第n项保留,mask掉,拿去多目标地预估用户会用哪个action)
生成式训练
假设用户有个token,那么训练的复杂度就是,其中:
是self-attention的复杂度,通过flash attention可以达到
是FFN的复杂度
因为要自回归地算,可以理解为batch_size也是,加一个下三角的mask,所以在里还要乘一个
假设,那复杂度就是,太巨大了
但其实可以发现(这段是自己的理解),假设序列长度9,要预测第4个的时候,4-9的输入是mask掉的,但他们还是要进行后面的attention+ffn计算,其实是很浪费资源的,所以如上面“异构特征的统一表示”小节的那个图(生成主序列和辅助序列)所示,该模型直接只吐出x=x1-x3,y=x4作为训练样本就行了,这样既省掉了4-9的无用计算,也更便于并行(相比不拆batch的自回归)
假设采样第个用户的概率是,那么总的训练消耗就是
如果设置,那消耗就降到了。而在工业界中要实现这种采样其实很简单,在用户请求或者session结束的时候吐出训练样本就有了
生成式推荐中的高性能自注意力编码器
HSTU的单层包括3个部分:
其中,
是MLP,
和是激活函数,都是SiLU(Sigmoid-weighted linear units for neural network function approximation in reinforcement learning),其实就是Swish,即
是relative attention bias,考虑了位置和时间(参考T5论文,Exploring the limits of transfer learning with a unified text-to-text transformer),其实是在Self-attention with relative position representations一文提出的
对应到代码(https://github.com/facebookresearch/generative-recommenders/blob/main/modeling/sequential/hstu.py)里:
DLRM的3部分:
特征抽取:常见的基础版本是离散特征pooling,高级版本是din。HSTU本来就能做这种target-aware的attention
特征交互:常见的使用FMs、DCNv2、DHEN(DHEN: A Deep and Hierarchical Ensemble Network for Large-Scale Click-Through Rate Prediction,引入残差连接)。HSTU通过来实现,将attention pooled后的结果直接和其他特征算element-wise product。
这个做法受Neural collaborative filtering vs. matrix factorization revisited和Revisiting neural retrieval on accelerators的启发,用MLP来近似点积是很困难的。原因大概是nn需要调超参和足够的训练数据,在线算得又慢,而且本来内积效果就不错了,nn能带来的边际收益其实不明确。
因为已经用过SiLU了,所以可以看成是SwiGLU的变种(参考Glu variants improve transformer),因为前面在对比LLM激活函数时讲了,
表示转换:常见的如MoE、PLE等,主要思想就是对不同人群用特定的子网络。HSTU里的element-wise product也能达到MoE中的门控操作,只是可能有一个正则化因子的区别。
其实就是原来一般会拆成attention+ffn,而它这3个公式,前两个是attention,第3个就是attention求个norm,然后过一个swiglu的ffn,还有一点,这里的是过attention之前的,感觉起到了类似resnet的作用
pointwise聚合的注意力
用的是pointwise聚合的注意力,而不是transformer里的softmax,主要有如下两点考虑:
推荐中item的强度信息很重要,softmax会让这种强度失真,导致在预估(如时长)不准;如果只需要预估序,那其实softmax也可以,但推荐要同时预估序和值,所以要删掉softmax。
虽然softmax对噪声有鲁棒性,但不太适用于流式setting下的非稳态词表。做了一个模拟流式数据的实验,发现只去掉relative attention bias比relative attention bias并加上softmax会好得多
Architecture | HR @10 | HR @50 |
---|---|---|
Transformers | .0442 | .2025 |
HSTU (, Softmax) | .0617 | .2496 |
HSTU () | .0893 | .3170 |
增加稀疏性
使用了一种高效的attention kernel的GPU算子,类似FlashAttention,能够将融合连续的矩阵操作(fuse back-to-back GEMMs),但能够 进行fully raggified(可能是不规则,即序列长度可变的??)的attention计算,本质是将attention计算转换为不同大小的分组GEMMs。因此,HSTU变成了memory-bound,并且能够以进行scale,其中,是样本的序列长度,是attention的维度,是寄存器的大小。
受Deep networks with stochastic depth启发,提出了SL(stochastic length)来增加用户历史序列的稀疏性,推荐系统中的用户行为往往有周期性,并且以不同形式呈现,因此引入稀疏性可以在效果不怎么损失的情况下显著减少encoder的代价,可以scale为
定义为一个函数,从原序列中选出长度为的子序列,具体方案如下:
即:
时,保留原始序列
时,有:
以的概率只保留长度的子序列
以的概率保留原始序列
对于,原来的attention相关的复杂度是,现在可以降低到。
其中的经过离线实验(原文附录D里),采用了feature-weighted sampler,即以的概率进行采样,其中表示用户和item 交互的时间和当前的时间差。
对稀疏性的改善如下,其中稀疏性指的是,越大表示短序列越多,即越稀疏(表示不SL,即直接使用原序列):
Alpha () | seq_len=1,024 | seq_len=2,048 | seq_len=4,096 | seq_len=8,192 |
1.6 | 71.5% | 76.1% | 80.5% | 84.4% |
1.7 | 56.1% | 63.6% | 69.8% | 75.6% |
1.8 | 40.2% | 45.3% | 54.1% | 66.4% |
1.9 | 17.2% | 21.0% | 36.3% | 64.1% |
2.0 | 3.1% | 6.6% | 29.1% | 64.1% |
最小化激活值的内存使用
在推荐系统中,大的batchsize很重要:
因此激活函数的内存占用就成为了主要的scaling瓶颈,这一点和llm不一样,llm一般是用小batchsize,并且内存主要由网络参数占据。HSTU设计了如下方式来减少激活函数的内存占用:
把attention外的linear layers从6减小到2,同时使用elementwise gating来降低MLP的计算(Transformer Quality in Linear Time和Efficiently modeling long sequences with structured state spaces)。第一篇对应的结构如下:
假设是embed size,是head数,是attention的dim,是ffn的hidden size,
将一些计算融合成一个op,包括、layer_norm、optional dropout和输出MLP,将每一层的激活的内存占用减小到了(以bf16计算,一个参数2字节)---没懂
自己的理解:layer_norm要存均值+方差,所以要,所以上面式子就是,U(),V(),Q和K(),QKV的norm(因为有均值和方差,所以是),QKV()
对比transformer,在attention后用了ffn和dropout,假设中间状态是,那么ffn包括layer_norm、linear、激活、linear、dropout,中间状态占用的就是,一般来说,,,
自己的理解:输入x(),linear(),linear(),dropout(约等于),layernorm一般是发生在最开始吧,所以应该是第一个改成吧,感觉不是在linear那里变成。。
然后,加上输入的input和input的layer_norm(),和qkv的映射,总的激活状态是---没懂
所以HSTU的设计能够让scaling达到大于两倍的更深的layers(14d vs 33d)
此外,词表中的id占用了极大的内存,对于10b的词表,512维的emb,Adam优化器,用fp32来存储emb和优化器状态要60TB的内存,因此,
将优化器状态存在DRAM里,从而每一个float在HBM的占用从12bytes降低到2bytes
cost-amortization(摊销)的预估scale up
对于召回来说,已经有很多加速方法了,例如MIPS的ANN加速,或者OTM等的beam search方法。
对于排序而言,提出了M-FALCON(Microbatched-Fast Attention Leveraging Cacheable OperatioNs),用于对个候选,序列长度为的输入进行预估
并行计算个候选,修改attention masks和 bias,使得这个候选的attention操作是完全一样的。从而将cross-attention的计算从缩减到了,因为相比要小得多
(可选)将个候选分成个microbatches,每个batch有个候选,从而在如下两个场合利用KV caching(Efficiently scaling transformer inference):
前向pass中,用于降低消耗
requests之间,降低长尾耗时
其他
发现了scaling-law:
Wukong
Wukong: Towards a Scaling Law for Large-Scale Recommendation
P5
agent4rec
On Generative Agents in Recommendation
word版的笔记:https://github.com/daiwk/collections/blob/master/assets/multi-agents.docx
https://github.com/LehengTHU/Agent4Rec
拿推荐语料微调LLM
Aligning Large Language Models with Recommendation Knowledge
llm vs ID
SIGIR2023 | ID vs 模态: 推荐系统ID范式有望被颠覆?
Where to Go Next for Recommender Systems? ID- vs. Modality-based Recommender Models Revisited
https://github.com/westlake-repl/IDvs.MoRec
推荐生态系统
其他
LLM+Recommendation大模型推荐近期进展|含WWW, SIGIR, AAAI等顶会文章
ClickPrompt: CTR Models are Strong Prompt Generators for Adapting Language Models to CTR Prediction
SIGIR'24 | 打破长度障碍:LLM增强的长文本用户行为CTR预测
Breaking the Length Barrier: LLM-Enhanced CTR Prediction in Long Textual User Behaviors
time-LLM
谁说大象不能起舞! 重编程大语言模型实现跨模态交互的时序预测 | ICLR 2024
Time-LLM: Time Series Forecasting by Reprogramming Large Language Models
https://github.com/KimMeen/Time-LLM
将时序预测任务转换成一个可以由 LLMs 有效解决的语言任务,成功激活了llm做高精度时序推理的能力。
时序输入重编程
提示做前缀
LLM+其他
【LLM-数学】MathScale 用于数学推理的指令调优扩展方法
MathScale: Scaling Instruction Tuning for Mathematical Reasoning
新的架构
SSM
挑战Transformer的Mamba是什么来头?作者博士论文理清SSM进化路径
预训练无需注意力,扩展到4096个token不成问题,与BERT相当
Diffusion Models Without Attention
丢掉注意力的扩散模型:Mamba带火的SSM被苹果、康奈尔盯上了
Long Range Language Modeling via Gated State Spaces 认为 Transformer 和 SSM 完全可以互补。
选择性状态空间模型(selective state space model)是Mamba论文作者Albert Gu此前主导研发的S4架构(Structured State Spaces for Sequence Modeling)的一个简单泛化。
https://stacks.stanford.edu/file/druid:mb976vf9362/gu_dissertation-augmented.pdf
序列模型在训练和推理时的侧重点:
训练时:在整个list上计算loss,需要优化forward的耗时
推理时:一次输入一个时间步,需要高效地顺序处理
Mamba
Mamba: Linear-Time Sequence Modeling with Selective State Spaces
https://huggingface.co/state-spaces
https://github.com/havenhq/mamba-chat
MODELING SEQUENCES WITH STRUCTURED STATE SPACES
Block-State Transformer
Jamba
Mamba做大做强!混合Transformer,打败Transformer
https://huggingface.co/ai21labs/Jamba-v0.1
Hawk & Griffin
RNN效率媲美Transformer,谷歌新架构两连发:同等规模强于Mamba
feedback attention memory
TransformerFAM: Feedback attention is working memory
infini-attention
Leave No Context Behind: Efficient Infinite Context Transformers with Infini-attention
【重磅】谷歌重塑Transformer:无限记忆力,无限长输入,LLM基础研究重大突破
将压缩记忆整合进标准的点积注意力机制,并在单个Transformer块内同时实现了掩码局部注意力和长期线性注意力机制
与transformer-xl对比:
MEGA
Mega: Moving average equipped gated attention
https://github.com/facebookresearch/mega
标准的self-attention公式
对于序列长度=的输入,输出
其中,,,,而且有两种定义方式:
对于个attention heads,计算需要的时间和空间复杂度都是
EMA
对于输出的序列采用Exponential Moving Average(指数滑动平均)如下
其中,表示权重衰减,是element-wise product
越大,越小,对历史的衰减也越快:
EMA的计算看成个独立的卷积,可以通过**FFT(快速傅立叶变换)**来加速计算。具体。。。再看看
Damped EMA:由于输入的x是d维向量,可以引入一个因子让EMA更鲁棒:
MEGA
EMA可以看成是一种与位置相关的归纳偏置(inductive bias),即假设当前位置与之前位置满足滑动平均的关系,而attention矩阵的计算其实并没有考虑位置信息,所以可以把二者结合一下。
其中的multi-dimensional damped EMA大致流程如下:
先变成h维:先把通过矩阵映射成
计算EMA:然后通过EMA得到(具体)
再变回d维:再通过一个矩阵变回
然后看整个流程:
先计算EMA
再基于EMA的结果计算QK,基于原始的X计算V:
计算带位置bias的attention:
通过reset gate 和update gate 计算输出
这里把attention里的softmax改成了如下的laplace函数:
其中,是误差函数,
为了让laplace逼近,对于这个点,求解如下方程
可以得到,,对应的曲线和准确率如下:
mega-chunk
将序列切分成长度固定为的个chunk,对每个chunk独立计算上面的attention,这样复杂度就变成了,由于有EMA,所以这样做还是能够保持一定程度的长距离依赖。
MEGALODON
革命新架构掀翻Transformer!无限上下文处理,2万亿token碾压Llama 2
MEGALODON: Efficient LLM Pretraining and Inference with Unlimited Context Length
https://github.com/XuezheMax/megalodon
Megalodon: Efficient LLM Pretraining and Inference with Unlimited Context Length
基于MEGA进行改进,能够同时实现
高效训练(减少通信和计算量)
高效推理(保持恒定的KV缓存)
个性化搜索
随便找一篇Denoising Attention for Query-aware User Modeling in Personalized Search,来看看它的参考文献:
学术界:
工业界:
Personalized Query Suggestions,sigir20,LinkedIn
q-i双塔的改进
引入location+social
Embedding-based Retrieval in Facebook Search,KDD20
q-d双塔结构,在两个塔的最底层均加入:
location:用户所处地理位置,如城市
social:facebook是社交网络,通过另一个基于graph的模型训练得到的user和item emb,直接加进来
引入用户行为序列
Encoding History with Context-aware Representation Learning for Personalized Search,sigir20,人大,提出HTPS
把用户历史的q-d pair对和当前query一起,过短期transformer和长期transformer得到输出。
把加上[mask],过transoformer得到预估的intent
然后将和通过gate nn融合得到最终的context-aware的query表示
最终doc和query的打分包括两部分,通过(一个MLP,激活是tanh)进行融合:
:q和d的语义相似度,可以用正常的nlp模型得到
:q和d的个性化得分,公式如下,其中是cos:
有两个loss:
pred loss:预估intent,即下一个query,拿与下一个query中各个词向量的avg算cos
rank loss:依据算lambda rank的pairwise loss
三塔+gnn邻居+mtl
A GNN-based Multi-task Learning Framework for Personalized Video Search,WSDM22,百度,提出MGNN-PVS
现有的PSM(g personalized search methods)大多使用用户反馈(如点击)进行训练,缺点:
反馈信号大部分表达的是吸引力而非相关性
用户的历史信号比较稀疏,很难学好PSM
两张二部图:u-q和q-d
3个塔:
user:
user自己
一跳邻居(u->q)的q
二跳邻居(u->q->u)的u
query:
query自己
一跳邻居(q->d)的doc
二跳邻居(q->d->q)的query
doc:
doc自己的title向量(训练query-正title-负title的triplet loss)和video向量(训练video-正query-负query的triplet loss)
二跳邻居(d->q->d)的doc
两个task:
ctr预估:u和q拼一起过nn得到个性化的q,再和d过nn得到的向量算内积,得到预估值,用交叉熵
相关性预估:q过另一个nn,d过另一个nn,内积,用mse
RAG
Retrieval-Augmented Generation for Large Language Models: A Survey
Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
Meta提出全新文档级嵌入框架,利用LLM来增强信息检索能力
LLM-Augmented Retrieval: Enhancing Retrieval Models Through Language Models and Doc-Level Embedding
LLM模型融合
Evolutionary Optimization of Model Merging Recipes
https://github.com/SakanaAI/evolutionary-model-merge
其他
一些比较好的模型
文本匹配
大多是基于sentence-bert的,m3e-base在电商语料上试过,效果不错
https://huggingface.co/moka-ai/m3e-base
https://huggingface.co/shibing624/text2vec-base-chinese
本地知识库
https://github.com/chatchat-space/Langchain-Chatchat
llm应用合辑
ChatGPT聚合站:https://hokex.com
游戏生成站:https://latitude.io/
家庭作业辅助站:https://ontimeai.com/
文字转语音站:https://www.resemble.ai/
艺术作画站:https://starryai.com/
logo制作站:https://www.logoai.com/
ai写作站:https://www.getconch.ai/
音乐制作站:https://soundraw.io/
声音模拟站:https://fakeyou.com/
一句话生成一段视频:https://runwayml.com/
文字转语音:https://murf.ai/
swiftsage
SwiftSage: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks
nanogpt
简化版的gpt, tiktoken:gpt2中使用的开源分词工具,比huggingface的tokenizer快得多
类似的:https://github.com/karpathy/llm.c
达摩院大模型技术交流
https://developer.aliyun.com/live/248332
ppt:链接 密码:5yyf
回译
通过单语数据提升 NMT 模型最高效的方法之一是回译(back-translation)。如果我们的目标是训练一个英语到德语的翻译模型,那么可以首先训练一个从德语到英语的翻译模型,并利用该模型翻译所有的单语德语数据。然后基于原始的英语到德语数据,再加上新生成的数据,我们就能训练一个英语到德语的最终模型。
最后更新于