重拾 NLP 技术(7)

从前面的发展过程也可以看到,网络本身从早期的几十 M(transformer)发展到现在几百个 B(GPT-3、PaLM),消耗的语料库也是越来越大,难道大就是好吗?OpenAI 的一些学者给出了 NLP 模型的 scaling laws(非 embedding 参数个数、数据集大小、训练计算时间)

测试错误 L 与 N 成对数线性关系

总结下来:小模型不 work -> 不花钱(硬件、计算时间)不 work。真的对科研单位很不友好的结论。据说当年 OpenAI 成立的初衷是走“反大公司”(也许暗指 Google)的路线,认为 AI 技术不应该仅仅被大公司拥有,但是其非盈利的属性很快就向资本低了头(微软下了手)。为了克服这样一个大规模的计算问题,其实很早就有一些 infrastructure 方面的工作展开,纯粹的硬件堆叠也需要相应的配套软件才能发挥最大的效能。

lingvo

较早出现在 TF 上面的 lingvo 框架是专门为 seq2seq 建模提供的,这里可以看见通过它刷 paper 的效率还是很高的。本身可以看成是一种设计好的编程习惯,通过一些共同的抽象,如 model/task/layer/input generator/params/experiment configurations/job runners 获得较为一致的封装。其实之前通过 estimator 自己写的库的结构感觉也差不太多,只是没有这么多人员 share 过也不如它如此 polished,不如它这么成熟了。

lingvo 框架

PaLM

Google 在 2022 年又提出了个新名词 PaLM(pathways LM),这是一个 dense decoder only 的 transformer 模型,训练使用了 pathways 系统,这是一个更为底层的编程框架,为什么我们会需要这样一个系统呢?

系统

我们知道

  • 现代的 CPU 和加速器(如 TPU/GPU)之间使用了带宽较高的 PCIe 连接,这一般是通过带宽 x lane 数目决定的,PCIe 4.0 每条 lane 可以有 2GB/s 的速度,最多 32 条 lane 支持 64GB/s 的传输速率,而 PCIe 5.0 每条的速度能达到 4GB/s。
  • 同时加速器之间可以通过一些特殊的连接(NVLink)完成同主机上的连接,如 NVIDIA 这个系统第二代速度就有 300GB/s,第三代 600GB/s(A100),第四代到了 990GB/s(H100)

TPU 是个很奇葩的存在,因为 Google 仅仅在自己的数据中心里面用,不单卖(单买的是 edge computing 用的只支持 tf-lite 的 coral 设备)。可以参看这篇了解一些细节

  • 一台 TPU node 是一个高性能的 CPU 主机搭配一块 TPU 板子,这块板子好像是 PCIe 3.0 16 通道的连接(16GB/s)
  • TPUv4 整块板子有 32GiB 的存储(相当于“显存”),带宽达到了 1200GBps
  • 一块板子上有四颗 TPU 芯片,每个芯片有两个 TensorCore,每个 TensorCore 有 4 个 MXU、一个矢量单元,一个向量单元
  • 而 TPU 芯片之间使用 ICI(Inter-Core Interconnect),在 TPUv2 时这个带宽就到了 496Gb/s,每片拥有 4 个连接(形成 2D torus 结构),而 v4 每片拥有 6 个连接(3D torus 结构)
  • 1024 台 TPU node 可以组成 TPU pod(4096 个 TPU chip,算力超过 1.1 exaflops),这个 3D torus 可以获得类似 16x16x16 的结构

之前的计算框架比较难以解决一些复杂的情况,参看访问 TPU 方式

  • 通过 TPU VM 直接连接到 TPU node/host,用户代码在 TPU node 上执行
  • 通过 User VM,而 User VM 与 TPU node 之间通过 gRPC 通信,用户无法直接访问 TPU node

