如何用 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 编写骰子损失反向传播的主要内容,如果未能解决你的问题,请参考以下文章