---
# System prepended metadata

title: 讨论 2023-07-17
tags: [Fudan, tutorials, '2023']

---

讨论 2023-07-17
=

# Attention机制浅析 （一）
本次分享主要介绍注意力机制的发展历史和关键性质，第一讲以单头注意力为主，第二讲会侧重多头注意力。

## 点乘注意力与加法注意力

假如序列输入为$X=\{x_0, x_1, \cdots, x_n \}$，早期的注意力机制和我们现在transformer里面的形式其实不同，以加法注意力为代表。

\begin{align}
\alpha_{ij} = v^T \tanh(W[x_i, x_j])
\end{align}

而我们现在常用的点乘注意力为，

\begin{align}
\alpha_{ij} =& \frac{Q_i K_j^T}{\sqrt{d}} \\
=& \frac{x_i W_Q W_K^T x_j^T}{\sqrt{d}}
\end{align}

其实两种注意力的优劣并不明确，严格来说，第一种方式的变换更加复杂，并且可以拓展成多层网络来加强非线性，但其计算更为复杂。研究者们近年来采用后者更多的主要原因是其计算更加高效。

## 独立的二元关系

我们观察 $x_i W_Q W_K^T x_j^T$，可以发现这其实是一个典型的双线性函数的矩阵形式。

我们知道一元线性函数有 $$f(a+b) = f(a) + f(b) $$

而二元线性函数（双线性）就是 $$f(x, a+b) = f(x, a) + f(x, b) $$ 和 $$f(a+b, y)=f(a, y)+ f(b, y) $$

而其定义的矩阵形式就是 $A = xWy^T$，因为$A_{ij} = x_i W_{ij} y_j$，恰好满足双线性。

我们可以进一步考虑下双线性的含义就是可拆分，我们考虑把序列分为前半段和后半段$x^0, x^1$（补零）,那么$f(x, x^0+x^1)=f(x, x^0)+f(x, x^1)$，也就是说双线性函数对一个序列的处理是可以拆分的。同理，我们会发现任何两个token之间的关系都是独立的，互不干扰。

## 非独立的二元关系

在自然语言中，我们往往认为语义理解是有复杂性的，或者说是非组合性，即$f(ABC) != g(f(A), f(B), f(C))$，其中g为线性变换，在实践中也可以认为g很难用简单的非线性，即浅层网络建模。那么上面介绍的独立二元关系建模明显是不足以覆盖语言的复杂性的。为此，我们可以考虑非独立的二元关系，即ab之间的关系会影响cd之间的关系。

我们目前普遍使用的注意力只考虑列相关性，即ab和ac之间的关系不独立，这便是由softmax函数引入的，$$\alpha = softmax (\alpha)$$，其中$$\alpha_i = \frac{\exp{\alpha_i}}{\sum_j \exp{\alpha_j}}$$

而考虑ab, cd之间的关系，即行列相关性都考虑方法也是有的，只不过在注意力机制中应用的比较少，常见的代表有sinkhorn normalization

考虑行相关性的也有，比如capsule network

关于非独立二元关系的分析其实不多，因为目前学者们普遍认为自然语言有复杂性，但具体多复杂，需要什么样的数学模型来建模，其实很模糊。也就很难谈论上述构建非独立关系的方法好不好。

## 门机制与注意力机制
因为softmax之后，其实我们添加了两个变量，一个是exp的非线性，一个是我们说的不同二元关系之间的相关性。

这一问题之前的学者也有过探讨，其中有代表性的就是门机制在序列上的应用，即$$\alpha = sigmoid(\alpha) $$，即$$\alpha_i = \frac{1}{1+ \exp - \alpha_i}$$

可以看到，这种方法引入了非线性，但还是保留了二元关系之间的独立性。有部分工作汇报这种方法和注意力机制相比也是有竞争力的，但是目前普遍观察还是这种方法比softmax弱一些。所以目前的研究认为非独立的二元关系是有帮助的。