henryliangt / usyd

0 stars 0 forks source link

NLP 5046 #46

Open henryliangt opened 1 year ago

henryliangt commented 1 year ago

NLP子任务: 分词, 实体识别 NER,文本分类,相似度判别, 机器翻译,文摘系统,事件抽,词性标注,句法分析,指代消解,语义Parse。

舆情监测系统: 文本分类,关键词(短语)抽取,实体识别,时间抽取,文本聚类,相似度判别,文本摘要。

小模型: fasttext 预训练+fintune模式 数据过于稀疏,本身过于小众:规则+解析

按照数据领域区分,针对医疗文本,定制一套实体识别系统,识别药物,疾病,诊疗日期等实体类型。 针对法律领域,定制一套,识别所犯罪行,量刑年限,罪犯名称,原告,被告等信息。

领域知识图谱:记录现实世界中的客观存在的事物的关联关系,也很重要。

我今天比较累了,想9点睡觉,然后明天的会议吧,早上大概9点叫我一声,我上线,大概到中午能开完。 小众任务,传统NLP 很难处理问题。

科研

大多论文,针对特定任务优化策略。 GPT 全方位碾压, 结构化数据:返回结果是,请按json格式返回。 返回关键短语时,以英语逗号隔开。 返回实体信息时,标明器类型名字,一行一条结果。

如何评价:

  1. 对自然语言本身的拟合。 前后语句连贯,通顺,符合正常人的叙述习惯。能理解反问,反讽,情绪,基本世界观的构建和逻辑推断。
  2. 对知识,事实类信息的拟合。暂时无法胜任。知识图谱。
henryliangt commented 1 year ago

2018 LLM时代: 初代GPT, Bert, 基于Transformer编码器(Encoder - Decoder),获取文本内部的相互联系。 image

image

Bert 仅用了encoder, GPT只用了Decoder 两者各自发展。 Decoder可能更适应文本生成。

后Bert: Albert, Roberta, ERNIE, BART, XLNET, T5, 预训练任务,从完形填空,到各种题型。 再到NLP 任务的数据集添加进去预训练。机器翻译,文本摘要,领域问答。

GPT-2,添加任务,扩增数据集,模型参数,再训练。 元学习: meta-learning, 汪小菲的妈妈是张兰,包含的信息量,可以用于翻译,分类,判断错误。 信息是脱离具体NLP 任务存在的。举一反三,语言模型的一脑多用。 image

GPT-3 超大计算量。DECODER适合生成 对话是涵盖一切的终极任务。NLP 不再需要模型建模, 传统NLP还有序列标注,用CRF解码,对话世界里,完全不需要。(Conditional random fields (CRFs) are a class of statistical modeling methods often applied in pattern recognition and machine learning and used for structured prediction. Whereas a classifier predicts a label for a single sample without considering "neighbouring" samples, a CRF can take context into account.)

in-context learning.

对模型进行引导,教会它应当输出什么内容。 给模型做个示范: zero-shot, one-shot, few-shot, 再多就是fine tuning 了。 image

超大模型上引导学习(in-context learning)才有用, 几亿参数的小模型不行。 image

ChatGPT 3

训练策略:强化学习。不断根据环境的惩罚和奖励(reward),拟合。 人工操作 reward : RLHF(Reinforcement Learning from Human Feedback)

image

技术重要性:ChatGPT > word2vec > Bert 问题: 重复一些词句,无法分清楚事实,没有在推理阶段连接外部信息

GPT-4 正在做图文理解,

henryliangt commented 1 year ago

LaMda : Language Models for Dialog Applications 10 Feb 2022

Sparrow:Improving alignment of dialogue agents via targeted human judgements

InstructGPT 自回归语言模型:Training language models to follow instructions with human feedback

Bert双向语言模型

基础模型: text-davinci-002 + 45T数据,1024XA100

Bert时代,也有TextCNN. 从前需要魔改网络,2018年只需对Bert进行finetune,2023年只需要In-Context Learning了吧,只能拿着别人大模型的API找找prompt了。

henryliangt commented 1 year ago

Bert/GPT出现之后,其实就没有必要做这些中间任务了,因为通过大量数据的预训练,Bert/GPT已经把这些中间任务作为语言学特征,吸收到了Transformer的参数里,此时我们完全可以端到端地直接解决那些最终任务,而无须对这种中间过程专门建模。

中文分词任务可能也会消失。 特征抽取器逐渐从LSTM/CNN统一到了Transformer. 经验够多,就不需要总结规律了。 聪明的模型,总结规律快,能耗低。

人类有多少知识不是靠死记硬背的?

henryliangt commented 1 year ago

最能体现Google技术眼光的是PaLM和Pathways,推出时间大概在22年2月到4月,同一时期,OpenAI推出的却是InstructGPT, DeepMind之前的重心一直在强化学习攻克游戏和AI for science这些方面,切入LLM其实很晚,应该是21年才开始重视这个方向

2013,DL进入NLP. 以大量的改进LSTM模型及少量的改进CNN模型作为典型的特征抽取器; 以Sequence to Sequence(或叫encoder-decoder亦可)+Attention作为各种具体任务典型的总体技术框架。

如何有效增加模型层深,或者模型参数容量。 往encoder, decoder里叠加更深的LSTM, CNN 层,达成增加层深和模型容量的目标。 尽管层深度增加,但是解决任务的效果,不算很成功,对于和非深度学习,带来的优势不算大。 原因

  1. 某个具体任务有限的训练数据。(与训练模型出现前,这是NLP 的一个大问题。)
  2. LSTM / CNN特征提取器,表达能力不强。不能有效吸收数据里的知识。

自然语言三大特征抽取器 (CNN/RNN/TF) 逐渐被Transformer取代。

