pit-rayの備忘録

知識のあうとぷっと

【Python】二値分類はシグモイド関数を使う

今回はニューラルネットワークに関するトピックです。

思うことがありましたら、どうぞお気軽にお寄せください。
早速ですが、本題です。


ニューラルネットワークを用いて推測を行う場合、大きく分けて二種類の分類ができるでしょう。
それは多値分類二値分類です。
それぞれ分けてスコアと確率の算出方法を見ていきましょう。


ここでは自然言語を扱う場合を想定しています。
特に二値分類に関しては、Negative Samplingを想定しています。


スコアの算出

多値分類

これはニューラルネットワークに入力した値が、どのようなクラスに属しているかを推測することを指します。

f:id:pit-ray:20190820220239j:plain

図は入力したxというデータが、ニューラルネットワークの?レイヤを通って、最後のノードにたどり着いた様子を示しています。
灰色はスコアの大きさを示しています。
また、このときのクラスの個数は、直前の重みの列数に等しくなります。

この場合、5つのクラスに分けているということになります。
多値分類の場合、スコアの大きさが確率の大きさに等しいため、上の5つのクラスはこのように表せます。

f:id:pit-ray:20190505180918j:plain

これから、xは二番目のクラスに属している可能性が高いと推測できます。


二値分類

二値分類は、xがYesかNoかを推測することを指します。(ここではそのように定義します)
ここでは、YesクラスとNoクラスに分けるのではなく、xが正解のときと比べてどれだけ似ているかを調べることで、YesかNoかを判断したいと思います。

それでは、xから得られたスコア正解から得られたスコアを比較するにはどうしたらいいでしょうか。
手っ取り早いのは内積を使うことです。

ベクトル\boldsymbol{a} とベクトル\boldsymbol{b} の内積は
  \boldsymbol{a}\cdot\boldsymbol{b}=|\boldsymbol{a}||\boldsymbol{b}|cos \theta
のように表せます。
大事なのは、\theta の意味です。
\theta は二つのベクトルがなす角です。
つまり、どれだけ同じ方向を向いているかを示しています。


ここまでのことを図に表すとこのようになります。

f:id:pit-ray:20190820220237j:plain


ここまでスコアの算出方法を、二つの分類方法に分けてみてきました。
それでは本題となるスコアを確率に変換する方法を考えます。


確率の算出

ここで確率は0から1の値を持つとします。

多値分類

上のスコアの算出にあったとおり、スコアの大きさは確率の大きさと一致します。
ここで注意したいのは、あくまで相対的な大きさが等しいのであって、実際の値は異なるということです。

そのような場合、分母に全体のスコアの和を取り、分子にクラスのスコアをとることで確率を算出できます。
そこで逆伝播を考慮して、ネイピア数を用いることで以下のように書けます。
  y _ k =  \displaystyle{ \frac{e^{a _ k} }{ \displaystyle{\sum_{i=1}^n e^{a _ i}}}}

k はクラスインデックスを指します。

これをソフトマックス関数といいます。

多値分類は、イメージしやすいと思います。


二値分類

二値分類のスコアは内積の結果でした。
繰り返しになりますが、内積は以下の式で定義されます。
  \boldsymbol{a}\cdot\boldsymbol{b}=|\boldsymbol{a}||\boldsymbol{b}|cos \theta

スコアはcos\theta が重要です。
\theta と内積の関係を示すと以下のようになります。

\theta cos\theta 内積(スコア)
0 1
\frac{\pi}{2} 0 0
\pi -1

このようにスコアの大きさは cos \theta に沿って変化していきます。
つまり、非線形に変化していきます。
ここで重要なのは、非線形であるという点です。
内積は大きさだけでなく、三角関数が絡むことで非線形性を持っています。

参考までに cos \theta0\leq\theta\leq\pi )のグラフを示します。
f:id:pit-ray:20190505193935j:plain

この変化を踏まえつつ、逆伝播を考慮してネイピア数を用いると活性化関数はこのように表せます。
  y=\frac{1}{1+e^{(-x)}}

これをシグモイド関数といいます。
グラフを示しますとこうなります。
f:id:pit-ray:20190505194915j:plain
このグラフは、表で示した内積と類似度( cos\theta )をうまく表現しています。
具体的に言うと、
xが正のときには、鋭角なので類似度が高くなり、確率が高くなっています。
その変化の仕方も cos\theta と似ています。

また、xが0のときには、垂直に交わっているので、確率が半分になっています。

さらに、xが負のときには、鈍角なので類似度が低くなり、確率が急激に下がります。
この時の変化も cos\theta を見ると同様の変化をしています。

したがって、シグモイド関数は、内積の変化を表すのに適していると言えます。


まとめ

これまでスコアと確率それぞれの考え方について、多値分類と二値分類で見てきました。
それぞれにおいて以下のような活性化関数を用いればよいです。

分類方法 活性化関数
多値分類 ソフトマックス関数
二値分類 シグモイド関数

 
 

参考文献

斎藤 康毅 『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』, 『ゼロから作るDeep Learning ❷ ―自然言語処理』



ゼロつくで直感的に理解できなかったため、まとめました。
参考になれば幸いです。
雑い図でスミマセン...

カラースキーム・テーマを他のテキストエディタ用に変換するツール【TeraPad, さくらエディタ対応】

今回は、テキストエディタの色設定を相互変換できるツールの紹介です。

C++学習の副産物として生まれたツールですので、対応エディタが非常に少ないですが、コメント等で対応希望のエディタ等がありましたら実装を検討します。

他にも対応OSやGUIの実装等の要望もありましたら実装いたします。
どうぞお気軽にお寄せください。

READMEは付属していません。

CUIアプリケーションですので、コマンドプロンプトやPowerShellなどで実行してください。

TxEditorCCTool

【対応OS】
Windows
※要望があれば、他OS用のアプリケーションも配布いたします。

【使い方】
〇/〇/tecc.exe 対象のファイル名 -fr 変換元エディタ -to 変換先エディタ -nm 出力ファイル名


〇/〇/tecc.exe
■ 最初の〇/〇/は、パスを示しています。
■ 絶対パスでも相対パスでも構いませんが、それぞれの環境にあった実行方法をご利用ください。
■ .exeは省略しても構いません。


対象のファイル名
■ これには、変換元となるファイル名を指定します(パスには対応していません)
■ ファイルはtecc.exeと同じ層のディレクトリに置いてください
■ 拡張子の有無は任意です


-fr 変換元エディタ -to 変換先エディタ
■以下の値を指定します

エディタ名
TeaPad TeraPad
さくらエディタ Sakura

※要望があれば他エディタも実装いたします


-nm 出力ファイル名
■ 省略可
■ デフォルトでは、読み込んだファイル名で出力されます(拡張子は異なる)
■ 拡張子の有無は任意です。

【実行例】
monokai.col(さくらエディタ)をmonokai2.tpc(TeraPad)として変換したい場合

C:/TxEditorCCTool/tecc.exe monokai.col -fr Sakura -to TeraPad -nm monokai2.tpc

【リンク】
TxEditorCCToolをダウンロードする

以上です。
コメントお待ちしております。