私が見た分類タスクのニューラルネットワークのほとんどの例では、出力アクティブ化関数としてソフトマックスレイヤーを使用しています。通常、他の隠しユニットは、シグモイド関数、tanh関数、またはReLu関数をアクティブ化関数として使用します。ここでsoftmax関数を使用すると、私の知る限り、数学的にもうまくいきます。
非表示層のアクティベーションとしてsoftmaxを使用するのが最善の方法ではない理由についての出版物は見つかりませんでした(ただし、おそらく既に読んだ Quora の質問を除く)。それがなぜかを説明しますこの場合にそれを使用するのは最良のアイデアではありません:
1。変数の独立性:変数を独立させ、無相関で非常にまばらに保つために、多くの正則化と努力が行われます。ソフトマックスレイヤーを非表示レイヤーとして使用する場合-すべてのノード(非表示の変数)を線形依存に保つため、多くの問題が発生し、一般化が不十分になる可能性があります。 。
2。トレーニングの問題:ネットワークを適切に機能させるには、非表示層からのアクティブ化の一部を少し低くする必要があると想像してみてください。次に、自動的に残りの部分をより高いレベルで平均的にアクティブにするようにします。これにより、実際にはエラーが増加し、トレーニングフェーズに悪影響を与える可能性があります。
3。数学的問題:モデルのアクティブ化に制約を作成することにより、論理的な説明なしにモデルの表現力を低下させます。すべてのアクティベーションを同じにするための努力は、私の意見ではそれだけの価値はありません。
4。バッチ正規化はそれをより良く行います:ネットワークからの一定の平均出力がトレーニングに役立つかもしれないという事実を考えるかもしれません。しかし、一方で、Batch Normalizationと呼ばれる手法は、より効果的に動作することが既に証明されていますが、非表示層のアクティベーション関数としてソフトマックスを設定すると、学習の精度と速度を低下させます。
Softmaxレイヤーは、 Neural Turing Machines(NTM) などのニューラルネットワーク内で使用でき、 Differentiable Neural Computer(DNC) であるものの改良版です。
要約すると、これらのアーキテクチャは RNNs/LSTMs であり、タイムステップを介して書き込みとアクセスが可能な微分可能な(ニューラル)メモリマトリックスを含むように変更されています。
簡単に説明すると、ここのsoftmax関数は、メモリのフェッチの正規化と、メモリのコンテンツベースのアドレッシングの他の同様の癖を可能にします。それについて、私は本当に気に入りました この記事 これは、NTMおよび他の最近のRNNアーキテクチャでの操作をインタラクティブな図で示しています。
さらに、Softmaxは この論文 などの機械翻訳などのアテンションメカニズムで使用されます。そこで、Softmaxは、注意が払われる最大の場所を「そっと」保持するために、注意が分散されている場所への場所の正規化を可能にします。つまり、他の場所にも少し注意を払います。ただし、これは、論文で説明されているように、大きなニューラルネットワークの中で、注目を集めるミニニューラルネットワークのように考えることができます。したがって、Softmaxがニューラルネットワークの最後でのみ使用されるかどうかは、議論の余地があります。
それが役に立てば幸い!
編集-より最近では、RNNもCNNもなしに、(softmaxで)注意のみが使用されているNeural Machine Translation(NMT)モデルを表示することも可能です: http://nlp.seas.harvard.edu/2018 /04/03/attention.html
多項分布をモデル化する場合は、どこでもsoftmaxアクティベーションを使用します。これは(通常は)出力層y
ですが、中間層、たとえば多項式潜在変数z
にすることもできます。このスレッドで出力__{o_i}
_について述べたように、sum({o_i}) = 1
は線形依存関係であり、この層で意図的です。追加のレイヤーは、望ましいスパース性および/または下流での機能の独立性を提供します。
ページ198/Deep Learning(Goodfellow、Bengio、Courville)
可能な値がnの離散変数の確率分布を表す場合はいつでも、softmax関数を使用できます。これは、バイナリ変数の確率分布を表すために使用されたシグモイド関数の一般化と見なすことができます。 Softmax関数は、n個の異なるクラスの確率分布を表すために、分類子の出力として最もよく使用されます。ごくまれに、内部変数に対してn個の異なるオプションから1つを選択することをモデルに希望する場合、モデル自体の内部でsoftmax関数を使用できます。
Softmax関数は、出力層のコンポーネントに(少なくともほとんどの場合)のみ使用され、出力ベクトルのコンポーネントの合計が1になるようにします(明確にするために、softmaxコスト関数の式を参照してください)。これはまた、出力の各コンポーネント(クラス)の発生確率が何であるかを意味するため、確率(または出力コンポーネント)の合計が1に等しくなります。
Softmax関数は、ニューラルネットワーク内のディープラーニングで使用される最も重要な出力関数の1つです(Uniqtechによる「Softmaxの詳細について」を参照)。 Softmax関数は、結果のクラスが3つ以上ある場合に適用されます。 softmax式は、eを各値スコアの指数スコアに引き上げ、それをeの指数スコア値の引き上げの合計で割ります。たとえば、これらの4つのクラスのLogitスコアが[3.00、2.0、1.00、0.10]であることがわかっている場合、確率出力を取得するには、次のようにsoftmax関数を適用できます。
npとしてnumpyをインポートする
def softmax(x):
print(softmax(scores))
出力:確率(p)= 0.642 0.236 0.087 0.035
すべての確率の合計(p)= 0.642 + 0.236 + 0.087 + 0.035 = 1.00。上記のスコアでわかっている任意の値を代入してみると、異なる値が得られます。すべての値または確率の合計は1になります。これは理にかなっています。すべての確率の合計が1に等しいため、ロジットスコアを確率スコアに変換して、より適切に予測できるようにするためです。最後に、softmax出力は、多項式ロジットモデルの理解と解釈に役立ちます。気に入っていただけましたら、下にコメントを残してください。