2020.5 GPT出现。 BERT / GPT, 预训练模型。

  1. 子领域衰退。
  2. 子领域的技术方法和框架日趋统一。

两阶段模式: 模型预训练 + 应用微调 ( Fine Tuning )

NLP理解: BERT为代表的“双向语言模型预训练+应用Fine-tuning”模式 NLP生成:GPT2.0为代表的“自回归语言模型(即从左到右单向语言模型)+Zero /Few Shot Prompt”模式。

henryliangt commented 1 year ago

Transformer统一了NLP, 也替换图像的CNN模型. 多模态也基本采用Transformer , 2020年底 Vision Transformer (ViT)

Will we have a Large Image Model Moment ? Autoregressive Image model + prompting? generative model win? image generative model can take care of the understanding image task? like GPT?

Multi-modal data, including depth. double camera, lidar? 4D 超声波雷达?

henryliangt commented 1 year ago

预训练模型走向通用人工智能(AGE, Artificial Genral Intelligence)

GPT3 (2020 June) to present. 初始是过渡期: GPT3 = 自回归语言模型 auto regressive language model + Prompting 模式.

技术框架收敛到了BERT + GPT 两个选择. 规模最大的LLM 几乎都是GPT autoregressive language model : Palm, GLaM, Gopher, Chinchilla, MT-NLG, LaMDA. 生成统一了世界.

Why ?

image

原因:

  1. T5模型形式上统一了NLP 的理解和生成. 生成模型可以兼顾理解任务.例如T5

  2. zero/few shot prompting 模式 === GPT === 生成模型 fine-tuning 模式解决下游任务 === Bert更好 === 理解模型

为什么要few shot, ?什么样的LLM 是好模型?

好模型可以自主学习. Best LLM image

  1. 强大的自主学习力. 世界上所有的文本和图片.自动学习,无需接入,自主解决.
  2. LLM 响应任意领域.
  3. LLM 适配人习惯的表达方式.

为什么要few shot ?

  1. 模型太大,用户无力部署,无力fine-tuning修改参数. 超级大模型一定会走向AGI.
  2. 0 / few shot prompting, or CoT (Chain of Thought ) prompting. few shot prompting = in-context learning 是一个过渡技术. GPT 3 + Prompting 是过渡期技术. ChatGPT 用 Instruct 取代了Prompting带来了新的技术范式转换.
henryliangt commented 1 year ago

Influence 1: new interface

ChatGPT只加入了数万人工标注数据. GPT3.5 几千亿token包含的世界知识(数据中包含的事实与常识) 几可忽略. 人通过Reward Model反馈LLM数据里人类偏好知识.获得听话,懂礼貌的LLM. Conversational Part. LLM 的接口层.

Influence 2: LLM取代子领域.

如何构建理想的LLM ?

子任务是否LLM超越人类比,如BLUE, SuperGLUE. few shot prompting 是否超越 fine-tuning .很多还是fine-tuning占优(单一模式领域训练数据量大)

LLM 泛化. image

LLM多模态化 Flamingo -- DeepMind Language Models are General-Purpose Interfaces --MS

henryliangt commented 1 year ago

图像在仿Bert , 做自监督, 典型技术:

对比学习,

MAE

Pre-trained image model在下游任务的收益,远不如GTP在NLP 的显著.

henryliangt commented 1 year ago
  1. LLM 模型 如何从数据中吸收知识.
  2. 模型规模增长对LLM吸收知识能力带来的影响.
  3. 如何使用LLM内在能力来解决任务的人机接口. In context learning, Instruct 两种模式.
  4. 思维链(CoT) Prompting 推理技术本质上也是In context Learning 很重要.
henryliangt commented 1 year ago

Transformer是足够强大的特征抽取器,尚不需改进.

Transformer学到了什么? 知识如何存取?如何修正错误知识?

LLM 包含 语言类知识+ 世界知识

语言类知识:

词法,词性,句法,语义. 实验证明: LLM 能捕获语言学知识.. LLM 可以学习各种层次的语言学知识. 这就是为何用预训练模型后, 语言理解类任务获得大幅效果提升的最重要原因之一. 研究证明: 浅层语言类知识比如词法,词性, 句法,等知识存储在Transformer的低层和中层 抽象的语言类知识比如语义类知识,广泛分布在Transformer的中层和高层结构中.

世界知识: Factual Knowledge / Common sense Knowledge

事实型知识 :拜登是米国人. 常识性知识: 太阳从东方升起.

结论: LLM 确实从训练数据吸收了大量的世界知识.这类知识主要分布在Transformer的中层和高层,尤其聚集在中层. 随着Transformer 模型层深增加, 能够学习到的知识数量逐渐以指数增加.(" BERTnesia: Investigating the capture and forgetting of knowledge in BERT ")

LLM 大概率是一种以模型参数体现的隐式知识图谱 "When do you need billions of words of Pre-training data?" 研究习得知识-训练数据量的关系. 结论: 1KW - 1E 单词的语料就能学好句法语义等语言学知识. 事实类知识要更多的数据. 事实类知识则数量巨大,不断变化,增加数据量,预训练模型表现更好. 说明了增量的训练数据主要是世界知识.

LLM如何存取知识.

存储到了哪里? 如何提取出来。

image

多头注意力(MHA) 总参数的三分之一 主要用于计算单词或知识间的相关强度,并对全局信息进行集成,更可能是在建立知识之间的联系,大概率不会存储具体知识点。

