Attention中的Mask: query mask, key mask, future mask

本文介绍了Attention机制及其在NLP中的应用,详细讲解了Attention的三个主要步骤,并重点探讨了Mask操作,包括Padding Mask的key mask和query mask,以及Future Mask在翻译任务中的应用,提供了相关TensorFlow代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Attention简介

Attention是2015年被提出来的,在NLP领域大放光彩。Attention具有在繁多信息中自动focus到重点的能力,而且Attention可以实现并行,一定程度上可以替代LSTM等循环神经网络,提高模型效率。Attention的具体介绍可以参考Attention总结

根据上面的Attention总结,Attention可以看作是 QKV 模型,假设输入为 q,(k,v)表示上下文信息。例如在 Q&A 任务中:k 是 question,v 是 answer,q 是新来的 question,看看历史 中 q 和哪个 k 更相似,根据相似 k 对应的 v,合成当前 question 的 answer。

Attention可以分为三个主要步骤:

  • score function:度量环境向量与当前输入向量的相似性;找到当前环境下,应该 focus 哪些输入信息。如果按照QKV的模式来看的score的计算分方式有很多种,一般根据Q和K计算获得,具体如下:

attention_mask_score_func_20190727

  • alignment function :计算 attention weight,通常都使用 softmax 函数,对上一步的score进行归一化
  • context vector function :根据 attention weight,得到输出向量,一般直接加权就可以

Mask操作

关于Attention的介绍很多,但是关于其中的Mask操作一直搞不清,这里整理一下Mask的思路和tensorflow代码。

Mask大致分为两种

  • Padding Mask:在NLP任务中,由于句子长度不一致,经常会进行padding操作,在sequence中加入零向量。这部分padding不应该起作用,但是在Attention的计算中用到了softmax等操作,即便0向量也会参与计算(e^0=1),因此需要手动将这部分信息mask才行。padding mask主要包含两种:
    • key mask:在计算score之后,且softmax之前进行,将值设为很小的数字(如-e^12),这样经过的softmax之后值几乎为0
    • query mask:在softmax之后进行,因此对应元素设置为0即可。
  • Future(blinding) Mask:例如在翻译的任务中(“我喜欢机器学习”),在翻译喜欢的时候,我们只知道“我喜欢”,而后面的“机器学习”并不知道,也就是不能提前利用Future的信息,因此需要将Future的信息Mask掉。Future Mask主要用在Decoder中,只有Decoder中才会有future 信息。Future Mask的实现也比较简单,首先建立一个对应的下三角形矩阵,之后根据这个矩阵过滤即可,因为下三角对应的之前的信息。

下面参考大神的代码,来看Attention的三种Mask是怎样实现的:


def mask(inputs, queries=None, keys=None, type=None):
    
def mha(x, attn, n_head): # [n_seq, n_embd] -> [n_seq, n_embd] """ Task: Complete the code of the multi-head attention Input: x: Tensor attn: dictionary that load from gpt2 weight. c_attn and c_proj are the params of two linear layer n_head: number of head Output: Tensorying multi-head attention and linear transformation, shape [n_seq, n_embd]. """ c_attn, c_proj = attn['c_attn'], attn['c_proj'] # qkv projection x = linear(x, c_attn) # [n_seq, n_embd] -> [n_seq, 3*n_embd] # Split into qkv """ Task: Split the q,k,v matrix from the tensor x Notes: [n_seq, 3*n_embd] -> 3 * [n_seq, n_embd] """ torch.split(x,) qkv = None # need to modify # Split into heads qkv_heads = [qkv_part.chunk(n_head, dim=-1) for qkv_part in qkv] # 3 * [n_seq, n_embd] -> 3 * n_head * [n_seq, n_embd/n_head] qkv_heads = list(zip(*qkv_heads)) # [3, n_head, n_seq, n_embd/n_head] # Causal mask to hide future inputs from being attended to """ Task: Construct mask matrix Notes: | 0 -inf -inf ... -inf | | 0 0 -inf ... -inf | | 0 0 0 ... -inf | |... ... ... ... ... | | 0 0 0 ... 0 | Mask is a tensor whose dimension is [n_seq, n_seq] """ causal_mask = None # need to modify # Perform attention over each head out_heads = [attention(q, k, v, causal_mask) for q, k, v in qkv_heads] # n_head * [n_seq, n_embd/n_head] # Merge heads """ Task: merge multi-heads results Notes: n_head * [n_seq, n_embd/n_head] --> [n_seq, n_embd] """ x = None # need to modify # Out projection x = linear(x, c_proj) # [n_seq, n_embd] -> [n_seq, n_embd] return x 注释解释一下
04-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值