スムーズな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