FFN结构 三分之二 知识主体可能在这里。 “Transformer Feed-Forward Layers Are Key-Value Memories” 给出了一个比较新颖的观察视角,它把Transformer的FFN看成存储大量具体知识的Key-Value存储器。如上图所示(图左是原始论文图,其实不太好理解,可以看做了注释的图右,更好理解些),FFN的第一层是个MLP宽隐层,这是Key层;第二层是MLP窄隐层,是Value层。FFN的输入层其实是某个单词对应的MHA的输出结果Embedding,也就是通过Self Attention,将整个句子有关的输入上下文集成到一起的Embedding,代表了整个输入句子的整体信息。Key层的每个神经元节点,记载了一对<Key,Value>信息。比如对于上图中FFN第一个隐层的第 iii 个节点 kik{i}k{i} ,也许就是它记载了<北京,is-capital-of,中国>这条知识。 kik{i}k{i} 节点对应的key向量,其实指的是节点 kik{i}k{i} 和输入层每个节点的权重向量;而对应的Value向量,指的是节点 kik{i}k{i} 和FFN第二层的Value层每个节点形成连接的权重向量。每个神经元的Key向量,用于识别输入中的某种语言或者知识模式,是一种模式探测器。如果输入中包含它要检测的某种模式,那么输入向量和 kik{i}k{i} 节点的key权重进行向量内积计算,加上Relu,形成 kik{i}k{i} 的大数值响应,意味着 kik{i}k{i} 检测到了这个模式,于是再把这个响应值,通过 kik{i}k{i} 节点的Value权重向量向FFN第二层传播。这等价于将Value向量的值,用响应值加权,然后传递并体现到第二层Value层每个节点的输出上。如此这般,FFN的正向传播计算过程,看起来就像是通过Key检测到某种知识模式,然后取出对应的Value,并把Value体现在FFN的第二层输出上。当然,FFN第二层每个节点,会收集FFN的Key层所有节点信息,所以是一种混合响应,而Value层所有节点的混合响应,可以解读为代表输出单词的概率分布信息。听着可能还是比较复杂,我们用个极端的例子来说明。我们假设上图的节点 kik{i}k{i} 就是记载<北京,is-capital-of,中国>这条知识的Key-Value存储器,它的Key向量,用于检测”中国的首都是…”这个知识模式,它的Value向量,基本存储了与单词“北京”的Embedding比较接近的向量。当Transformer的输入是“中国的首都是[Mask]”的时候, kik{i}k{i} 节点从输入层探测到这个知识模式,所以产生较大的响应输出。我们假设Key层其它神经元对这个输入都没有任何响应,那么对应的Value层的节点,其实只会接收到“北京”这个Value对应的单词embedding,并通过 kik{i}k{i} 的大响应值,进行了进一步的数值放大。于是,Mask位置对应的输出,就自然会输出“北京”这个单词。基本就是这么个过程,看着很复杂,其实很简单。而且这篇文章还指出,Transformer低层对句子的表层模式作出反应,高层对语义模式作出反应,就是说低层FFN存储词法、句法等表层知识,中层和高层存储语义及事实概念知识,这和其它研究结论是一致的。要我猜,把FFN看成Key-Value存储器这种思路,很可能不是最终的正确答案,但是距离最终正确答案的距离,估计也不太远。

henryliangt commented 1 year ago

如何修正知识

  1. 训练数据的源头来修正 。 Towards Tracing Factual Knowledge in Language Models Back to the Training Data” 可以逆向追踪到某条知识对应的训练数据源头。首先定位到其对应的数据源头,删除数据源,然后重新预训练整个LLM模型,这样即可达成删除LLM中相关知识的目的。 比较适合那种对于某个特定类别数据的一次性大规模删除场合,不适合少量多次的常规知识修正场景,比如可能比较适合用来做去除偏见等去toxic内容的处理。

  2. fine-tuning修正LLM. 修正成的新知识来构建训练数据,然后让LLM模型在这个训练数据上做fine-tuning,这样指导LLM记住新的知识,遗忘旧的知识。 问题:首先它会带来灾难遗忘问题,就是说除了忘掉该忘的知识,还忘掉了不该忘的知识,导致这么做了之后有些下游任务效果下降。 另外,因为目前的LLM模型规模非常大,即使是做fine-tuning,如果次数频繁,其实成本也相当高。 "Modifying Memories in Transformer Models”

  3. 直接修改LLM里某些知识对应的模型参数 . 定位到存储旧知识的FFN节点,然后可以强行调整更改FFN中对应的模型参数,将旧知识替换成新的知识。 两项关键技术: 首先是如何在LLM参数空间中定位某条知识的具体存储位置; 其次是如何修正模型参数,来实现旧知识到新知识的修正。

“Locating and Editing Factual Associations in GPT” “Mass-Editing Memory in a Transformer”

henryliangt commented 1 year ago

GPT3 175B gogole LaMDA 137B PaLM 540B DeepMind Gogher 280B 清华&智谱GLM 130B 华为 盘古 200B 百度 文心 260B 浪潮 源1.0 245B

image

henryliangt commented 1 year ago

OpenAI在“Scaling Laws for Neural Language Models”中专门研究了这个问题,并提出LLM模型所遵循的“伸缩法则”(scaling law)

独立增加训练数据量、 模型参数规模或者 延长模型训练时间(比如从1个Epoch到2个Epoch),

预训练模型在测试集上的Loss都会单调降低,也就是说模型效果越来越好。

假设用于训练LLM的算力总预算(比如多少GPU小时或者GPU天)给定,那么是应该多增加数据量、减少模型参数呢?还是说数据量和模型规模同时增加,减少训练步数呢?此消彼长,某个要素规模增长,就要降低其它因素的规模,以维持总算力不变,所以这里有各种可能的算力分配方案。

OpenAI选择了同时增加训练数据量和模型参数,但是采用早停策略(early stopping)来减少训练步数的方案。

因为它证明了:对于训练数据量和模型参数这两个要素,如果只单独增加其中某一个,这不是最好的选择,

最好能按照一定比例同时增加两者,它的结论是优先增加模型参数,然后才是训练数据量。

