为什么Transformer / ViT 中的Position Encoding能和Feature Embedding直接相加?

31 篇文章 13 订阅
4 篇文章 7 订阅

前言

刚开始学习Transformer / ViT的时候会发现为什么作者会将Position Encoding直接和Feature Embedding相加?当时的第一反应是,为什么不是concat,因为两者分明是两种异构的信息,为什么能放在一起相加呢?不应该concat才合理么?最近对一些工作做收尾的时候发现了这个后来被我遗漏的问题。(如果不知道Position Encoding是啥的建议先去阅读一下原论文)

问题

从向量空间的角度来看,我原本有一个Feature Embedding向量矩阵,我再加上一个Position Encoding,那不就意味着我原本的Feature Embedding向量的大小和方向都发生了变化么?而Positon Encoding代表的是Feature Embedding中的每个feature的相对/绝对位置,直觉上来讲,在通道维上concat是一个符合深度学习逻辑的操作,那么为什么原文作者最后选择了直接对两者做相加呢?

推理

以语句为例,首先,我们先尝试用concat的方法。我们给原始输入向量的每个位置x^i \in R^{(d,1)} concat上一个代表位置信息的向量p^i \in R^{(N,1)} (N代表共有N个位置)形成x^i_p \in R^{(d+N, 1)},它也可以表示为[[x^i]^T, [x^p]^T]^T这个形式。

接着,对这个新形成的向量做变化,比如linear projection。

记变换矩阵 W \in R^{(d, d+N)}d 就是需要变换到的维度(这里为了方便,直接假设原输入的维度与嵌入维度一致,都是d),它也可以表示为[W^I, W^P],其中W^I \in R^{d,d}, W^P \in R^{d,N}

现在进行变换:

W \cdot x_p^i = [W^I, W^P] \cdot [[x^i]^T, [x^p]^T]^T = W^I \cdot x^i + W^P \cdot x^p = embed^i + pos^i

其中,embed^i就是对原始输入做了嵌入之后的向量,而pos^i就是对位置向量做了嵌入之后的表示。即 Feature Embedding 和 Position Encoding。

于是,由变换结果可知,在原始向量上concat一个代表位置信息的向量,再经过变换,最终的效果等价于:先对原始输入向量做变换,然后再加上位置嵌入。

另一方面,concat会使网络进入深层之后参数量剧增,这是很不划算的。

Transformer,输入序列的每个token都会先进行一个embedding操作,将其转换为一个高维度的向量表示。这个embedding操作通常使用一个简单的线性变换来完成。然后,为了考虑序列token的顺序信息,我们需要将每个token的embedding与一个位置编码相加。这个位置编码是一个固定的向量,它的值是根据该位置的位置索引计算得到的。 具体来说,假设我们有一个输入序列 $x = [x_1, x_2, ..., x_n]$,其 $x_i$ 是第 $i$ 个token的编号,$d_{model}$ 是embedding的维度。那么,我们可以先对每个token进行一个embedding操作,得到一个 $d_{model}$ 维的向量表示,即: $$ \textbf{E}_x = [\textbf{e}_1, \textbf{e}_2, ..., \textbf{e}_n] $$ 其,$\textbf{e}_i$ 是 $x_i$ 的embedding向量。 然后,我们需要为每个位置 $i$ 计算一个位置编码 $\textbf{p}_i$,它的维度也是 $d_{model}$。具体计算方式如下: $$ \begin{aligned} \textbf{p}_{i, 2j} &= \sin \left(\frac{i}{10000^{2j/d_{model}}}\right) \\ \textbf{p}_{i, 2j+1} &= \cos \left(\frac{i}{10000^{2j/d_{model}}}\right) \end{aligned} $$ 其,$i$ 是位置索引,$j$ 是embedding向量的维度索引。这个公式的含义是,对于每个位置和每个维度,我们使用一个不同的正弦或余弦函数来计算位置编码的值。 最后,我们将每个token的embedding向量和其对应的位置编码向量相加,得到最终的token表示,即: $$ \textbf{x}_i = \textbf{e}_i + \textbf{p}_i $$ 这样,我们就完成了embedding和位置编码的结合。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越胖的GuanRunwei

祝老板们身体健康,财源广进!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值