使用 softmax 函数进行多任务分类

Posted

技术标签:

【中文标题】使用 softmax 函数进行多任务分类【英文标题】:Multitask classification with softmax function 【发布时间】:2019-10-13 11:23:49 【问题描述】:

我正在尝试使用 softmax 作为输出函数来训练多任务分类神经网络。

这个想法来自论文“超越炒作:深度神经网络优于使用 ChEMBL 生物活性基准集的既定方法”,其中作者描述了具有 3 个隐藏层 ([4000,2000,1000]) 的 MT-NN 和一个输出层,其节点数与任务数(即 1227)一样多。该数据集由针对不同蛋白质靶标测试的分子组成,标签“1”和“0”将它们描述为活性/非活性。此外,一种分子可以被归类为对多个靶点有活性。

在论文中,作者在输出层上使用了一个自定义的 softmax 函数,它没有产生总和为 1 的向量 o 概率,而是为每个节点/任务提供了独立的概率。这对我来说很奇怪,因为我了解到 softmax 函数的概率之和是 1。

这是他们在千层面中使用的代码:

    def custom_softmax(x):
        num_groups = num_outputs # number of tasks
        probabilities = softmax(x[:, 0:2])
        for i in range(2, 2 * num_groups, 2):
            p_y_given_x = softmax(x[:, 2 * i:2 * i + 2])
            probabilities = T.concatenate([probabilities, p_y_given_x], axis=1)
        return probabilities

由于他们没有回复我的电子邮件,我想问一下是否有人可以解释一下这个自定义的 softmax 是做什么的。我天真地认为应该使用 sigmoid 函数。在我看来,输出层上的每个节点似乎都被独立对待。

另一件事是我如何在 Keras 上实现它?我测试了上述函数,当我将张量传递给它时它可以工作,但由于输入的形状错误,训练失败。例如,我的目标变量的形状为 (10000,154),但是当我拟合批量大小为 128 的模型时,它会引发并错误说它预期的形状为 (128,78)。

原论文:https://link.springer.com/article/10.1186/s13321-017-0232-0

【问题讨论】:

我想,你说的是Multi-label_classification。那我支持你的想法,应该使用 sigmoid 函数。你有什么特别的理由来理解那篇论文吗?如果没有,我建议您继续使用 sigmoid。 嗨@lanenok。这很奇怪,因为我在其他地方也看到过这个实现!一个具有许多节点的隐藏层 + softmax_crossentropy。此外,当我尝试使用 sigmoid 时,我的召回率非常低,但我的准确率很高(可能是因为类不平衡)。 我同意应该使用 sigmoid:参见 Andrew Ng 的多任务学习:youtube.com/watch?v=UdXfsAr4Gjw 【参考方案1】:

Sigmoid 函数为每个激活节点提供从 0-1 的激活概率,其中 softmax 将通过所有输出的总和为您提供从 0-1 的激活概率。所以你混合了这两个概念,你的形状不匹配可能是由于 softmax shape = 2,(152/2!=78 你也有一些关于最后一个小批量大小的索引问题)

【讨论】:

为了澄清我的信息,我将添加 sigmoid 函数的概率总和对于每个输出 (1=p+(1-p)) 为 1,对于所有输出 (1=p1+),softmax 函数为 1 p2...+pn /其中n是所有输出的数量) 为了进一步阐明答案:对与您要识别的项目/任务数量相对应的每个输出层使用 sigmoid 函数!不要使用 softmax 函数!

以上是关于使用 softmax 函数进行多任务分类的主要内容,如果未能解决你的问题,请参考以下文章

深度学习中分类任务的损失函数详解

深度学习中分类任务的损失函数详解

深度学习中分类任务的损失函数详解

softmax函数与交叉熵函数详解

具有互斥任务的多任务学习?

一分钟理解softmax函数(超简单)