1

Caffeは複数の損失をサポートしています。逆伝搬段階では、いくつかのブロブは、異なる損失からくる複数の勾配を有することがある。 Caffeはこのブロブのグラデーションをどのようにしていますか?Caffeは、複数の出力ブランチを持つブロブのグラジエントをどのように更新しますか?

私が知る限り、これはネットワークを設計する際には重要ではないかもしれません。しかし、私が新しいレイヤーを書き込もうとすると、この質問は本当に混乱します。何かありがとう! enter image description here

答えて

0

これは、caffeや他の深い学習ツールの問題ではありません。これは純粋に数学的な質問です:あなたはいくつかの損失がある場合、あなたはそれぞれの損失に割り当てられたloss_weightを持っており、ネットの全体的な損失はすべての損失の加重合計です。結果として、ネットに対して計算された勾配は、損失の加重和の勾配である。積分する必要がある勾配当たりの勾配はなく、むしろ損失層の加重和である単一損失である。いくつかの層に層の"top"を向けるとき

カフェは、通常、(あなたの例では"conv2"の出力は"auxiliary loss""bottom""ip1"から"Split"ある)"Split"層を使用します。
逆伝播コード"Split" layerを見ると、すべてがbottom.diffに合計されていることがわかります。

+0

ありがとうございました。私は各損失の重量を制御する 'loss_weight'があることを知っています。しかし、私はまだCaffeがそれをいかに正確に実装しているかはまだ分かりません。私はCaffeで、各レイヤーはそのトップブロブのdiffを受け取り、計算を行い、結果を 'mutable_cpu_diff()'を介してその下のブロブの 'diff'に渡すと思います。たとえば、上記の図を参考にしてください。 'conv2'の一番上のblob(慣例として' conv2'という名前)は、 'auxiliary'と' pool2'の一番下にあります。 'auxiliary'と' pool2'の両方は、バックプロップ中にボトムブロブの 'diff'を変更します。次に、 'conv2' blobの' diff'はどのように更新されますか? –

+0

@ C.Liグラジエントチェーンルールが指示するように更新します – Shai

+0

グラデーションチェーンルールの考え方を得ます。しかし、私はまだ、Caffeがいつどこでそれを実装しているかについてはっきりしていません。何か案が?どうもありがとう! –

関連する問題