这导致之前的一些计算框架出现了一些限制:

  • JAX/PyTorch 使用的是类似第一种方式,好处是进行 collective op 的时候可以利用 ICI 的高速连接;但是这种结构非常难以支持 MPMD(为了避免死锁)。这意味着要么一个人独享这个硬件(难以虚拟化)
  • TF v1 使用的类似后者,控制器单独在一个地方执行,而 heavy lifting 的事情是 TPU node 承接的。但是这个设计过于简单(认为不需要太多的 TPU node),因此一旦任务变得复杂庞大,其中通过网络(DCN,datacenter network)进行的操作就会变得非常的昂贵

但是并不是后者一无是处,因为这个单独的 controller 的存在,使得我们实现 SPMD 内部的执行顺序非常容易,但是(由于没有 scheduler)仍然不能解决 MPMD 问题里面的执行顺序。

Pathways 的出现就是为了解决这些计算框架下产生的不能很好的规模化、支持 MPMD 的问题,它会考虑到 ICI/DCN 的连接,甚至能让程序执行在多个 TPU pod 之上(一般 TPU pod 内部都仅仅使用 ICI)。这是一个极为复杂的工程性的问题,但是 Google 之前就积累了不少相关的技术,如 XLA、TF graph 与 executor。下面稍微看一下系统构架

  • 在 Pathways 中一个核心的组件是 resource manager,它管理的是被抽象成为设备岛的东西(简单的理解成为 TPU pod),岛之间使用 DCN 连接。
  • 用户需要通过一个客户端启动自己的程序,它需要向 resource manager 注册,并生成一个设备位置无关的中间表示形式(MLIR),该表示被逐步的优化、下放到更低层的时候会考虑到很多细节,比如网络连接等,然后交由 TPU nodes 去执行
  • 这些计算通过 Plaque 进行协调

一些神奇的事情:

  • NVIDIA / Microsoft 他们也有一个自己的系统,参看这篇
  • TPUv4 还有一个“孪生”的 TPUv4i,纯用来做 inference,由于推断过程中不需要做 gradient 这类 collective op 的操作,因此可以减少在 ICI 上面的开销,也可以降低功耗,这可能在 v2/v3 上重视(被同时用作训练和推断)不够

模型

PaLM 拥有 540B 参数,主要使用的 dense decoder-only transformer,如此庞大的计算规模甚至需要多个 TPU pod。同时研究还发现模型达到一定的程度之后,性能会突飞猛进(超过 power law)。其中引入了一个让 LM 获得 chain of thought 的策略,即使用 chain of thought prompting 训练。

PaLM 也用了很多之前的工作,它提到了下面这些

  • SwiGLU 激活函数
  • parallel layers:不再先执行 attention,然后 MLP,而是将输入 layer normalized 之后分别通过 attention 与 MLP 再与自己加起来。这可能是对 TPU 做的性能优化
  • multi-query attention:对 decoding 有较大的性能帮助
  • RoPE embedding:没有用 absolution / relative position embedding,还挺神奇是深圳的一家 NLP 相关的公司提出来的

PaLM-E

这几天 Google 忙不迭的发布了 PaLM-E,在 PaLM 的基础上进一步融合了图像输入、机器人控制,

  • 输入除了文本,这里加入了 ViT 生成的图像 token,应该还有一些其他传感器的数据可以使用类似的方式作为输入
  • 输出是 LLM 产生的 token,这些信息里面有一部分被传递给更底层的模型用来执行机器人的行为
  • 同时在某些情况下,PaLM-E 需要处理 control loop:它生成的指令通过机器人完成的过程中,传感器、视觉的反馈又被用来决定是否出现了问题是否需要调整策略,直到任务被完成

看起来 Google 之前发布 Bard 想要赶在 ChatGPT + bing 之前,这次 PaLM-E 是为了 GPT-4 吗?

重拾 NLP 技术(7)

重拾 NLP 技术(6)

我们这里也开始讨论一些与 NLP 相关的生成式模型在其他的领域里面的应用。算是挖(几)个新坑,首先搞清楚一些大致的策略,后面再慢慢梳理一些实现上的细节。

