更新(18/04/18):旧的答案仍然被证明对我的模型有用。诀窍是分别对分区函数和分布建模,从而利用softmax的功能。
考虑您的观察向量包含标签。 (如果样本i包含标签m,则为1,否则为0)。因此,目标是以每个样本的方式对矩阵建模。因此,模型评估。考虑扩展以实现两个属性:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- 分布函数:∑mP(ym)=1
- 分区函数:估计标签数Z
然后是分别对两者建模的问题。最好使用softmax层对分布函数进行建模,而可以使用线性单位对分区函数进行建模(在实践中,我将其裁剪为。更复杂的建模(例如泊松单元)可能会更好地工作)。然后,您可以选择应用分布式损失(在分配上分配KL,在分区上分配MSE),也可以在其产品上尝试以下损失。max(0.01,output)
实际上,优化器的选择也有很大的不同。我使用分解法的经验是,它在Adadelta下效果最佳(Adagrad对我不起作用,尚未尝试RMSprop,SGD的性能受参数影响)。
关于乙状结肠的旁注:我当然已经尝试过乙状结肠+交叉熵,但没有奏效。该模型仅倾向于预测,而无法捕获分布函数的变化。(又名,它在某种程度上对分区建模很有用,其背后可能存在数学原因)Z
更新:(随机的想法)似乎使用Dirichlet程序会允许一些事先合并的标签数目吗?
更新:通过实验,修改后的KL散度仍然倾向于提供多类输出,而不是多标签输出。
(旧答案)
我对S形交叉熵的体验不是很愉快。目前,我正在使用改良的KL散度。它采取的形式
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
其中是目标伪分布,是预测的伪分布(但是函数实际上是对称的,因此实际上并不重要)
P(x)Q(x)
由于未归一化,它们被称为伪分布。因此,如果您有2个用于特定样本的标签,则可以。∑xP(x)=2
Keras推动
def abs_KL_div(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), None)
y_pred = K.clip(y_pred, K.epsilon(), None)
return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)