$\infty$-former: Infinite Memory Transformer
概
在transformer中引入一种长期记忆机制.
主要内容
假设\(X \in \mathbb{R}^{L \times d}\), 即每一行\(x_i\)代表一个token对应的特征.
Attention需要进行如下的步骤:
Z = \mathrm{softmax}(\frac{QK^T}{\sqrt{d}})V.
\]
为了符号简易起见, 我们不考虑multi-head的情形, 下面的思想可以直接应用之.
我们知道, 可以通过径向基函数来逼近任意的连续函数:
\]
现在, 我们令\(t_i = \frac{i}{L}\), 即对\(L\)个tokens冠以时序, \(X\)的每一列都可以看成一个特殊的\(f_j(t)\)的位于\(t_i, i=0,1,\cdots, L-1\)处的值.
给定\(N\)个基函数\(\psi_k (t), k=0,1,\cdots, N-1\), 我们要通过求解系数\(\bm{b}_j = [b_{j0}, b_{j1},\cdots b_{j,N-1}]^T\)来逼近\(f_j\)(\(X\)的第\(j\)列).
设\(\Psi \in \mathbb{R}^{N \times L}, \Psi_{ki}=\psi_{k}(t_i)\), \(B \in \mathbb{R}^{d \times N}, B_{jk} = b_{jk}\).
作者通过岭回归来求解系数\(b\):
\]
其显示表达式为:
\]
故
\]
现在我们用\(\tilde{X} := \Psi^T B^T\)来代替\(X\), 则
\]
注意, 我们并不对\(Q\)进行替换, 因为这个只是用作长期的记录用, Q每次重新计算.
对于每个\(q_i\), 我们构建一个其关于\(t\)的密度函数\(p_i(t)\), 文中假设其满足高斯分布:
\]
\(\mu_i, \sigma_i^2\)分别通过如下估计:
=\mathrm{sigmoid} (w_{\mu}^T B^TW^K q_i), \\
\sigma^2_i = \mathrm{softplus} (w_{\sigma}^T K q_i)
=\mathrm{softplus} (w_{\sigma}^T B^TW^K q_i). \\
\]
注意最后令\(w^T\Psi^T = w^T\)既然\(\Psi\)是事先确定的.
我们知道
\]
实际上求解的是一个离散化的\(p_i(t)\), 即\(q_i\)和\(k_j\)的相合程度, 而
\]
实际上就是求解期望
\]
现在我们近似了一个连续的\(p_i(t)\), 也可以通过这种方式得到最后的\(z_i\):
=\mathbb{E}_{p_i}[\psi^T(t)B^TW^V]
=\mathbb{E}_{p_i}[\psi^T(t)]B^TW^V.
\]
当我们取\(\psi\)为高斯径向基函数的时候, 上述是由显示解的.
现在来剖析一下, 好在哪里?
原本的\(K\)是\(L\times d\)的, 现在由于我们只需要计算\(B^TW\), 故实际上只有\(N \times d\), 我们可以选取很大的\(L\)但是选择较小的\(N\)来避免较高的复杂度.
如何扩展?
难不成每一次都要重新计算\(B\)? 倘若真的是这样就谈不上是长期记忆了.
作者采取了一种比较巧的方法, 实际上, 现在的\(B\psi(t)\)可以看成是一个\(d\)维的向量函数.
我们首先将其进行压缩至\([0, \tau], \tau \in (0, 1)\):
\]
如此一来, 整个函数的能量集中在\([0, \tau]\)中, 我们可以用剩下的\((\tau, 1]\)来放置新的\(X\).
我们首先从\([0, \tau]\)中采样\(M\)个点\(t_0, \cdots, t_{M-1}\), 并得到:
\]
加上新的\(X_{new}\), 我们有
\]
对\(X\)按照上面的逻辑重新估计\(B\)即可更新记忆.
关于如何采样这\(M\)个点, 作者提了一种sticky memories的方法, 将其与密度函数联系在一起, 便不细讲了.
实验细节
在看这篇论文的时候, 困扰我的就是这个径向基函数是怎么选的?
举一个作者在Language Modeling中的例子便可:
选取150个高斯径向基函数\(\mathcal{N}(t;\mu, \sigma^2)\), 其中
\(\mu\)从\([0, 1]\)中均匀采样, \(\sigma \in \{0.01, 0.05\}\).
还有用KL散度防止一般化就不讲了. 感觉本文有趣的点就是压缩这个地方, 还有对\(\Psi\)的处理.
随机推荐
- 【♪♪♪】网易云音乐mp3真实地址
参考别人的博客,得到下面的地址,填上ID号即可,后缀的[.mp3]不用输入 http://music.163.com/song/media/outer/url?id= 例如 最终,合并地址为 http ...
- Oracle中如何自定义类型
一:Oracle中的类型有很多种,主要可以分为以下几类:1.字符串类型.如:char.nchar.varchar2.nvarchar2.2.数值类型.如:int.number(p,s).integer ...
- ython学习笔记(接口自动化框架 V2.0)
这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...
- Use of explicit keyword in C++
Predict the output of following C++ program. 1 #include <iostream> 2 3 using namespace std; 4 ...
- 【Linux】【Basis】进程
1. 维基百科:https://zh.wikipedia.org/wiki/%E8%A1%8C%E7%A8%8B 进程的类型: 终端:硬件设备,关联一个用户接口 与终端相关:通过终端启动 与终端无关: ...
- Spring Boot 自动扫描组件
使用@ComponentScan自动扫描组件 案例准备 1.创建一个配置类,在配置类上添加 @ComponentScan 注解.该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <con ...
- 拷贝txt文本中的某行的数据到excel中
package com.hope.day01;import java.io.*;import java.util.ArrayList;public class HelloWorld { publ ...
- 『学了就忘』Linux启动引导与修复 — 72、Linux系统的修复模式(单用户模式)
目录 1.单用户模式常见的错误修复 2.通过单用户模式修改系统密码 (1)进入grub启动引导程序中 (2)编辑相应的系统启动内容 (3)编辑grub配置文件内容 (4)启动系统 (5)修改root用 ...
- 探究Go-YCSB做数据库基准测试
本篇文章开篇会介绍一下Go-YCSB是如何使用,然后按照惯例会分析一下它是如何做基准测试,看看它有什么优缺点. 转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.l ...
- pipeline groovy
目录 一.变量 一.变量 1.直接定义 def x="abc" 2.从脚本执行结果赋值变量 branch = "/jen_script/return-branch.sh ...