スムーズなl1(huber)+バイナリクロスエントロピー(tensorflow + pytorch)の詳細な説明



Detailed Explanation Smooth L1 Binary Cross Entropy



序文

前回の記事では、yolo v2の損失で2つの損失が使用されたときに、whおよびその他のBCElossで使用されたsmoothl1の損失について説明しました。これは拡張された紹介であり、pytorchとtensorflowのapiインターフェースの使用を比較します

スムーズなl1(フーバー損失)

知乎高山の答えから転載: https://www.jianshu.com/p/19483787fa24



スムーズなL1損失は、2つの側面から勾配を制限する可能性があります。

  • 予測フレームとグラウンドトゥルースの差が大きすぎる場合、勾配値は大きくなりすぎません
  • 予測ボックスとグラウンドトゥルースの差が小さい場合、勾配値は十分に小さくなります。

次の損失関数を検討してください。





xに対する損失関数の導関数は次のとおりです。

(4)を観察します。xが増加すると、xに関するL2損失の導関数も増加します。これにより、トレーニングの初期段階で予測値とグラウンドトゥルースの差が大きくなり、損失関数の予測値への勾配が非常に大きくなり、トレーニングが不安定になります。

式(5)によれば、xに関するL1の導関数は定数です。これにより、トレーニングの後の段階で、予測値とグラウンドトゥルースの差が非常に小さくなります。 L1損失の予測値に対する導関数の絶対値は1のままです。学習率が変わらない場合、損失関数は安定した値を中心に変動し、より高い精度を達成するために収束し続けることは困難です。

最後に、(6)を観察します。滑らかなL1が小さい場合、xへの勾配も小さくなり、xが大きい場合、xへの勾配の絶対値は上限1に達します。これは、破壊するには大きすぎません。ネットワークパラメータ。スムーズなL1は、L1とL2の損失の欠陥を完全に回避します。関数イメージは次のとおりです。

図からわかるように、座標の原点から遠く、画像とL1損失が非常に近く、座標の原点付近では、L1損失の鋭い角とは異なり、遷移が非常にスムーズです。これはスムーズL1損失と呼ばれます。

pytorchとtensorflowのインターフェース

pytorch:

import torch.nn as nn smooth_l1 = nn.SmoothL1Loss(reduce=False) loss = smooth_l1(coord_wh, tcoord_wh))

テンソルフロー:

#reduction parameter returns the sum value by default, if you want to return a matrix of the same shape, pass in NONE loss = tf.losses.huber_loss(gt_coord_wh, pre_coord_wh, reduction=tf.losses.Reduction.NONE)

各パラメーターの意味を参照してください。 https://www.w3cschool.cn/tensorflow_python/tensorflow_python-2cbn2wyj.html