这篇是DeepMind基于transformer-XL 方法进行改进,通过压缩memory 使得模型可以处理更长的序列 可长达一个本书。
同时他们 在一个目标匹配任务上发现 该算法可以有效地模拟高频语音,并可作为RL的记忆机制。
论文的另外一个贡献是提出一个基于Project Gutenberg 书的长序列的benchmark PG-19 这个序列是目前语言模型的长度的两倍,并且也包含更长的上下文信息。
前面提到来目前改进transformer的模型有 Transformer - XL , Sparse Transformer, 以及 span Transformer。
Compressive Transformer 的具体实现
本模型是 Transformer 的改进版本,借鉴Transformer-XL的思想,但是transformer-XL 会丢掉 记忆窗口以外的信息,而本文的 Compress transformer 不会丢掉,而是把他们压缩并且存储到一个额外的记忆模块。
压缩函数如下,其中d是隐藏层的维度,c是压缩比例,c越大 压缩越多。
具体步骤如下:
首先 有 2个memory: 一个是存放正常的前几个segment的hidden state 下图中计做 m, 一个是存放压缩的记忆模块 cm。
假设原始序列为S (
x
1
,
x
2
,
.
.
.
x
∣
s
∣
x_1, x_2,...x_{|s|}
x1,x2,...x∣s∣),我们将S 切割成长度为
n
s
n_s
ns大小的片段,那么在t时刻的输入片段为
X
=
x
t
,
x
t
+
1
.
.
.
x
t
+
n
s
X=x_t,x_{t+1}...x_{t+n_s}
X=xt,xt+1...xt+ns, 在t时刻得到的hidden 放到FIFO memory(m)中,把最早的hidden 从 m中去除,然后通过一个压缩方法 将被去除的hidden 压缩成更小的单元 存放到cm中。
在t+1时刻时,先将cm和m进行拼接得到第i层的记忆模块mem, 然后通过当前segment的当前层的hidden 和 mem 来计算多头注意力a, 后面接着layer norm, 然后再处理记忆模块,将m中前ns个记忆单元 放到old_mem中,并通过压缩函数生成新的new_cm,然后再更新当前的memory 和 压缩记忆单元。
关于 Compression Function 和 loss
对于压缩函数 f c f_c fc 考虑以下4种方式:
- max/mean pooling: kernel 和步长设置为 压缩比例 c。 这个是最快最简单的baseline。
- 1D convolution :kernel和步长也是设置为c.
- dilated convolutions :膨胀卷积。卷积压缩方法 包含需要训练的参数。
- most-used :memories 存储 通过他们的平均attention 和最常使用来存储。这个来源于垃圾回收机制,不常用的记忆模块被删除掉。
我们可以通过损失的梯度来训练 压缩网络。但是对于每个 old memory 这个需要BPTT(通过长时间的反向传播)。所以这里我们也考虑 局部辅助 压缩损失。
- auto-encoding 损失 :从压缩记忆模块中重建原始记忆,然后计算auto-encoding损失 L a e = ∣ ∣ o l d m e m ( i ) − g ( n e w c m i ) ∣ ∣ 2 L^{ae} = ||old_mem^{(i)} - g(new_cm^{i})||_2 Lae=∣∣oldmem(i)−g(newcmi)∣∣2, 其中 g : R n s c ∗ d − > R n s ∗ d g: R^{\frac{n_s}{c} * d} -> R^{n_s * d} g:Rcns∗d−>Rns∗d. 这个是试图从所有的记忆模块中恢复信息 , 这个是无损的压缩目标函数。
- attention-reconstruction 损失:注意力重建损失。重建memory的上下文注意力损失,这个是有损失的目标函数,因为没有被关注的信息已经丢失了。we found this worked best。
我们没有让压缩损失的梯度 进入主网络,因为这个会妨碍学习。相反,ttransformer的优化任务目标,压缩网络优化压缩目标函数。没必要把这两个损失用常熟项加和起来。
下面Algorithm2 就是论文说的效果好的 压缩损失函数流程 attention-reconstruction loss。
Temporal Range 时序窗口大小
我们知道Transformer -XL 在记忆窗口大小为n时,最大的temporal range 为 l ∗ n l * n l∗n 时 注意力消耗的空间大小为 O ( n s 2 + n s ∗ n ) O(n^2_s+n_s*n) O(ns2+ns∗n). Compressive Transformer temporal range 为 l x ( n m + c ∗ n c m ) l x (n_m + c*n_{cm}) lx(nm+c∗ncm)时,attention cost 是 O ( n s 2 + n s ( n m + n c m ) ) O(n^2_s + n_s(n_m+n_{cm})) O(ns2+ns(nm+ncm)). 比如 当设置 n c m = n m = n / 2 c = 3 n_{cm} = n_m = n/2 c=3 ncm=nm=n/2c=3时,compressive transformer的 temporal range是 transformer-xl 的2倍,但是attention cost 是一样的。只要我们学到c>1 模型的temporal range 就可以增加很多。
PG-19 benchmark
该数据集包含 28752本书(11GB文本)是目前BookCorpus 和 Billion Word Benchmark的2倍长。
PG-19 这个数据集的构造动机
word-level 语言模型的数据集:
- Billion Word Benchmark 是单独句子的模型
- Penn Treebank 是新闻的小片段
- WikiText-103 是英文维基百科论文的一个高质量的子集
以上都是平均3600个单词长。这些数据集在LM 模型非常受欢迎,因为这个有可以探索长距离依赖的可能性。
但是最近的Transformer 模型 比如Transformer-XL很明显已经可以很好地处理几千字的文本。所以我们提出更长的上下文数据集。
基于书籍的数据集 如 Childen’s Book Test 和 LAMBADA 这些都是从Project Gutenberg 里面提取的文本,Book- Corpus 之前的一个数据集有11K 未公布的书。 CBT 和 LAMBADA 从书籍里面提取文本,主要是为了特定的预测保留单词的任务(阅读理解)。这两个数据集对于语言理解模型很有用,但是对于长句子依赖语言模型不是很好,因为他们只是抓取了书中的片段 删掉了大量的内容。 之前有模型直接在BookCorpus上训练(bert),但是现在BookCorpus由于版权问题无法再使用。
The NarrativeQA Book Compreshension Task也是使用Project Gutenberg texts 与维基百科内容 结合 可用于总结摘要。由于需要一些总结,这个数据集里面也是只包含了一小部分书。 1527 versus the 28752 books in PG-19.
Statistics
Tabel-2 里面是训练验证和测试比例, Table-3是困惑度,可以看出Compressive Transformer 的比 Transformer-XL的要好一些。Table-4是在Enwik8上的结果比较,Table-5是不同的压缩方法在Enwik8 上的效果,可以看出attention 压缩效果比较好。
作者还在pg-19上 用LDA 主题模型做了个分类:
对attention weight 的分析, 看看模型是否真正用到了压缩的记忆模块,并且在各个模块的attention 权重大小分布。下图可以看出 大部分的attention是放在当前sequence,对当前序列的前面的单词关注更多 因为我们mask后面的单词。同时也可以看出 attention 在memory 里面靠前的attention 低于compressed memory 的权重,这与越老的记忆访问权重越低的趋势相反, 这也正说明了模型确实在学习 compress memory 中的重要的信息。
在其他领域的应用
语音模型上:
强化学习上: