如果未设置 tf.stop_gradient 会怎样?

What happens if tf.stop_gradient is not set?

我正在阅读 tensorflow 模型的 faster-rcnn 代码。我对 tf.stop_gradient.

的使用感到困惑

考虑以下代码片段:

if self._is_training:
    proposal_boxes = tf.stop_gradient(proposal_boxes)
    if not self._hard_example_miner:
    (groundtruth_boxlists, groundtruth_classes_with_background_list, _,
     groundtruth_weights_list
    ) = self._format_groundtruth_data(true_image_shapes)
    (proposal_boxes, proposal_scores,
     num_proposals) = self._sample_box_classifier_batch(
         proposal_boxes, proposal_scores, num_proposals,
         groundtruth_boxlists, groundtruth_classes_with_background_list,
         groundtruth_weights_list)

更多代码是here。我的问题是:如果没有为 proposal_boxes 设置 tf.stop_gradient 会怎样?

这真是个好问题,因为这条简单的线tf.stop_gradient在训练faster_rcnn模型时非常关键。这就是训练期间需要它的原因。

Faster_rcnn 模型是 two-staged 检测器,损失函数必须满足两个阶段的目标。在 faster_rcnn 中,rpn 损失和 fast_rcnn 损失都需要最小化。

这是论文第 3.2 节的内容

Both RPN and Fast R-CNN, trained independently will modify their convlolutional layers in different ways. We therefore need to develop a technique that allows for sharing convolutional layers between the two networks, rather than learning two separate networks.

论文接着描述了三种训练方案,在原论文中他们采用了第一种方案——Alternating training,即先训练RPN再训练Fast-RCNN .

第二种方案是近似联合训练,很容易实现,这个方案被API采用 . Fast R-CNN 接受来自预测边界框的输入坐标(通过 rpn),因此 Fast R-CNN 损失将具有梯度 w.r.t 边界框坐标。但在这个训练方案中,这些梯度被 忽略 ,这正是使用 tf.stop_gradient 的原因。论文报道称,该训练方案将减少训练时间25-50%。

第三种方案是Non-approximate联合训练,所以不需要tf.stop_gradient。该论文报告说,具有可微分的 RoI 池化层 w.r.t 框坐标是一个非常重要的问题。

但是为什么这些梯度被忽略了呢?

事实证明,RoI 池化层是完全可微的,但支持方案二的主要原因是方案三会导致它在训练早期不稳定。

API 的一位作者给出了非常好的答案

关于近似联合训练的一些further reading