假设用于训练LLM的算力总预算增加了10倍,那么应该增加5.5倍的模型参数量,1.8倍的训练数据量,此时模型效果最佳。

DeepMind : Training Compute-Optimal Large Language Models 确实需要同时增加训练数据量和模型参数,模型效果才会更好。 认为训练数据量和模型参数是同等重要的,也就是说,假设用于训练LLM的算力总预算增加了10倍,那么应该增加3.3倍的模型参数量,3.3倍的训练数据量,

这意味着:增加训练数据量的重要性,比我们之前所认为的,还要重要。

对标数据量300B、模型参数量280B的Gopher模型 DeepMind - - Chinchilla 选择增加4倍的训练数据,但是将模型参数降低为Gopher的四分之一,大约为70B

Chinchilla效果都要优于规模更大的Gopher。

启示:我们可以选择放大训练数据,并同比例地减少LLM模型参数,以达到在不降低模型效果的前提下,极大缩小模型规模的目的。缩小模型规模有很多好处,比如在应用的时候,推理速度会快很多等,无疑这是一个很有前途的LLM发展路线。

henryliangt commented 1 year ago

LLM解决下游任务效果看,模型增大的任务效果。三种情况。 image

scaling law

a图:scaling law .知识密集型任务: 模型放大,表现更好。

究已经证明越大的LLM模型学习效率越高,也就是说相同训练数据量,模型越大任务效果越好, 说明面对的即使是同样的一批训练数据,更大的LLM模型相对规模小一些的模型,从中学到了更多的知识。

增大LLM模型参数的时候,往往会同步增加训练数据量,这意味着大模型可以从更多数据中学习更多的知识点。

“涌现能力(Emergent Ability)” 图(b)

模型规模是解锁(unlock)LLM新能力的关键,随着模型规模越来越大,会逐渐解锁LLM越来越多的新能力。

“Beyond the Imitation Game: Quantifying and extrapolating the capabilities of language models”

涌现能力”的任务也有一些共性:这些任务一般由多步骤构成,要解决这些任务,往往需要先解决多个中间步骤,而逻辑推理能力在最终解决这类任务中发挥重要作用。

思维链(Chain of Thought)Prompting是典型的增强LLM推理能力的技术,能大幅提升此类任务的效果

Emergent Ability 原因: Emergent Abilities of Large Language Models”

  1. 有些任务的评价指标不够平滑。 标准答案完全匹配才算对,否则就是0分。所以,即使随着模型增大,其效果在逐步变好,体现为输出了更多的正确字符片段,但是因为没有完全对,只要有任何小错误都给0分,只有当模型足够大,输出片段全部正确才能得分。
  2. 任务由若干中间步骤构成,随着模型规模增大,解决每个步骤的能力也在逐步增强,但是只要有一个中间步骤是错的,最终答案就是错的,于是也会导致这种表面的“涌现能力”现象。 image

真任务 + distractor task

“Inverse scaling can become U-shaped” 出了一种解释:这些任务,内部其实隐含了两种不同类型的子任务,一种是真正的任务,另外一种是“干扰任务(distractor task)”。当模型规模小的时候,无法识别任意一种子任务,所以模型的表现跟随机选择答案差不多,当模型增长到中等规模的时候,主要执行的是干扰任务,所以对真正的任务效果有负面影响,体现为真正任务效果的下降,而当进一步增加模型规模,则LLM可以忽略干扰任务,执行真正的任务,体现为效果开始增长。

推理任务

对于那些随着模型规模增大,效果一直下降的任务,如果采用思维链(CoT)Prompting,则部分任务的表现转换为遵循Scaling law,即模型规模越大效果越好,而其它任务则转换为U性增长曲线。这其实侧面说明了:此类任务应属于推理类型的任务,所以加入CoT后任务表现会发生质的变化。

henryliangt commented 1 year ago

人机接口

zero shot prompting其实就是现在的Instruct的早期叫法

一个内涵,两种做法. zero shot prompting,实际上就是不知道怎么表达一个任务才好,于是就换不同的单词或者句子,反复在尝试好的任务表达方式,这种做法目前已经被证明是在拟合训练数据的分布,其实没啥意思。 目前Instruct的做法则是给定命令表述语句,试图让LLM理解它。所以尽管表面都是任务的表述,但是思路是不同的。

In Context Learning和few shot prompting意思类似

给LLM几个示例作为范本,然后让LLM解决新问题。 In Context Learning也可以理解为某项任务的描述,只是Instruct是一种抽象的描述方式,In Context Learning是一种例子示范的例子说明法。

神奇的In Context Learning

image

Fine-tuning不同于In Context Learning Fine-tuning拿这些例子当作训练数据,利用反向传播去修正LLM的模型参数,而修正模型参数这个动作,确实体现了LLM从这些例子学习的过程。但是,In Context Learning只是拿出例子让LLM看了一眼,并没有根据例子,用反向传播去修正LLM模型参数的动作,就要求它去预测新例子。

难道LLM通过一种奇怪的方式去学习?还是说,它确实也没学啥?目前仍是未解之谜。

Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?”试图证明In Context Learning没有从例子中学习

真正对In Context Learning影响比较大的是: xxx 和 yyy 的分布,也就是输入文本 xxx 的分布和候选答案 yyy 有哪些,如果你改变这两个分布,比如把 yyy 替换成候选答案之外的内容,则In Context Learning效果急剧下降。

工作证明了In Context Learning并未学习映射函数,但是输入和输出的分布很重要,这两个不能乱改。

“What learning algorithm is in-context learning? Investigations with linear models”认为Transformer能够隐式地从示例中学习 xxx 到 yyy 的映射过程,它的激活函数中包含了一些简单映射函数,而LLM通过示例能够激发对应的那一个。