图像

text-to-image 的大火大约是这个领域的扰局者 stable diffusion 带来的神奇效果,凭借着较小的模型就能在单机上生成高分辨率的图片的优势,不少 startup 或者研究者可以不受 LLM 壁垒的影响下完成一些神奇的应用。我们这里大概先介绍几个解决该问题的方向。

GAN

GAN(generative adversarial network) 算是较早的生成式模型,早在 2014 年(DNN 开始发展起来那几年)就已经被提出来了,当时引起了轰动和极大的关注的原因大概是它提供的一种新思路:

  • 一个生成式的网络(generator)用来产生某个 domain 中的样本(使用的 seed 是符合某种分布,如 Gaussian 的随机 sample),它的目标是尽可能模仿真实世界里面这个 domain 的样本(服从这个 domain 中某种分布)
  • 一个判别式的网络(discriminator)用来鉴别这个 domain 中的样本是不是 fake 的

这就像是现实生活中造假者和鉴定家之间的关系,魔高一尺道高一丈:更好的鉴定家逼迫着造假者更好的造假,更好的造假者又进一步逼迫鉴定家学会更多的识别水平,如此博弈过程中两者的水平都会有大幅度的提升。这个高层次的想法的一个 variant 可以用在 text-to-image 上,这里的 text 可以作为某种条件引入到 generator 里,而识别的对象就是对应的图片是否真实、符合文本描述的语义。

通常训练 GAN 需要首先获得一个较为合理的 discriminator(可以拿该领域的样本与其他的混合在一起),继而训练一个 generator,这时通过它生成的结果与 discriminator 判断的正确与否的信息可以用来帮助 generator 调整生成的过程。下一个轮回中可以将 generator 的输出(标注为 0)与真实的样本(标注为 1 )喂给 discriminator。如此迭代即可。在图像领域比较常见的选择是 deconvolutional network 来做生成,convolution network 用来判别。

GAN 一般认为是比较难以训练的:

  • generator / discriminator 需要同步发展,如果其中一个明显优于另一个就会导致一些奇怪的事情,比如 generator 只能生成部分类型的样本(mode collapse)
  • 不稳定的收敛特性:尽管数学上博弈均衡点存在且唯一,但实际上 generator / discriminator 受限于参数化后函数空间(仅仅是对原样本空间的近似),因此仅仅通过梯度搜索有可能是无法达到这个均衡点的

Dall-E

OpenAI 在这个领域的出现并不奇怪,图片从某种意义上如果能表达成为序列的形式,与相应的文本放在一起就可以作为一种生成式过程(与 Q/A prompt response 的逻辑是一样的)。早在 2021 年 Dall-E 相关的一些研究中就出现了这样的策略

  • 首先在图像数据上获得压缩编码的 dVAE(discrete variational autoencoder),可以把它当作是生成自然图像的基本单元,256×256 的 RGB 可以被压缩到 32×32 个 image token
  • 然后将 text image 对转换成为编码:text 使用 BPE,而图片使用 dVAE,这样就获得了训练数据(比如 t1 t2 … tm [IMG] i1 i2 … in)。而生成过程(仅仅给定文本部分,比如从 t1 t2 … tm [IMG] 开始生成后面的部分)获得的图片的 image token 序列使用 dVAE 解码就得到了原始图片

这看起来是非常自然的 GPT 的扩展,可以比较容易的应用到其他的领域(只要首先获得该领域的 VAE)。但是这个方案的缺陷主要是没有能直接利用图像本身的一些特性,转换到序列后长距离的关联性是靠 attention 获得的。在 Dall-E 2 中,也开始在图像解码上应用 diffusion model 而抛弃了比较糙的 VAE。

stable diffusion

