ニューラルネットワークの仕組みと利用する活性化関数の性質

▼この記事をSNSでシェアする▼

スポンサーリンク

スポンサーリンク

Pythonで形態素解析や画像認識などを行う際に、SVM(LinearSVC())などを使って分析するのもある程度の制度で行えますが、やはりニューラルネットワークを使った方がより精緻な分析ができることが多いです。

ただ実際に試しにやっていて、ニューラルネットワークのイメージは掴めたけど、ニューラルネットワークにおける活性化関数についてよくわからなかったので、今回調べて見たことを備忘録としてブログに残しておきます。

理解が至らない点があることはご了承ください・・・

ニューラルネットワークとは

仕組み

神経細胞を模したものをニューロンと呼びます。神経細胞が入力を受け取って、ある閾値を越えると次の神経細胞に信号を送る。

この仕組みを再現したものをニューラルネットワークと言います

機械学習においてはxの大量の入力値を入力し、たくさんの中間層を経て、最後の出力層に値が出力される。

※図では中間層が一つしか書かれていませんが、実際は複数中間層が構成されます。

具体例のイメージ

60px * 60pxの数字(0-9)の画像を判別するプログラムでニューラルネットワークを再現する場合、

画像の各画素を一列にして、3600個の入力層を設定し、中間層を作成し、出力層では最後0-9の数字の答えを判別するので10個の出力層を構成します。

ニューロンでの処理イメージ

個々のニューロンでの入力と出力のイメージを見てみよう。

実際は入力と出力の矢印はたくさんありますが、今回2つの入力と1つの出力を想定して考えて見ます。

入力は重み付きの数(wx)や切片(b)としてパラメータとなります。

パラメータが多ければ、w1x1+w2x2+…+wnxn+b1+…+bnとなる。

それがσで表現している関数に代入され、出力される。

この関数が今回の本題である活性化関数というもので、ニューラルネットワークの核となる計算処理となる。

活性化関数

sigmoid関数

y = \(\frac{1}{1+exp(-x)}\)

値の範囲:\(0 \leq y \leq 1\)

x=0のとき、y=\(\frac{1}{2}\)

※exp(n) =\( e^{n}\)

注目すべきは、値の範囲0以上1以下をとること。

それゆえ確率的な表現に向いており、中間層で用いられていたのですが、最近はあまり使われなくなっている。

ニューラルネットワークの学習では、誤差逆伝播法(バックプロパゲーション)を用いて、ニューラルネットワークの重みを計算するのですが、その際に関数の誤差の微分を使用します。

sigmoid関数を微分すると、y = (\(1 – \frac{1}{1+exp(-x)}\)) * \(\frac{1}{1+exp(-x)}\)

絶対値が大きくなるにつれ、微分値が0に近づいていってしまいます。それゆえ、誤差逆伝播法での学習に適さないのです。

誤差逆伝播法(バックプロパゲーション)についてはこちらが参考になるかと思います。

http://ipr20.cs.ehime-u.ac.jp/column/neural/chapter6.html

ReLU関数

  • y = 0 \((x \leq 0)\)
  • y = x \((0 \lt x)\)

Rectified Linear Unit:日本語でいうと、正規化した線形関数といったところか。

この関数は、シグモイド関数とは違い、関数の微分値は1\((0 \lt x)\)

であるため、誤差逆伝播法の学習に適しており、中間層の計算によく使われています。

softmax関数

式を見るとわかるのですが、sigmoid関数と似ている。

yi = \(\frac{exp(xi)}{exp(x1) +exp(x2) + …+exp(xn)}\)

値の範囲:\(0 \leq y \leq 1\)

こちらも、eにある入力値を累乗した値を、eに入力値の累乗した値の和を分母に割るので、分子が分母より大きくなることはありません。

exp(n)は非負であるためです。

softmax関数も0以上1以下であり、確率を表すのに便利な関数であるため、しばしば出力関数で使われます。

損失関数で使われることの多いクロスエントロピーとの親和性が高いです。

one-hot表現と言われる正解が1、そうでないものが0で表現される際の鉄板の関数の組み合わせです。

ニューラルネットワークの実装イメージ

最後にイメージを書いて見ます。

中間層はReLU関数、出力層はsoftmax関数を用います。

多層パーセプトロン(MLP)という構造を考えます。(ここは今回深く触れません)

上で少し触れた60px * 60pxの数字(0-9)の画像を判別するプログラムを考えて見る。

最終的な出力で

各数字である可能性が

0(1%),1(90%),2(1.5%),…,9(0.23%)といった具合に算出し、学習の結果画像の数字が90%の確率で1だという結果が導出されます。

あくまでイメージです。

次は損失関数とかそこらへんについて書こうかな・・・

メニュー・主な記事カテゴリ

おすすめ特集!




「ゆとり鳥日記」について
ITを中心に関心の赴くままに好きなように書いていく雑記ブログ!管理人が二人います。
◆フクロウ(ITコンサル)
◆santaka(SE)

詳しいプロフィール
お仕事の依頼・ご要望

ゆとり鳥日記をBTCで応援する