“Why Can GPT Learn In-Context? Language Models Secretly Perform Gradient Descent as Meta-Optimizers”这篇文章则将ICL看作是一种隐式的Fine-tuning。

henryliangt commented 1 year ago

image

偏学术研究的Instruct

多任务场景下,LLM模型对Instruct理解的泛化能力。

“Scaling Instruction-Fine-tuned Language Models”/“Super-NaturalInstructions: Generalization via Declarative Instructions on 1600+ NLP Tasks”

人类真实需求下的Instruct

基于多任务,以InstructGPT和ChatGPT为代表。

InstructGPT论文里,也拿这种方法和FLAN那种Instruct based方法做了比较。首先在GPT3上用FLAN提到的任务、数据以及Prompt模版进行微调,来在GPT 3上复现FLAN方法,然后和InstructGPT进行比较,因为InstructGPT的基础模型也是GPT3,所以只有数据和方法的差别,两者可比,结果发现FLAN方法的效果,距离InstructGPT有很大的差距。那么背后的原因是什么呢?论文分析数据后认为,FLAN方法涉及到的任务领域相对少,是InstructGPT涉及领域的子集,所以效果不好。也就是说,FLAN论文里涉及到的任务和用户真实需求是不符的,而这导致在真实场景下效果不够好。而这对我们的启示是:从用户数据中收集真实需求,这事情是很重要的。

henryliangt commented 1 year ago

In Context Learning和Instruct的联系

image

设In Context Learning是用一些例子来具象地表达任务命令,Instruct是一种更符合人类习惯的抽象任务描述。那么,一个很自然的问题是:它们之间有什么联系吗?比如,我们是否能够提供给LLM完成某个任务的若干具体示例,让LLM找出其对应的自然语言描述的Instruct命令?

image

“Large Language Models Are Human-Level Prompt Engineers”

如上图所示,对于某项任务,给LLM一些示例,让LLM自动生成能够描述这项任务的自然语言命令,然后它再用LLM生成的任务描述去测试任务效果。它使用的基础模型是GPT 3和InstructGPT,经过这项技术加持后,LLM生成的Instruct的效果相比未采用这项技术的GPT 3 以及InstuctGPT来说,指标有极大地提升,而且在一些任务上超过人类的表现。这说明了:具象的任务示例和任务的自然语言描述之间,有种神秘的内在联系。至于这种联系到底是什么?我们目前对此还一无所知。

henryliangt commented 1 year ago

智慧之光:如何增强LLM的推理能力

LLM具备推理能力吗?如果具备,那么它的推理能力够强吗? 这两个问题目前的答案似乎应该是:当模型规模足够大的时候,LLM本身是具备推理能力的,在简单推理问题上,LLM已经达到了很好的能力,但是复杂推理问题上,还需要更多深入的研究。 LLM推理相关工作的话,我把它们归到两大类,体现出挖掘或促进LLM推理能力不同的技术思路:

第一类研究比较多,可以统称为基于Prompt的方法,核心思想是通过合适的提示语或提示样本,更好地激发出LLM本身就具备的推理能力,Google在这个方向做了大量很有成效的工作。

第二类做法是在预训练过程中引入程序代码,和文本一起参与预训练,以此进一步增强LLM的推理能力,这应该是OpenAI实践出的思路。比如ChatGPT肯定具备很强的推理能力,但它并不要求用户必须提供一些推理示例,所以ChatGPT强大的推理能力,大概率来源于使用代码参与GPT 3.5的预训练。

这两种思路其实大方向是迥异的:利用代码增强LLM推理能力,这体现出一种通过增加多样性的训练数据,来直接增强LLM推理能力的思路; 而基于Prompt的方法,它并不会促进LLM本身的推理能力,只是让LLM在解决问题过程中更好地展示出这种能力的技术方法。可以看出,前者(代码方法)治本,后者治标。当然,两者其实也是互补的,但从长远看,治本的方法更重要。

henryliangt commented 1 year ago

基于Prompt的方法: 三条技术路线

image

接在问题上追加辅助推理Prompt. Large language models are zero-shot reasoners”提出. zero-shot CoT。具体而言,分为两个阶段(如上图所示),第一阶段在提问的问题上追加“Let’s think step by step”这句提示语,LLM会输出具体的推理过程;第二阶段,在第一阶段的问题后,拼接LLM输出的具体推理过程,并再追加Prompt=“Therefore, the answer (arabic numerals) is”,此时LLM会给出答案。如此简单的操作,却可以大幅增加LLM在各项推理任务中的效果,比如在数学推理测试集GSM8K上,加上提示语后,推理准确率直接从原先的10.4%提升到了40.4%,可谓神奇。

为什么LLM会具备给一句“Let’s think step by step”提示语,就能列出详细的推理步骤并算出答案呢?其原因目前尚无定论,我的猜测是:很可能因为预训练数据里面存在大量的此种数据,就是以“Let’s think step by step”开头,然后后面是详细的推理步骤,最后给出答案,而LLM在预训练的时候记住了这些模式。而当我们输入这个提示语的时候,激发LLM模糊得“回忆”起某些例子的推导步骤,于是即可模仿这些例子进行步骤推理并给出答案。当然这只是我的无依据推论,若事实真的如此,如果你看过后面介绍的标准CoT做法,会发现Zero-shot CoT 本质上和标准CoT很可能没什么区别,只是标准CoT由人工来写推理步骤的示例,而Zero-shot CoT大概率是通过提示语,激活了记忆中的某些包含推理步骤的示例,很可能是如此区别。而标准CoT效果比Zero-Shot CoT效果好也完全可以理解,因为毕竟靠LLM回忆示例,精准性估计不会太高,而人工给出的示例,准确性是有保障的,所以自然标准CoT效果会更好。这侧面说明了一个道理,就是LLM本身是具备推理能力的,只是我们没有办法把它的这种能力激发出来而已,通过合适的提示语来进行两步提示,就在一定程度上可以释放出它的这种潜力。另外,对于中文,很可能存在另外一个黄金提示语,比如“详细解题思路如下”,类似这种,因为中文语料在讲解推理步骤的时候,经常用的引导句和“让我们一步一步来思考”应该是不同的,这是明显的西方说法,而探索出这个中文黄金提示语,其实也是很有必要的。

