デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

ステップ関数を理解してみる

はじめに

活性化関数としてステップ関数がある、ニューラルネットワークの起源となるアルゴリズムのパーセプトロンでAND回路やOR回路の構成に使用されたものです。

yaju3d.hatenablog.jp

過去にシグモイド関数をやってきてるのに、なんで初期の活性化関数であるステップ関数に戻るのかというと、それは微分不可能だから。
活性化関数 Relu も微分不可能なのにディープラーニングの隠れ層では推奨されています。

私の方で活性化関数で「微分不可能」というところに理解が引っかかっているので、原点に戻って整理しようと考えたのです。

あとで追記します。

参考

ステップ関数

形式ニューロン

f:id:Yaju3D:20170528144340p:plain f:id:Yaju3D:20170528154127p:plain
左図が本物の神経細胞(ニューロン) で、右図が形式ニューロンです。
形式ニューロンをWikipediaから引用します。

形式ニューロン(けいしきニューロン、英: formal neuron)や Threshold Logic Unit とは、1943年に神経生理学者・外科医であるウォーレン・マカロックと論理学者・数学者であるウォルター・ピッツが発表した最初の人工ニューロン(英: artificial neuron)[1]。伝達関数としてはヘヴィサイドの階段関数を使い、入出力の値は 0 または 1 の二値だけをとる。

簡単に説明すると、入力が2つあり各入力に対して重みが掛け算され、その値が閾値を超えれば出力は「1」、そうでなければ出力は「0」となります。 たとえば、入力が(1,0)、重みが(0.5, 0.7)だとすると、1×0.5 + 0×0.7 = 0.5 を計算して閾値と比較します。

形式ニューロンの場合、入力が「0」か「1」、重みが「実数」、出力が「0」か「1」となります。

単位ステップ関数

後述するヘヴィサイド関数との違いは、x = 0 の時も1の値を持つものとして定義していること。

f(x) = \begin{cases} 1 & (x \geq 0) \\ 0 & (x < 0) \end{cases}

機械学習のサンプルプログラムで使用されるステップ関数は、x = 0 の時は0の値になっているので用途によって定義が違うんでしょうね。

def step(x): 
    return 1 if x > 0 else 0
f(x) = \begin{cases} 1 & (x > 0) \\ 0 & (x \leq 0) \end{cases}

f:id:Yaju3D:20170603024904p:plain

ヘヴィサイド関数

ヘヴィサイドの階段関数 は、正負の引数に対しそれぞれ 1, 0 を返す階段関数となります。

f(x) = \begin{cases} 1 & (x > 0) \\ 0 & (x < 0) \end{cases}

又は、原点を埋めて

f(x) = \begin{cases} 1 & (x > 0) \\ \frac{1}{2} & (x = 0)  \\ 0 & (x < 0) \end{cases}

パーセプトロン

単純パーセプトロン

単純パーセプトロンの活性化関数としてステップ関数を使用しています。
qiita.com

rightcode.co.jp

多層パーセプトロン

多層パーセプトロンの活性化関数としてステップ関数を使用しています。
rightcode.co.jp

ステップ関数の限界

多層パーセプトロンの精度をよくするための誤差逆伝播(バックプロパゲーション)が生み出されたのですが、ステップ関数は微分が出来ないため、ラメルハートらは誤差を伝播できるような微分可能な活性化関数として、シグモイド関数を用いるようになりました。
rightcode.co.jp

最後に

今の自分は本やWebサイトを見て知識を得ているだけで、本当の意味で理解出来ていないことがあらためて分かったので、ちゃんと理解するようにプログラムを組んでみることにします。

スポンサーリンク