如何理解transformer中mask多头注意力机制 -masked multi-head attention 详解

1.masked multi-head attention用来干什么?作用是啥?

一句话,需要mask掩码来实现并行训练。

2. 那并行化有什么用?

可以用来加速模型的训练过程。

举个栗子。

假设我们要训练一个翻译模型,将英文"I love you"翻译成德文"Ich liebe dich"。编码器以并行模式工作 - 它可以在恒定数量的步骤内生成输入序列("I love you")的向量表示(步骤的数量不取决于输入序列的长度)。

假设编码器生成了向量表示为11、12、13(分别代表I love you,实际上,这些向量会更长,因为我们忽略了其它标记,如-序列的开始、-序列的结束等),但为简单起见,我们使用了短向量。

在训练期间,我们知道I love you翻译成德语,应该是"Ich liebe dich"(在训练期间我们总是知道期望的输出,也就是监督学习)。假设"Ich liebe dich"这些词的向量表示是21、22、23。

I     love   you

11、12、13

Ich liebe dich

21、22、23

如果我们使解码器的训练在顺序模式下进行,它将类似于循环神经网络的训练。将执行以下顺序步骤:

  1. 顺序操作 #1. 输入:11, 12, 13。尝试预测21。预测的输出不会完全是21,假设它是21.1。
  2. 顺序操作 #2. 输入:11, 12, 13,以及上一个输出21.1。尝试预测22。预测的输出不会完全是22,假设它是22.3。
  3. 顺序操作 #3. 输入:11, 12, 13,以及上一个输出22.3。尝试预测23。预测的输出不会完全是23,假设它是23.5。

这意味着我们需要进行3个操作(通常情况下,每个输入需要执行一个操作)。此外,每次迭代都会有累积误差。

此外,我们不使用注意力机制,因为我们只关注单个先前的输出。

由于我们实际上知道期望的输出(是21、22、23),所以我们可以调整这个过程,直接并行化操作输入。而不用等待前一步的输出。

并行操作 #A. 输入:11, 12, 13。尝试预测21。

并行操作 #B. 输入:11, 12, 13,以及21。尝试预测22。

并行操作 #C. 输入:11, 12, 13,以及21, 22。尝试预测23。

这个算法可以并行执行,而且不会累积误差。这个算法使用了注意力机制(即查看所有先前的输入),因此在进行预测时可以考虑上下文的更多信息。

这就是我们需要掩码的地方。训练算法知道整个期望的输出(21, 22, 23)。它为每个并行操作隐藏(掩码)已知输出序列的一部分。

当执行 #A 时,它会隐藏(掩码)整个输出。

当执行 #B 时,它会隐藏第2和第3个输出。

当执行 #C 时,它会隐藏第3个输出。

掩码本身是通过以下方式实现的(来自原始论文):

我们通过在softmax的输入中屏蔽(设置为-∞)与非法连接对应的所有值来在缩放的点积注意力中实现这一点。

注意:在推理过程中(而不是训练中),解码器以顺序(而不是并行)模式工作,因为它最初不知道输出序列。但这与RNN方法不同,因为Transformer推理仍然使用自注意力并查看所有先前的输出(而不仅仅是最近的一个)。

注意2:对于非翻译应用,掩码可以有不同的用法。例如,对于语言建模,掩码可以用于隐藏输入句子中的某些单词,模型将在训练期间使用

### Transformer 时间序列模型的工作原理 Transformer 模型最初是为了处理自然语言处理任务而设计的,但其强大的并行化能力和捕捉长期依赖关系的能力使其成为时间序列分析的理想工具。该模型的核心组件是自注意力机制(Self-Attention Mechanism),它允许模型关注输入序列的不同位置,从而更好地编码上下文信息。 #### 自注意力机制的作用 在时间序列建模中,自注意力机制能够帮助模型识别不同时间点之间的重要关联[^1]。例如,在金融市场的预测场景下,某些历史价格波动可能会对未来的价格走势产生重要影响;通过学习这些潜在的时间依赖性,Transformer 可以为更精确地做出预测提供支持。 #### 多头注意力机制的应用 为了进一步增强这种能力,Transformer 引入了多头注意力机制Multi-head Attention)。这一改进让模型可以从多个角度同时观察同一组数据,进而发现更多样化的特征组合方式。这对于理解复杂的动态变化过程特别有用,比如电力消耗模式或是天气预报等问题领域内的非线性趋势。 #### 前馈神经网络层的功能 除了上述提到的关注力部分外,每个子层后面还连接着一个简单的前馈神经网络(Feed Forward Neural Network, FFNN)。FFNN 层负责对经过变换后的表示向量执行逐元素操作,并最终输出新的状态表示用于后续处理阶段。这样的结构有助于保持计算效率的同时提升表达能力。 ```python import torch.nn as nn class PositionwiseFeedForward(nn.Module): def __init__(self, d_model, d_ff, dropout=0.1): super(PositionwiseFeedForward, self).__init__() self.w_1 = nn.Linear(d_model, d_ff) self.w_2 = nn.Linear(d_ff, d_model) self.dropout = nn.Dropout(dropout) def forward(self, x): return self.w_2(self.dropout(torch.relu(self.w_1(x)))) ``` #### 输入序列长度的影响 值得注意的是,由于采用了基于位置嵌入的位置编码方案来引入绝对或相对顺序信息,当面对极长的历史记录时,Transformer 的性能会受到一定限制。这是因为随着序列的增长,所需的内存开销也会显著增加,而且过长的距离可能导致梯度消失现象更加严重。因此,在实际应用过程中往往需要考虑截断策略或其他方法来进行有效的降维处理[^3]。 #### Sequence Mask 的作用 另外,在涉及因果关系的任务里——即当前时刻的结果只取决于过去而非未来的观测值——还需要利用到所谓的 sequence mask 技术。这项技术确保了解码器不会无意间访问到来自未来的信息,维持了合理的推理逻辑链条[^4]。 ```python def create_sequence_mask(seq_len): # 创建上三角矩阵作为mask mask = (torch.triu(torch.ones((seq_len, seq_len))) == 0).transpose(0, 1) return mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0)) ``` ### 应用案例 通过对以上各个组成部分的理解可以看出,Transformer 不仅适用于传统的NLP应用场景,同样也能很好地适应各种各样的时间序列数据分析需求。无论是股票市场行情监测还是工业设备健康状况评估等领域都能见到它的身影。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值