早期的 diffusion model 都有个计算代价的问题,2022 年大火的是使用了 latent diffusion model 的版本,它能在单个 A100 GPU 5 天时间里获得一个顶得上 V100 需要 150-1000 天上的模型。这里比较重要的是使用了 VAE 将图像先转换到一个更小的空间,然后再这里使用 diffusion model 常用的 U-net(一种 CNN) 与 text encoder 作为训练时的条件,这里将两者产生关系的技术是 cross attention。后面仔细地学习一下这里面的细节,这篇介绍非常的图文并茂,可以作为论文的补充。

Imagen

这领域 Google 一定是不会缺席的,在 2022 年,Google 也发了一篇基于 diffusion model 的 Imagen。这篇文章 text 的部分是基于 T5 做的(encoder-decoder 构架),它将文字变成 embedding,然后在一个 64×64 的图像空间使用 diffusion model,继而再使用两个超分辨率(super resolution,SR) diffusion model(DM),最后获得 1024×1024 大小的图片。这里图片与文字之间的关联是使用这篇文章中引入的技术获得的。

音频

这个领域一般有 TTS 与 audio generation。前者这个领域据说微软是领先不少,开源的实现中 coqui.ai 提供的算是一个比较容易上手的 package。其实很多做语音助手的公司都需要自己的 TTS,Google Assistant / Alexa 都存在类似的系统。后者的出现大约是注意到 language model 与声音的相似性(都是一个序列,只是编码需要不同的技术),趁着 LLM 大行其道,这方面的研究也有所斩获。

音频的处理很多时候会使用 spectrogram 或者 mel spectrogram,前者可以看成是一个指定 window 大小中音频数据通过 FFT 变换到频谱后获得的频率与声强的关系随时间变化的结果,而后者只是将人感知声音大小与音调呈现的关系应用在前者上,这样获得的表达更符合人的感知。参看这篇介绍

TTS

coqui.ai 收集了不少相关的 paper。这个领域里面有两个模型比较重要

  • vocoder(voice encoder):相当于是声音的编码模型,这里面似乎不少是基于 GAN 获得的,比如 MelGAN这里有一系列的基于 DNN 的 vocoder
  • TTS 模型,有了编码器之后并不是简单的将每个字符转换到对应的声音就好了(文字上没有“时间”而发声与时间相关),我们还需要一个模型来对齐

这里有个韩国团队的模型 Glow-TTS 可以参看,其实也有基于 transformer 的结构。感觉下图中左边应该是 Mel-Spectrogram 通过 encoder(而不是 decoder)进入到 alignment search

Glow-TTS 训练与推断的过程

AudioLM 与 MusicLM

这方面的研究 Google 在 2022 年就有了一定的进展。AudioLM 首先展示了如何使用 LM 来处理 audio generation。这里他们由于不是仅仅对人声建模,因此不是使用的 vocoder,文中使用了 semantic token(粗)+ acoustic token(细)两种

AudioLM 模型
  • SoundStream 提供了 acoustic token:使用了 CNN 做 autoencoder,然后加上 residual vector quantizer 获得了很好的 reconstruction 效果
  • 而通过 w2v-BERT 中间产生的 embedding 并通过 k-means 聚类(也是一种 VQ 的策略)获得了 semantic tokens

通过比较发现这两者具有很强的互补性,前者具有很好的重构效果(声音质量好),后者用来做判别好(语义信息保留完整),最后选择了一种分层的模型,首先获得 semantic token,然后在给定 semantic token 的情况下(条件分布)获得 acoustic token。这种建模方式借用了不少 NLP 中常见的模型。同时整体也是一个 decoder only 的生成式模型。

随后针对音乐这个领域后续 MusicLM 展现出来了加入文本之后(text to audio)的惊艳效果,它使用了 AudioLM 作为 audio decoder,而 text-conditioned audio 借鉴了原本在 image 领域里构建 Dall-E 2 的 CLIP,其核心思想是需要获得 image-text 的联合分布,这里 MusicLM 使用了 MuLan 提供的声音、文本联合分布。

视频

2022 年 Meta 发布一篇 Make-A-Video 的论文,展示了一种利用 txt2img 技术获得 txt2vid 的策略,这样的好处是可以回避使用 text / video pair 的问题(也许 Google 直接用 YT 了)

