Сети с несколькими выходами, как рассчитывается потеря? - PullRequest
1 голос
/ 24 апреля 2020

При обучении сети с более чем одной ветвью и, следовательно, с более чем одной потерей, в описании keras упоминается, что глобальная потеря представляет собой взвешенное суммирование двух частичных потерь, т.е. final_loss = l1 * loss1 + l2 * loss2

Однако во время обучения моя модель состояла из двух ветвей и скомпилирована с категориальной кросс-энтропийной потерей для обеих ветвей, с опцией loss_weights = [1., 1.]. Я ожидал увидеть глобальные потери как средние значения двух потерь (так как две частичные потери имеют одинаковый вес), что не соответствует действительности. Я получил относительно высокую глобальную потерю, которую я не мог догадаться, как она была рассчитана с использованием частичных потерь и их весов. Ниже приведены некоторые учебные ценности. Может ли кто-нибудь объяснить мне, как глобальные потери рассчитывались с этими параметрами? и если сумма весов потерь не превысит 1 (то есть вместо этого я должен использовать loss_weights = [0.5, 0.5]?), я буду очень благодарен тем, кто мог помочь, потому что я был заблокирован в течение длительного времени.

Epoch 2/200
26/26 [==============================] - 39s 1s/step - loss: 9.2902 - 
dense_1_loss: 0.0801 - dense_2_loss: 0.0717 -
Epoch 3/200
26/26 [==============================] - 39s 1s/step - loss: 8.2261 - 
dense_1_loss: 0.0251 - dense_2_loss: 0.0199 -
Epoch 4/200 
26/26 [==============================] - 39s 2s/step - loss: 7.3107 - 
dense_1_loss: 0.0595 - dense_2_loss: 0.0048 -
Epoch 5/200
26/26 [==============================] - 39s 1s/step - loss: 6.4586 - 
dense_1_loss: 0.0560 - dense_2_loss: 0.0025 -
Epoch 6/200
26/26 [==============================] - 39s 1s/step - loss: 5.9463 - 
dense_1_loss: 0.1964 - dense_2_loss: 0.0653 -
Epoch 7/200
26/26 [==============================] - 39s 1s/step - loss: 5.3730 - 
dense_1_loss: 0.1722 - dense_2_loss: 0.0447 -
Epoch 8/200
26/26 [==============================] - 39s 1s/step - loss: 4.8407 - 
dense_1_loss: 0.1396 - dense_2_loss: 0.0169 -
Epoch 9/200
26/26 [==============================] - 39s 1s/step - loss: 4.4465 - 
dense_1_loss: 0.1614 - dense_2_loss: 0.0124 -
Epoch 10/200
26/26 [==============================] - 39s 2s/step - loss: 3.9898 - 
dense_1_loss: 0.0588 - dense_2_loss: 0.0119 -
Epoch 11/200
26/26 [==============================] - 39s 1s/step - loss: 3.6347 - 
dense_1_loss: 0.0302 - dense_2_loss: 0.0085 -

1 Ответ

1 голос
/ 25 апреля 2020

Правильно. Глобальные потери представляют собой взвешенную сумму двух частичных потерь как

Global loss=(loss1 * weight1 + loss2 * weight2)

Я взял функциональную модель keras, чтобы продемонстрировать, что глобальные потери представляют собой взвешенную сумму двух частичных потерь. Пожалуйста, взгляните на весь код здесь .

Модель составлена ​​как

model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
              loss=[keras.losses.BinaryCrossentropy(from_logits=True),
                    keras.losses.CategoricalCrossentropy(from_logits=True)],
              loss_weights=[1., 0.2])

Модель обучена как

model.fit({'title': title_data, 'body': body_data, 'tags': tags_data},
          {'priority': priority_targets, 'department': dept_targets},
          epochs=2,batch_size=32)

Epoch 1/2
40/40 [==============================] - 2s 45ms/step - loss: 1.2723 - priority_loss: 0.7062 - department_loss: 2.8304
Epoch 2/2
40/40 [==============================] - 2s 46ms/step - loss: 1.2593 - priority_loss: 0.6995 - department_loss: 2.7993

Проверьте, как весит и две потери используются для получения общей потери (потеря1 * вес1 + потеря2 * вес2) (0,7062 * 1,0 + 2,8304 * 0,2) # 1,27228

Надеюсь, это поможет.

...