当我们使用 NN 进行监督分类时,为什么我们训练交叉熵而不是分类错误?
When we do supervised classification with NN, why do we train for cross-entropy and not for classification error?
标准的监督分类设置:我们有一堆样本,每个样本都有 N
个标签中的正确标签。我们构建一个具有 N 个输出的 NN,使用 softmax 将它们转换为概率,损失是每个 NN 输出与相应真实标签之间的平均值 cross-entropy
,表示为 1-hot
向量 1
在真正的标签和 0
其他地方。然后我们通过遵循它的梯度来优化这个损失。分类错误仅用于衡量我们的模型质量。
但是,我知道在执行 policy gradient
时我们可以使用 likelihood ratio trick, and we no longer need to use cross-entropy
! our loss simply tf.gather
the NN output corresponding to the correct label. E.g. this solution of OpenAI gym CartPole。
为什么我们在进行监督学习时不能使用相同的技巧?我在想我们使用 cross-entropy
的原因是因为它是可微的,但显然 tf.gather
是 differentiable as well。
我的意思是 - 如果我们衡量自己的分类错误,并且我们可以针对分类错误进行优化,因为它是可区分的,那么优化分类错误而不是这个奇怪的 cross-entropy
代理不是更好吗?
交叉熵损失的最小化最小化了预测分布和目标分布之间的 KL 散度。这确实与最大化预测分布的可能性相同。
策略梯度是使用交叉熵(或 KL 散度,正如 Ishant 指出的那样)。对于监督学习 tf.gather 实际上只是实现技巧,没有别的。另一方面,对于 RL,这是必须的,因为您不知道 "what would happen" 是否要执行其他操作。因此,您最终会得到梯度的高方差估计量,如果可能的话,您希望不惜一切代价避免这种情况。
尽管回到监督学习
CE(p||q) = - SUM_i q_i log p_i
假设 q_i 是一个热编码,1 在第 k 个位置,那么
CE(p||q) = - q_k log p_k = - log p_k
所以如果你愿意,你可以把它实现为tf.gather,这根本没关系。交叉熵只是更通用,因为它处理更复杂的目标。特别是,在 TF 中,你有 sparse 交叉熵,它完全符合你的描述——利用一种热编码,就是这样。在数学上没有区别,在计算方面有很小的区别,并且有一些函数可以完全按照你的意愿去做。
标准的监督分类设置:我们有一堆样本,每个样本都有 N
个标签中的正确标签。我们构建一个具有 N 个输出的 NN,使用 softmax 将它们转换为概率,损失是每个 NN 输出与相应真实标签之间的平均值 cross-entropy
,表示为 1-hot
向量 1
在真正的标签和 0
其他地方。然后我们通过遵循它的梯度来优化这个损失。分类错误仅用于衡量我们的模型质量。
但是,我知道在执行 policy gradient
时我们可以使用 likelihood ratio trick, and we no longer need to use cross-entropy
! our loss simply tf.gather
the NN output corresponding to the correct label. E.g. this solution of OpenAI gym CartPole。
为什么我们在进行监督学习时不能使用相同的技巧?我在想我们使用 cross-entropy
的原因是因为它是可微的,但显然 tf.gather
是 differentiable as well。
我的意思是 - 如果我们衡量自己的分类错误,并且我们可以针对分类错误进行优化,因为它是可区分的,那么优化分类错误而不是这个奇怪的 cross-entropy
代理不是更好吗?
交叉熵损失的最小化最小化了预测分布和目标分布之间的 KL 散度。这确实与最大化预测分布的可能性相同。
策略梯度是使用交叉熵(或 KL 散度,正如 Ishant 指出的那样)。对于监督学习 tf.gather 实际上只是实现技巧,没有别的。另一方面,对于 RL,这是必须的,因为您不知道 "what would happen" 是否要执行其他操作。因此,您最终会得到梯度的高方差估计量,如果可能的话,您希望不惜一切代价避免这种情况。
尽管回到监督学习
CE(p||q) = - SUM_i q_i log p_i
假设 q_i 是一个热编码,1 在第 k 个位置,那么
CE(p||q) = - q_k log p_k = - log p_k
所以如果你愿意,你可以把它实现为tf.gather,这根本没关系。交叉熵只是更通用,因为它处理更复杂的目标。特别是,在 TF 中,你有 sparse 交叉熵,它完全符合你的描述——利用一种热编码,就是这样。在数学上没有区别,在计算方面有很小的区别,并且有一些函数可以完全按照你的意愿去做。