Make-A-Video 的思路

有点像是关键帧的做法,因而比较适合较短的视频片段:

  • txt2img 模型,如 CLIP
  • spatiotemporal convolution / attention layer 用来扩展到时间维度(文章的重点之一)
  • spatiotemporal network 增强 fps 与 resolution

感觉视频这块应该有不少有意思的应用,这个提到的还是比较早期的一些想法,如果与 YT / TikTok 之类的应用结合起来,感觉这是一个非常有前景的方向,而且无论是声音、图像、视频,只有几个完全打通了才能实现某个场景、氛围,给人一个完整的体验。

重拾 NLP 技术(6)

重拾 NLP 技术(5)

我们这里侧重了解 ChatGPT 使用的技术细节,并且也看看与其方向类似的其他模型。

RLHF

DeepMind 作为 reinforcement learning 在很多神奇应用问题(下围棋、预测蛋白质折叠)中的先行者,很早也意识到了很多 AI/ML 问题的核心是找到一个合理的目标函数(进而才是为其设计模型),然而这个(目标函数是什么)问题本身是非常困难的。因此既然无法“悟”到它,那我们是否可以“猜”到它?早在 2017 年的这篇论文里(注意,作者里面有几个是 DeepMind,有几个是 OpenAI 的),他们就试图在这个不算太新的想法上提出一个适合现代 deep reinforcement learning 的解决方案:从人类的反馈中学习出来一个 reward function 作为最终问题优化的目标函数。如果用 RL 的语言表述这个问题,基本上是说有两个 action 序列 \sigma = ((o_0, a_0), \ldots, (o_{k-1}, a_{k-1})) 其中 o_t 是 agent 在时间 t 观察到的情况,a_t 是做出的 action,我们将这个序列展示给人,要求选择更好的那一个 \sigma^1 \succ \sigma^2,我们相信这个偏好符合一个未知的 reward function 产生的大小关系 \displaystyle\sum_{t = 0}^{k-1} r(o_t^1, a_t^1) > \sum_{t = 0}^{k-1} r(o_t^2, a_t^1)

在这种假设下,RL 学习中就没有真实的 reward function,而转变为我们对它的估计 \hat{r}: \mathcal{O}\times \mathcal{A}\to \mathbb{R},原先做决策的 policy function 转而根据 \hat{r} 做出决策。这里 \hat{r} 是被一个监督学习所拟合出来的。另外用来收集 preference 的数据是从 policy function 做出的一组决策序列选出来给人类的。

如果我们把 \hat{r} 通过 deep learning 参数化出来(以 o, a 为输入的神经网络),就可以将 r(\sigma^j), j = 1, 2 的比较通过一个 softmax 关系表达出来 p(\sigma^1 \succ \sigma^2) = \displaystyle\frac{\exp \hat{r}(\sigma^1)}{\exp \hat{r}(\sigma^1) + \exp \hat{r}(\sigma^2)},  \hat{r}(\sigma^j) = \sum_{t=0}^{k-1} \hat{r}(o_t^j, a_t^j)

这个想法在那个时候主要还是解决打游戏这种问题(参看博文)。OpenAI 估计在这个合作以后还自己发了一篇 PPO 算法。然而也许是看到同行们一些“instruct tuning”的原因(感觉更多的是这个概念),OpenAI 算是第一个将 RLHF 真正应用到了 finetune 这步的公司了吧,在 2022 年初发表的 InstructGPT 中,他们展示了这样的一个策略

InstructGPT 使用的 finetune 策略

这里涉及的三步,多数的 supervised finetune 只使用了第一步。而这里通过 RLHF 中对应的第二、第三步也是我们关心的核心部分,其中第三步中通过第二步学习到的 reward function 来改变 policy 的 PPO 算法,是比较神奇的一步。

PPO

