Что произойдет, если tf.stop_gradient не установлен?
Я читаю 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 ответ
Это действительно хороший вопрос, потому что эта простая строка tf.stop_gradient
очень важно при обучении моделей fast_rcnn. Вот почему это необходимо во время обучения.
Модели Faster_rcnn представляют собой двухступенчатые детекторы, и функция потерь должна удовлетворять цели обоих этапов. В fast_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 полностью дифференцируем, но основной причиной, по которой предпочтение отдается схеме два, является то, что схема три приведет к тому, что он будет нестабильным в начале обучения.
Один из авторов API получил действительно хороший ответ
Некоторое дальнейшее чтение относительно приблизительного совместного обучения.