【问题标题】:Understanding dense layer in LSTM architecture (labels & logits)了解 LSTM 架构中的密集层(标签和 logits)
【发布时间】:2020-08-31 15:32:32
【问题描述】:

我正在研究这个笔记本 -- https://github.com/aamini/introtodeeplearning/blob/master/lab1/solutions/Part2_Music_Generation_Solution.ipynb -- 我们在其中使用嵌入层、LSTM 和带有 softmax 的最终密集层来生成音乐。

不过,我对我们如何计算损失感到有些困惑;据我了解,在这个笔记本中(在 compute_loss() 中),在任何给定的批次中,我们都将预期标签(即注释本身)与 logits(即来自密集层的预测)进行比较。但是,这些预测不应该是概率分布吗?我们什么时候真正选择我们预测的标签?

再澄清一下我的问题:如果我们的标签的形状是 (batch_size, # of time steps),而我们的 logits 的形状是 (batch_size, # of time steps, vocab_size),那么在什么时候compute_loss() 函数我们实际上是在为每个时间步选择一个标签吗?

【问题讨论】:

    标签: machine-learning deep-learning lstm recurrent-neural-network


    【解决方案1】:

    简短的回答是 Keras 损失函数 sparse_categorical_crossentropy() 可以满足您的所有需求。

    在 LSTM 模型的每个时间步长,该损失函数中的顶层密集层和 softmax 函数共同生成模型词汇表的概率分布,在本例中为音符。假设词汇表包含音符 A、B、C、D。那么生成的一个可能的概率分布是:[0.01, 0.70, 0.28, 0.01],这意味着模型将大量概率放在音符 B(索引 1)上,如下所示:

    Label:    A     B     C     D
    ----      ----  ----  ----  ----
    Index:    0     1     2     3
    ----      ----  ----  ----  ----
    Prob:     0.01  0.70  0.28  0.01
    

    假设真正的音符应该是 C,它由数字 2 表示,因为它在分布数组中的索引 2 处(索引从 0 开始)。要测量预测分布与真实值分布之间的差异,请使用sparse_categorical_crossentropy() 函数生成一个表示损失的浮点数。

    更多信息请访问this TensorFlow documentation page。在该页面上,他们有示例:

    y_true = [1, 2]
    y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
    loss = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
    

    您可以在该示例中看到有一批两个实例。第一个实例,真实标签为1,预测分布为[0.05, 0.95, 0],第二个实例,真实标签为2,预测分布为[0.1, 0.8, 0.1]

    这个函数在你的 Jupyter Notebook 第 2.5 节中使用:

    为了在这个分类任务上训练我们的模型,我们可以使用一种形式的交叉熵损失(负对数似然损失)。具体来说,我们将使用 sparse_categorical_crossentropy 损失,因为它利用整数目标进行分类分类任务。我们将希望使用真实目标(标签)和预测目标(logits)来计算损失。

    所以直接回答你的问题:

    据我了解,在此笔记本中(在 compute_loss() 中),在任何给定批次中,我们都在将预期标签(即注释本身)与 logits(即来自密集层的预测)进行比较。

    是的,你的理解是正确的。

    但是,这些预测不应该是概率分布吗?

    是的,他们是。

    我们什么时候真正选择我们预测的标签?

    这是在sparse_categorical_crossentropy() 函数中完成的。如果您的分布是[0.05, 0.95, 0],那么这隐含意味着该函数预测索引 0 的概率为 0.05,索引 1 的概率为 0.95,索引 3 的概率为 0.0。

    再澄清一下我的问题:如果我们标签的形状是 (batch_size, # of time steps),而我们的 logits 的形状是 (batch_size, # of time steps, vocab_size),那么在什么时候compute_loss() 函数我们实际上是在为每个时间步选择一个标签吗?

    它在那个函数里面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2021-11-15
      • 1970-01-01
      • 2019-07-21
      相关资源
      最近更新 更多