形象解释Transformer中的自注意力机制

        我们以下面这句话为例子来说明一下Transformer中的自注意力机制:

我 是 小 狗

一、将token嵌入

        首先要将每一个字(token)嵌入为一个向量,这里可以采用one-hot编码等。假设每个嵌入向量的维度都为512维。我们将“我”表示为vec_{0}\in \mathbb{R}^{1\times 512},“是”嵌入的向量表示为vec_{1}\in \mathbb{R}^{1\times 512}...那么由所有嵌入向量组成的嵌入矩阵就为:


$\begin{bmatrix} vec_{0} \\ vec_{1}\\vec_{2}\\vec_{3}\end{bmatrix}_{4\times 512}$

        将该嵌入矩阵(Input Embedding)加上位置编码就得到了输入矩阵,将该矩阵记作W_{in},表示为:

$\begin{bmatrix} vec_{0}^{'} \\ vec_{1}^{'}\\vec_{2}^{'}\\vec_{3}^{'}\\\end{bmatrix}_{4\times 512}$

二、生成Q、K、V向量

        我们首先随机生成三个矩阵W_{Q}\in \mathbb{R}^{512\times d_{k}}W_{K}\in \mathbb{R}^{512\times d_{k}}W_{V}\in \mathbb{R}^{512\times d_{v}},意为Query、Key以及value,他们的第一维度一定都为512维(要与W_{in}相乘),我们假设它的第二维度都是64维,即d_{k}=d_{v}=64(与原始论文一致)。它们的作用相当于神经网络中各层的权重,是要逐渐地被训练的。将W_{in}和以上三个矩阵分别相乘得到了Q、K、V三个矩阵,即最上面图片中的"Scaled Dot-Product Attention"中的三个输入。

Q=\begin{bmatrix} vec_{0}^{'} \\ vec_{1}^{'}\\vec_{2}^{'}\\vec_{3}^{'}\end{bmatrix}_{4\times 512}\cdot \left [ W_{q} \right ]_{512\times 64}= \begin{bmatrix} vec_{0}^{'}\cdot W_{q} \\ vec_{1}^{'}\cdot W_{q}\\vec_{2}^{'}\cdot W_{q}\\vec_{3}^{'}\cdot W_{q}\\\end{bmatrix}_{4\times 64}=\begin{bmatrix} Q_{0} \\ Q_{1}\\Q_{2}\\Q_{3}\end{bmatrix}_{4\times 64}

        其中Q_{0}是"我"的Query向量,Q_{1}是"是"的Query向量......

K=\begin{bmatrix} vec_{0}^{'} \\ vec_{1}^{'}\\vec_{2}^{'}\\vec_{3}^{'}\end{bmatrix}_{4\times 512}\cdot \left [ W_{k} \right ]_{512\times 64}= \begin{bmatrix} vec_{0}^{'}\cdot W_{k} \\ vec_{1}^{'}\cdot W_{k}\\vec_{2}^{'}\cdot W_{k}\\vec_{3}^{'}\cdot W_{k}\\\end{bmatrix}_{4\times 64}=\begin{bmatrix} K_{0} \\ K_{1}\\K_{2}\\K_{3}\end{bmatrix}_{4\times 64}

V=\begin{bmatrix} vec_{0}^{'} \\ vec_{1}^{'}\\vec_{2}^{'}\\vec_{3}^{'}\end{bmatrix}_{4\times 512}\cdot \left [ W_{v} \right ]_{512\times 64}= \begin{bmatrix} vec_{0}^{'}\cdot W_{v} \\ vec_{1}^{'}\cdot W_{v}\\vec_{2}^{'}\cdot W_{v}\\vec_{3}^{'}\cdot W_{v}\end{bmatrix}_{4\times 64}=\begin{bmatrix} V_{0} \\ V_{1}\\V_{2}\\V_{3}\end{bmatrix}_{4\times 64}

三、MatMul

        然后将Q和K的转置相乘:

Q\cdot K^{T}=\begin{bmatrix} Q_{0} \\ Q_{1}\\Q_{2}\\Q_{3}\end{bmatrix}_{4\times 64} \cdot \begin{bmatrix} K_{0} &K_{1}&K_{2}&K_{3}\end{bmatrix}_{64\times 4}

                           =\begin{bmatrix} Q_{0} \cdot K_{0} & Q_{0} \cdot K_{1} &Q_{0} \cdot K_{2} & Q_{0} \cdot K_{3} \\ Q_{1}\cdot K_{0} & Q_{1}\cdot K_{1} & Q_{1}\cdot K_{2} &Q_{1}\cdot K_{3} \\Q_{2}\cdot K_{0} & Q_{2}\cdot K_{1} &Q_{2}\cdot K_{2}&Q_{2}\cdot K_{3} \\Q_{3}\cdot K_{0} & Q_{3}\cdot K_{1} &Q_{3}\cdot K_{2}&Q_{3}\cdot K_{3}\end{bmatrix}_{4\times 4}

        我们知道Q_{i}\cdot K_{j}相当于是Q_{i}K_{j}上的投影,投影数值的大小反映了token_{i}token_{j}的注意力大小。在该矩阵中第i行反映了token_{i}对其他token的注意力大小(包括自己)。