第二种思路一般被称为基于示例的思维链(few-shot CoT,Chain of Thought)Prompting。这个方向目前是LLM推理研究的主方向,很多工作都是在这个思路上做的,我们简单介绍几个效果显著的代表性工作,基本能代表CoT的技术发展方向。

image 最早明确提出CoT这个概念的文章是“Chain of thought prompting elicits reasoning in large language models”,论文发布于22年1月份,虽然做法很简单,但是应用CoT后LLM模型的推理能力得到了巨大提升,GSM8K数学推理测试集准确率提高到60.1%左右。当然,这种给出详细推理步骤和中间过程的思想,并非CoT最早提出的,更早一些的“scratchpad”技术(可参考:Show Your Work: Scratchpads for Intermediate Computation with Language Models)首先采用了类似的思路。

image

CoT的主体思想其实很直白;为了教会LLM模型学会推理,给出一些人工写好的推理示例,示例里把得到最终答案前,一步步的具体推理步骤说清楚,而这些人工写的详细推理过程,就是思维链Prompting,具体例子可参照上图中蓝色文字部分。CoT的意思是让LLM模型明白一个道理;就是在推理过程中,步子不要迈得太大,否则很容易出错,改变思维模式,化大问题为小问题,步步为营,积小胜为大胜。

CoT提出不久,很快在22年3月份,一项被称为“Self-Consistency”的改进技术就将GSM8K测试集准确率提高到74.4%,提出这项改进的论文是“Self-Consistency Improves Chain of Thought Reasoning in Language Models”。“Self-Consistency”的思路也很直观(参考上图):首先可以利用CoT给出几个写了推理过程的示例,然后要求LLM对给定的问题进行推理,如果是CoT,直接输出一个推理过程和答案,整个过程就结束了。“Self-Consistency”则不然,它要求LLM输出多个不同的推理过程和答案,然后采用投票的方式选出最佳答案,思路非常简单直接,但是效果也确实好。“Self-Consistency”其实是教导LLM学会这么一个道理:孔乙己说过茴香豆的“茴”字有四种写法,类似的,一个数学题的正确解法也可以有很多种,每个不同的推导过程都指向最终的答案。条条大路通罗马,虽说也有个别迷路走到北京的,但是迷路的毕竟是少数,看看大多数人走到哪里,哪里就是正确答案。简单的方法往往蕴含着深刻的哲学含义,是不是这道理? 再往后,“On the Advance of Making Language Models Better Reasoners”这个工作在“Self-Consistency”基础上,进一步集成了“从一个Prompt问题拓展到多个Prompt问题、检查推理中间步骤的正确性以及对多个输出的回答加权投票”这三个改进点,将GSM8K测试集准确率提高到83%左右。

image

第三种思路体现了一种分治算法的思想。当然这个所谓“分治”是我归纳的,别人没这么说。这种思路的核心思想是:对于一个复杂的推理问题,我们把它分解成若干容易解决的子问题,一一解决掉子问题后,我们再从子问题的答案推导复杂问题的答案。你看这确实比较类似分治算法的思想吧。我个人觉得,这种思路可能才是揭示问题本质、最终解决LLM复杂推理问题正宗的道路。我们以“Least-to-most prompting”技术为例来说明这种思路的一种具体实现方式,如上图所示:它分为两个阶段,第一个阶段,从原始问题我们可以得知最终要问的问题是什么,我们假设最终问题是Final Q,然后从原始问题填充Prompt模版:“如果要解决Final Q问题,那么我需要先解决”,然后把原始问题和这个Prompt交给LLM,让LLM模型给出答案,等于让LLM给出最终问题的前置子问题Sub Q;接下来我们进入第二个阶段,让LLM先回答刚才拿到的子问题Sub Q,并拿到对应的答案,然后原始问题拼接子问题Sub Q及对应答案,再去问LLM最终那个问题Final Q,此时LLM会给出最后的答案。如此这般,体现出拆解子问题,并从子问题的答案逐步找出最终答案的思路。

henryliangt commented 1 year ago

代码预训练增强LLM推理能力

image

个有趣且费解的现象:除了文本外,如果能够加入程序代码一起参与模型预训练,则能大幅提升LLM模型的推理能力。这个结论从不少论文的实验部分都可以得出(可以参考:AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS/Challenging BIG-Bench tasks and whether chain-of-thought can solve them等论文的实验部分)。

