Как keras обрабатывают несколько потерь?

Поэтому мой вопрос: если у меня есть что-то вроде:

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? Или он используется для всех слоев модели?

Я довольно смущен

Ответ 1

Из документации по model:

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

...

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.

Ответ 2

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

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

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