最近ではあらゆる分野でディープラーニングについての関心が大きくなっていますよね。実際、第4次産業革命と呼ばれる技術革新では、これらが大きく影響するといわれていわれています。そして、このディープラーニングについて語る上で欠かせないのが単純パーセプトロンと呼ばれるモデル。
この単純パーセプトロンとは、ディープラーニングの基礎とも呼べるものであり、こちらを発展させたことでニューラルネットワークやディープラーニングが生まれました。
今回はそんな単純パーセプトロンについてニューラルネットワークの関連性や、パーセプトロンと単純パーセプトロンの違い。また、単純パーセプトロンを使うメリットやデメリット、具体的な単純パーセプトロンの実装方法を紹介していきます。
ぜひ、単純パーセプトロンがどのようなものであるのかを知り、興味が出てきたら実際に扱ってみてください。
最後には説明してきた単純パーセプトロンの限界を打ち破る方法についてお伝えしていきます。
まずはパーセプトロンとは何か、を解説
パーセプトロンについて説明していく前に、その土台となるニューロンの仕組みと形式ニューロンについて説明してきましょう。
なお、ニューロンとは脳の神経細胞のことで以下の4つから構成されています。
- ニューロン本体
- 入力端子の樹状突起
- ニューロン同士を繋げるシナプス
- 出力を行う軸索
そして、これらが細胞内の働きによって電位差を生じさせ、ある一定の値を超えると電気が流れるようになっているのです。そのため、この仕組みによって人間は電気信号を伝えて体に命令を行ったり、ものを記録するなどといったことができます。
これがニューロンの仕組みなのですが、これをモデル化してあらわしたのが形式ニューロンと呼ばれるものです。
具体的には入力に対してそれぞれ重みを付加して総和する。その後これが一定値を超えた場合には1を出力し、超えない場合には0を出力するというものです。
以上がニューロンの仕組みと形式ニューロンについてになります。
そして、本題のパーセプトロンとはこの形式ニューロンを以下のように数式化したものです。
- u=ΣWiXi(i=1〜n)
- f(u)={1(u>0),0(u≦0)}
- y=f(ΣWiXi(i=1〜n)−θ)) or y=f(ΣWiXi(i=0〜n)),X0=1,W0=θ
数式だけをみていくとわかりにくいかもしれませんが、おおよそ上で説明したことを数式にしてやっているだけです。
したがって、パーセプトロンは神経組織ニューロンをモデル化した、形式ニューロンを数式化したものであることがわかるでしょう。
それではこれを踏まえて、パーセプトロンとニューラルネットワークの関連性を説明していきます。
パーセプトロンとニューラルネットワークの関連性
上記で説明したようにパーセプトロンとは、神経組織ニューロンをモデル化した形式ニューロンを数式化したものです。ここでみなさんに考えてほしいのが、元の神経細胞ニューロンは脳ではどのような状態であるかということ。
それでは話をパーセプトロンとニューラルネットワークの関係性に戻すと、今言ったことがパーセプトロンにも当てはまります。
というのもニューラルネットワークとは、その名前にあるようにパーセプトロンを単位として構成されたネットワークであるのです。具体的には複数のパーセプトロンが結びつき以下の3層から構成されています。
- 入力層
- 中間層
- 出力層
これらが上で説明したパーセプトロンに比べてどのような違いがあるのかといえば、特に重要なのが処理を行う中間層。こちらは入力層からの出力を入力として受け取り、処理を行って出力層に出力していく仕組みです。
そして、このディープラーニングでは猫の画像を人間以上に機械が判別できるようになるなど。様々な分野で大きな成果を上げていることからも、この中間層がいかに重要であるのかがわかるでしょう。
したがって、以上の点からパーセプトロンとニューラルネットワークは、1つの構成部品とそれらで構成された回路という関係性があるのです。
それでは以下ではより仕組みとしては古く、単純に作られているニューラルネットワーク、単純パーセプトロンについて説明していきましょう。ぜひ、単純パーセプトロンとパーセプトロンとの違いを理解してください。
パーセプトロンと単純パーセプトロンの違いとは
それでは、パーセプトロンと単純パーセプトロンの違いを説明していきましょう。上でも説明したようにパーセプトロンは、ニューラルネットワークという回路を構成する1つの部品にあたるものです。
そして、これらが集まることでニューラルネットワークは回路として機能します。
こちらに関しては多層パーセプトロンという複雑な仕組みのもの以外に、前段階となる単純パーセプトロンというものがあります。具体的には以下のようなもの。
- パーセプトロンで構成されている
- ニューラルネットとしては入力層と出力層の2層で構成される
- 出力層は基本的には1つでパーセプトロンと構造は似ている
なお、数式でこの単純パーセプトロンを表すと以下のようになります。
f(x)={1(W0+W1X1+W2X2+…+WnXn≧θ),0(W0+W1X1+W2X2+…+WnXn<θ)
こちらは「まずはパーセプトロンとは何か、を解説」で説明した式から求められます。
以上がパーセプトロンと単純パーセプトロンについてです。
これまでのことをまとめていくとパーセプトロンと単純パーセプトロンには、ニューラルネットワークにおいての部品と回路という違いがありますが、両者の入出力の構造は似ているという共通点があります。
単純パーセプトロンを使うメリット
それではこれらを踏まえて単純パーセプトロンを使うメリット、デメリットをお伝えしていきましょう。
単純パーセプトロンを使うメリットとしてあげられるのは以下のような点です。
単純パーセプトロンでは数式などが非常にシンプル
2クラス分類を行う際に向いている
ディープラーニングなどを学んでいく際の基本となる
以上が単純パーセプトロンを使うメリットになります。
つまり、単純パーセプトロンはそれ自体がわかりやすく、2クラス分類など単純な事柄を扱う際に向いているため、初歩のディープラーニング学習としておすすめということ。
ただし、単純パーセプトロンを使うことには当然デメリットもあります。それではそのデメリットもお話しましょう。
単純パーセプトロンを使うデメリット
単純パーセプトロンを使うデメリットとしてあげられるのは以下のような点です。
単純パーセプトロンでは線形非分離の問題に対応できない
まず、線形分離とはある集団を線形、つまり直線で2つに分けることを意味しています。わかりやすい例としてデジタル回路などで使われている論理回路、ORゲートで説明していきましょう。
なお、このORゲートとは、AとBという2つの入力うちどちらかが1であった場合に1を出力するもので、以下のように表すことが可能です。
- 0を出力する場合:(0,0)
- 1を出力する場合:(1,1)、(1,0)、(0,1)
そして、この線形分離可能であることは単純パーセプトロンでは大きなポイントとなり、線形分離可能なら単純パーセプトロンで何らかの判別を行えます。これは入力に対して適切な重みを付与することでプロットの位置を調節し、それによって直線をひけるようにしているため。
ところが2つ以上のより複雑なことがらを判別する場合などには線形分離ができないことがあり、その場合は単純パーセプトロンでは判別できないのです。
こちらについては具体的な例としてXORゲートをご紹介します。
なお、XORゲートとはORゲートと同様にデジタル回路などで使われている論理回路なのですが、排他的論理和というAとBという2つの入力うちどちらかが1の場合は1を出力する。両者が1、もしくは0であるときには入力とは反対の値を出力する性質のものです。
具体的には以下の場合に0or1を出力するもの。
- 0を出力する場合:(A,B)=(0,1)、(1,0)
- 1を出力する場合:(A,B)=(0,0)、(1,1)
こちらをORゲートと同様にプロットしていくとあることに気づくでしょう。それはいくら直線をひこうとしても無理であること。つまり、こちらは線形非分離の問題であるのです。
なお、この線形非分離の問題について次の章の最後でどう解決すればよいのかを説明していきます。そのため、以下の単純パーセプトロンの実装方法と併せて理解してください。
単純パーセプトロンの実装方法
それでは、単純パーセプトロンの簡単な実装方法についてみていきましょう。なお、実装にはプログラミング言語Pythonを利用するのが良いです。こちらなら比較的簡単に実装が行えます。
今回は上で紹介したORゲートの単純パーセプトロンを実装してみましょう。
まず、このORゲートでは入力に対して以下の値を出力します。
0を出力する場合:(0,0) 1を出力する場合:(1,1)、(1,0)、(0,1)
次に、こちらを単純パーセプトロンの数式で表すと以下のようになります。
u=W0+W1X1+W2X2
f(u)={1(u>0),0(u≦0)}
さらに、ここでポイントとなるのは重みWの値です。単純パーセプトロンではこちらを変化させることで、出力を変えられるのはこれまで説明してきました。
そのため、今回のORゲートにおいては以下のように重みを設定します。
W1=0.6 W2=0.6 W0=-0.2
後はこれをPythonで実装していけばよいです。具体的には適当な名前、例えば「orgate.py」と名付けて保存します。そして、以下のようにプログラミングしていきましょう。
def orgate(x1, x2): W1 = 0.6 W2 = 0.6 W0 = -0.2 u = W0 + x1 * W1 + x2 * W2 if u <= 0: y = 0 else: y = 1 return y
以上がプログラミングできれば実装としてはokです。
簡単に説明していくと「def orgate(x1, x2):」とはorgateとして関数を定義する。つまり関数名を付けているだけです。
そして、上で設定した重みを入力して1と2の数式をそのままプログラミングしています。後は以下の確認コード入力して正しいのかをみてみましょう。
print(orgate(0, 0)) print(orgate(1, 0)) print(orgate(0, 1)) print(orgate(1, 1))
これらのコードが正しければ以下のように出力されます。
$ python orgate.py 0 1 1 1
これが確認できれば簡単なORゲートの単純パーセプトロンの実装が完了したことになります。なお今回はORゲートの簡単な単純パーセプトロンの実装方法を説明しましたが、他のANDゲートなども重みなどを変えれば実装することが可能。
それではみなさん自身の手で重みを変え、しっかりとそれぞれの論理回路を再現して単純パーセプトロンを体験してみましょう。そしてこれを機会により専門的な単純パーセプトロンの実装などを学んでみてください。
今回は単純パーセプトロンについて解説しました。まとめると以下の通り。
- パーセプトロンは神経組織ニューロンをモデル化した形式ニューロンを数式化したものである
- パーセプトロンとニューラルネットワークは構成部品とそれらで構成された回路という関係性をもつ
- パーセプトロンと単純パーセプトロンは部品と回路という違いがあるが両者は似た構造をしている
- 単純パーセプトロンはシンプルでわかりやすいが、線形非分離の場合には判別ができない
- 単純パーセプトロンで論理回路を実装すると重みWを変えることで複数のゲートを実装できる
それでは最後に、単純パーセプトロンの限界を打ち破る方法についてお伝えしましょう。
この単純パーセプトロンの限界とはいわゆるこれまで説明した「線形非分離の場合には判別ができない」という点です。こちらについては論理回路のXORゲートの場合では、プロットしていくと直線をひくことができないのは明らかでしたよね。
では、これをどうすれば解決できるのかといえば、複数の論理回路ゲートを用いればよいのです。具体的にはXORゲートでは以下のようにすればパーセプトロンでの判別が可能に。
XOR=AND(OR,NAND)
ちなみにこれらのゲートはどれも線形分離が可能であるため、こちらは線形非分離なものを線形分離可能なもので表現していることになります。
また、これらを実際につなげてみると実はあるものが生まれていることがわかるでしょう。それは構成したネットワークに中間層ができていること。つまり、この線形非分離なものを判別しようとすると入力層と中間層、出力層の3層をもつ多層パーセプトロンが作成されたということです。
したがって、単純パーセプトロンの限界を打ち破りたければ、多層パーセプトロンを構成すれば良いでしょう。今回はXORゲートで説明しましたが、他にも2クラス以上の多クラス分類では効率的にそれぞれを分類できます。
もし単純パーセプトロンの実装をやってみて興味が出てきたのなら、こちらにも挑戦してみてください。そうしていけばいずれこの多層パーセプトロンを発展させた、ディープラーニングにも挑戦できるかもしれません。是非将来に生かしていきましょう。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。