【问题标题】:How does chainer.functions.get_item back propagation exactly?chainer.functions.get_item 究竟是如何反向传播的?
【发布时间】:2017-09-07 09:49:57
【问题描述】:

这个问题跟随Does slice or index of chainer.Variable to get item in chainer has backward ability? 考虑一个典型的示例问题:假设我有卷积层 + FC 层,我的最后一个 FC 层输出一个向量。

因为在某些情况下我必须对向量进行切片来计算损失函数,例如,在多标签分类中,ground truth label vector大部分元素为0,只有少数为1,这种情况直接使用F。 sigmoid_cross_entropy 可能会导致标签不平衡问题,所以我决定使用 a[0, 1](a 是 chainer.Variable output by last FC layer) 对特定元素进行切片计算损失函数。

在这种情况下,最后一个FC层如何进行梯度流(BP),如何更新其权重矩阵??

【问题讨论】:

    标签: chainer


    【解决方案1】:

    当您为变量a 编写b = a[index] 并切片index(可能是花哨的索引)时,通过此操作进行反向传播会将b.grad 的值设置为a.grad[index],而将a.grad 的其他元素保留为零(因为a的对应元素不影响损失值)。最后一个 FC 层的反向传播然后计算梯度 w.r.t。与此a.grad 一样,权重矩阵和偏置向量。

    【讨论】:

    • 我做了一个实验,我将mnist数据集的单标签问题转换为多标签问题,然后使用chainer.Variable slice方法来控制positve/negative = 1/3,正如我在问题中所说,然后使用 F.sigmoid_cross_entropy。我发现这种方法训练精度的提高比我直接使用没有变量切片的 F.softmax_cross_entropy 慢得多。这样做是因为这种方法大部分 grad =0 每次迭代,所以训练很慢。
    • 如果 w 和 x 的形状不同,因此 dw 和 dx 的形状不同,我们如何逐元素地把顶层的 dx 乘以前一层的 dw 来影响前一层的 w 的变化层。
    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多