【问题标题】:embedding layer outputs nan嵌入层输出nan
【发布时间】:2020-01-19 01:23:21
【问题描述】:

我正在尝试学习 seq2seq 模型。 嵌入层位于编码器中,它有时会在一些迭代后输出 nan 值。 我无法确定原因。 我该如何解决这个问题? 问题出在下面代码中forward函数中的第一个emb_layer。


class TransformerEncoder(nn.Module):
    def __init__(self, vocab_size, hidden_size=1024, num_layers=6, dropout=0.2, input_pad=1, batch_first=False, embedder=None, init_weight=0.1):
        super(TransformerEncoder, self).__init__()
        self.input_pad = input_pad
        self.vocab_size = vocab_size
        self.num_layers = num_layers
        self.embedder = embedder

        if embedder is not None:
            self.emb_layer = embedder
        else:
            self.emb_layer = nn.Embedding(vocab_size, hidden_size, padding_idx=1)

        self.positional_encoder = PositionalEncoder()
        self.transformer_layers = nn.ModuleList()
        for _ in range(num_layers):
            self.transformer_layers.append(
                    TransformerEncoderBlock(num_heads=8, embedding_dim=1024, dropout=dropout))

    def set_mask(self, inputs):
        self.input_mask = (inputs == self.input_pad).unsqueeze(1)

    def forward(self, inputs):
        x = self.emb_layer(inputs)
        x = self.positional_encoder(x)

【问题讨论】:

  • 请首先确定您获得 NaN 值的相应输入张量。在不了解您的数据的情况下,仅查看代码是不可能解决您的问题的。
  • 我明白了。谢谢你的建议。我会先听你说的。

标签: deep-learning pytorch transformer seq2seq


【解决方案1】:

看起来有些权重变成了 nan。可能的原因之一是在某些迭代中,层输出为 +-inf。如果向前输出为 +-inf,向后输出将有一个 +-inf 并且当 inf - inf = none 时,权重将变为无,并且在所有后续迭代中都将输出无。

您可以通过跟踪 emb_layer 中的 inf 输出来检查这一点。

如果是这个原因,请尽量避免使用可能返回 inf 值的函数。

【讨论】:

  • 非常感谢。我会试试这个并报告结果。
【解决方案2】:

与我所遵循的教程的维度相比,我的数据库非常小,而且我的嵌入对于我的可用数据来说太大了,因此最终 NaN 会通过网络传播。使我的嵌入网络更小(矩阵中的因子/列数更少)为我解决了 NaN 问题。

【讨论】:

    【解决方案3】:

    通常是输入多于权重往往会变成 nan(太高或太低)。也许这些开始时是不正确的,并且在一些梯度之后会恶化。您可以通过运行张量或 np.array 通过简单的条件检查来识别这些输入,例如:

    print("Inp value too high") if len(bert_embeddings[bert_embeddings>1000]) > 1 else None
    

    初学者的一个常见错误是使用 torch.empty 而不是 torch.zeros。随着时间的推移,这总是会导致 Nan。

    如果您的所有输入都很好,那么这就是梯度消失或爆炸的问题。查看几次迭代后问题是否会恶化。探索通常可以解决此类问题的不同激活或剪切渐变。如果您使用的是最新的优化器,您通常无需担心调整学习率。

    【讨论】:

    • 我可以确认,在层中使用 torch.empty 很可能会导致您的模型在一段时间后输出 nans。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2016-08-26
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多