我想我不理解多输出网络。
通过我了解实现的方式并成功地训练了这样的模型,我不了解如何训练多输出深度学习网络。我的意思是,网络内部正在发生什么?
以keras功能性API指南中的以下网络为例:
您可以看到两个输出(aux_output和main_output)。反向传播如何运作?
我的直觉是该模型进行两次反向传播,每个输出一次。 然后,每个反向传播都会更新退出之前的图层的权重。 如果是这样,那么反向传播过程将以什么顺序进行?
此外,如果有人知道一些有关此类网络的好文章,我很感兴趣!
答案 0 :(得分:3)
Keras计算基于图形,并且仅使用一个优化程序。
优化器也是图形的一部分,并且在其计算中它会获得整个权重组的梯度。 (不是两组渐变,每个输出一组,而是整个模型的一组渐变)。
从数学上讲,这并不是很复杂,您有一个由以下组成的最终损失函数:
loss = (main_weight * main_loss) + (aux_weight * aux_loss) #you choose the weights in model.compile
全部由您定义。加上一系列其他可能的权重(样本权重,类权重,正则化条件等)
位置:
main_loss
是function_of(main_true_output_data, main_model_output)
aux_loss
是function_of(aux_true_output_data, aux_model_output)
所有权重的梯度仅为∂(loss)/∂(weight_i)
。
优化器一旦具有渐变,它将执行一次优化步骤。
问题:
由于辅助分支权重未直接连接到主输出,该如何更新?
main_output
的一个数据集,aux_output
的另一个数据集。您必须将它们传递给fit
model.fit(inputs, [main_y, aux_y], ...)
main_loss
取main_y
和main_out
;和aux_loss
Takex aux_y
和aux_out
。 loss = (main_weight * main_loss) + (aux_weight * aux_loss)
loss
计算梯度,并且此函数连接到整个模型。
aux
一词将在反向传播中影响lstm_1
和embedding_1
。 损失权重是否是辅助分支的根与主输出之间的网络部分?还是权重仅影响连接到辅助输出的网络部分?
权重是简单的数学。您将在compile
中定义它们:
model.compile(optimizer=one_optimizer,
#you choose each loss
loss={'main_output':main_loss, 'aux_output':aux_loss},
#you choose each weight
loss_weights={'main_output': main_weight, 'aux_output': aux_weight},
metrics = ...)
损失函数将在loss = (weight1 * loss1) + (weight2 * loss2)
中使用它们。
剩下的是每个权重∂(loss)/∂(weight_i)
的数学计算。