上图给出了一份实验数据,来自于论文“On the Advance of Making Language Models Better Reasoners”,其中GPT3 davinci就是标准的GPT 3模型,基于纯文本训练;code-davinci-002(OpenAI内部称为Codex)是同时在Code和NLP数据上训练的模型。如果比较两者效果,可以看出,不论采用具体哪种推理方法,仅仅是从纯文本预训练模型切换到文本和Code混合预训练模型,在几乎所有测试数据集合上,模型推理能力都得到了巨大的效果提升,比如我们以“Self Consistency”方法为例,在大多数据集合上的性能提升,都直接超过了20到50个百分点,这是很恐怖的性能提升,而其实在具体推理模型层面,我们什么也没做,仅仅是预训练的时候除了文本,额外加入了程序代码而已。除了这个现象,从上图数据中,我们还可以得出其它一些结论,比如GPT 3这种纯文本预训练模型,其实是具备相当程度的推理能力的,除了在GSM8K这种数学推理上效果比较差外,其它推理数据数据集合表现也还可以,前提你需要采用合适的方法,来激发出它本身就具备的这种能力;再比如,text-davinci-002,也就是在code-davinci-002基础上加入instruct fine-tuning后的模型(就是加入InstructGPT或ChatGPT模型的第一步),其推理能力要弱于Codex,但是有其它研究表明它在自然语言处理任务又要强于Codex。而这貌似说明了,加入instruct fine-tuning,会损害LLM模型的推理能力,但是会在一定程度上提升自然语言理解能力。而这些结论其实都是很有意思的,也能启发后续进一步的思考和探索。那么,一个自然的疑问是:为何预训练模型可以从代码的预训练中获得额外的推理能力?确切原因目前未知,值得深入探索。我猜测可能是因为原始版本的Codex(只使用代码训练,可参考文献:Evaluating Large Language Models Trained on Code)的代码训练是从文本生成代码,而且代码中往往包含很多文本注释,本质上这类似于预训练模型做了<文本,Code>两种数据的多模态对齐工作。而数据中必然包含相当比例的数学或逻辑问题的代码、描述和注释,很明显这些数学类或逻辑推理类的数据,对于解决下游数学推理问题是有帮助的,我猜大概率原因在此。

henryliangt commented 1 year ago

关于LLM推理能力的思考

对于复杂的推理问题,我们应该把它拆解成若干简单的子问题,因为子问题对于LLM来说回答正确的概率就大很多,让LLM一一回答子问题后,再逐步推导出最终答案。受到“Least-to-most prompting”技术的启发,如果进一步思考,我觉得LLM推理本质上很可能会是如下两种可能的其中之一:不断和LLM进行交互的图上推理问题,抑或是不断和LLM进行交互的程序流程图执行问题。

上述思路最大的问题是,我们如何根据文本描述的问题,能够靠LLM模型,或者其它模型,得到图结构或者流程图结构?这个可能是其中的难点。一种可能的思路就类似继续增强文本和更高质量的代码预训练,走隐式学习内部隐含结构的方法。而目前的CoT技术,如果套到上述思路来思考的话,可以这么理解:标准CoT,其实就是靠自然语言文本来描述图结构或者程序流程图的;而“Least-to-most prompting”技术,则是试图根据最后一个图节点,靠倒推来试图推导出其中的图结构,但是很明显,目前的方法限制了它倒推的深度,也就是说它只能推导出非常简单的图结构,这正是限制它能力的所在。

henryliangt commented 1 year ago

“Will we run out of data? An analysis of the limits of scaling datasets in Machine Learning” 对此进行了估算,结论是到2026年左右,高质量的NLP数据将会用光,低质量NLP数据会在2030到2050年用光,而低质量图像数据会在2030到2060年用光。而这意味着:要么到时我们有新类型的数据源,要么我们必须增加LLM模型对数据的利用效率。否则,目前这种数据驱动的模型优化方式将会停止进步,或者收益减少。

henryliangt commented 1 year ago

增强LLM的复杂推理能力正如之前对LLM推理能力的叙述,尽管LLM在最近一年推理能力得到了很大的提升,但是很多研究(参考:Limitations of Language Models in Arithmetic and Symbolic Induction/Large Language Models Still Can’t Plan)表明,目前LLM能够解决得比较好的推理问题,往往都相对简单,LLM的复杂推理能力仍然薄弱,比如即使是简单的字符拷贝推理或者加减乘除运算,当字符串或者数字非常长的时候,LLM推理能力会极速下降,再比如行为规划能力等复杂推理能力很弱。总而言之,加强LLM的复杂推理能力,应该是LLM未来研究中最重要的环节之一。前文有述,加入代码加入预训练,这是一种直接增强LLM推理能力的方向。这个方向目前研究尚显不足,更像是实践经验的总结,探索背后的原理,并进而引入更多类型除代码外的新型数据来增强LLM的推理能力,这可能是更本质提升推理能力的方向。LLM纳入NLP之外更多其它研究领域目前的ChatGPT擅长NLP和Code任务,作为通向AGI的重要种子选手,将图像、视频、音频等图像与多模态集成进入LLM,乃至AI for Science、机器人控制等更多、差异化更明显的其它领域逐步纳入LLM,是LLM通往AGI的必经之路。而这个方向才刚刚开始,因此具备很高的研究价值。更易用的人和LLM的交互接口如前所述,ChatGPT的最大技术贡献即在此。但是很明显,目前的技术并不完美,肯定还有很多命令LLM理解不了。所以,沿着这个方向,寻找更好的技术,来让人类使用自己习惯的命令表达方式,而LLM又能听懂,这是个新的,且非常有前景的技术方向。建设高难度的综合任务评测数据集好的评测数据集,是引导技术不断进步的基石。随着LLM模型逐步增大,任务效果快速提升,导致很多标准测试集快速过时。也就是说,这些数据集合相对现有技术来说,太容易了,在没有难度的测试集合下,我们不知道目前技术的缺陷和盲点在哪里。所以构建高难度的测试集合,是促进LLM技术进步的关键所在。目前行业应出现了一些新的测试集,有代表性的包括BIGBench、OPT-IML等。这些测试集合体现出一些特性,比如相对LLM现有技术具备一定的难度、综合了各种各样多种类型的任务等。受到ChatGPT的启发,我觉得除此外应纳入另一考虑因素:体现真实用户需求。就是说,这些任务的表述由用户真实发起,这种方式构建出来的LLM模型,才能解决用户实际需求。除此外,相信LLM会快速将能力溢出到NLP之外的领域,而如何融入更多其它领域的评测数据,也是需要提前去考虑。高质量数据工程对于预训练模型来说,数据是其根本,预训练过程可以理解为从数据中吸取其中所包含知识的过程。因此,我们需要进一步加强对高质量数据的挖掘、收集及清洗等工作。关于数据,需要考虑两个方面:数据的质量和数量。而根据T5的对比实验,我们可以得出结论:在数量和质量两个因素里,质量优先,正确的道路应该是在保证数据质量的前提下,再去增大数据规模。数据质量,包括数据的信息含量以及数据的多样性等多个衡量标准,比如Wiki明显就属于世界知识密度极高的高质量数据,这是从信息含量来说的;而增加数据类型的多样性,无疑是激发LLM各种新能力的根本,比如加入问答网站的数据,对于LLM的QA能力提升是有直接帮助的。多样化的数据赋予了LLM更好解决更多不同类型任务的能力,所以,这可能是数据质量里最关键的标准。

