🐽

パーセプトロンとは

2023/07/26に公開

今回はパーセプトロンについて解説します。

パーセプトロンとは?

パーセプトロンとは、入力を受け取り、計算して0か1を出力する関数のことです。

パーセプトロンは入力xと重みw、出力yから構成され、
x×w が一定の値を越えた時にy=1,越えなかった時にy=0を出力する
という非常に単純な構造になっています。

コードで書くと以下のようになります。

# 入力:x,重み:w,しきい値θ,出力:y
if x*w > θ:
 y = 1
else:
 y = 0

パーセプトロンは、入力xに対して重みwを書けた結果が、閾値θを超えた時に、1、超えなかった時に0を出力します。
これがパーセプトロンの動作です。

現在使用されているニューラルネットでは、このパーセプトロンを拡張したニューロンが多く使用されています。
そのため、ここからはパーセプトロンの拡張とニューロンについて説明します。

パーセプトロンの拡張1 入力の増加

パーセプトロンの入力が増えてx_1,x_2となり、対応する重みもw_1,w_2となった時、
その動作は
{(x_1×w_1)+(x_2×w_2)}がθを超えた際にy=1、超えなかった場合にy=0を出力する

となり、
コードで書くと以下のようになります。

# 入力:x,重み:w,しきい値θ,出力:y
if x1*w1 + x2*w2 > θ:
 y = 1
else:
 y = 0

入力はx_3,x_4...x_nと幾つでも追加することができます。
これにより、パーセプトロンの入力として扱える変数の数が増えるため、ニューラルネット全体における表現力が増加します。

パーセプトロンの拡張2 出力を連続値に変換

上記でパーセプトロンは0か1(離散的な値)を出力すると説明しました。
しかし、実際に使用されているものはしきい値を取り去ってしまい、活性化関数と呼ばれる非線形な関数を通すことで、出力に連続的な値を扱えるようにしています。
※しきい値を取り去るだけでも、一次式の単純な連続値(入力×重みがそのまま)が出力されますが、非線形性を取り入れ、モデルの表現力を高めるために活性化関数を通しています。

ここでは活性化関数として有名なReLU関数とシグモイド関数を示します。
グラフは後の説明の際に確認するために表示しているので、サラッと見てもらえれば結構です。

・ReLU関数(正の値で単純比例)
y = max(0,x)

・シグモイド関数
y = \dfrac{1}{1+e^{-x}}

どちらも、入力の値xが増加するにつれて、出力yが増加することがわかると思います。
ニューロンの場合、上記のしきい値θではなく、この活性化関数を介して出力yを決定します。

これはコードで見ると分かりやすいと思います。
・ReLU関数を使用したニューロン

def neuron(x,w):
    
    
    def relu(z):
        return max(0, z)
    # 入力:x,重み:w,出力:y
    z = x*w
    y = relu(z)



    print(y)

少し難しく見えるかもしれませんが、これはパーセプトロンでθを比較していた 入力x×重みw に対して、θと比較する代わりにreluという関数を通しているだけです。

このコードの出力結果を見てみましょう。

# 入力:x,重み:w
neuron(x=1,w=2)
neuron(x=2,w=3)
neuron(x=-1,w=2)
neuron(x=-4,w=2)

>> 2 # x*w
>> 6
>> 0
>> 0

しきい値θによる0,1判別から、入力と重みの大きさによって出力が連続的(2,6のように)に変化するようになりました。またx×wが負の数の場合は出力が0になっています。
※ニューロンの入力を、上記のグラフに適用するイメージを持つと分かりやすいかもしれません。

これにより、0,1のみの出力から、0~∞まで表現の幅が広がったことになります。

同様に
・シグモイド関数を利用したニューロン

import math
def neuron(x,w):


    def sigmoid(z):
        return 1 / (1 + math.exp(-z))
    # 入力:x,重み:w,出力:y
    z = x*w
    y = sigmoid(z)



    print(y)

これも、パーセプトロンの出力前(θ比較の代わり)にsigmoid(y = \dfrac{1}{1+e^{-x}})という関数を通しているだけです。
出力は以下のようになります。

# 入力:x,重み:w
neuron(x=1,w=2)
neuron(x=2,w=3)
neuron(x=-1,w=2)
neuron(x=-4,w=2)

0.8807970779778823 
0.9975273768433653
0.11920292202211755
0.0003353501304664781

x×wが大きいほど1に近く、小さいほど0に近くなっていることが分かると思います。

このように特性の異なる活性化関数を使い分けて、ニューラルネットのモデルは作られています。

パーセプトロンの拡張3 バイアス項

バイアスを使用することで、ニューラルネットの表現力を高めることができます。
とても重要な要素ですが、解説が難しいためここでは簡潔に役割を紹介します。

バイアスは通常bで表され、コードでは以下のようになります。

# 入力:x,重み:w,しきい値θ,出力:y,バイアス:b
if x*w +b > θ:
# bが大きいほどしきい値θを超えやすい
 y = 1
else:
 y = 0

バイアスを調整することにより、発火(出力が1になること)しやすいパーセプトロンと、発火しにくいパーセプトロンを作ることができます。

最後に

実際にはパーセプトロン(ニューロン)を何重にも掛け合わせることでニューラルネットが作られています。
パーセプトロンとはニューラルネットを構成する要素であり、入力値に重みをかけて、活性化関数を通して出力する単純な構造を持ちます。

-実際の使われ方
実際に使われる時、重みは学習を通して変化し、重要な入力に対しては大きい重み、重要でない入力に対しては小さな重みに調整することで、入力から必要な要素をだけを抜き出し、予測や生成を行うモデルが作られています。

例として、画像認識で犬を判断したい場合、犬の画像を読み込み学習が進むにつれて、入力要素のうち犬の画像で多くみられる要素X(例えば鼻や目、耳)の重みが大きくなり、犬に関係のない背景の要素に対する重みが小さくなります。
そして学習後に新しい画像を入れたときに、要素Xに似たものがあると、それらの入力要素は重みの大きなニューロンを通るため、出力yが大きくなり犬であると判断が下されます。※ここでは重みの更新は行われません。
全く別の車の画像などは、犬の鼻や耳らしきものがないので、どの入力要素も大きな重みのニューロンを通らず、出力が小さくなるため犬ではないと判断されます。

これがパーセプトロンの仕組みと、実際の使われ方になります。

今回の解説はここまでになります。最後まで読んで頂きありがとうございました!

おまけ

他の活性化関数について記載します。
tanh関数(y=\dfrac{e^{x}-e^{-x}}{e^{x}+e^{-x}})

ハイパボリックタンジェントと呼ばれる活性化関数で、シグモイド関数に似ていますが最低値が-1まで拡張されています。
誤差逆伝搬法と呼ばれる、重みやバイアスの最適化手法で使用する際にシグモイド関数より特性が優れているため、こちらの方がより使用されています。

Discussion