Transformer 两种mask简介

Mask 有两种,Padding-mask,用于处理不定长输入

另一种是 seqence-mask,为了防止未来信息不被泄露

 

padding mask - 处理输入不定长

在 NLP 中,一个常见的问题是输入序列长度不等,一般来说我们会对一个 batch 内的句子进行 PAD,通常值为 0。

 

sequence mask - 防止未来信息泄露

在语言模型中,常常需要从上一个词预测下一个词,sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。产生一个上三角矩阵,上三角的值全为 1,下三角的值全为 0,对角线也是 0。把这个矩阵作用在每一个序列上,就可以达到我们的目的啦。值得注意的是,本来 mask 只需要二维的矩阵即可,但是考虑到我们的输入序列都是批量的,所以我们要把原本二维的矩阵扩张成 3 维的张量。

 

### Transformer模型中的Mask机制及其作用 在Transformer架构中,mask机制用于处理不同类型的输入数据以及防止信息泄露。具体来说,在自注意力层(self-attention layer),为了确保解码器不会提前访问未来时间步的信息,引入了掩蔽操作。 对于序列到序列的任务(如机器翻译),编码器部分通常不需要使用mask,因为整个源句都是已知的;但在解码阶段,则需应用future tokens masking来阻止当前位置看到后续位置的内容[^1]。 当涉及到填充(pad) token时,还需要创建padding masks以忽略这些无意义的位置,从而提高计算效率并保持上下文的有效性。这通过设置对应于pad标记处权重为负无穷大(-inf)或非常小数值的方式完成,使得softmax函数后的概率接近零。 #### 实现方式 下面是一个简单的Python代码片段展示如何在一个批次(batch)内构建这两种masks: ```python import torch def create_masks(src, tgt, pad_idx=0): src_mask = (src != pad_idx).unsqueeze(1).unsqueeze(2) tgt_pad_mask = (tgt != pad_idx).unsqueeze(1).unsqueeze(2) seq_len = tgt.size(1) nopeak_mask = (torch.triu(torch.ones((seq_len, seq_len)), diagonal=1) == 0).type_as(tgt) tgt_mask = tgt_pad_mask & nopeak_mask return src_mask, tgt_mask ``` 在此示例中: - `create_masks` 函数接收源(`src`) 和目标 (`tgt`) 序列作为参数; - 对于每一个batch内的样本,分别生成source mask和target mask; - Source mask仅屏蔽掉填充的部分; - Target mask不仅考虑到了填充情况还加入了nopeek特性,即不允许当前时刻关注未来的token。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值