はじめに
ニューラルネットワークでは、入力に重みを掛けて足し合わせ、バイアスを加えたあと、活性化関数を適用します。これまでの記事では、活性化関数の例としてReLU関数を使ってきました。
しかし、活性化関数にはReLU以外にもさまざまな種類があります。その中でも、仕組みが単純で、初期の人工ニューロンの考え方を理解するうえで重要なのがステップ関数です。
ステップ関数は、入力がある値を超えたかどうかによって、出力を \(0\) か \(1\) に切り替えます。一見すると、ニューロンが情報を伝えるかどうかを決めるのに適した関数のように思えますが、現在のディープラーニングで広く使われる、勾配を利用した学習方法には向いていません。
なぜなのでしょうか。
この記事では、ステップ関数の仕組みを理解し、微分と勾配の観点から、なぜニューラルネットワークの学習に向かないのかを考えます。
この記事でわかること
この記事では、次の内容の理解を目指します。
- ステップ関数がどのような計算を行うのか
- ステップ関数のグラフが階段状になる理由
- ニューロンの出力を \(0\) か \(1\) に切り替える仕組み
- ステップ関数を微分すると何が起こるのか
- 勾配を使った学習にステップ関数が向かない理由
- シグモイド関数などが使われるようになった背景
1.ステップ関数とは何か?
ステップ関数(step function)は、入力がある境界を超えたかどうかによって、出力を切り替える関数です。ニューラルネットワークで使われる代表的なステップ関数は、次のように定義されます。
$$
f(x)=
\begin{cases}
0 & (x\leq 0)\\
1 & (x\gt0)
\end{cases}
$$
この関数では、入力 \(x\) が \(0\) 以下なら出力は \(0\)、\(0\) より大きければ出力は \(1\) になります。たとえば、\(f(-2)=0\)、\(f(0)=0\)、\(f(2)=1\) です。
入力の値がどれほど大きくても、出力は \(0\) か \(1\) のどちらかになります。
1.1.ステップ関数のグラフ
ステップ関数をグラフにすると、次のようになります。

グラフを見ると、\(x=0\) を境界として、出力が \(0\) から \(1\) へ突然切り替わっています。このように、ある境界で値が階段状に変化することから、ステップ関数と呼ばれます。
なお、\(x=0\) のときの値を \(1\) と定義する場合もあります。どちらの定義でも、今回考える学習上の問題は変わりません。
2.ステップ関数はニューロンでどのように使われるのか?
では、ステップ関数をニューロンに組み込むと、どのような計算になるのでしょうか。
これまでの記事で見てきたように、ニューロンでは、入力に重みを掛けて足し合わせ、バイアスを加えます。2つの入力を受け取るニューロンなら、活性化関数を適用する前の値は、次のようになります。
$$
z=w_1x_1+w_2x_2+b
$$
ここで、\(x_1,\ x_2\) は入力、\(w_1,\ w_2\) は重み、\(b\) はバイアスです。この \(z\) にステップ関数を適用すると、ニューロンの出力 \(y\) は次のようになります。
$$
y=f(z)=
\begin{cases}
0 & (z\leq0)\\
1 & (z\gt0)
\end{cases}
$$
つまり、重み付き和とバイアスの計算結果が \(0\) を超えた場合だけ、出力が \(1\) になります。
2.1.具体例で計算してみる
たとえば、重みとバイアスを次のように設定します。
$$
w_1=1,\quad w_2=1,\quad b=-3
$$
このとき、ニューロンの計算は \(z=x_1+x_2-3\) となります。
入力が \(x_1=2,\ \ x_2=2\) なら、\(z=2+2-3=1\) です。\(z\gt0\) なので、ステップ関数の出力は \(y=1\) になります。
一方、入力が \(x_1=1,\ \ x_2=1\) なら、\(z=1+1-3=-1\) です。こちらは \(z\leq0\) なので、出力は \(y=0\) になります。

