更新(18/04/18):古い答えは私のモデルでまだ有用であることが証明されました。トリックは、パーティション関数と分布を別々にモデル化し、softmaxのパワーを活用することです。
観測ベクトルがラベルを含むとします。 (サンプルiにラベルmが含まれる場合は1、それ以外の場合は0)。したがって、目的は、サンプルごとにマトリックスをモデル化することです。したがって、モデルはます。を展開して、2つの特性を実現することを検討してください。ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- 分布関数:∑mP(ym)=1
- パーティション関数:はラベルの数を推定しますZ
次に、2つを別々にモデリングする必要があります。分布関数は、ソフトマックスレイヤーで最適にモデル化され、パーティション関数は線形単位でモデル化できます(実際には、としてクリップしました。ポアソンユニットのようなより洗練されたモデリングがおそらくうまく機能します)。次に、分散損失(ディストリビューションでKL、パーティションでMSE)を適用するか、製品で次の損失を試すかを選択できます。max(0.01,output)
実際には、オプティマイザーの選択も大きな違いをもたらします。因数分解アプローチでの私の経験は、Adadeltaの下で最もうまく機能することです(Adagradは私には役に立たず、まだRMSpropを試していません。SGDのパフォーマンスはパラメーターの影響を受けます)。
シグモイドに関するサイドコメント:私は確かにシグモイド+クロスエントロピーを試しましたが、うまくいきませんでした。モデルはのみを予測する傾向があり、分布関数の変動を捕捉できませんでした。(別名、それはパーティションのモデリングに何らかの形で非常に有用であり、その背後に数学的な理由があります)Z
更新:(ランダムに考えた)Dirichletプロセスを使用すると、ラベルの数にいくつかの事前の組み込みが可能になると思われますか?
更新:実験により、修正されたKL発散は、マルチラベル出力ではなく、マルチクラス出力を与える傾向があります。
(旧回答)
シグモイドのクロスエントロピーに関する私の経験はあまり快適ではありませんでした。現時点では、修正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
ケラスの推進力
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)