四、Scale

        这一步就是简单地将Q\cdot K^{T}的值除以\sqrt{d_{k}}(原论文中采用的),这样做的目的是防止向量内积过大(因为这些大数值在缩放后要通过softmax函数,由于softmax函数的性质,它会放大数值差异,导致数值稳定性问题。在反向传播时,这可能会导致梯度消失或爆炸)。

\frac{Q\cdot K^{T}}{\sqrt{d_{k}}}=\frac{1}{8}\begin{bmatrix} Q_{0} \cdot K_{0} & Q_{0} \cdot K_{1} &Q_{0} \cdot K_{2} & Q_{0} \cdot K_{3} \\ Q_{1}\cdot K_{0} & Q_{1}\cdot K_{1} & Q_{1}\cdot K_{2} &Q_{1}\cdot K_{3} \\Q_{2}\cdot K_{0} & Q_{2}\cdot K_{1} &Q_{2}\cdot K_{2}&Q_{2}\cdot K_{3} \\Q_{3}\cdot K_{0} & Q_{3}\cdot K_{1} &Q_{3}\cdot K_{2}&Q_{3}\cdot K_{3}\end{bmatrix}_{4\times 4}

五、Mask(可选)

        从前面的推导可以得知,Transformer会同时计算每一个token对其他所有token的注意力。但是当我们进行预测时,我们是不能看到(注意到)当前token往后的所有token的,所以不能计算当前token对后面的token的注意力。方法就是将\frac{Q\cdot K^{T}}{\sqrt{d_{k}}}中的上三角区域(除去主对角线)全部变为-inf,这样在进行softmax后值为-inf的部分就全部变为0。

Masked (\frac{Q\cdot K^{T}}{\sqrt{d_{k}}})=\frac{1}{8}\begin{bmatrix} Q_{0} \cdot K_{0} & -inf & -inf & -inf \\ Q_{1}\cdot K_{0} & Q_{1}\cdot K_{1} & -inf & -inf \\Q_{2}\cdot K_{0} & Q_{2}\cdot K_{1} &Q_{2}\cdot K_{2}& -inf\\Q_{3}\cdot K_{0} & Q_{3}\cdot K_{1} &Q_{3}\cdot K_{2}&Q_{3}\cdot K_{3}\end{bmatrix}_{4\times 4}

六、Softmax

        用softmax将每一行转换为一个概率分布,每行中的所有元素和为1。

Softmax(\frac{Q\cdot K^{T}}{\sqrt{d_{k}}})=\begin{bmatrix} \frac{e^{Q_{0}\cdot K_{0}}}{\sum\limits^{i=3}_{i=0}e^{Q_{0}\cdot K_{i}}}&\frac{e^{Q_{0}\cdot K_{1}}}{\sum\limits^{i=3}_{i=0}e^{Q_{0}\cdot K_{i}}}&\frac{e^{Q_{0}\cdot K_{2}}}{\sum\limits^{i=3}_{i=0}e^{Q_{0}\cdot K_{i}}}&\frac{e^{Q_{0}\cdot K_{3}}}{\sum\limits^{i=3}_{i=0}e^{Q_{0}\cdot K_{i}}} \\ \frac{e^{Q_{1}\cdot K_{0}}}{\sum\limits^{i=3}_{i=0}e^{Q_{1}\cdot K_{i}}}&\frac{e^{Q_{1}\cdot K_{1}}}{\sum\limits^{i=3}_{i=0}e^{Q_{1}\cdot K_{i}}}&\frac{e^{Q_{1}\cdot K_{2}}}{\sum\limits^{i=3}_{i=0}e^{Q_{1}\cdot K_{i}}}&\frac{e^{Q_{1}\cdot K_{3}}}{\sum\limits^{i=3}_{i=0}e^{Q_{1}\cdot K_{i}}}\\\ \frac{e^{Q_{2}\cdot K_{0}}}{\sum\limits^{i=3}_{i=0}e^{Q_{2}\cdot K_{i}}}&\frac{e^{Q_{2}\cdot K_{1}}}{\sum\limits^{i=3}_{i=0}e^{Q_{2}\cdot K_{i}}}&\frac{e^{Q_{2}\cdot K_{2}}}{\sum\limits^{i=3}_{i=0}e^{Q_{2}\cdot K_{i}}}&\frac{e^{Q_{2}\cdot K_{3}}}{\sum\limits^{i=3}_{i=0}e^{Q_{2}\cdot K_{i}}}\\\frac{e^{Q_{3}\cdot K_{0}}}{\sum\limits^{i=3}_{i=0}e^{Q_{3}\cdot K_{i}}}&\frac{e^{Q_{3}\cdot K_{1}}}{\sum\limits^{i=3}_{i=0}e^{Q_{3}\cdot K_{i}}}&\frac{e^{Q_{3}\cdot K_{2}}}{\sum\limits^{i=3}_{i=0}e^{Q_{3}\cdot K_{i}}}&\frac{e^{Q_{3}\cdot K_{3}}}{\sum\limits^{i=3}_{i=0}e^{Q_{3}\cdot K_{i}}}\end{bmatrix}_{4\times 4}   =\begin{bmatrix} p_{00} & p_{01}&p_{02} & p_{03} \\ p_{10}& p_{11}& p_{12}&p_{13}\\p_{20}&p_{21}&p_{22}&p_{23}\\p_{30}&p_{31}&p_{32}&p_{33}\end{bmatrix}_{4\times 4}

        其中p_{ij}表示了一个权重,即token_{i}应该放多少比例的注意力到token_{j}上。例如当\frac{Q\cdot K^{T}}{\sqrt{d_{k}}}进行Mask和Softmax操作后,它的第一行会变成[1 \ 0\ 0\ 0],也就是说token_{0}应该把全部注意力放在token_{0}上,而对于其他token则不应该关注。

