Machine learning Keras如何在多标签学习中更新权重(实现方面)

Machine learning Keras如何在多标签学习中更新权重(实现方面),machine-learning,neural-network,keras,classification,multilabel-classification,Machine Learning,Neural Network,Keras,Classification,Multilabel Classification,假设我想用神经网络和Keras解决一个多标签问题 输出的形式通常为y=[0,1,0,1,0,0],很容易使用二进制交叉熵和Sigmoid对网络进行训练(例如,见下面的代码) 当我在最后一行进行拟合时,在实现方面会发生什么 网络是否已更新多次?计算6个输出中每个输出的误差一次后,将其传播回升级权重 它是否分别计算每个输出的误差,然后对网络进行一次整体更新 编辑:丹尼尔·莫勒回答后更新的问题 我的问题可能更清楚,批量大小为1 在每次迭代中,我们从训练集中选择一个示例并进行前馈。然后,我们计算每个输出

假设我想用神经网络和Keras解决一个多标签问题

输出的形式通常为y=[0,1,0,1,0,0],很容易使用二进制交叉熵和Sigmoid对网络进行训练(例如,见下面的代码)

当我在最后一行进行拟合时,在实现方面会发生什么

  • 网络是否已更新多次?计算6个输出中每个输出的误差一次后,将其传播回升级权重

  • 它是否分别计算每个输出的误差,然后对网络进行一次整体更新

  • 编辑:丹尼尔·莫勒回答后更新的问题

    我的问题可能更清楚,批量大小为1

    在每次迭代中,我们从训练集中选择一个示例并进行前馈。然后,我们计算每个输出的误差。在这种情况下,问题如下:

    对于未在输出之间共享的权重(从隐藏层到输出的权重),它们是基于模型产生的误差进行更新的,该误差是作为所有输出上的误差之和计算的,还是仅由一个特定输出进行更新


    模型权重是根据误差之和更新一次还是根据所有输出上的单个误差更新多次?

    对于所有影响,应将其视为一个巨大的矩阵运算

    一旦每批处理完成,它将更新网络。所以,1和2都不是

    Its:3-作为矩阵运算,它一次计算整个批次的误差,然后对所有权重矩阵进行一次整体更新。但它将是多个更新,因为您将有多个大小为128的批次

    Y通常是以下形式:

    [
        [1,0,0,1,0,0],
        [1,0,0,1,0,0],
        [0,0,0,1,1,0],
        [1,0,1,1,0,0]
    ]
    
    一批输出



    无论它在内部执行循环还是执行矩阵计算所需的任何操作,我们都看不见它,也无法访问它

    我想补充Daniel的答案,即
    二进制交叉熵
    对应于tensorflow中的实际操作,它确实为所有标签计算一个单个标量(详见)。单个损失从未实际计算,tensorflow使用直接计算总和的公式

    以下是源代码:

    def binary\u crossentropy(目标,输出,from\u logits=False):
    输出张量和目标张量之间的二进制交叉熵。
    论据:
    目标:与“输出”形状相同的张量。
    输出:张量。
    from_logits:'output'是否应为logits张量。
    默认情况下,我们考虑“输出”。
    对概率分布进行编码。
    返回:
    张量。
    """
    #注:nn.softmax\u交叉\u熵\u与\u逻辑
    #期待罗吉斯,凯拉斯期待概率。
    如果不是从_logits:
    #转换回logits
    ε=到张量(ε(),output.dtype.base\u dtype)
    输出=剪裁操作。按剪裁值剪裁剪裁(输出,ε,1-ε)
    输出=数学运算日志(输出/(1-输出))
    返回nn.sigmoid\u cross\u entropy\u和logits(标签=目标,logits=输出)
    
    所以所有梯度更新都是基于这个减少的损失值。二进制交叉熵函数和CNTK是相同的

    model.fit(xtrain, ytrain, batch_size=1)
    
    [
        [1,0,0,1,0,0],
        [1,0,0,1,0,0],
        [0,0,0,1,1,0],
        [1,0,1,1,0,0]
    ]