“闭门造车”之多模态思路浅谈(三):位置编码
By 苏剑林 | 2024-09-06 | 30798位读者 |在前面的文章中,我们曾表达过这样的观点:多模态LLM相比纯文本LLM的主要差异在于,前者甚至还没有形成一个公认为标准的方法论。这里的方法论,不仅包括之前讨论的生成和训练策略,还包括一些基础架构的设计,比如本文要谈的“多模态位置编码”。
对于这个主题,我们之前在《Transformer升级之路:17、多模态位置编码的简单思考》就已经讨论过一遍,并且提出了一个方案(RoPE-Tie)。然而,当时笔者对这个问题的思考仅处于起步阶段,存在细节考虑不周全、认识不够到位等问题,所以站在现在的角度回看,当时所提的方案与完美答案还有明显的距离。
因此,本文我们将自上而下地再次梳理这个问题,并且给出一个自认为更加理想的结果。
多模位置 #
多模态模型居然连位置编码都没有形成共识,这一点可能会让很多读者意外,但事实上确实如此。对于文本LLM,目前主流的位置编码是RoPE(RoPE就不展开介绍了,假设读者已经熟知),更准确来说是RoPE-1D,因为原始设计只适用于1D序列。后来我们推导了RoPE-2D,这可以用于图像等2D序列,按照RoPE-2D的思路我们可以平行地推广到RoPE-3D,用于视频等3D序列。
然而,以上说的只是单一模态输入,当多种模态混合输入时,困难就出现了:文本是1D序列,所以它的位置只是一个标量$n$;图像是2D的(“宽”和“高”),所以表达它的位置需要一个二维向量$(x,y)$;视频则在图像的基础上新增了一个时间维度(或者说“帧”),所以它的位置是一个三维向量$(x,y,z)$。当我们希望用同一个模型去处理三种模态的数据时,就要想办法糅合这三种不同形式的位置信息。
大家都知道,RoPE在实现上是绝对位置编码,但结合基于内积的Attention来用时,内积之后位置会自动作差,从而实现了相对位置编码的效果。可同一大小的向量可以作差,不同大小的向量怎么作差呢?这就是多模态位置编码的困难所在。
不少工作选择“逃避”这个困难,直接Flatten所有模态然后使用RoPE-1D,这不失为一种解决办法,但终究显得不够优雅。此外,强行Flatten也可能会降低模型性能的天花板,因为《VisionLLaMA: A Unified LLaMA Backbone for Vision Tasks》等工作已经表明,RoPE-2D的引入有助于提升模型效果尤其是变分辨率输入的效果。
向后兼容 #
所以,我们希望设计一种多模态位置编码,它既可以多模态混合使用,在单模态下又能退化为对应的RoPE-1D/2D/3D,以充分解锁每个模态的能力。
刚才我们说,多模态位置编码的主要困难是不同大小的位置向量无法作差,既要保留完整的位置信息又要允许作差,那么我们就只能统一升维到最高维度。下面我们以图文混合模态为例,由于图像是2D的,所以我们将文本的位置编码也提升到二维,然后统一用RoPE-2D。怎么升维都可以吗?并不是,我们希望它具有向后的兼容性,即当输入是纯文本时,它跟RoPE-1D完全等价。
为此,我们对比一下RoPE-1D与RoPE-2D:
$$\scriptsize{\begin{array}{c}\begin{array}{c}\text{RoPE-1D}\\ (\boldsymbol{\mathcal{R}}_n)\end{array}= \begin{pmatrix}
\cos \bbox[yellow]{n}\theta_0 & -\sin \bbox[yellow]{n}\theta_0 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\
\sin \bbox[yellow]{n}\theta_0 & \cos \bbox[yellow]{n}\theta_0 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\
0 & 0 & \cos \bbox[yellow]{n}\theta_1 & -\sin \bbox[yellow]{n}\theta_1 & \cdots & 0 & 0 & 0 & 0 \\
0 & 0 & \sin \bbox[yellow]{n}\theta_1 & \cos \bbox[yellow]{n}\theta_1 & \cdots & 0 & 0 & 0 & 0 \\
\vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \vdots \\
0 & 0 & 0 & 0 & \cdots & \cos \bbox[yellow]{n}\theta_{d/2-2} & -\sin \bbox[yellow]{n}\theta_{d/2-2} & 0 & 0 \\
0 & 0 & 0 & 0 & \cdots & \sin \bbox[yellow]{n}\theta_{d/2-2} & \cos \bbox[yellow]{n}\theta_{d/2-2} & 0 & 0 \\
0 & 0 & 0 & 0 & \cdots & 0 & 0 & \cos \bbox[yellow]{n}\theta_{d/2-1} & -\sin \bbox[yellow]{n}\theta_{d/2-1} \\
0 & 0 & 0 & 0 & \cdots & 0 & 0 & \sin \bbox[yellow]{n}\theta_{d/2-1} & \cos \bbox[yellow]{n}\theta_{d/2-1} \\
\end{pmatrix} \\[16pt]
\begin{array}{c}\text{RoPE-2D}\\ (\boldsymbol{\mathcal{R}}_{x,y})\end{array}= \begin{pmatrix}
\cos \bbox[yellow]{x}\theta_0 & -\sin \bbox[yellow]{x}\theta_0 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\
\sin \bbox[yellow]{x}\theta_0 & \cos \bbox[yellow]{x}\theta_0 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\
0 & 0 & \cos \bbox[yellow]{y}\theta_1 & -\sin \bbox[yellow]{y}\theta_1 & \cdots & 0 & 0 & 0 & 0 \\
0 & 0 & \sin \bbox[yellow]{y}\theta_1 & \cos \bbox[yellow]{y}\theta_1 & \cdots & 0 & 0 & 0 & 0 \\
\vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \vdots \\
0 & 0 & 0 & 0 & \cdots & \cos \bbox[yellow]{x}\theta_{d/2-2} & -\sin \bbox[yellow]{x}\theta_{d/2-2} & 0 & 0 \\
0 & 0 & 0 & 0 & \cdots & \sin \bbox[yellow]{x}\theta_{d/2-2} & \cos \bbox[yellow]{x}\theta_{d/2-2} & 0 & 0 \\
0 & 0 & 0 & 0 & \cdots & 0 & 0 & \cos \bbox[yellow]{y}\theta_{d/2-1} & -\sin \bbox[yellow]{y}\theta_{d/2-1} \\
0 & 0 & 0 & 0 & \cdots & 0 & 0 & \sin \bbox[yellow]{y}\theta_{d/2-1} & \cos \bbox[yellow]{y}\theta_{d/2-1} \\
\end{pmatrix}\end{array}}$$
发现什么共同点了吗?如果单看这个形式,可以发现其实有$\boldsymbol{\mathcal{R}}_n=\boldsymbol{\mathcal{R}}_{n,n}$,即位置为$n$的RoPE-1D跟位置为$(n,n)$的RoPE-2D其实是等价的,所以要想在图文混合中统一用RoPE-2D,并且对于纯文本能退化为RoPE-1D,那么就要将文本部分的位置坐标取为$(n,n)$的形式。
当然,实际上它们还是有少许不同的,我们知道对于RoPE-1D有$\theta_i = b^{-2i/d}$,也就是$\theta_{2j}$跟$\theta_{2j+1}$是不同的,但对于RoPE-2D来说,为了确保$x,y$的对称性,通常的选择是确保$\theta_{2j}=\theta_{2j+1}$,这就产生了矛盾之处。对此,我们有两种选择:一是放弃RoPE-2D中$x,y$的对称性,依旧取$\theta_i = b^{-2i/d}$;二是取$\theta_{2j}=\theta_{2j+1}=b^{-4j/d}$,此时纯文本部分的位置编码就跟已有RoPE-1D略有不同。对于$\theta_i = b^{-2i/d}$来说,$\theta_i$与$\theta_{i+1}$差别不大,所以两种方案其实都差不多,选哪一种取决于个人的审美,笔者倾向于选择第一种。
等价对称 #
通过上述分析,我们确定了图文混合模态统一用RoPE-2D的方案,并且由向后兼容性确定了位置$n$的文本Token的二维位置应该取$(n,n)$,从而完成了文本部分的位置编码设计。接下来,我们需要构思的是图像部分的位置编码。
如果输入只有一张$w\times h$个Patch的图像,那么它的位置坐标自然就是各个Patch本身的坐标,即
\begin{equation}\left[\begin{matrix}
(1,1) & (1,2) & \cdots & (1, w) \\
(2,1) & (2,2) & \cdots & (2, w) \\
\vdots & \vdots & \ddots & \vdots \\
(h,1) & (h,2) & \cdots & (h, w) \\
\end{matrix}\right]\label{eq:rope2d}\end{equation}
我们这展示的是绝对位置,但实际的效果是相对位置,相对位置的特点是跟位置偏置无关,所以我们可以给每个坐标都加上$(\beta_1,\beta_2)$而不改变效果;其次,我们可以给每个坐标都乘以$(\gamma_1,\gamma_2)$,这样允许我们按需调整相邻位置的间隔。将这两点结合起来,我们可以得到图像的一般化二维位置为
\begin{equation}\left[\begin{matrix}
(\beta_1 + \gamma_1,\beta_2 + \gamma_2) & (\beta_1 + \gamma_1,\beta_2 + 2\gamma_2) & \cdots & (\beta_1 + \gamma_1,\beta_2 + w\gamma_2) \\[8pt]
(\beta_1 + 2\gamma_1,\beta_2 + \gamma_2) & (\beta_1 + 2\gamma_1,\beta_2 + 2\gamma_2) & \cdots & (\beta_1 + 2\gamma_1,\beta_2 + w\gamma_2) \\[8pt]
\vdots & \vdots & \ddots & \vdots \\[8pt]
(\beta_1 + h\gamma_1,\beta_2 + \gamma_2) & (\beta_1 + h\gamma_1,\beta_2 + 2\gamma_2) & \cdots & (\beta_1 + h\gamma_1,\beta_2 + w\gamma_2)
\end{matrix}\right]\end{equation}
现在我们考虑左右两段文本夹着中间一张图像时,$\beta_1,\beta_2,\gamma_1,\gamma_2$该怎么选取。
首先,我们假设文本的Token和Patch具有一定的等价性:经过合理的Patchify后每个Patch的地位跟Token等价(An Image is Worth xxx Tokens),这意味着对于两段文本来说,它们相当于夹着一个$wh$个Token的句子,所以如果左段文本最后一个Token的位置是$(L,L)$,那么右段文本第一个Token的位置就是$(L+wh+1, L + wh + 1)$。
接着,我们还需要引入对称性——具体来说,图像的第一个Patch的位置是$(\beta_1 + \gamma_1,\beta_2 + \gamma_2)$,最后一个Patch的位置是$(\beta_1 + h\gamma_1,\beta_2 + w\gamma_2)$,我们认为【图像第一个Patch】与【左段文本最后一个Token】的位置差,等于【右段文本第一个Token】与【图像最后一个Patch】的位置差,即
\begin{equation}\begin{pmatrix}\beta_1 + \gamma_1 \\ \beta_2 + \gamma_2\end{pmatrix} - \begin{pmatrix}L \\ L\end{pmatrix} = \begin{pmatrix}L+wh+1 \\ L+wh+1\end{pmatrix} - \begin{pmatrix}\beta_1 + h\gamma_1 \\ \beta_2 + w\gamma_2\end{pmatrix}\label{eq:beta-gamma}\end{equation}
这里边有四个未知数$\beta_1,\beta_2,\gamma_1,\gamma_2$,但只有两个等式,所以有无穷多组解。我们可以简单地取$\gamma_1=\gamma_2=1$,继而解得
\begin{equation}\beta_1 = L + \frac{1}{2}(wh - h),\quad \beta_2 = L + \frac{1}{2}(wh - w)\end{equation}
这个方案我们暂时可以称之为RoPE-Tie-v2或者RoPE-TV(RoPE for Text and Vision)吧。
优劣分析 #
根据这个结果,当句子后面接一张$w\times h$的图像时,只需要按照上述计算计算出$(\beta_1,\beta_2)$,然后加到常规的二维RoPE $\eqref{eq:rope2d}$中去,就得到了图像部分的位置坐标了,如下图所示
作为对比,我们在《Transformer升级之路:17、多模态位置编码的简单思考》提出的旧版RoPE-Tie,其位置坐标如下图所示:
事实上,RoPE-Tie的出发点同样包括兼容性和对称性,但没有严格遵循等价性,并且RoPE-Tie默认了$\beta_1=\beta_2=L$,以及没有限定$w\times h$个Patch等价于$wh$个Token,最终推出了一组整数解(如果不要求整数解也可以满足等价性):
\begin{equation}\gamma_1 = w+1,\quad\gamma_2=h+1\end{equation}
从如今的视角来看,RoPE-Tie的默认设置其实并不是很理想,所以本文重新选择了$\gamma_1=\gamma_2=1$,并确保等价性,然后反推出$\beta_1,\beta_2$。
那新方案有什么好处呢?首先,RoPE-Tie中图像内的相对位置跟它的大小有关,而新方案中Patch的间隔是固定的$(0,1)$和$(1,0)$,这可以让Patch的尺度更为一致。举个例子,一张128*128的图像以及该图的上半部份(即128*64的子图),由于两者高度不一样,所以RoPE-Tie后它们横向的位置间隔并不一样,这意味着同样位置、同样含义的两个Patch在加了RoPE-Tie后的距离(尺度)变得不一致了,这看起来并不合理,而新方案没有这个问题。
其次,RoPE-Tie中图像与左右文本的间隔,跟图像内部Patch的间隔一样都是$(\gamma_1,\gamma_2)$,而新方案中文本到图像、图像到文本之间会出现一个比较大的间隔$\frac{1}{2}(wh - h, wh-w)$,然后文本内部、图像内部则都是固定的均匀间隔。直觉上,这种不同模态之间比较大的位置跳跃,可以更好地实现“模态隔离”,让单个模型既能更好地处理单模态内容,又保留了多模态之间的交互,这跟我们通常在左右加[IMG]和[/IMG]两个Special Token来标记出图像具有异曲同工之处。
三维困境 #
在RoPE-Tie的文章中,并没有讨论到“文本-视频”混合模态的位置编码,这一节我们来补充讨论完整。
直观来看,对于视频输入我们可以有两种处理方式。第一种方式就是简单地将视频当成多张图片处理(必要时加个[VIDEO]、[/VIDEO]的标记),这样我们就不需要针对视频提出新的位置编码了,沿用“文本-图像”的混合位置编码结果就行,但这样丧失了同一视频不同帧之间的对齐关系,可能不是太完美,例如“第1帧的第1个Patch”跟“第2帧的第1个Patch”和“第1帧的第2个Patch”,应该有差不多的邻近关系,但展平当多张图片处理就体现不出这一点。
第二种方式则是将“文本-图像”的结果平行地推广到“文本-视频”中。对于一个$w\times h\times t$的视频(画面为$w\times h$,一共$t$帧),它的位置坐标是三维的$(x,y,z)$,根据相同的兼容性、等价性和对称性,我们可以将方程$\eqref{eq:beta-gamma}$推广成
\begin{equation}\begin{pmatrix}\beta_1 + \gamma_1 \\ \beta_2 + \gamma_2 \\ \beta_3 + \gamma_3\end{pmatrix} - \begin{pmatrix}L \\ L \\ L\end{pmatrix} = \begin{pmatrix}L+wht+1 \\ L+wht+1 \\ L+wht+1\end{pmatrix} - \begin{pmatrix}\beta_1 + h\gamma_1 \\ \beta_2 + w\gamma_2 \\ \beta_3 + t\gamma_3\end{pmatrix}\end{equation}
如果还是设$\gamma_1=\gamma_2=\gamma_3=1$,我们得到
\begin{equation}\beta_1 = L + \frac{1}{2}(wht - h),\quad \beta_2 = L + \frac{1}{2}(wht - w),\quad \beta_3 = L + \frac{1}{2}(wht - t)\end{equation}
这样做完整了保留了视频位置的三维性,看起来会更优雅一些,但笔者认为它仍有一些美中不足之处。
这个美中不足源于笔者对视频的时间维度的不同理解:视频的三维,实际上是“2个空间维度+1个时间维度”,跟真实世界的三维立体的“3个空间维度”不一样。按照笔者的观点,视频的时间维度跟两个空间维度是不平权的,时间维度更像是文本从左往右的书写方向,所以笔者想象中的完美多模态LLM,应该能像文本LLM续写文本一样,理论上能够以自回归的方式无限地续作视频,直到出现[EOS]标记。
刚才我们提了两种“文本-视频”混合编码方案,第一种直接当作多张图片处理,这种方案是可以无限自回归生成视频的,但第二种看上去更完美的方案反而不行,因为它的$\beta_1,\beta_2,\beta_3$是依赖于$t$的,这意味着我们需要提前知道生成多少帧的视频,换句话说,第二种方案并不是不能用自回归的方式生成视频,而是需要提前确定帧数,这在笔者看来是不符合时间维度的理想特性的(时间,应该可以无约束地往前推进)。
可能有读者疑问:为什么图像就不介意$\beta_1,\beta_2$中依赖于$w,h$呢?也就是说为什么图像生成不介意事先知道图像大小呢?这是因为图像有两个方向,就算我们用自回归的方式生成图像,也必须至少知道一个方向的大小,才能告诉模型及时“换行”,以生成一张完整的二维图像。而图像的两个空间维度是平权的,单知其一倒不如全部知道,所以我们能够接受事先确定图像大小。
此外,我们还可以用《“闭门造车”之多模态思路浅谈(一):无损输入》介绍的“AR+Diffusion”做“文本-图像”模型,此时图像生成部分是Diffusion,就必须提前知道目标图像大小了。
相关工作 #
前段时间,阿里开源了名为“Qwen2-VL”的多模态模型,介绍中提到自己提出了一种多模态旋转位置编码(M-ROPE),引起了笔者的兴趣。经过阅读源码(链接),发现M-RoPE实际上就是沿用了RoPE-Tie的兼容性思想,但没有保留对称性和等价性。
用本文的记号,M-RoPE实际上就是取了$\beta_1=\beta_2=\beta_3=L,\gamma_1=\gamma_2=\gamma_3$(对于“文本-视频”混合模态),然后视频右段的文本的第一个Token的位置,直接取视频最大的位置坐标加1。这样如果还是用自回归的方式生成视频,确实也不用提前确定帧数,但牺牲了对称性和等价性。
对称性和等价性有多重要呢?笔者不清楚答案,这需要充分实验来验证。但如果仅仅是头脑风暴的话,笔者猜测可能会影响极端情形的表现,比如对于M-RoPE来说,如果是画面很小但时间很长的视频,它的空间维度的位置坐标相对于左段文本来说是连续的,但相对于右段文本来说则是突变了,直觉上会使得文本和视觉的交互更不友好。
再比如一个$w=h=t=n$的视频,直觉上它等效于$n^3$个Token,但如果按照M-RoPE的规则,如果两段文本夹着这样一个视频,只是等价于夹着一个$n$个Token的文本,换言之在大小为$n$的相对距离内放下了$n^3$个Token,会不会导致信息密度过大而增加模型理解难度了?
当然,对于NoPE都可能Work的Decoder-only LLM来说,这些问题也可能是笔者多虑了。
文章小结 #
本文分享了笔者关于多模态位置编码的后续思考,提出了构建多模态位置编码的三个原则:兼容性、等价性和对称性,改进了之前提出过的RoPE-Tie,最后讨论了“文本-视频”混合模态的位置编码设计和困难,以及Qwen2-VL的M-RoPE与RoPE-Tie的联系等。
转载到请包括本文地址:https://spaces.ac.cn/archives/10352
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Sep. 06, 2024). 《“闭门造车”之多模态思路浅谈(三):位置编码 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/10352
@online{kexuefm-10352,
title={“闭门造车”之多模态思路浅谈(三):位置编码},
author={苏剑林},
year={2024},
month={Sep},
url={\url{https://spaces.ac.cn/archives/10352}},
}
September 6th, 2024
个人感觉对称性放弃了可能没什么关系。虽然作者的设计保证了“【图像第一个Patch】与【左段文本最后一个Token】的位置差,等于【右端文本第一个Token】与【图像最后一个Patch】的位置差”,但是这两个的位置差的和与$\beta_i$无关。因此M-RoPE可以认为是右边有个突变,而RoPE-TV则是两侧都有一个突变。总之多模态数据的位置和两侧文本的距离之和是一样的,就看个人取舍了。感觉就像是在word里图像是左对齐还是居中对齐问题。
等价性就有点难以评价了。图像与视频的信息密度确实比文本低,所以不等价也是可以的,但是如果一帧(一张图)就相当于1个token,感觉又太密了。
在写评论时想到,等价性和对称性其实就是通过$\beta_i,r_i$控制的(如果理解没错的话)。那么可以通过设置两侧距离都为1,这种紧密形式,我们可以得到$\beta_i,r_i$唯一解。
$
r_1 = \frac{1 - wh}{1 + h}\\
r_2 = \frac{1 - wh}{1 + w}\\
b_1 = L - \frac{1 - wh}{1 + h} + 1\\
b_2 = L - \frac{1 - wh}{1 + w} + 1
$
至于到底是模态隔离好、还是紧凑点好,就不得而知了。
1、对称性主要是审美上的追求,当然,对于单向注意力来说本身就没有对称性,所以这一点可能比较虚,但我一直以来的观点是位置编码本身跟注意力的单双向不挂钩的,如果是双向注意力,显然有对称性更为合理一些;
2、注意等价性的前提是我们已经经过合理的Patchify,“合理”的含义可以就理解为每个Patch的信息密度跟Token相近,所以实际上这里的等价性我认为是有必要的;
3、你这个解看起来还不如 https://kexue.fm/archives/10040 最后提的一个解,翻译到这里就是$\gamma_1=\frac{wh+1}{h+1},\gamma_2=\frac{wh+1}{w+1},\beta_1=\beta_2=L$,它的好处是图片内部、图片与文本之间的间隔都是相等的,但如本文对RoPE-Tie的分析所述,$\gamma_1,\gamma_2$跟$w,h$相关似乎不是一个很合理的选择。
读了第二点回复才理解苏神说的等价性到底是什么。我们默认patchify就是裁一个nxn的patch,这个patch就等价为1个token。至于它是否可以是合理的patchify,也就是图像token是否能和文本token等价,2个方向都可以解读。
可以等价:每个图像patch可以类比于文本中的未知词,就像我们可以将不在词表中的词通过UTF-8编码转换为1-4个token,我们同样可以将每个图像patch视为一个独立的token。
不可以等价:图像patch间的信息熵差异显著。如果我们将每个patch类比为一个nxn的字符矩阵,并为图像数据训练一个类似于文本的分词器,我们可能会发现某些复杂的patch需要多个token来表示,而简单的patch仅需很少的token。
第3点提到的我的解写错了,为了保证正确性,我还是把修正后的结果放上来:
$$r_1 = \frac{wh-1}{h-1}, \quad r_2 = \frac{wh-1}{w-1} \\ b_1 = L - \frac{wh-1}{h-1} + 1, \quad b_2 = L - \frac{wh-1}{w-1} + 1$$
重新读了原文,确实$r_i$和图像尺寸相关不太合理。
对模型来说,它不知道信息熵之类的概念,也不知道patch和token是否等价,但形式上patch和token都是用向量来表示的,所以形式上根本区分不出来,因此对于左右两段文本来说,它们确实相当于夹着$wh$个token。
苏神可以解释一下第三点为什么γ1,γ2跟w,h相关似乎不是一个很合理的选择吗?
文章已经有解释了啊
September 6th, 2024
虽然多模态token之间的相对关系能够通过rope建模了,但是AR的顺序计算关系还是感觉没有全局attention那么契合图像,visionllama和扩散表征那篇文章的效果不惊艳可能也和这个有关系,不知道未来有没有什么好方法。
另外,从理解生成统一建模的角度前两者也可以在内容token前先提前预测好长宽和帧数,而mrope其实也需要几个token来表示换行换帧,区别只是一个提前预测一个“实时”预测罢了,不知道这么理解有没有什么问题。
另外感觉m-rope虽然压缩了token间的距离,但是也带来多模态输入的长上下文外推优势,有点类似于之前的局部内插方案,。
你说的这个是RoPE本身的优势吧,本文说的方案都有这个优势吧。
我目前预期的方案,可能是文本以及视频的时间维度用AR生成,图片以及视频的单帧用Diffusion生成,最终模型应该是AR+Diffusion的混合模型,这样图片内部就是双向的了,没有方向选择问题,而文本和视频的时间维度本身就是一个天然的方向,可以利用起来做AR。
必要时还可以将Diffusion部分从AR的Transformer部分解耦出来,如同 https://arxiv.org/abs/2403.05196 一样。
苏老师如何看待这个研究?这种图像Visual AutoRegression的方法有没有可能集成到MM-LLM中?
https://arxiv.org/abs/2404.02905
https://github.com/FoundationVision/VAR
VAR怎么说呢,我觉得它只是相比普通的“离散化+AR”思路采样速度更快,除此之外相比AR或者Diffusion均无特别优势。
September 7th, 2024
苏老师,如何理解《3D-RPE: Enhancing Long-Context Modeling Through
3D Rotary Position Encoding》这篇文章,用于多模态位置编码有何优劣
3D-RPE看上去只是把chunck也引入到了RoPE的定义中,它本身就只是一种用于一维序列的位置编码吧
可能不太正确,我理解的是:他的做法是多了一个新的旋转矩阵R,相当于对原始的q,k做了两步旋转,正好能对应上二维的序列。这样一来,任意的图像/文本的位置坐标都能使用它这种建模方式?
你得理解它新引入部分的含义,不能听风就是雨。它新引入的就是文本的chunck信息,可以理解为这是用于文本(一维序列)的层次RoPE,层次RoPE本身就具有RoPE-2D的形式,但就它本身的设计而已,它就是一种一维序列的位置编码。
受教了,感谢苏老师!
September 8th, 2024
其实有一个简单的办法:
目前常见的LLM,每个head的维度是128,可以分别用64+32+32个通道,分别编码t+x+y(时间+宽+高)共三个维度。32个维度编码图片的宽、高,其实足够用了(图片宽、高通常不会超过10K)。
这样,n个文本token的位置编码分别为(0,0,0)到(n-1,0,0),
接下来的图片的位置编码范围为以(n,-W/2,-H/2)和(n,W/2,H/2)为对角顶点的矩形,
再接下来的文本tokens的位置编码则从(n+1,0,0)开始排列。
文本和图片的排列类似: -----|-----------。
文本和视频的排列则类似这样:------------|||||||||||--------------。
这样,略微牺牲了一点等价性和兼容性,但对称性得到满足,而且符合直觉:图片的tokens应当编码在x,y维度,文本和视频的tokens应该编码在时间维度上。
这种方案我也想过,其实跟 https://kexue.fm/archives/10040#%E7%BB%9F%E4%B8%80%E5%8D%87%E7%BB%B4 中的排版方案类似,即统一升到最高维,但文本多出来的二、三维统一使用一个数字。除开兼容性外,总感觉文本这样是用同一个数字不大好。
比如“文本-视频”混合,对于文本,二、三维是不变的,但视频的二、三维则是变的,总感觉不大科学,除非它们的attention能隔离开来。但隔离开来的话,只能用不同的head分别存x,y,z的方案了,但这样每个head获取不到完整的位置信号,不知道会不会有别的隐藏问题。
但文本多出来的二、三维统一使用一个数字。除开兼容性外,总感觉文本这样是用同一个数字不大好
-> 对于纯文本而言,相当于在64个维度上进行RoPE,在另外64个维度上维持原样。您之前提到过,仅在部分维度上编码RoPE,收益有可能是正的。
“文本-视频”混合,对于文本,二、三维是不变的,但视频的二、三维则是变的,总感觉不大科学
-> 如果视频/图像的位置位于(-w/2,-h/2)到(w/2,h/2)之间的话,无论是前文,还是后文文本的位置就位于视频/图像的中心点附近,这样,直觉上,文本与视频/图像中心点patch的之间的距离最近,衰减最少,越靠边缘的patch,与文本token之间的衰减就越多,这符合大部分图片/视频的中间区域比边缘区域更重要的这一先验,在我看来也比“前文tokens与上边/左上角的patch离得更近、后文tokens与下边/右下角的patch离得更近”这些“人工2D排版”方案更合理一点。
但隔离开来的话,只能用不同的head分别存x,y,z的方案了
-> 个人不看好这种方案。之前在ViT中试过不同head选用不同base的RoPE,但这样的话,为使相同距离的两个token之间的注意力达到最大,不同head中weight/bias的尺度会有较大差异,对训练稳定性有干扰。另外一方面,人为指定某些head用于学习x,y的位置,某些head用于学习z的位置,相当于引入不必要的先验?
1、你说Partial RoPE的话,它是所有token/patch都在部分维度保持NoPE才有的好处,文本部分NoPE、图片部分RoPE-2D这样的组合不见得一定会有这个好处;
2、跟图片中心对齐,这个视角倒是很独特,也有一定的道理,受教了!但我始终对“文本部分保持不变”、“视觉部分保持变化”这一特点感到有点奇怪,这样一来“变”与“不变”的比例太不均匀了;
3、我同样对该方案表示怀疑,但你说的“人为指定某些head用于学习x,y的位置,某些head用于学习z的位置,相当于引入不必要的先验”其实并不存在,因为head本身也是无序的,所以只要保持接近平均分配,就不会存在过度的先验问题。
受教了,谢谢苏老师。
2. 个人认为,只要想把patch和tokens统一编码,这个问题是无法避免的。因为不管1d RoPe还是2d ROPE,本质上都是先把坐标从R^1或R^2映射到R^{d/2},再统一进行旋转。这样,如果要同时保持1d序列和2d序列的平移不变性,第一步的映射必然是线性映射。这样,一定能找到R^{d/2}内一个垂直于文本编码方向的超平面,图像patches在这个平面内坐标发生改变。
嗯嗯,从一条线到一个面转变,确实很难做到完全优雅
苏老师,我又想了一下,同时满足兼容性、对称性、等价性的方案是存在的,但考虑图片或视频patches的信息冗余,是否需要严格满足等价性呢?我的想法发表在https://zhuanlan.zhihu.com/p/2912148838,苏老师有时间的话请指教。
1、同时满足兼容性、对称性、等价性的方案肯定存在啊,本文说的方案也是满足的,难度在于不提前预见生成图片/视频的长度;
2、你知乎说的方案确实也是个思路,但如果选择跟中心对齐的话,即便牺牲等价性,其实也需要提前预见生成图片/视频的长度(除非改为从中心向四周地自回归生成,这倒也是一个选择)。
这样做有一个很大的难点在于,图文多模态还可以这样搞,后面加入其他模态呢,搞出4、5种类的模态呢,还可以继续拆分通道么
对,有这个问题,所以可能最终的方案更多的可能是像 https://kexue.fm/archives/10040 说的排版法,直接按照人类可读的2D/3D排版来编码。
September 9th, 2024
苏神,请教下大语言模型中用的是类似于二维空间的旋转,多模态情形下为什么不考虑将其进一步升维到三维空间的旋转呢?
你可能没完全理解RoPE的定义和多模态位置编码问题,建议再多理解理解。
September 18th, 2024
多模态的位置编码,感觉应该考虑一下图片的一个的分割块所包含的信息量应该与一个词向量的信息量基本相当,如果考虑描述一个图片需要两句16个字的话,那么一幅图就可以分为4*4=16块,或者统一考虑,文本序列位置用时序代表,图片就是一系列的token排列在二维的位置上,不带时间,视频是图片,加上时序,多模态的处理相当于预测在下一个时序的token是什么,出现在哪里
这个是Patchify该考虑的事情,位置编码已经假设了Patchify的合理性。
September 20th, 2024
大佬您好,我想请教一下Transformer应用到NLP的时候,对一个batch中的词组对齐,在Encoder中的Softmax之后的得到的attn矩阵最后几行对齐补全的数据不是0,因此也会聚合其他行的信息,但是这些行按理说只是补全的数据而不是原始token的数据,这样会产生噪音吗,我看好像没有对此处理的,只有padding mask 对token中对齐的列进行掩码,但是token中在对齐完成后添加的行数据却没有处理。
cross attention也有attention mask的,你可能没看仔细。如果真的没处理,那就是作者的问题。
October 11th, 2024
「但第二种看上去更完美的方案反而不行,因为它的β1,β2,β3是依赖于t的,这意味着我们需要提前知道生成多少帧的视频,换句话说,第二种方案并不是不能用自回归的方式生成视频,而是需要提前确定帧数,这在笔者看来是不符合时间维度的理想特性的(时间,应该可以无约束地往前推进)」这部分不是很理解,提前知道生成多少帧的视频感觉是一个很自然的约束,生命和电视剧都有结束,为啥时间应该可以无约束地往前推进?
就好比写一部小说,作者也无法事先估计自己要多少个字,多一个不行,少一个也不行,这是不存在的,电影有个大概时间,但也不是事先精确到多少秒甚至多少毫秒,甚至电影也会有续集。
当然,这些原因其实都不是太本质,最本质的原因是天然具备的单向维度,我们总想让它有无限续写的潜能,就像“生命不息,生活不止”一样。
October 13th, 2024
还想探讨一个问题,https://github.com/huggingface/transformers/blob/1759bb9126e59405f58693a17ef9f58040c2008b/src/transformers/models/qwen2_vl/modeling_qwen2_vl.py#L143 里 rotate_half的实现是不是有bug呀?
def rotate_half(x):
"""Rotates half the hidden dims of the input."""
x1 = x[..., : x.shape[-1] // 2]
x2 = x[..., x.shape[-1] // 2 :]
return torch.cat((-x2, x1), dim=-1)
def apply_multimodal_rotary_pos_emb(q, k, cos, sin, mrope_section, unsqueeze_dim=1):
# ...
q_embed = (q * cos) + (rotate_half(q) * sin)
k_embed = (k * cos) + (rotate_half(k) * sin)
return q_embed, k_embed
应该是按照下面方式吧?如果理解错恕我眼拙:
$$
R_{\Theta, m}^d x =
\begin{pmatrix}
x_1 \\
x_2 \\
x_3 \\
x_4 \\
\vdots \\
x_{d-1} \\
x_d \\
\end{pmatrix}
\otimes
\begin{pmatrix}
\cos m \theta_1 \\
\cos m \theta_1 \\
\cos m \theta_2 \\
\cos m \theta_2 \\
\vdots \\
\cos m \theta_{d/2} \\
\cos m \theta_{d/2} \\
\end{pmatrix}
+
\begin{pmatrix}
-x_2 \\
x_1 \\
-x_4 \\
x_3 \\
\vdots \\
-x_d \\
x_{d-1} \\
\end{pmatrix}
\otimes
\begin{pmatrix}
\sin m \theta_1 \\
\sin m \theta_1 \\
\sin m \theta_2 \\
\sin m \theta_2 \\
\vdots \\
\sin m \theta_{d/2} \\
\sin m \theta_{d/2} \\
\end{pmatrix}
$$
喔喔,我找到解释了 https://github.com/huggingface/transformers/issues/25199
November 12th, 2024
老师好,想请教您一下应该如何对三维物体的坐标直接应用旋转位置编码。我是做三维物体理解方面的,处理的数据经常是点云。由于点云是无序的,没有序列里所谓第几个token的这种序号信息,因此我想将其坐标作为序号,进行编码,不过要对x,y,z分别进行,举例来说,一个token对应的一个dim维的位置编码类似于(sinx1, cosx1, siny1, cosy1, sinz1, cosz1……),这个思路进行三角位置编码是可行的,尝试下来效果不错。但是基于这样的三角位置编码进行旋转位置编码我不知道应该怎样做,我尝试简单地把上述的RoPE-2d再多增加一个
[coszθ_0, -sinzθ_0,
sinzθ_0, coszθ_0],但是效果比三角编码差了很多,还想到或许把二维的旋转编码都变成三维绕轴旋转的公式,这样就是3+3+3,9个为一组,但是代码写起来有些复杂,也不知道是否有道理。我想我没有真正理解,希望老师能指点一二,谢谢!