七、MatMul

        将这个比例再乘以value(值)矩阵V进行点乘,得到了注意力Attention(Q,K,V)的最终形式:

        Softmax(\frac{Q\cdot K^{T}}{\sqrt{d_{k}}})V=\begin{bmatrix} p_{00} & p_{01}&p_{02} & p_{03} \\ p_{10}& p_{11}& p_{12}&p_{13}\\p_{20}&p_{21}&p_{22}&p_{23}\\p_{30}&p_{31}&p_{32}&p_{33}\end{bmatrix}_{4\times 4}\cdot \begin{bmatrix} V_{0} \\ V_{1}\\V_{2}\\V_{3}\end{bmatrix}_{4\times 64}

                                                           =\begin{bmatrix} p_{00}V_{0}+p_{01}V_{1} +p_{02}V_{2}+p_{03}V_{3} \\ p_{10}V_{0}+p_{11}V_{1} +p_{12}V_{2}+p_{13}V_{3}\\p_{20}V_{0}+p_{21}V_{1} +p_{22}V_{2}+p_{23}V_{3}\\p_{30}V_{0}+p_{31}V_{1} +p_{32}V_{2}+p_{33}V_{3} \end{bmatrix}_{4\times 64}             

        第一行由四项相加,即token_{0}应该放到token_{0}上的注意力比例乘以token_{0}的值

                                        + token_{0}应该放到token_{1}上的注意力比例乘以token_{1}的值

                                        + token_{0}应该放到token_{2}上的注意力比例乘以token_{2}的值

                                        + token_{0}应该放到token_{3}上的注意力比例乘以token_{3}的值

        若该结果和V_{1}比较接近,则说明p_{01}的值很接近1,而其他p_{0i}则很接近于0,则token_{0}更应该把注意力放到token_{1}上。总而言之就是重要的信息更关注,不重要的信息被忽视了,这时我们就能根据该值来更好地进行预测。        

### 多头注意力机制与多头自注意力机制 #### 概念 多头注意力机制是 Transformer 架构中的核心组件之一,通过对单一注意力机制的扩展来增强模型的表现力。具体来说,该机制允许模型在同一层内通过多个不同的“头”并行处理输入序列的不同方面,从而捕捉更丰富的特征表示[^2]。 多头自注意力机制则是指在特定情况下应用于同一序列内部的关系建模过程。在这种模式下,所有的查询(Query)、键(Key)以及值(Value)都来源于相同的输入序列。这意味着它能够帮助网络更好地理解单个句子或文档内的词间依赖关系[^1]。 #### 区别 主要区别在于应用场景: - **多头注意力**可以用于不同源的信息融合场景,比如机器翻译任务中编码器和解码器之间交互时采用的形式;此时查询来自目标语言序列而键和值则来自于源语言序列。 - **多头自注意力**专门针对同一条数据记录内部结构的学习,在自然语言处理领域常被用来分析一段文字里各个部分之间的关联程度。这种形式特别适用于那些需要深入挖掘文本内在逻辑的任务,如问答系统、情感分类等[^3]。 #### 解释 为了形象化这两种方法的区别,可以用晚宴安排的例子来进行说明。假设正在策划一次聚会,并且要确定客人们如何就座。如果只考虑一种因素——例如兴趣爱好相似度,则类似于执行简单的自注意操作;但如果综合考量多种属性(年龄、职业背景等等),分别给予适当权重后再做决策,这就相当于实现了多维度下的多头注意力评估方式。 ```python import torch.nn as nn class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super(MultiHeadAttention, self).__init__() assert d_model % num_heads == 0 self.d_k = d_model // num_heads self.num_heads = num_heads # ...其余实现细节... def multi_head_self_attention(query_value_key_matrix): """模拟一个多头自注意力模块""" pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lpy0204

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值