machine-learning - 真正理解交叉熵损失
问题描述
我有一个机器学习课程,我必须在其中实现 CELoss 的前向和后向方法:
class CELoss(object):
@staticmethod
def forward(x, y):
assert len(x.shape) == 2 # x is batch of predictions (batch_size, 10)
assert len(y.shape) == 1 # y is batch of target labels (batch_size,)
# TODO implement cross entropy loss averaged over batch
return
@staticmethod
def backward(x, y, dout):
# TODO implement dx
dy = 0.0 # no useful gradient for y, just set it to zero
return dx, dy
此外,我被赋予了 CELoss 作为
CELoss(x,y) = - log\frac{exp(x_y)}{\sum_{k}exp(x_k)}
(它说我不能使用公式创建器,因为我需要至少 10 个声望)
但是,这不是您可以在 wikipedia 上找到的 CELoss(例如https://en.wikipedia.org/wiki/Cross_entropy)。据我了解,CELoss 需要目标和预测。x 是否代表这里的目标而 y 是预测?如果是这样,x_y 指的是什么?谢谢您的帮助!
解决方案
他们是一样的。
您在问题中给出的交叉熵损失对应于您的标签为1
或的交叉熵的特定情况0
,我假设您正在进行基本分类时就是这种情况。
至于为什么会发生这种情况,让我们从单个训练示例的交叉熵损失开始x
:
Loss = - sum_j P(x_j) log(Q(x_j)) #j is the index of possible labels
其中P
是“真实”分布,“Q”是您的网络学习的分布。“真实”分布P
由您的硬标签给出,也就是说,假设真正的标签是t
,您将拥有:
P(x_t) = 1
P(x_j) = 0 if j!=t
这意味着上面的损失变为
Loss= - log(Q_t)
在您的情况下,似乎分布Q_s
是根据 logits 计算的,即softmax 或成本函数之前的最后一层,它为每个标签输出一组分数:
scores= [s_1 , ..., s_N]
如果你通过 softmax 运行它,你会得到:
distribution = [exp(s_1)/(sum_k exp(s_k)), ..., exp(s_N)/(sum_k exp(s_k))]
t
到目前为止,我们已经表示的真实标签的分布由Q
下式给出
Q(s_t)=exp(s_t)/(sum_k exp(s_k))
这让我们回到了损失,它可以表示为
Loss= - log(Q_t) = - log (exp(s_t)/(sum_k exp(s_k))
这是您在问题中给出的那个。因此,在您的问题中,x_y
网络为与 关联的正确标签输出的分数是x
。
推荐阅读
- c - libiconv:在 UTF-8/UTF-16/UTF-32 之间转换时安全估计目标字节长度?
- r - 在R Boruta函数中为响应向量传递一个变量
- python - 将一组评级(数字越小越好)转换为 pandas 中的概率
- angular - 如何更改角度服务变量值?
- facebook - 悖论:请求 FB 权限 需要必须已经上线的应用程序?
- python-3.x - 由于客户函数错误,Lambda 执行失败,状态为 200
- python - 如何将您在 python 中创建的 .wav 文件保存到指定目录?
- ios - 如何使用 MKPolygon 的 Apple Map 绘制多边形
- javascript - 未获取 Google 评论
- php - 如果 meta_key = Delivery Date 和 meta_value = this day,则每天 23:00 在 WooCommerce 中将订单状态从自定义状态更新为已完成