henryliangt commented 1 year ago

超大LLM模型Transformer的稀疏化

规模最大的LLM中,有相当比例的模型采取了稀疏(Sparse)结构,比如GPT 3、PaLM、GLaM等,GPT 4大概率也会走稀疏模型路线。之所以采用Sparse 化的模型,主要好处是它可以极大减少LLM的训练时间和在线推理时间。Switch Transformer论文里指出:在相同算力预算的前提下,使用稀疏化Transformer,相对Dense Transformer,LLM模型的训练速度可以提升4倍到7倍。为何Sparse模型可以加快训练和推理时间呢?这是因为尽管模型参数巨大,但是对于某个训练实例,Sparse模型通过路由机制,只使用整个参数中的一小部分,参与训练和推理的活跃参数量比较少,所以速度快。我认为未来超大的LLM模型大概率会收敛到稀疏模型。主要有两个原因:一方面,现有研究表明(参考:Large Models are Parsimonious Learners: Activation Sparsity in Trained Transformers),标准的Dense Transformer在训练和推理时,它本身也是稀疏激活的,就是说只有部分参数会被激活,大部分参数没有参与训练和推理过程。既然这样,我们不如直接迁移到稀疏模型;另外,毫无疑问LLM模型的规模会继续推大,而高昂的训练成本是妨碍其进一步扩大模型的重要阻力,使用稀疏模型可以极大降低超大模型的训练成本,所以随着模型规模越大,稀疏模型带来的收益越明显。考虑到这两个方面,大概率未来更大的LLM模型会采用稀疏模型方案。那为何目前其它大规模模型不走稀疏模型的路线呢?因为Sparse模型存在训练不稳定、容易过拟合等问题,不太容易训练好。所以,如何修正稀疏模型面临的问题,设计出更容易训练的稀疏模型,是很重要的未来研究方向。

henryliangt commented 1 year ago

取经之路:复刻ChatGPT时要注意些什么

如果希望能复刻类似ChatGPT这种效果令人惊艳的LLM模型,综合目前的各种研究结论,在做技术选型时需要重点权衡如下问题:首先,在预训练模式上,我们有三种选择:GPT这种自回归语言模型,Bert这种双向语言模型,以及T5这种混合模式(Encoder-Decoder架构,在Encoder采取双向语言模型,Decoder采取自回归语言模型,所以是一种混合结构,但其本质仍属于Bert模式)。我们应选择GPT这种自回归语言模型,其原因在本文范式转换部分有做分析。目前看,国内LLM在做这方面技术选型的时候,貌似很多都走了Bert双向语言模型或T5混合语言模型的技术路线,很可能方向走偏了。第二,强大的推理能力是让用户认可LLM的重要心理基础,而如果希望LLM能够具备强大的推理能力,根据目前经验,最好在做预训练的时候,要引入大量代码和文本一起进行LLM训练。至于其中的道理,在本文前面相关部分有对应分析。第三,如果希望模型参数规模不要那么巨大,但又希望效果仍然足够好,此时有两个技术选项可做配置:要么增强高质量数据收集、挖掘、清理等方面的工作,意思是我模型参数可以是ChatGPT/GPT 4的一半,但是要想达到类似的效果,那么高质量训练数据的数量就需要是ChatGPT/GPT 4模型的一倍(Chinchilla的路子);另外一个可以有效减小模型规模的路线是采取文本检索(Retrieval based)模型+LLM的路线,这样也可以在效果相当的前提下,极大减少LLM模型的参数规模。这两个技术选型不互斥,反而是互补的,也即是说,可以同时采取这两个技术,在模型规模相对比较小的前提下,达到超级大模型类似的效果。第四,超级大模型因为模型规模大,所以训练成本过高,导致很少有机构有能力去做这件事。而且由上文分析可见,继续不断推大LLM模型规模是肯定会发生、也应该去做的事情。于是,如何通过技术手段降低LLM的训练成本就很重要。LLM的特征抽取器Sparse化是有效降低模型训练及推理成本的技术选择。由此可见,随着模型越来越大,LLM模型Sparse化是一个应该考虑的选项。第五,ChatGPT是目前最接近理想LLM的技术方案,而理想中的LLM应该是以一个几乎无所不能的基础通用大模型作为依托,来支持各种各样的上层任务类型。目前看,支持越来越多的任务类型,主要是通过增加LLM预训练数据的多样性来达成的,数据多样性越好,LLM能够支持的任务类型就越丰富。所以,应该重视通过增加数据多样性来增加LLM新能力的思路。第六,易用的人机操作接口。人类用他们自己习惯的表达方式来描述任务,而LLM要能够理解这些Instruct的真实含义。另外,也要注意这些Instruct是符合人类真实需求的,就是说,要从最终用户那里收集任务表述方式,而不能靠研发人员自己的臆想或猜测。ChatGPT给我最大的启发其实是这一点,至于是否用增强学习我倒觉得不重要,其它替代技术应该也能做类似的事情。