chainer.functions.get_item 反向传播到底是怎么做到的?
How does chainer.functions.get_item back propagation exactly?
这个问题在之后
考虑一个典型的示例问题:假设我有卷积层 + FC 层,我的最后一个 FC 层输出一个向量。
因为在某些情况下我必须对向量进行切片来计算损失函数,例如在多标签分类中,ground truth标签向量大部分为0,只有少数为1,这种情况下,直接使用F.sigmoid_cross_entropy可能会造成标签不平衡的问题,所以我决定用a[0, 1](a是chainer.Variable最后一个FC层输出的)对特定元素进行切片计算损失函数。
在这种情况下,最后一个FC层如何进行梯度流(BP),如何更新其权重矩阵??
当您为变量 a
和切片 index
编写 b = a[index]
时(可能是奇特的索引),通过此操作反向传播会将 b.grad
的值设置为 a.grad[index]
,将a.grad
的其他元素留零(因为a
的对应元素不影响损失值)。然后最后一个 FC 层的反向传播计算梯度 w.r.t。 a.grad
.
和往常一样的权重矩阵和偏置向量
这个问题在
因为在某些情况下我必须对向量进行切片来计算损失函数,例如在多标签分类中,ground truth标签向量大部分为0,只有少数为1,这种情况下,直接使用F.sigmoid_cross_entropy可能会造成标签不平衡的问题,所以我决定用a[0, 1](a是chainer.Variable最后一个FC层输出的)对特定元素进行切片计算损失函数。
在这种情况下,最后一个FC层如何进行梯度流(BP),如何更新其权重矩阵??
当您为变量 a
和切片 index
编写 b = a[index]
时(可能是奇特的索引),通过此操作反向传播会将 b.grad
的值设置为 a.grad[index]
,将a.grad
的其他元素留零(因为a
的对应元素不影响损失值)。然后最后一个 FC 层的反向传播计算梯度 w.r.t。 a.grad
.