原文地址:Transformers, Fast and Slow: New Developments in Language Processing, on 2022-11-11
Transformer的快慢之道:语言处理领域的新进展
文章与趋势
本期我们将聚焦基于Transformer架构的大语言模型——它是现代深度学习与人工智能领域的另一大支柱,与扩散模型齐名。
想必不少读者都还有印象,自然语言处理(NLP)领域曾长期由循环神经网络(RNN)主导。而基于自注意力机制的神经网络(例如论文https://arxiv.org/abs/1706.03762 提出的初代Transformer架构)问世后,彻底革新了整个领域。

语言模型响应提示的示例。
(冷知识:早在自注意力机制出现之前,论文https://arxiv.org/abs/1409.0473 就已经研究了注意力机制。正如我在拙著https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/ 中详细介绍的,RNN会在编码器与解码器的编码结果之间使用注意力机制。而在Transformer中,之所以叫“自注意力”,是因为注意力计算作用于同一序列内的所有元素。)
好了,这些都已是过往,注意力机制的发展沿革大可以改日再聊。我们进入正题,来看看有哪些新动向?
与现代机器学习模型交互
提示工程(Prompt Engineering)
基于Transformer的生成式语言模型,和上期讨论的图像扩散模型有一个共同点:它们都需要一定程度的提示工程。所谓提示工程,就是调整输入序列(即“提示”)以获得期望的输出。
听起来很复杂?其实大可不必,提示工程这事儿从互联网诞生之初大家就一直在用——无非就是反复调整谷歌搜索的关键词,直到搜到想要的结果,本质上是一回事。
想深入了解提示工程?可以看看Rick Neubig整理的这份极佳的提示方法分类体系:

提示方法分类体系。图片来源:https://docs.google.com/presentation/d/1YfSkqvFVtRkFBpQ4SKuBlqkhJrzWEERluivYjleB6a4/edit#slide=id.p)
内容毒性(Toxicity)
Transformer和扩散模型的另一个共同点是都可能产生有害影响——比如被滥用来生成不良内容。在近期的一篇论文(https://arxiv.org/abs/2210.03162 )中,研究者探究了提示压缩的效果。他们发现,对提示进行压缩、同时保留其中的抽象信息,能够降低生成文本的毒性。
Transformer有哪些实际用途?
凭借出色的文本生成能力,Transformer爆火出圈,甚至引发了诸如https://www.washingtonpost.com/technology/2022/06/11/google-ai-lamda-blake-lemoine/ 报道的相关事件。但除了生成文本之外,Transformer在现实世界中还有哪些“真正”实用的应用场景?
语言翻译
除了补全“Twitter的未来是什么?”这类提示、生成通顺的文本之外,语言翻译才是Transformer真正大放异彩的领域。
近期代表性的模型包括Meta的https://ai.facebook.com/blog/nllb-200-high-quality-machine-translation/ ——这是一个支持200种语言互译的Transformer模型。
蛋白质折叠
你或许听说过DeepMind的https://www.nature.com/articles/s41586-021-03819-2 ,它在两年前斩获了https://en.wikipedia.org/wiki/Critical_Assessment_of_protein_Structure_Prediction 赛事的奖项。没错,和初代https://github.com/deepmind/deepmind-research/tree/master/alphafold_casp13 不同,AlphaFold2采用的正是语言Transformer的架构。
近期,Meta发布了https://esmatlas.com/explore?at=1%2C1%2C21.99999344348925 ,包含由ESMFold蛋白质折叠模型生成的6.2亿个宏基因组蛋白质结构。相关介绍见https://ai.facebook.com/blog/protein-folding-esmfold-metagenomics/ 。

宏基因组图谱截图。来源:https://esmatlas.com/explore.
这项成果非常出色,是一个重要的里程碑。尤其是它的规模和速度,令人印象深刻。不过我还是期待看到CASP15竞赛的结果,好判断这个模型在预测新结构时的准确率如何。
另外值得一提的是,AlphaFold2和ESMFold都是从蛋白质序列数据出发,生成准确的结构。但它们并没有解决真正的“蛋白质折叠”过程本身。打个比方:这些模型就像是拿到一份食材清单,就能预测出对应的菜品(比如意大利肉酱面)。但这些基于Transformer的模型并没有学习做菜的配方和流程——它们直接从食材跳到了成品。放在不同语境下,你可以把这看作优势,也可以看作局限。
问答系统
Transformer另一个具备实际落地潜力的领域是问答系统。比如亚马逊近期发布了多语言数据集https://github.com/amazon-science/mintaka 。Mintaka可以作为下一代问答系统的训练数据。我希望未来的系统能比现在的技术更实用、更智能——毕竟谁喜欢和现在这种水平的聊天机器人交互呢?
迈向通用人工智能(AGI)了吗?
在我看来,通用人工智能(AGI)还远未到来,也绝非触手可及。但与此同时,正如上文所见,近期的语言模型在文本生成、翻译、蛋白质结构预测等方面的能力确实令人惊叹。不过,对部分读者来说可能值得关注的是,研究者正在探索让Transformer实现自我提升的机制:通过一种基于强化学习的预训练方法,叫做“算法蒸馏”(Algorithm Distillation),相关论文见https://arxiv.org/abs/2210.11610 。
自注意力效率与碳足迹
研究者普遍认为,初代自注意力机制(又称缩放点积注意力)效率很低——因为它的内存需求随输入序列长度呈二次方增长。多年来,研究者提出了很多更高效、呈线性增长的替代方案。但这些稀疏注意力机制始终非常冷门,相关讨论见https://twitter.com/rasbt/status/1542872768378724352?s=20&t=PC0uHqQN3z0WcxRoBR_1Wg 。
近期发布的https://www.stateof.ai/ 报告也提到了自注意力优化方案遇冷的现象,观察到了类似的趋势:

各类高效自注意力机制。来源:https://www.stateof.ai.
这就引出了另一个问题:大语言模型的环境成本到底是多少?在近期的论文https://arxiv.org/abs/2211.02001 中,研究者发现训练BLOOM模型需要1,082,990个GPU小时(使用最先进的英伟达A100显卡),总计排放约50.5吨二氧化碳!作为对比,可以参考这篇文章:https://www.sciencefocus.com/future-technology/how-many-cars-equal-the-co2-emissions-of-one-plane/ 。
更多学习资源
想深入学习语言Transformer?以下是整理好的实用资源列表:
https://sebastianraschka.com/blog/2021/dl-course.html#l18-introduction-to-generative-adversarial-networks
https://github.com/rasbt/machine-learning-book/blob/main/ch16/ch16-part1-self-attention.ipynb ——出自我的图书,分步讲解自注意力机制
Lucas Beyer的讲解视频:https://www.youtube.com/watch?v=UpfcyzoZ644
Andrej Karpathy实现的OpenAI GPT(生成式预训练Transformer)迷你版本:https://github.com/karpathy/minGPT
研究深度解读
在这个部分,我会精选一篇研究论文进行解读。既然本期通讯的主题是Transformer,我选的当然是一篇大语言模型相关的论文:https://arxiv.org/abs/2210.06280 。
GReaT(Generation of Realistic Tabular data,真实表格数据生成)方法使用基于自注意力的自回归生成式大语言模型,来生成合成表格数据集。具体来说,作者使用了预训练的Transformer解码器网络(包括https://openai.com/blog/better-language-models/ 中的模型,以及更小的Distil-GPT-2——后者是类似论文https://arxiv.org/abs/1910.01108 中思路的“蒸馏”缩小版本)。
基于预训练的解码器式Transformer,GReaT流程包含两个步骤:(1)微调;(2)采样。
在第一步的微调阶段,GReaT执行以下操作:(1)将特征向量转换为文本;(2)打乱特征顺序,以编码顺序无关性;(3)用转换后的文本对Transformer进行微调。

微调阶段示意图(标注版),基于论文https://arxiv.org/abs/2210.06280
第二步(采样)的流程如下:(1)将(不完整的)输入送入微调后的Transformer;(2)从Transformer得到文本格式的完整特征向量;(3)将特征文本转换为表格格式。

采样阶段示意图(标注版),基于论文https://arxiv.org/abs/2210.06280
在“机器学习效率”实验中,研究者发现,用GReaT生成的合成数据训练分类器,效果比用其他方法生成的合成数据更好,也更接近原始数据的表现。

机器学习效率实验结果表(标注版),基于论文https://arxiv.org/abs/2210.06280
为评估合成数据与原始数据的相似度,“到最近记录的距离”图表显示,GReaT并没有照搬训练数据。此外,作者还做了一项“判别器度量”研究:他们将原始数据和合成数据混合,给每条数据打上标签,0代表原始,1代表合成。在这些数据集上训练的分类器平均准确率为70%——也就是说它们在一定程度上能分辨出合成数据。但GReaT的表现远优于其他合成数据方法(其准确率在75%到88%之间)。

判别器度量实验结果表(标注版),基于论文https://arxiv.org/abs/2210.06280
开源亮点
Scikit-learn 1.2.0:流水线终于可以返回Pandas DataFrame了
我最喜欢的机器学习库出了新版本,带来了很多有趣的新特性。但最大的亮点当属新增的 .set_output() 方法,可以配置流水线返回DataFrame对象:
举个例子
scalar = StandardScaler().set_output(transform=”pandas”) scalar.fit(X_df) # X_trans_df is a pandas DataFrame X_trans_df = scalar.transform(X_df)
或者
log_reg = make_pipeline( SimpleImputer(), StandardScaler(), LogisticRegression()) log_reg.set_output(transform=”pandas”)
以后我们再需要传递列名的时候,就不用写很多变通代码了。
更多新特性可以查看官方说明:https://scikit-learn.org/dev/whats_new/v1.2.html
虽然还没有正式发布,但你已经可以通过安装每日构建版来体验sklearn 1.2dev0版本:
pip install –pre –extra-index https://pypi.anaconda.org/scipy-wheels-nightly/simple scikit-learn
Embetter:适配Scikit-Learn的嵌入工具
我最近偶然发现了https://github.com/koaning/embetter ——一个小巧的、兼容scikit-learn的库,主打计算机视觉和文本的嵌入表示。用embetter,只需要4行代码,就能构建一个分类流水线,基于Transformer的句子嵌入训练逻辑回归模型:
text_emb_pipeline = make_pipeline( ColumnGrabber(“text”), SentenceEncoder(‘all-MiniLM-L6-v2’) LogisticRegression() )
它可能不会刷新性能榜单,但在处理文本和图像数据集时,用来快速搭建一个性能基线非常方便好用。
Lightning 1.8:面向大Transformer的Colossal AI
Lightning(原PyTorch Lightning)发布新版本了!正好契合本期大语言模型的主题,它带来了一个全新的训练器策略:Colossal-AI。
选择带有良好默认配置的策略 trainer = Trainer(strategy=”colossalai”)
顾名思义,Colossal-AI通过实现多种并行算法,让我们能够训练超大规模的Transformer模型:
- 数据并行
- 流水线并行
- 1D、2D、2.5D、3D张量并行
- 序列并行
- 零冗余优化
(这些都是什么?又是怎么工作的?这可是机器学习问答板块的绝佳话题!)
更多Lightning 1.8的新特性可以查看发布说明:https://github.com/Lightning-AI/lightning/releases/tag/1.8.0
PyTorch 1.13中的更优Transformer
下个月的PyTorch大会前夕,PyTorch也发布了1.13版本:https://pytorch.org/blog/PyTorch-1.13-release/ !其中一大亮点是BetterTransformer正式版——此前它在1.12中还是测试版。BetterTransformer面向生产环境的Transformer推理做了优化。更多信息可以看这个教程:https://pytorch.org/tutorials/beginner/bettertransformer_tutorial.html
Muse:生产环境中的扩散模型
我所在的Lightning AI团队推出了https://lightning.ai/muse ,展示了如何将Stable Diffusion这样的大模型部署到生产环境。项目仓库见https://github.com/Lightning-AI/stable-diffusion-deploy 。

这个应用配套了一篇分步讲解的文章(https://lightning.ai/pages/community/tutorial/deploy-diffusion-models/ ),分享了模型扩缩到数千用户规模时的经验和注意事项,涵盖自动扩缩容、动态批处理等方方面面。
机器学习问答
你是想学习新知识、练练手,还是准备面试?这个板块的问题说不定能帮上忙!
使用多GPU并行训练大机器学习模型,有哪些不同的机制?(提示:至少有5种!)这些多GPU训练范式各自的优缺点是什么?
上周问题解答
问题1:NLP中的分布假说是什么?应用在哪些地方?适用程度如何?
分布假说认为,出现在相同语境中的词,词义往往相近(原始出处:Zellig S. Harris 1954年的论文,https://doi.org/10.1080/00437956.1954.11659520 )。换句话说,两个词的词义越相似,它们出现在相似语境中的频率就越高。比如“猫”和“狗”经常出现在相似的语境中,关联性更强(都是哺乳动物,都是宠物),而“猫”和“三明治”的关联性就弱很多。在大规模数据集上,这个假说大体成立,但也很容易举出反例。
分布假说是https://en.wikipedia.org/wiki/Word2vec 背后的核心思想,很多自然语言Transformer模型也基于这个理念——比如https://en.wikipedia.org/wiki/BERT_(language_model) 中的掩码语言模型,以及https://en.wikipedia.org/wiki/GPT-3 采用的下一词预训练任务。
问题2:无状态训练和有状态训练的区别是什么?分别在什么时候用?
无状态(重新)训练和有状态训练,是生产模型的两种不同训练方式。无状态训练就像一个滑动窗口,在数据流的不同片段上反复重新训练模型。而在有状态训练中,我们先用初始批次的数据训练模型,之后有新数据到来时,定期更新模型(而不是重新训练)。

有状态训练 vs 无状态训练
两种范式没有绝对的优劣之分。不过有状态训练的一个优势是不需要永久存储数据。但反过来,如果条件允许,存储数据依然是个好主意——因为模型可能会遇到“糟糕”的更新,这时候(临时)切回无状态重新训练会更稳妥。
问题3:递归和动态规划的区别是什么?
递归和动态规划都是算法编程技术。
递归中,我们以迭代的方式将问题拆分为更小的子问题,通常称为“分治”。
动态规划则通过将子问题的解存储在支持快速(常数时间)查找的数据结构(比如字典)中,避免重复计算相同的子问题。存储子问题解的做法也常被称为“记忆化”(memoization,注意和“记忆”memorization不是一回事)。
实际应用中,我们经常把动态规划用在递归算法上。
名言佳句
人工智能/机器学习这个领域发展得太快了。聊到某些方法的时候,我都开始说“想当年我读研究生的时候”了……搞得我像个60岁的老太太。可我明明才毕业两年啊,哈哈。
—— https://twitter.com/adjiboussodieng/status/1582848642347503616?s=20&t=49xrbvxByg7lsKcC2Shjuw
近期活动
https://neurips.cc/ (顶级机器学习与人工智能会议)即将召开:2022年11月28日至12月1日。
如果你去参会的话,欢迎过来打个招呼!我会联合主持一场主题为“产业、学术与中间地带”(即从学术界到产业界的转型)的工作坊社交活动。到时候会有很多有意思的话题可以聊!

更多详情可以查看:https://sites.google.com/lightning.ai/neurips-scl-academia-industry/
https://pytorch.org/blog/announcing-pytorch-conference-2022/ 将于2022年12月2日在新奥尔良举办,是NeurIPS的卫星会议。如果你打算去的话,我也会在——欢迎过来打个招呼!
学习与效率小贴士
说到效率工作流,我有很多想分享的。但很多人问我的一个话题是:我怎么跟上机器学习与人工智能领域的发展?怎么找到有意思的论文?
2018到2021年,我担任https://arxiv.org/list/cs.LG/new 板块的版主。每周好几次,我都会浏览每天上传的100到300篇机器学习论文的标题。我可以说,问题从来不是找不到有意思的论文,而是怎么避免分心——怎么做好优先级排序和时间管理。
互联网很精彩,有意思的东西太多了。但残酷的真相是,我们根本看不完。机器学习领域尤其如此,发展太快,有意思的细分方向太多了:激活函数、自动机器学习、校准、因果推断、CNN架构……
我应对“错过焦虑”的方法是做列表。每个我感兴趣的大类别,我都建一个列表。有意思的类别可太多了!

每个列表里,我会收集有意思的书籍、研究论文、博客文章、视频、Reddit讨论,有时候甚至还有Twitter的帖子。我会全看完吗?当然不会——全跟上的话就得全职干这个了。我只收录其中一部分有意思的内容。通常我只关注能帮我学到新东西的资源,而不是去搭建宽泛的知识库、复刻一个个人维基百科。
然后我会挑出一些本周想读的资源(每周复盘的习惯可以改天再说)。这么做我发现,我收录的内容里95%都没那么重要——和你当前项目相关的高优先级内容才是重点。所以,忽略一些资源不代表你懒或者错过了什么,而是我们在明确优先级,做最重要的事。(对了,保持这些列表很有用,有时候写东西或者做研究项目的时候特别方便!)
我常用和常看的资源有哪些?
- 谷歌学术提醒https://scholar.google.com/scholar_alerts (比如针对https://sebastianraschka.com/blog/2022/deep-learning-for-tabular-data.html这类主题,还有很多其他)
- https://paperswithcode.com/
- 我大部分机器学习新闻都是通过在https://twitter.com/rasbt 上关注对的人获取的
- 还有一些我很喜欢的行业通讯(比如https://jack-clark.net/ 、https://www.deeplearning.ai/the-batch/ )
- 我偶尔(很少)会逛https://www.reddit.com/r/MachineLearning/
(注:上面的截图里,你可能注意到我用https://www.onenote.com/ 来做这些列表。为什么用OneNote?其实和很多场景一样,工具不重要,重要的是习惯和工作流。我选OneNote只是因为复制粘贴最省事——Markdown保存和插入截图总要多一步。而且它多设备同步——当你在常去的茶馆或者咖啡店,聊到兴头上想查点东西的时候,这个功能就很实用。当然,还有很多其他工具也很好用,或者各有取舍。但还是那句话,工具不重要,选适合自己的就行。)
这份通讯是我的个人兴趣项目,没有直接的报酬。但如果你愿意支持我,可以考虑购买我出版的书:https://sebastianraschka.com/books 。如果你觉得内容有启发、有帮助,也欢迎推荐给你的朋友和同事。

https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/ 、https://nostarch.com/machine-learning-and-ai-beyond-basics ,以及http://mng.bz/M96o
非常感谢你的支持!