web-dev-qa-db-ja.com

ケラスは複数の損失をどのように処理しますか?

私の質問は、次のようなものがある場合です。

model = Model(inputs = input, outputs = [y1,y2])

l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)

最終的な損失を得るためにケラスは損失をどう扱いますか?それは次のようなものですか?

final_loss = l1*loss1 + l2*loss2

また、トレーニング中はどういう意味ですか? loss2は、y2が由来するレイヤーの重みを更新するためにのみ使用されますか?または、すべてのモデルのレイヤーに使用されていますか?

私はかなり混乱しています

23
jfga

model documentation から:

loss:文字列(目的関数の名前)または目的関数。損失を参照してください。モデルに複数の出力がある場合、辞書または損失のリストを渡すことにより、各出力で異なる損失を使用できます。モデルによって最小化される損失値は、すべての個々の損失の合計になります。

...

loss_weights:異なるモデル出力の損失寄与に重み付けするスカラー係数(Pythonフロート)を指定するオプションのリストまたは辞書。モデルによって最小化される損失値は、loss_weights係数で重み付けされた個々のすべての損失の加重和になります。リストの場合、モデルの出力への1:1マッピングが期待されます。テンソルの場合、出力名(文字列)をスカラー係数にマップすることが期待されます。

したがって、はい、最終的な損失は「loss_weights係数で重み付けされた、個々の損失すべての加重和」になります。

損失が計算されるコード を確認できます。

また、トレーニング中はどういう意味ですか? loss2は、y2が由来するレイヤーの重みを更新するためにのみ使用されますか?または、すべてのモデルのレイヤーに使用されていますか?

重みは backpropagation で更新されるため、各損失は入力を損失に接続するレイヤーのみに影響します。

例えば:

                        +----+         
                        > C  |-->loss1 
                       /+----+         
                      /                
                     /                 
    +----+    +----+/                  
 -->| A  |--->| B  |\                  
    +----+    +----+ \                 
                      \                
                       \+----+         
                        > D  |-->loss2 
                        +----+         
  • loss1はA、B、Cに影響します。
  • loss2はA、B、およびDに影響します。
27
Fábio Perez

逆伝播する複数の出力については、FábioPerezが述べたものからの完全な答えではないと思います。

また、トレーニング中はどういう意味ですか? loss2は、y2が由来するレイヤーの重みを更新するためにのみ使用されますか?または、すべてのモデルのレイヤーに使用されていますか?

出力Cおよび出力Dの場合、kerasは最終損失F_loss = w1 * loss1 + w2 * loss2を計算します。そして、最終損失F_lossが出力Cと出力Dの両方に適用されます。最後に、同じF_lossを使用して逆伝搬する出力Cと出力Dからの逆伝搬が行われます。

3
wishcome