このように、ステップ関数を使うと、ニューロンは入力に応じて \(0\) か \(1\) を出力する仕組みになります。
3.ステップ関数と初期の人工ニューロン
ステップ関数の考え方は、初期の人工ニューロンと深く関係しています。人工ニューロンの初期のモデルでは、複数の入力を受け取り、一定の条件を満たした場合に出力を切り替える仕組みが考えられました。
たとえば、1943年に提案されたマカロックとピッツの人工ニューロンモデルでは、入力に応じて \(0\) か \(1\) の出力を決める考え方が使われています。また、後に登場したパーセプトロンでも、重み付き和がしきい値を超えるかどうかによって、出力を決めます。
ここでいうしきい値とは、出力を切り替える境界のことです。先ほどのステップ関数では、\(z=0\) がしきい値に相当します。バイアスを調整することで、入力の重み付き和に対する境界を変更できます。
ただし、初期の人工ニューロンと現在のディープラーニングでは、学習方法が異なります。たとえば、パーセプトロンには、予測と正解の違いを利用して重みを更新する学習規則があるため、ステップ関数を使うニューロンが、まったく学習できないわけではありません。
問題になるのは、微分によって勾配を求め、その勾配を使って重みを更新する学習方法です。
4.ステップ関数を微分するとどうなるのか?
ここからが、今回の記事で最も重要な部分です。
ニューラルネットワークの学習では、予測と正解の違いを表す損失を小さくするように、重みやバイアスを調整します。そのために広く使われるのが、損失を重みで微分して得られる勾配です。
では、ステップ関数を微分すると、どのようになるのでしょうか。
4.1.微分は変化の割合を表す
微分とは、入力をわずかに変化させたとき、出力がどれくらい変化するのかを調べることです。たとえば、\(f(x)=x^2\) なら、微分すると \(f'(x)=2x\) になります。
この導関数を使えば、それぞれの位置で、入力の変化に対して出力がどれくらい変わるのかを求められます。
一方、ステップ関数ではどうでしょうか。
4.2.ステップ関数の微分はほとんどの場所で \(0\) になる
ステップ関数は、\(x\lt0\) の範囲では常に \(0\)、\(x\gt0\) の範囲では常に \(1\) です。そのため、それぞれの範囲では入力を少し変えても出力が変わりません。
したがって、ステップ関数の導関数は、次のようになります。
$$
f'(x)=
\begin{cases}
0 & (x\lt0)\\
\text{微分できない} & (x=0)\\
0 & (x\gt0)
\end{cases}
$$
\(x=0\) では、関数の値が不連続に変化するため、通常の意味では微分できません。つまり、ステップ関数は、\(0\) 以外のすべての場所で微分すると \(0\) になるのです。

この特徴が、ニューラルネットワークの学習で問題になります。
5.なぜステップ関数は学習に向かないのか?
ニューラルネットワークの学習では、重みを少しずつ調整しながら、予測と正解の違いを小さくしていきます。その代表的な方法が、勾配降下法です。
勾配降下法では、損失を \(L\)、重みを \(w\)、学習率を \(\eta\) とすると、重みを次のように更新します。
$$
w_{\mathrm{new}}
=
w-\eta\frac{\partial L}{\partial w}
$$
ここで、\(\frac{\partial L}{\partial w}\) は、重み \(w\) を変化させたときに損失 \(L\) がどのように変わるかを表す勾配です。この勾配を利用することで、損失を小さくする方向へ重みを調整します。
5.1.ステップ関数では勾配が \(0\) になる
ここで、1つの入力を持つニューロンを考えます。
$$
z=wx+b,\quad y=f(z)
$$
\(x\) は入力、\(w\) は重み、\(b\) はバイアス、\(f\) はステップ関数です。さらに、損失 \(L\) が出力 \(y\) に依存しているとします。
このとき、連鎖律を使うと、損失を重みで微分した値は次のように表せます。
$$
\frac{\partial L}{\partial w}
=
\frac{\partial L}{\partial y}
\frac{\partial y}{\partial z}
\frac{\partial z}{\partial w}
$$
ここで、\(y=f(z)\) なので、\(\frac{\partial y}{\partial z}=f'(z)\) です。また、\(z=wx+b\) なので、\(\frac{\partial z}{\partial w}=x\) となります。
したがって、
$$
\frac{\partial L}{\partial w}
=
\frac{\partial L}{\partial y}
f'(z)x
$$
となります。
ところが、ステップ関数では、\(z\neq0\) のとき \(f'(z)=0\) です。そのため、この式で計算される勾配も \(0\) になります。
$$
\frac{\partial L}{\partial w}=0
\quad (z\neq0)
$$
すると、勾配降下法による更新は \(w_{\mathrm{new}}=w\) となり、重みが変化しません。一方、\(z=0\) ではステップ関数が微分できないため、通常の連鎖律をそのまま適用できません。
つまり、ステップ関数では、境界以外では勾配が \(0\) になり、境界では通常の微分ができません。そのため、勾配を使って重みを更新する学習方法には適していないのです。
なお、ここで使った連鎖律は、合成関数を微分するための公式です。連鎖律がなぜ成り立つのかについては、数学編の記事で詳しく説明する予定です。
(準備中)
5.2.出力が間違っていても重みを更新できない
具体例で考えてみましょう。
入力を \(x=1\)、重みを \(w=-1\)、バイアスを \(b=0\) とします。このとき、ニューロンの計算結果は \(z=-1\) なので、ステップ関数の出力は \(y=0\) です。
しかし、正解が \(t=1\) だったとします。この場合、予測と正解は一致していません。たとえば、二乗誤差 \(L=\frac12(y-t)^2\) を使うと、損失は \(L=0.5\) になります。
本来なら、重みを調整して、出力が正解に近づくようにしたいところです。ところが、\(z=-1\) ではステップ関数の微分が \(0\) なので、連鎖律で求めた重みの勾配も \(0\) になります。
その結果、通常の勾配降下法では重みを更新できません。
ステップ関数が勾配を使った学習に向かないのは、入力のほとんどの場所で微分が \(0\) になり、誤差を減らすために重みをどの方向へ調整すればよいかという情報を、通常の勾配から得られないためです。
なお、これはステップ関数を使ったモデルが一切学習できないという意味ではありません。パーセプトロンの学習規則のように、微分を使わずに重みを更新する方法もあります。
6.ステップ関数の問題をどう解決するのか?
ここまで見てきたように、ステップ関数は \(0\) か \(1\) を出力するという単純な仕組みを持っています。しかし、出力が突然切り替わるため、通常の勾配を使った学習には適していません。
では、出力を \(0\) か \(1\) に突然切り替えるのではなく、入力に応じて滑らかに変化させたらどうでしょうか。
その考え方につながるのが、シグモイド関数です。シグモイド関数は、次のように定義されます。
$$
\sigma(x)=\frac{1}{1+e^{-x}}
$$
この関数は、入力が小さいと \(0\) に近い値を取り、入力が大きいと \(1\) に近い値を取ります。ステップ関数と異なり、出力が滑らかに変化するため、すべての実数で微分できます。
また、シグモイド関数の導関数は、有限の入力に対して正の値を取ります。そのため、ステップ関数とは異なり、活性化関数の微分がほとんどの場所で \(0\) になってしまう問題を避けられます。
ただし、シグモイド関数にも、入力の絶対値が大きい領域では微分が \(0\) に近づくという問題があります。このように、活性化関数にはそれぞれ特徴があり、学習のしやすさにも違いがあります。
次回の記事では、シグモイド関数の仕組みと微分を詳しく確認し、ステップ関数との違いを考えます。
まとめ
今回、見てきたことをまとめます。
- ステップ関数は、入力がしきい値を超えたかどうかによって、出力を \(0\) か \(1\) に切り替える関数である
- ニューロンに適用すると、重み付き和とバイアスの結果に応じて、出力を決められる
- 初期の人工ニューロンやパーセプトロンでは、しきい値によって出力を切り替える考え方が使われている
- ステップ関数は、境界以外では微分が \(0\) になり、境界では微分できない
- そのため、通常の勾配降下法や誤差逆伝播法を使った学習には向いていない
- ただし、パーセプトロンの学習規則など、微分を使わない学習方法は存在する
- シグモイド関数などの滑らかな活性化関数は、この問題を考えるうえで重要になる
ステップ関数は、出力を \(0\) か \(1\) に切り替えることはできますが、通常の微分では学習に必要な勾配を得られません。これが、勾配を利用するニューラルネットワークの学習に向かない理由です。
今回は、ステップ関数の仕組みから、活性化関数の微分が学習にどのように関係するのかを確認しました。次回は、ステップ関数と似た形を持ちながら、滑らかに変化するシグモイド関数について詳しく見ていきます。
関連記事


(準備中)
シリーズ全体を理解する
(準備中)
関連書籍
ニューラルネットワークの活性化関数や学習の仕組みをさらに理解したい方には、次のような書籍もおすすめです。



コメント