Как Keras справляется с множественными потерями?

Итак, мой вопрос, если у меня есть что-то вроде:

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

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

Что Keras делает с потерями, чтобы получить окончательную потерю? Это что-то вроде:

final_loss = l1*loss1 + l2*loss2

Кроме того, что это означает во время тренировки? Потеря2 используется только для обновления весов на слоях, откуда берется y2? Или он используется для всех слоев модели?

Я в замешательстве

2 ответа

Решение

От model документация:

потеря: строка (имя целевой функции) или целевая функция. Смотрите потери. Если модель имеет несколько выходов, вы можете использовать разные потери на каждом выходе, передав словарь или список потерь. Значение потерь, которое будет минимизировано моделью, будет тогда суммой всех индивидуальных потерь.

...

loss_weights: необязательный список или словарь, задающий скалярные коэффициенты (числа Python) для взвешивания вкладов потерь различных выходных данных модели. Значение потерь, которое будет минимизировано моделью, будет затем взвешенной суммой всех индивидуальных потерь, взвешенных по loss_weights коэффициенты. Если список, ожидается, что он будет иметь соотношение 1:1 к выходам модели. Если это тензор, он должен отображать выходные имена (строки) в скалярные коэффициенты.

Итак, да, окончательная потеря будет "взвешенной суммой всех индивидуальных потерь, взвешенной по loss_weights coeffiecients".

Вы можете проверить код, где рассчитывается потеря.

Кроме того, что это означает во время тренировки? Потеря2 используется только для обновления весов на слоях, откуда берется y2? Или он используется для всех слоев модели?

Веса обновляются путем обратного распространения, поэтому каждая потеря будет влиять только на слои, которые связывают вход с потерей.

Например:

                        +----+         
                        > C  |-->loss1 
                       /+----+         
                      /                
                     /                 
    +----+    +----+/                  
 -->| A  |--->| B  |\                  
    +----+    +----+ \                 
                      \                
                       \+----+         
                        > D  |-->loss2 
                        +----+         
  • loss1 повлияет на А, В и С.
  • loss2 будет влиять на A, B и D.

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

Кроме того, что это означает во время тренировки? Потеря2 используется только для обновления весов на слоях, откуда берется y2? Или он используется для всех слоев модели?

Для выхода C и выхода D keras рассчитает окончательную потерю F_loss=w1 * loss1 + w2 * loss2. И затем, окончательная потеря F_loss применяется как к выходу C, так и к выходу D. Наконец, происходит обратное распространение с выхода C и выхода D с использованием того же F_loss для обратного распространения.

Другие вопросы по тегам