获取渐变的 nans

Getting nans for gradient

我正在尝试创建一个搜索相关性模型,我在其中计算查询向量和结果文档之间的点积。我在顶部添加了一个位置偏差项,以考虑到位置 1 更有可能被点击的事实。最终(非标准化)对数似然计算如下:

        query = self.query_model(query_input_ids, query_attention_mask)
        docs = self.doc_model(doc_input_ids, doc_attention_mask)
        positional_bias = self.position_model()
        
        if optimizer_idx is not None:
            if optimizer_idx == 0:
                docs = docs.detach()
                positional_bias = positional_bias.clone().detach()
            elif optimizer_idx == 1:
                query = query.detach()
                positional_bias = positional_bias.clone().detach()
            else:
                query = query.detach()
                docs = docs.detach()
                
        similarity = (docs @ query.unsqueeze(-1)).squeeze()

        click_log_lik = (similarity + positional_bias)\
                .reshape(doc_mask.shape)\
                .masked_fill_((1 - doc_mask).bool(), float("-inf"))

查询和文档模型只是一个 distilbert 模型,在 CLS 令牌之上有一个投影层。模型可以在这里看到:https://pastebin.com/g21g9MG3

检查第一个梯度下降步骤时,它有 nans,但仅针对查询模型而不是文档模型。 我的假设 是对文档和查询模型 (return F.normalize(out, dim=-1)) 的 return 值进行归一化以某种方式影响梯度。

有谁知道1。如果我的假设是真的 更重要的是 2. 我怎样才能纠正 nan 梯度?.

附加信息:

更新 1

以下更改对 nans 没有影响:

如果它对任何人有帮助,并且您在使用变形金刚时遇到了这个问题,这就是我所做的:

所以最后这个错误是由于我掩盖了 nan 的事实。因为我有一些长度为零的文件,所以转换器的输出是 nan。我希望 masked_fill 能解决这个问题,但事实并非如此。我的解决方案是仅将非零长度序列放入转换器,然后附加零以填充批量大小。