OpenAI 这篇 17 年的文章提到一种解决 RLHF 的策略 PPO 和之前的 TRPO。这类算法在 RL 的世界里同属 policy gradient 策略,关于这些东西的细节可能得另开一篇了。我们这里简单的看看,其优化的目标函数为

L_t^{\text{CLIP} + \text{VF} + \text{S}} = \hat{\mathbb{E}}[L_t^{\text{CLIP}}(\theta) - c_1L_t^{\text{VF}} + c_2S[\pi_\theta](s_t)]

这里其中的第一项是文章提出来比较有意思的一项(其余的是之前的文献中使用的一些惩罚项),这一项可以看成是对 TRPO 的一种改进(trust region 的意思是做一个局部的二次逼近,优化的时候会考虑到搜索的空间要在逼近较好的区域里,也就是 trust region)。TRPO 优化的目标是

L^{\text{CPI}} = \hat{\mathbb{E}}\displaystyle\left[ \frac{\pi_\theta(a_t, o_t)}{\pi_{\theta_\text{old}}(a_t, o_t)} \hat{A}_t\right]

这里新的策略 \pi_\theta 最大化的是 t 时刻的 advantage 估计(直观上来说是相对于 baseline value function 的优势函数),如果该优势为正,新的策略应该提高对应的概率,而如果为负,则应该减少对应的概率。我们可以将这个比例定义为 q_t(\theta) = \frac{\pi_\theta(a_t, o_t)}{\pi_{\theta_\text{old}}(a_t, o_t)},PPO 选择的一种新的 objective 为

