2016-10-23 4 views
6

ロジスティック回帰を行いながら、望ましい結果として1つのホットベクトルを使用するのが一般的です。従って、no of classes = no of nodes in output layer。語彙索引(または一般的なクラス番号)は、2つのクラスの接近を間違って示す可能性があるため、索引語は使用しません。しかし、なぜ我々は1ホットベクトルの代わりに2進数を使用できないのでしょうか?1つのホットベクトルではなく2進数

つまり、4つのクラスがある場合、各クラスを00,01,10,11として表すことができ、結果として出力層にlog(no of classes)のノードが生成されます。

+2

有効な最適化である場合、これらのビットを見つけるためにハフマンコーディングを使用することもできます。この場合、softmaxが機能しないなど、最適化の目的を変更する必要があるかもしれないことに注意してください。 –

+1

これは整数を使用する場合とほとんど同じです( "ビット10とビット01"のものは "00"または "11"のいずれかで高い確率で結果が得られるので、 ) – lejlot

答えて

7

バイナリでエンコードしても問題ありません。しかし、タスクやモデルに応じて別のレイヤー(またはフィルター)を追加する必要があるかもしれません。あなたのエンコーディングがバイナリ表現のために無効な共有機能を意味するようになりました。例えば

、入力のためのバイナリエンコーディング(x = [x1, x2]):

'apple' = [0, 0] 
'orange' = [0, 1] 
'table' = [1, 0] 
'chair' = [1, 1] 

そのorangechair共有同じ機能x2を意味します。今、二つのクラスyの予測で:ラベル付きデータサンプルのため

'fruit' = 0 
'furniture' = 1 

と線形最適化モデル(W = [w1, w2]とバイアスb):あなたが肯定を得るfurnitureとして

(argmin W) Loss = y - (w1 * x1 + w2 * x2 + b) 

あなたはchairためw2重みを更新するたびにこのクラスに対してもorangeを選択することの改善。あなたが他の層U = [u1, u2]を追加する場合は、この特定のケースでは、あなたはおそらくそれを解決することができます:

(argmin U,W) Loss = y - (u1 * (w1 * x1 + w2 * x2 + b) + 
         u2 * (w1 * x1 + w2 * x2 + b) + 
         b2) 

[OK]を、ワンホットエンコーディングを使用することによって、このミス表現を避けられない理由。 :)

+0

ネットワークの出力にワンホットエンコードの代わりにバイナリエンコードを使用する場合はどうなりますか? – gen

+0

onehotエンコーディングはバイナリエンコーディングのようなものです(存在がない場合は '0'、存在の場合は' 1')が、実装方法としては、損失をどのように計算したいかによって決まります。たとえば、データと予測との間にクロスエントロピーの距離を持たせたい場合、間違いなくベクトルが必要です。したがって、1つの点を表す浮動小数点ベクトルを持つことが標準です。 – Mehdi

+0

迅速な対応に感謝します。私はこのすべてを理解しています。私の質問はこれです:出力のベクトルとしてワンホットエンコーディングの設定があります。代わりに出力形式をバイナリの符号化された数値に変更すると、上で概説したのと同じ問題になりますか? (結果はカテゴリをエンコードします...) – gen

0

https://github.com/scikit-learn-contrib/categorical-encoding

バイナリエンコードが(実際には、ベース-何エンコーディングは)category_encodersでサポートされています。私たちの場合、バイナリ文字列には1つのフィーチャがあるので、[0、1、1]と[0、1、0]をそれぞれ持つ値 '011'または '010'の3つのフィーチャではありません。

関連する問題