nn.TransformerEncoder的输出为NaN值的原因及解决方法

问题描述:

当使用nn.TransformerEncoder时,即如下情况:

复制代码
实例化一个TransformerEncoder 
 self.encoder_layer = nn.TransformerEncoderLayer(d_model=encoder_in_dim, nhead=encoder_head,
                                                           dim_feedforward=encoder_ffnn_dim,
                                                           batch_first=batch_first)
 self.model = nn.TransformerEncoder(self.pre_encoder_layer, num_layers=pre_encoder_layer_num)
调用:
transformer_features =  self.model(embeddings, src_key_padding_mask=src_padding_mask)

transformer_features的值为NaN

原因在于src_padding_mask的传入出现均为0/False的情况!即attention---mask出现了全1/True行

由于我们在使用MultiheadAttention做self-attention时因为batch内序列长度不一致,难免需要使用mask

以pytorch自带的torch.nn.TransformerEncoder方法为例,其forward函数如下

复制代码
forward(src, mask=None, src_key_padding_mask=None)

这里的mask会送到torch.nn.TransformerEncoderLayer的forward函数:

python 复制代码
def forward(self, src: Tensor, src_mask: Optional[Tensor] = None, src_key_padding_mask: Optional[Tensor] = None) -> Tensor:
        src2 = self.self_attn(src, src, src, attn_mask=src_mask,key_padding_mask=src_key_padding_mask)[0]

之后送到MultiheadAttention 的forward函数的attn_mask参数,而这里做的是一个self attention。

此时若是attn_mask出现一整行都是True的情况,通过如下源码中的实现mask的方法可以看到:

python 复制代码
    if attn_mask is not None:
        if attn_mask.dtype == torch.bool:
            attn_output_weights.masked_fill_(attn_mask, float('-inf'))
        else:
            attn_output_weights += attn_mask

把权重矩阵中需要mask的位置置为负无穷,然后再按行做softmax,问题就在这里,把一个元素全是是负无穷的tensor送给softmax,就会得到一个全是NaN的tensor。然后NaN和任何数运算都是NaN,NaN会传染,再经过一轮self attention,输出的tensor就全成NaN了。

解决方法:避免attention mask中存在全1/True的行

相关推荐
YOLO数据集集合9 小时前
一站式AI数据自动化标注与训练平台:零门槛玩转YOLO全系列模型
人工智能·深度学习·yolo·ai·自动化·数据集·标注软件
史上最甜的躯12 小时前
医疗影像分析与深度学习-导论
深度学习·医疗检测
铅笔侠_小龙虾13 小时前
深度学习阶段总结(2)--矩阵
深度学习·矩阵
手写码匠16 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 灰度发布实战:让每一次变更都“小步快跑、随时可回滚“
人工智能·深度学习·算法·aigc
TonyLee01717 小时前
神经网络门控机制探讨
人工智能·深度学习·神经网络
JAI科研18 小时前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
还不秃顶的计科生18 小时前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
段一凡-华北理工大学1 天前
AI推动工业智能化转型~系列文章24:钢铁工业 AI 全景图:从原料场到轧机的场景地图
人工智能·深度学习·模型生命周期·钢铁工业·ai全景
chen_zn951 天前
《VLA 系列》Human-to-Robot Transfer | 人类视频共训练 | 跨本体涌现迁移 | 论文解析
人工智能·深度学习·transformer·具身智能·vla
CCC:CarCrazeCurator1 天前
DeepSeek‑Harness Windows 本地快速上手
深度学习·数据挖掘