©作者 | 吴迪 整理 | PaperWeekly
前言
在现代自然语言处理(NLP)的应用中,使用预训练的表征进行迁移学习是很重要的一个方法。在深度学习开始被应用之后,迁移学习最早出现在使用预训练的特征向量,以及对预训练语言模型(pre-trained language model,PLM)进行微调(fine-tuning)[1]。基于预训练模型,adapter 给出了一个新的思路,即能否在模型中插入一些少量的参数,在下游某个任务微调时只对这些参数进行训练,而保持预训练模型原有的参数不变。如果使用 adapter 可以让我们达到和微调整个模型一样的效果(或者更好),那就可以带来很多好处:
- 参数效率更高:一个任务只需要少量参数,训练更快,占用的内存更少,对数据集较小的任务更难过拟合,也更有利于模型的存储和分发。
- 连续学习的遗忘问题:adapter 冻结了原有模型的参数,保证了原来的知识不被遗忘。
- 多任务学习:使用 adapter 也可以用比较少量的参数学习多个任务,和传统的多任务学习相比,好处是不同任务之间影响较少,坏处是不同任务带来的相互的监督可能会变少。
Adapter 最早由 [2] 提出,应用在了计算机视觉的模型中,后来由 [1] 引入 NLP,近些年相关的工作越来越多。最近对 adapter 在 NLP 上的应用很感兴趣,在此文中整理一些学习 adapter 时相关论文的笔记,其中的很多算法都在开源库 AdapterHub 中有实现:
https://adapterhub.ml/
Bottleneck Adapter
首先总结一下把 adapter 引入 NLP 的论文 [1]。本文的主要贡献就是提出了应用于 transformer 的 adapter 结构,并且展示了在经典的 NLP 任务上使用 adapter 进行参数高效的迁移学习的可行性。
网络结构:如下图所示,[1] 提出在 transformer层中插入 adapter 层。adapter 层的结构很简单,向下投射到一个较小维度,经过一层非线性激活函数,然后向上投射到原有的维度。另外,整个 adapter 层的输入和输出之间还有一个残差连接。这一类的 adapter 也被形象地称作 bottleneck adapter。以 BERT 为例,根据 bottleneck 层的大小不同,新增的参数量大致占原有模型的 0.5%-8%。
▲Bottleneck adapter的结构
初始化:所有的 adapter 参数都从均值为 0 标准差为 0.01 的正态分布中采样。这样可以保证刚开始训练时,adapter 主干的全连接网络的输出很小,主要由残差连接传递信息。
训练:冻结原有模型的全部参数,只训练 adapter 层的参数和 layer normalization 的参数。
实验:主要在分类任务(GLUE)和抽取式问答任务(SQuAD v1.1)上进行,比较微调整个 BERT-Large 和 BERT-Large 加 adapter 只微调 adapter 的性能。
实验发现:
- 只微调 adapter 可以做到比较接近整个模型微调的性能,如果根据每个 task 调 adapter 的大小,可以做到掉点比较少。
- 使用 adapter 的参数效率要高于只微调 BERT 的靠近输出的若干层,性能要高于只训练 layer normalization 的参数。
- 推理阶段,对某层的 adapter 进行剪枝(pruning)是可行的,不会对性能产生太大影响。但是对多层进行剪枝性能会大幅下降。相比靠近输出的层(顶层)来说,靠近输入的层(底层)对剪枝更不敏感。
- 权重初始化的分布标准差小于 0.01 的时候效果比较好,标准差过大会让效果变差。
对Adapter结构或训练/推理流程的改进
论文 [3-5] 对 [1] 进行了改进和拓展,这些文章解决的主要问题如下:
- AdapterFusion [3]:如何把多任务学习和 adapter 更好地结合起来,利用多任务学习的优势,避免其劣势?
- AdapterDrop [4]:adapter 在推理阶段速度会慢多少?如何对 adapter 进行剪枝?
- Compacter [5]:能否将 adapter 层做得更加轻量化,同时不降低性能?
3.1 AdapterFusion
想要结合来自多个任务的知识,传统的两个方法是按一定顺序微调(sequential fine-tuning)或者多任务学习(multi-task learning)。前者的一大问题是需要先验知识来确定顺序,且模型容易遗忘之前任务学到的知识,后者的问题是不同的任务互相影响,也难以平衡数据集大小差距很大的任务。Adapter 的一个优势是不用更新预训练模型的参数,而是插入比较少的新的参数就可以很好地学会一个任务。此时,adapter 的参数某种程度上就表达了解决这个任务需要的知识。受此启发,[3] 提出如果想要把来自多个任务的知识结合起来,就可以考虑把多个任务的adapter的参数结合起来。
[3] 提出的 AdapterFusion 的多任务学习框架分成两个阶段。首先,针对于每个任务,学习一组新的 adapter 参数。然后,针对于某个特定目标任务,学习一个融合模块把第一步的所有 adapter 结合起来。[3] 假设第二阶段的每个任务都被包括在第一阶段里了,不考虑第二阶段引入新的任务的情况。
网络结构:
▲AdapterFusion的结构
图中展示了 AdapterFusion 的结构(右)和在 transformer 层的放置位置(左)。单个 adapter 层(粉色)和 [1] 中没有区别,但是每个 transformer 层中只保留最顶端的一个 adapter 层,去掉了多头注意力层之后的 adapter 层。
AdapterFusion 层(蓝绿色)的结构就是一个注意力模块。Q 是原来 transformer 层中全连接层的输出,K 和 V 都是各个任务对应的 adapter 的输出。和 transformer 中的 cross attention 相似,先对 QKV 进行一层线性projection,然后 QK 点乘并计算 softmax,再用输出把 V(来自不同任务的 adapter 的输出)加权组合起来,具体公式如下。l 代表层数,t 代表序列位置,n 代表任务(一共 N 个)。抽象地说,任务 X 对应模型的每一层的 AdapterFusion就是根据上一层的输出,从众多任务的知识中选择并应用最适合任务 X 的知识。
初始化:QK 随机初始化,V 初始化成 identity matrix 加上一些小的随机噪声。
训练:
- 第一步:训练每个任务的adapter。作者实验了两种方式:(1)每个任务独立初始化一套 adapter 参数,只学习当前任务,不更新预训练模型的参数(ST-A);(2)把所有的 adapter 组装在一起,用多任务学习的损失函数同时训练所有 adapter,也一起微调所有预训练的参数(MT-A)。
- 第二步:把第一步的所有 adapter 组装到一起(只针对 ST-A,MT-A 已经组装好),然后加入 AdapterFusion 层,再在目标任务上训练。数据集用第一步中使用过的相同的版本。作者也实验了在第二步使用 MT-A,作为对照。
实验:作者挑选了 16 个不同种类、不同大小的任务进行多任务学习。类别包括常识、情感分析、自然语言推理、句子相关性;数据集大小包括 40k 以上、10k 以上、5k 以上、5k 以下。预训练模型使用 BERT-base 和 RoBERTa-base。
实验发现:
- 第一阶段训练,使用 ST-A 可以做到和整个模型微调相近或更好的表现,但是使用 MT-A 会一定程度影响性能。作者的解释是只训练 adapter 是一种正则化,可以帮助泛化。
- 第二阶段,加入 AdapterFusion 对训练集比较小的任务提升比较明显。
- 第一阶段使用 ST-A 并且第二阶段使用 AdapterFusion 效果最好,也有利用 adapter 的复用。第一阶段使用 MT-A,在第二阶段也要使用 MT-A 才可以有一定提升。
- AdapterFusion 提升比较明显的任务,每一层的 AdapterFusion 层会更倾向于 attend 到其他任务的 adapter。
3.2 AdapterDrop
论文 [4] 主要的贡献是:1)建立了一系列 adapter 的训练/推理速度相关的测量结果;2)提出了剪枝整个 adapter 层的方法 AdapterDrop,加快了多任务同时推理的速度;3)建立了对 AdapterFusion 进行剪枝的结果。
Adapter 的训练和推理速度。作者们在两种不同的 GPU 上测量了 [1] 和 [3] 两种 adapter 结构和整个模型微调相比的训练和推理速度,结果如下图。Adapter 的训练会比整个模型微调快 60% 左右,推理会比使用原模型慢 4%-6%。
3.2.1 AdapterDrop
为了加快推理速度,在推理时可以对某几层的 adapter 进行剪枝。根据 [1] 的结论,靠近输入的 adapter 被剪掉后对性能影响更小。因此,AdapterDrop 的作者提出,推理时可以剪掉最下方 n 层的 adapter,也就是最靠近输入的前 n 层。为了尽可能地减小掉点,作者设计了两种训练方案:(1)specialized AdapterDrop:训练时固定 n,训练后的模型推理时也固定剪掉前 n 层;(2)robust AdapterDrop:训练时每个 batch 都随机选取 n 的大小,训练后的模型可以适应多个 n。由于原有模型其他参数是不训练的,在训练时梯度就可以只回传到保留 adapter 的最早一层即可(见下图)。
▲标准的adapter训练(中)和AdapterDrop的训练(右)
实验结果:在 GLUE 的多个任务上,两种 AdapterDrop 可以做到推理时 n=5 以下掉点都不太严重,而传统的 adapter 在 n>1 时性能下降就很快了。当去除掉五层的 adapter 时,训练速度可以加快 26%,多任务同时推理的速度可以加快 21%-42%,超过了原模型的推理速度。要注意为了更凸显 AdapterDrop 的优势,作者测量速度的场景是多任务同时推理,也就是说输入文本,模型生成多个任务的输出。
3.2.2 对 AdapterFusion 进行剪枝
作者首先测量了 AdapterFusion (AF,[3])的训练和推理时间,发现和原模型整体微调和推理相比,每层 8 个adapter 的 AF 的训练速度大约慢 47%,推理速度大约慢 62%,主要是因为 adapter 需要逐个推理。作者用 8 个 GLUE 的任务(去除 WNLI)训练了一个 AF 模型,在上面实验了两种加速 AdapterFusion 的思路:
- 去除掉前几个 AF 层,对性能的影响不同的任务有所不同。例如对 RTE 的影响不大,但是 CoLA 十分敏感。这说明直接去除 AF 层并不是一个通用的好方法。
- 剪掉每层中对输出贡献较小的 adapter。作者用训练集测量了每个 adapter 的平均激活水平(应该是加权之后的输出),每层只保留两个贡献最高的 adapter,模型的性能和原来基本持平,推理速度可以提高 68%。
3.3 Compacter
Compacter 这一结构来自论文 [5]。作者沿用了 [1] 的 adapter 放置位置和训练方式,只是重新设计了更加轻量化的 adapter 结构,使得只需要新增原模型大约 0.05%-0.2% 的参数量便可在 GLUE 和 SuperGLUE 这些 benchmark 上达到比较好的表现。
网络结构:
- Compact 应用了 Kronecker 积。一个 mxf 的 A 矩阵和一个 pxq 的 B 矩阵的 Kronecker 积是
- 假设模型 hidden state 大小是 k,bottleneck 大小是 b,[1] 中的 adapter 层就包含两个 kxb 的矩阵。Compacter首先借用了 parameterized hypercomplex multiplication layers 的理念,把每个 adapter 的参数表达成一个 nxn 的矩阵 A 和一个 (k/n)x(d/n) 的矩阵 B 的 Kronecker 积,这样参数量就被大大缩减了。
- 在此之上,要求所有 adapter 共享矩阵 A。
- 另外,把矩阵 B 再次分解成 n 组两个低秩矩阵的积,两个矩阵的大小分别是 (k/n)xr 和 rx(d/n)。为了减少参数量,作者把 r 固定为 1。
- Compacter 层结构如下图所示。图中展示了两个 compacter 层,彩色的是需要训练的参数。把 [1] 中的 adapter 层中的参数用这种形式表达就得到了 compacter 的结构。
▲Compacter的结构
实验:作者主要使用了 T5-base 在 GLUE 和 SuperGLUE 的任务上进行了实验。对比了 Compacter,整个模型微调,以及一系列参数高效的方法。对 compacter,作者实验了无低秩分解的版本进行对照,也实验了类似 [3] 每个transformer层只保留靠近输出的一个 adapter 的结构(称作 compacter )。
实验结果:
- 在 T5-base 上,[3] 的adapter层的效果比 [1] 要好。AdapterDrop 或者仅仅对 adapter 层进行低秩分解的性能都比整个模型微调要差。
- Compacter 的三个创新使得只训练 0.1% 上下的新参数就可以和全模型微调的表现相近。
- 和全模型微调相比,Compacter 在训练集较小(0.1k-4k)的时候表现要更好。
Adapter的应用和针对应用的改进
这里的几篇论文 [6-12] 都利用了 adapter 设计了一些特定问题的解决方案,有的方法重在参数高效,有的方法重在对原模型的效果进行进一步提升。篇幅限制,这部分对每篇论文只做简略介绍。
4.1 Bapna & Firat(2019)
本篇论文 [6] 主要应用了 adapter 来解决两个机器翻译(NMT)的问题:(1)域适应(domain adaptation)和(2)大规模多语种 NMT。作者主要采用的框架是先预训练一个基础模型,再根据每个目标任务插入一个新的 adapter 进行微调。文章主要的贡献是展现了在 NMT 任务上 adapter 类的方法可以做到和整个模型微调达到相似性能,同时更加参数高效。另外,多语种 NMT 任务上可以做到单个模型同时在资源少和多的语言上表现良好。
- Adapter 结构:本文和 [3] 使用了类似结构(但是本文的工作在 [3] 之前),每个 transformer 层只在最后插入一个 adapter 层。另外,作者重新初始化了 layer norm 的参数(和 [1] 不同,[1] 是直接用预训练的 layer norm 参数继续训练)。
- 域适应:作者在 WMT En-Fr 上训练,然后冻结参数,插入 adapter,分别迁移到 IWSLT'15 和 JRC。模型性能好于 LHUC [7],和全模型微调比较接近。
- 多语种 NMT:作者首先训练了一个英语 <=>102 种其他语言的模型,然后冻结参数,再针对每组(源语言,目标语言)的组合分别插入一个 adapter 进行微调。主要比较的基线方法是只用(源语言,目标语言)的数据训练的模型。结果显示英语是源语言时,大部分目标语言的表现相比基线都持平或有所提升;但是英语是目标语言时,主要在训练数据较少的语言上有较大提升,在训练数据比较多的语言上效果有所下降。
4.2 K-Adapter
本篇论文 [8] 主要的贡献是用 adapter 以一种模块化的方式向预训练语言模型中插入知识,来解决一些知识密集型的 NLP 任务(关系分类、实体类型识别、问答等等)。作者通过训练两个 adapter 来把两种类型的知识引入 RoBERTa:(1)事实性知识,(2)语言学类的知识。两个 adapter 分别训练,互不影响。
- 模型结构:K-Adapter 不再改动原有的 transformer 层,而是变成在两个 transformer 层之间插入 adapter 层。每个 adapter 层内,在向下和向上 project 的全连接层之间加入了两层 transformer 层(下图左),增加了模块的表达能力。每个 adapter 层的输入可以看到上一个 adapter 和邻近的上一个 transformer 层的输出(下图右)。
▲K-Adapter的结构(左)和训练方式(右)
- 预训练:插入 adapter 层,把原模型参数固定,把原模型最后一层的输出和最后一个 adapter 的输出 concat 起来作为 feature,然后在特定的预训练任务上学习。
- 事实性知识:在关系分类任务上训练,共 430 个类,5.5M 个句子。通过学习预测实体和实体之间的关系,模型可以学到一些基本事实和常识。
- 语言学类知识:在依存关系分类任务上训练,作者用斯坦福的 parser 准备了共约 1M 个训练样本。通过学习预测每个 token 对应的 head 的位置,模型可以学到一些和句法/语义相关的知识。
- 下游微调:把每个任务新增的参数接在最后一个 adapter 层的输出上进行训练。如果同时使用多个 adapter,就把他们的输出 concat 起来作为特征。另外,原来预训练模型的参数也跟着一起微调。
- 下游任务主要涵盖关系分类、实体类型识别、问答。
- 基线模型除了之前效果比较好的语言模型 知识的模型外,还有原 RoBERTa 模型、原 RoBERTa 模型 随机初始化的 adapter 参数、原 RoBERTa 模型进一步在两个任务上多任务学习得到的模型。实验结果发现同时使用两个 adapter 时可以获得最好的效果。对后两个下游任务来说事实性知识帮助更大,对第一个任务语言学类的知识帮助更大。
4.3 MAD-X
和前文总结过的 AdapterFusion 以及 K-Adapter 类似,MAD-X [9] 这篇论文的目标也是用 adapter 来学习和存储模块化的知识,做到“即插即用”。AdapterFusion 的目标是让小训练集的任务使用大训练集的任务的知识,而 MAD-X 的目标是在同一个任务下让低资源的语言使用高资源的语言的知识。
为了解耦语言和任务,作者提出分别训练相对应的 adapter,这样想要解决一个低资源语言 L 的任务 T 时,可以使用对应语言 L 的 adapter,搭配上在其他语言 L' 上训练的任务 T 的 adapter。在这个框架的基础上,作者还设计了 invertible adapter 作为学习语言知识的 adapter 的一部分。
网络结构:仍然是在每个 transformer 层中插入 adapter(下图),其中 language adapter 和 task adapter 沿用 AdapterFusion 的网络结构,invertible adapter 是一个 token 层面的映射函数,和 language adapter 一起训练,可以理解成在 multilingual embedding 上再为每种语言学习一个专用的 embedding 函数,但是比每种目标语言重新训练 embedding 更加参数高效。
▲MAD-X中三类adapter的放置方式(左)和invertible adapter的结构(右)
训练和推理:首先为每种语言训练 language adapter 和 invertible adapter,用的任务是 MLM。然后再插入某任务专用的 adapter,配合源语言的 language adapter 和 invertible adapter 在源语言的训练集上训练。推理时,使用目标语言的 language adapter 和 invertible adapter,再配合源语言的 task adapter。
实验和发现:
1. 作者主要在命名实体识别、问答、因果常识推理上进行跨语言迁移的实验,选取了 16 种来自各种语系并且训练集资源大小不一的语言两两配对进行实验。作者在 XLM-R 上加入 adapter,对比的基线模型包括 mBERT 和 XLM-R,还有在目标语言上进行预训练过的 XLM-R。
2. 对于预训练阶段没有出现过的语言,XLM-R 和只使用 task adapter 的 MAD-X 表现都很差,在目标语言进行预训练之后,XLM-R 效果有很大提升。
3. NER 任务上,language adapter 和 invertible adapter 都对性能影响很大。MAD-X 对高资源向低资源语言的迁移帮助最大。
4. 因果常识推理任务上,MAD-X 和目标语言上预训练的 XLM-R 表现类似;问答任务上,后者似乎在比 MAD-X 表现更好。但是 MAD-X 训练的参数更少。
4.4 其他应用
- UDapter [10]:用 adapter 训练参数高效的多语言的依存分析模型。
- Philip et al.(2020)[11]:和 [6] 类似,关注多语言机器翻译任务,但是给每个语言引入 adapter 参数,而不是像 [6] 一样给每对语言引入一个 adapter。
- Lauscher et al.(2020)[12]:和 [8] 类似,使用 adapter 模块化地引入知识。
类似Adapter的结构
下面列举了思路和 adapter 相近,但是网络结构设计不同的文章,这里就不详细介绍了,也推荐 ICLR 2022 的文章 [16](或者何俊贤大大亲自讲解的视频)。
- BERT and PAL [13]
- Prefix Tuning [14]
- LoRA [15]
▲三种 adapter 类的结构(adapter,prefix tuning,LoRA),图片来自 [16]。
参考文献
[1] Houlsby, N., Giurgiu, A., Jastrzebski, S., Morrone, B., Laroussilhe, Q. D., Gesmundo, A., Attariyan, M., & Gelly, S. (2019). Parameter-Efficient Transfer Learning for NLP. Proceedings of the 36th International Conference on Machine Learning, 2790–2799. https://proceedings.mlr.press/v97/houlsby19a.html
[2] Rebuffi, S. A., Bilen, H., & Vedaldi, A. (2017). Learning multiple visual domains with residual adapters. Advances in neural information processing systems,30. https://proceedings.neurips.cc/paper/2017/file/e7b24b112a44fdd9ee93bdf998c6ca0e-Paper.pdf
[3] Pfeiffer, J., Kamath, A., Rücklé, A., Cho, K., & Gurevych, I. (2021). AdapterFusion: Non-Destructive Task Composition for Transfer Learning. Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Main Volume, 487–503. https://doi.org/10.18653/v1/2021.eacl-main.39
[4] Rücklé, A., Geigle, G., Glockner, M., Beck, T., Pfeiffer, J., Reimers, N., & Gurevych, I. (2021). AdapterDrop: On the Efficiency of Adapters in Transformers. Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing, 7930–7946. https://doi.org/10.18653/v1/2021.emnlp-main.626
[5] Karimi Mahabadi, R., Henderson, J., & Ruder, S. (2021). Compacter: Efficient Low-Rank Hypercomplex Adapter Layers. Advances in Neural Information Processing Systems, 34, 1022–1035. https://proceedings.neurips.cc/paper/2021/hash/081be9fdff07f3bc808f935906ef70c0-Abstract.html
[6] Bapna, A., & Firat, O. (2019). Simple, Scalable Adaptation for Neural Machine Translation. Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP), 1538–1548. https://doi.org/10.18653/v1/D19-1165 [7] Vilar, D. (2018). Learning Hidden Unit Contribution for Adapting Neural Machine Translation Models. Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 2 (Short Papers), 500–505. https://doi.org/10.18653/v1/N18-2080
[8] Wang, R., Tang, D., Duan, N., Wei, Z., Huang, X., Ji, J., Cao, G., Jiang, D., & Zhou, M. (2021). K-Adapter: Infusing Knowledge into Pre-Trained Models with Adapters. Findings of the Association for Computational Linguistics: ACL-IJCNLP 2021, 1405–1418. https://doi.org/10.18653/v1/2021.findings-acl.121
[9] Pfeiffer, J., Vulić, I., Gurevych, I., & Ruder, S. (2020). MAD-X: An Adapter-Based Framework for Multi-Task Cross-Lingual Transfer (arXiv:2005.00052). arXiv. http://arxiv.org/abs/2005.00052
[10] Üstün, A., Bisazza, A., Bouma, G., & van Noord, G. (2020). UDapter: Language Adaptation for Truly Universal Dependency Parsing. Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP), 2302–2315. https://doi.org/10.18653/v1/2020.emnlp-main.180
[11] Philip, J., Berard, A., Gallé, M., & Besacier, L. (2020). Monolingual Adapters for Zero-Shot Neural Machine Translation. Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP), 4465–4470. https://doi.org/10.18653/v1/2020.emnlp-main.361
[12] Lauscher, A., Majewska, O., Ribeiro, L. F. R., Gurevych, I., Rozanov, N., & Glavaš, G. (2020). Common Sense or World Knowledge? Investigating Adapter-Based Knowledge Injection into Pretrained Transformers. Proceedings of Deep Learning Inside Out (DeeLIO): The First Workshop on Knowledge Extraction and Integration for Deep Learning Architectures, 43–49. https://doi.org/10.18653/v1/2020.deelio-1.5
[13] Stickland, A. C., & Murray, I. (2019). BERT and PALs: Projected Attention Layers for Efficient Adaptation in Multi-Task Learning. Proceedings of the 36th International Conference on Machine Learning, 5986–5995. https://proceedings.mlr.press/v97/stickland19a.html
[14] Li, X. L., & Liang, P. (2021). Prefix-Tuning: Optimizing Continuous Prompts for Generation. Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing (Volume 1: Long Papers), 4582–4597. https://doi.org/10.18653/v1/2021.acl-long.353
[15] Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., & Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models (arXiv:2106.09685). arXiv. http://arxiv.org/abs/2106.09685
[16] He, J., Zhou, C., Ma, X., Berg-Kirkpatrick, T., & Neubig, G. (2022). Towards a Unified View of Parameter-Efficient Transfer Learning (arXiv:2110.04366). arXiv. http://arxiv.org/abs/2110.04366