如果不设置tf.stop_gradient会发生什么?

7

我正在阅读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)

更多代码请参见此处。我的问题是:如果没有设置tf.stop_gradient用于proposal_boxes会发生什么?

1个回答

3
这是一个非常好的问题,因为这个简单的命令tf.stop_gradient在训练faster_rcnn模型时非常重要。以下是它在训练过程中的原因。
Faster_rcnn模型是两阶段检测器,损失函数必须满足两个阶段的目标。在faster_rcnn中,RPN损失和Fast RCNN损失都需要最小化。
论文在第3.2节中写道:
“独立训练的RPN和Fast R-CNN将以不同的方式修改其卷积层。因此,我们需要开发一种技术,允许在两个网络之间共享卷积层,而不是学习两个独立的网络。”
然后,论文描述了三种训练方案,并在原始论文中采用了第一种解决方案——交替训练,即先训练RPN,然后训练Fast-RCNN。
第二个方案是近似联合训练,易于实现,并且API采用了这个方案。Fast R-CNN接受来自预测边界框(由RPN预测)的输入坐标,因此Fast R-CNN损失将具有关于边界框坐标的梯度。但是,在这个训练方案中,这些梯度被忽略,这正是使用tf.stop_gradient的原因。该论文报告称,这种训练方案将减少25-50%的训练时间。
第三个方案是非近似联合训练,因此不需要使用tf.stop_gradient。该论文报告称,具有与盒坐标可微分的RoI池化层是一个非平凡的问题。
但是为什么会忽略这些梯度呢?
事实证明,RoI pooling层是完全可微的,但支持方案2的主要原因是方案3“在训练早期可能会导致不稳定性”。
API的一位作者在这里回答得很好。
关于近似联合训练的更多阅读内容

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接