L^{\text{CLIP}} = \hat{\mathbb{E}}\displaystyle\left[ \min(q_t(\theta)\hat{A}_t, \mathrm{clip}(q_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t)\right]

这里仅仅把 _t(\theta) \hat{A}_t 增加了一个条件(min 的意思),也就是说新获得的概率增减要在 1\pm\epsilon 以内(对应于 advantage 为正或者负),这个修正主要是避免一个较大的跳跃产生的问题(跑到了 trust region 以外)。这个 advantage 的估计可以在已知策略 \pi 的时候通过 value function 的线性组合计算出来。

PPO 的计算过程就可以看成是:给定一个策略与 value function,计算出来每步的 advantage;然后根据这个 advanatge 优化 surrogate function(对 L_t^{\text{CLIP}+\text{VF} + \text{S}}\theta 求导),然后使用 SGD/Adam 之类的算法优化,然后如此反复几次。

早期的尝试

2020 年作为 text summarization 方面的尝试,与前面几乎一样的策略(事实上 InstructGPT 沿用了这个算法)就已经被提了出来。一种偷懒的想法是我们可以把 reward 作为整体评估的结果,通过它来影响模型本身(原先优化的目标是最大化下个 token 的条件似然):把 reward 作为一个 penalty 加入到 finetune 的目标函数,我们可以将初始的模型记为 \pi^{\text{SFT}}(y \mid x),那么待求模型 \pi^{\text{RL}}(y \mid x, \theta) 不应该太大的偏离它,因此这个 loss 里面应该有两者的 KL 距离作为一个限制,另一部分是 r(x, y) 在这个分布上的期望。其实从这个角度来看似乎与 PPO / RL 什么关系都没有。

但如果我们看待这个生成式的过程,

  • 生成下一 token 的算法(最大化预测下一个 token 的概率)和在 RL 中的 policy function 的作用是一样的
  • reward function 我们通过以上的 preference 数据可以拟合出来一个
  • 我们实际使用的 full reward 是学习获得的 reward + regularizer,这个后面的项是为了减少调整后模型对 SFT 的偏离
  • 我们使用的 value function 是 reward model,但是它的参数与 policy 的参数分开(只是初始状态下相等)

在 huggingface 的这篇 blog 里面找到了一个比较清楚的关系图

PPO finetune 过程

根据这个图,我们看到 RLHF 不仅仅更新了 policy 本身,还可以(可选性)继续更新 reward model。

InstructGPT

初始的训练包含了大约 13k prompts(从之前 playground 中收集的 + labeler 根据一些特定的 task /或者不受限制任意的 task 设计出来的,某些是可以有 labeler 的一个或者多个 response 的)。训练 reward function 有大约 33k(跟前面类似),而最后算法调节有 31k(仅仅是用户在 playground 中收集的)。

训练 reward function 需要把同一 prompt 的比较偏好放在同一个 batch 中(而不是随机打散)学习才能避免 overfit。

通过该算法我们能够获得哪些重要的改进

  • labeler 会更喜欢 finetune 之后的模型输出
  • instructGPT 改善了 GPT-3 的 truthfulness(减少 hallucination 的成分)
  • instructGPT 稍微改善了 toxicity,但没有改善 bias
  • 在 finetune 过程中会产生在公开 NLP 数据集任务上的性能退化(目标函数变成了 reward function),因此实际优化目标函数是 reward function 与预训练使用的目标函数的加权和(或者说把两部分目标函数产生的更新加起来)可以降低这个退化问题产生的影响
  • 模型能够泛化,并且对不在训练集中 labeler 的偏好也能更好的满足
  • InstructGPT 的用来获得初始模型(SFT)的数据集与类似 FLAN 之类使用的公开 NLP 数据集不大一样(不能反映 GPT 系列应用的场景或者目的),因此通过这些公开数据集进行 finetune 获得的效果不如他们自己收集的好(注意第一步里面那个 prompt dataset)
  • RLHF 使得模型能够更好的泛化,支持一些训练集中不常见到 prompt

其实论文的最后作者也承认即便通过这些策略获得的模型也不可能完全的安全。事实上,不论是 chatGPT 还是后来在 bing 上线的版本很快就被人发现了各种奇葩的问题。

LaMDA

早期工作

2019 年 Google 的一个相关的研究比较了之前的一些 transformer 模型(GPT 是基于 decoder,BERT 是基于 encoder),提出的模型 T5(同时使用了 encoder 与 decoder),它对 encoder-decoder 的结构稍微做了一些改动(使用了 relative position embedding),提到

  • 应用一个 encoder-decoder 网络仍然可以用来解决 generative problem(不是仅限于 decoder 的 GPT)
  • 可以共享 encoder / decoder 的参数这样可以将模型大小减半,但不会牺牲很多性能(与相同层数的、单一使用 encoder / decoder 的模型比较的时候会更合理),
  • 同时应用 denoising 目标函数(接近于 BERT 使用的 MLM 策略,只是 MLM 仅在缺失的 token 上计算,denoising 是整个句子)获得的性能最好,但是使用 prefix language modeling (与预测 next token 类似,但是预测的是下一半句子)

2020 年 Google 开始实验了一个基于 next token 预测的 LM,meena 使用了 BPE 获得的 8k 词汇量的 vocab,预训练则选择了 evolved transformer(通过 neural architecture search 获得更好的 transformer,包括 encoder / decoder),meena 一文似乎关注于预测 next token 的 perplexity 与其中一个指标 SSA(Specificity Average)的强相关性。

2021 年 Google 在 I/O event 里对外提出了 LaMDA(language model for dialogue application,相关 blog),2022 年获得了更新,并在 2023 年准备包装称为 Bard 推向市场应对 ChatGPT 的挑战。LaMDA 的主要贡献在于它提到了模型规模可以改进性能但对安全、事实性这些方面却很少有所改观,为了解决这两个问题,他们引入了外部的知识源(信息检索系统、计算器、翻译器)。如果我们了解 Google 自家的各种服务就知道,这些知识源很可能就是 Google 的搜索引擎,计算器和 Google 翻译这几个服务。

预训练

LaMDA 使用的 BPE tokenizer(SentencePiece 库提供),vocab size 达到了 32K。网络结构上并没有跟随 meena 或者 T5 的 transformer 构架,而是转换到了 decoder only 与 relative attention(沿袭了 T5 的部分思想),而目标函数选择了 meena 的预测 next token 的 perplexity。感觉 LaMDA 是个超级杂交的产物。

finetune

出了一些比较常规的 finetune,这里面比较有意思的大约是如何与知识源交互解决一些与时间相关的泛化问题(temporal generalization problem)。这里把外部知识源定义为对应的一个 toolset,交互的方式是发过去一个句子(string),接受几个返回的句子(string),如果一个 toolset 不能处理输入,则返回空。

在与人(labeller)交互的过程中,可能被模型 improvised(瞎说)部分会被标记应使用何种 toolset 来解决,然后 labeller 基于 toolset 的答案重写答案。这样我们获得了训练数据。在 finetune 过程中,

  • 根据标注需要生成一个 [TS] token 跟着对应发送给 toolset 的文本(模拟 labeller 的操作)
  • 然后根据上下文、基础的答复结果、发给 toolset 的 query、toolset 返回的结果,生成最终的结果(模拟 labeller 重写的答案)

一个比较形象的过程大约是问一个人的年龄,可能会生成一个 toolset query 询问这个人的 birthday(可能是 search engine 作答),然后询问时钟(也是个 toolset)当前的时间,最后询问计算器(时间差),最后生成的答案是综合了几个 toolset 结果的。

后续工作

2021 年发布了 LaMDA 之后 Google 告诉大家“修理” LLM 的一个策略:FLAN(Finetuned LAnguage Net)里面提到了 instruction tuning 让 LLM 处理没见过的问题时性能大大地提高了,但是它使用的相当于是多个领域的 label 直接上 supervised learning 来调整。其做法是通过模版将数据集变成类似自然语言描述的文字,然后通过一个特殊的 token [OPTIONS] 表示答案(如 yes/no),这样的 finetune 也被称为 instruction tuning。当然文章主要觉得可以做更好的 zero-shot 问题吧。在 FLAN 中提到被 finetune 的模型就是 LaMDA。

结尾

通过比较这一系列论文,我们可以看到以下几点:

  • 现代的 NLP 研究需要大量的工程团队的支持
    • 早期的论文往往只有少量 researcher 的署名,而后来不少工作上可以看到几十个作者了,其中不少是工程团队的参与者
    • 数据的准备工作变得非常的复杂:除了一些公开的数据集,大家也通过自己的工程团队创建了与 labeller 交互的环境,并定制其中很多细节(交互任务的 guideline、使用 toolset 以及提交 feedback),然后这些数据需要经过处理才能进入到 training 的过程中
    • 算力的大量消耗导致硬件上的迭代(GPU、TPU 为了支持更大规模的计算),软件上的的迭代(硬件上层的软件需要更好利用硬件的新特性,并行化计算任务需要更好的分解更高层计算的逻辑并融合成为更适合硬件的单元,高层次软件接口的重新实现以支持更多的应用需求)
    • 与现有系统的整合(如 LaMDA 使用的 toolset)也需要相应的支持
  • 尽管学术上某些模型的优势反复被验证,但是工程上最终不一定沿袭一致的路径
    • 似乎使用 encoder 结构的模型在不少文献(BERT、T5)中都能看到对 decoder only 模型的一定优势,但是现阶段似乎无论是 OpenAI 还是 Google 都已经向 decoder only 的结构靠拢
    • 这也许是因为学术界与工业界关心的目标不完全一致导致的:学术界更在意某些 metrics 上的比较,而工业界更多的考量的是实现的便利性,可扩展性(与其他系统的整合)
    • PaLM 一文开头一针见血的指出使用 encoder only / encoder-decoder 网络产生的问题是面对特定的任务时,finetune 需要大量的该任务下的训练样本,同时模型本身或者至少一部分参数需要被更新来适应这个任务,这样一来使得 finetune 和模型的 deployment 产生了困难
    • 相反 decoder-only 的网络是很好的 few-shot learner(少量展示如何求解问题的例子就可以让模型能够处理类似的任务)
重拾 NLP 技术(5)