如何用 numpy 编写骰子损失反向传播

Posted

技术标签:

【中文标题】如何用 numpy 编写骰子损失反向传播【英文标题】:How to write dice-loss backpropogation with numpy 【发布时间】:2019-10-19 01:15:08 【问题描述】:

我正在尝试自己编写一个骰子损失函数。这是我写的前传。但我不明白如何计算反向传播。我试图写一些,但它不工作。还是 dice-loss 根本不需要 back prop?

alpha = 0.5
belta = 0.5

tp = np.sum(pred * label)

fn = np.sum((1- pred ) * label)

fp = np.sum(pred * (1 - label))

dice = tp / (tp + alpha * fn + belta * fp)

【问题讨论】:

【参考方案1】:

我不确定我是否会称之为前向传球。您如何获得 pred ? 通常你需要写下导致 pred 的步骤。然后你会像你一样得到你的损失。这定义了一个计算图。从那里可以开始反向传播(或反向传播)。您需要从计算图的末尾开始计算梯度,然后向后进行以获得损失相对于权重的梯度。 我在一篇博文 (https://www.qwertee.io/blog/an-introduction-to-backpropagation) 中写了一篇关于反向传播的介绍,我想你应该找到更多关于如何做到这一点的细节。

【讨论】:

【参考方案2】:

你只需要使用微积分和链式法则来解决这个问题。

骰子定义为。 X 是您的 pred,Y 是您的标签。

对于大小为 MxN 的矩阵 X 和 Y,我们可以将其写为 。

对 X 中的任意值 i,j 应用商规则:

我们现在可以除以|X|+|Y|这给了我们一个非常简洁的解决方案:

在python中:

dX = (2*Y-dice)/(np.sum(X)+np.sum(Y))

如果你在骰子的分子和分母中添加一个平滑项:

dX = (2*Y-dice)/(np.sum(X)+np.sum(Y)+eps)

如果你保存骰子,|X|和 |Y|前向计算中的变量,您不必在后向计算中再次计算它们。

【讨论】:

以上是关于如何用 numpy 编写骰子损失反向传播的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记Pytorch十二损失函数与反向传播

深度学习-反向传播

pytorch自定义多分类损失函数怎么反向传播

反向传播与参数更新

Back Propagation:反向传播

机器学习笔记:反向传播