简短的回答是 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() 函数我们实际上是在为每个时间步选择一个标签吗?
它在那个函数里面。