获取渐变的 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
检查第一个梯度下降步骤时,它有 nan
s,但仅针对查询模型而不是文档模型。 我的假设 是对文档和查询模型 (return F.normalize(out, dim=-1)
) 的 return 值进行归一化以某种方式影响梯度。
有谁知道1。如果我的假设是真的 更重要的是 2. 我怎样才能纠正 nan 梯度?.
附加信息:
- None 的损失是 inf 或 nan。
- 查询是 BS x 768
- 文档是 BS x DOC_RESULTS x 768
- positional_bias 是 DOC_RESULTS
- DOC_RESULTS 在我的例子中是 10。
- 最后一行的
masked_fill
是因为我偶尔查询不到10个数据点
更新 1
以下更改对 nans 没有影响:
- 将
masked_fill
从 -inf
更改为 1e5
。
- 将投影从
F.normalize(out, dim=-1)
更改为 out / 100
。
- 完全消除了位置偏差,但仍然没有运气。
如果它对任何人有帮助,并且您在使用变形金刚时遇到了这个问题,这就是我所做的:
所以最后这个错误是由于我掩盖了 nan 的事实。因为我有一些长度为零的文件,所以转换器的输出是 nan。我希望 masked_fill
能解决这个问题,但事实并非如此。我的解决方案是仅将非零长度序列放入转换器,然后附加零以填充批量大小。
我正在尝试创建一个搜索相关性模型,我在其中计算查询向量和结果文档之间的点积。我在顶部添加了一个位置偏差项,以考虑到位置 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
检查第一个梯度下降步骤时,它有 nan
s,但仅针对查询模型而不是文档模型。 我的假设 是对文档和查询模型 (return F.normalize(out, dim=-1)
) 的 return 值进行归一化以某种方式影响梯度。
有谁知道1。如果我的假设是真的 更重要的是 2. 我怎样才能纠正 nan 梯度?.
附加信息:
- None 的损失是 inf 或 nan。
- 查询是 BS x 768
- 文档是 BS x DOC_RESULTS x 768
- positional_bias 是 DOC_RESULTS
- DOC_RESULTS 在我的例子中是 10。
- 最后一行的
masked_fill
是因为我偶尔查询不到10个数据点
更新 1
以下更改对 nans 没有影响:
- 将
masked_fill
从-inf
更改为1e5
。 - 将投影从
F.normalize(out, dim=-1)
更改为out / 100
。 - 完全消除了位置偏差,但仍然没有运气。
如果它对任何人有帮助,并且您在使用变形金刚时遇到了这个问题,这就是我所做的:
所以最后这个错误是由于我掩盖了 nan 的事实。因为我有一些长度为零的文件,所以转换器的输出是 nan。我希望 masked_fill
能解决这个问题,但事实并非如此。我的解决方案是仅将非零长度序列放入转换器,然后附加零以填充批量大小。