# 【手計算で紹介】パーセプトロンを簡単な例でわかりやすく解説！

> 当サイト【スタビジ】の本記事では、パーセプトロンについて分かりやすく簡単な例で徹底的に解説していきたいと思います！パーセプトロンを理解できればニューラルネットワークやディープラーニングの理解が早まるので是非おさえておきましょう！

- URL: https://toukei-lab.com/perceptron
- 公開: 2022.11.29 / 更新: 2025.01.04
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、パーセプトロンについて分かりやすく簡単な例で徹底的に解説していきたいと思います！パーセプトロンを理解できればニューラルネットワークやディープラーニングの理解が早まるので是非おさえておきましょう！
:::

こんにちは！

外資系でのデータサイエンティストを経て現在は会社経営をやっているウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

この記事では<mark>ディープラーニングやニューラルネットワークの基本となる「パーセプトロン」</mark>について見ていきたいと思います。

パーセプトロンについては以下の書籍「ゼロから作るディープラーニング」について詳しく載っています。

::product[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装]{url="https://www.amazon.co.jp/dp/4873117585?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/513J77QZHgL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/4873117585?tag=statistic08-22&linkCode=ogi&th=1&psc=1" rakuten="https://af.moshimo.com/af/c/click?a_id=858168&p_id=54&pc_id=54&pl_id=616&url=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E3%2582%25BC%25E3%2583%25AD%25E3%2581%258B%25E3%2582%2589%25E4%25BD%259C%25E3%2582%258BDeep%2BLeaning%2F%3Ff%3D1%26grp%3Dproduct"}

この記事では、この書籍を参考にしながら解説していきたいと思います。

パーセプトロンを理解しておくだけで、[ニューラルネットワーク](/nn)・[ディープラーニング](/deep-learning)の理解がビックリするくらい進むので是非この記事で理解を深めてください！

動画でも解説しているので以下もあわせてチェックしてみてください！

::youtube{#GOSSOMy_RXU}

## パーセプトロンの仕組み

![AI](/wp-content/uploads/2017/12/Artificial-intelligence-amico-min-e1617628722323-1024x824.png)

パーセプトロンとは、ローゼンブラットという研究者によって1957年に考案されたアルゴリズムです。

非常に古くからある、このパーセプトロンですが、<mark>ニューラルネットワークそして多層ニューラルネットワークであるディープラーニングにつながる大事なアルゴリズム</mark>なのです。

パーセプトロンとはある信号を入力として受け取り、あるルールに基づいて変換し、特定の信号を出力するものです。

![3層構造のニューラルネットワーク](/wp-content/uploads/2019/06/NN-1024x364.jpg)

パーセプトロンの考え方は、人間の神経回路が信号を伝達していく流れをシンプルにしたものなんです。

このパーセプトロンでは、<mark>信号を流す（1）か流さない（0）かの２値の値で表現</mark>します。

ある入力信号x1,x2に対して重みを付けて足し合わせたものを出力yとします。

重みは適当にw1,w2と付けておきましょう！

こんな形の絵でイメージしてください。

![パーセプトロン](/wp-content/uploads/2021/09/5-1024x576.jpg)

この時yは決められた閾値に応じて反応します。

特定の閾値θを超えた場合1を出力し、超えなかった場合は0を出力します。

これを式で表すと以下のようになります。

$$
\begin{darray}{rcllll}
y= \left\{ \begin{array}{l} 0~~(w_1x_1+w_2x_2<=\theta) \\ 1 ~~  (w_1x_1+w_2x_2>\theta) \end{array} \right.
\end{darray}
$$

こんな形でパーセプトロンを定義します。

この時、x1、x2は信号を流すか流さないかの1もしくは0になるのでした。

その際に以下のようにx1とx2の組み合わせに対してyを出力したいとしましょう。

こんな組み合わせです。

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody>
</table>

x1,x2のどちらかが0であれば0を出力し、どちらも1であれば1を出力するというものです。

この時(w1,w2,θ)の組み合わせには何があるか考えてみましょう！

:::talk{who="robotan"}
うーん、なんとなくたくさん組み合わせが考えられそうな気がするけど・・・
:::

:::talk{who="umatan"}
そうなんだ！実は無数の組み合わせが考えられるんだよ！
:::

このようになる(w1,w2,θ)の組み合わせは実はたくさん考えられるのですが、例えば(0.4,0.4, 0.5)などが1つの例になります。

これを先程の式に当てはめてみると、、、このようになり、

$$
\begin{darray}{rcllll}
y= \left\{ \begin{array}{l} 0~~(0.4x_1+0.4x_2<=0.5) \\ 1~~  (0.4x_1+0.4x_2>0.5) \end{array} \right.
\end{darray}
$$

ちゃんと、

$\displaystyle 0.4×0+0.4×0=0<=0.5~~y=0$\
$\displaystyle 0.4×1+0.4×0=0.4<=0.5~~y=0$\
$\displaystyle 0.4×0+0.4×1=0.4<=0.5~~y=0$\
$\displaystyle 0.4×1+0.4×1=0.8>0.5~~y=1$

と表のようになってますね！

続いて以下のようにx1とx2の組み合わせに対してyを出力したいとしましょう。

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
</tbody>
</table>

こちらは先の組み合わせとは完全に逆のパターンであり、今度は1つでも0が入力にあれば出力は1になって、入力がどっちも1であれば出力は0になります。

この時も同様にパラメータ(w1,w2,θ)を変えれば実現することが出来ます。

先ほどの逆なので先ほどのパラメータを反転させて(0.4,0.4, 0.5)などのようにすれば実現することができます。

$$
\begin{darray}{rcllll}
y= \left\{ \begin{array}{l} 1~~(0.4x_1+0.4x_2<=0.5) \\ 0~~  (0.4x_1+0.4x_2>0.5) \end{array} \right.
\end{darray}
$$

これは問題なさそうですね。

さらに以下のような組み合わせも問題なくパラメータをいじることで実現することができるのが分かるでしょう。

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody>
</table>

今回は、1つでも入力に1があれば出力が1になって、どっちも入力が0の時だけ出力が0になってますね！

例えば、(w1,w2,θ)に(1,1,0.5)を入れれば実現できますね

$$
\begin{darray}{rcllll}
y= \left\{ \begin{array}{l} 0~~(x_1+x_2<=0.5) \\ 1~~  (x_1+x_2>0.5) \end{array} \right.
\end{darray}
$$

$\displaystyle 1×0+1×0=0<=0.5~~y=0$\
$\displaystyle 1×1+1×0=1>0.5~~y=1$\
$\displaystyle 1×0+1×1=1>0.5~~y=1$\
$\displaystyle 1×1+1×1=2>0.5~~y=1$

ちゃんと組み合わせを実現できていることが分かりました！

このように特定の入力に対して特定の出力がされるように人間の手でパラメータをいじってルールを作ることができました。

今回は人間が手動で行いましたが、<mark>これを機械が調整してくれるのが機械学習であり、ニューラルネットワーク→ディープラーニングにつながっていきます。</mark>

このパーセプトロンの考え方は非常に重要であり、ディープラーニングを学ぶ上で重要な基礎となるポイントなので必ずおさえておきましょう！

## パーセプトロンはどんな組み合わせでも表現できる？

![quiz](/wp-content/uploads/2021/01/Exams-amico-min-e1618234275813-1024x955.png)

:::talk{who="robotan"}
なるほど〜、こんな単純な仕組みなのに色んな組み合わせを表現できるんだね！どんな組み合わせでもパーセプトロンで表現できるの？？
:::

:::talk{who="umatan"}
どうかなー？見ていこう！
:::

さて、ここで1つの疑問がわきます。

どんな組み合わせでもパラメータをうまく調整すれば表現できるようになるのでしょうか？

例えば以下のような組み合わせはどうでしょう？

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
</tbody>
</table>

どうやったら実現できるか考えてみましょう。

いかがでしょうか？

実はこの組み合わせは、<mark>これまでのパーセプトロンでは表現することができないのです。</mark>

なぜ実現できないのか考えてみましょう。

先ほどの以下の組み合わせは(w1,w2,θ)の(1,1,0.5)を入れた場合に実現できるのでした。

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody>
</table>

式は以下のようになります。

$$
\begin{darray}{rcllll}
y= \left\{ \begin{array}{l} 0 ~~ (x_1+x_2<=0.5) \\ 1 ~~  (x_1+x_2>0.5) \end{array} \right.
\end{darray}
$$

この状態がどんな状態なのか図で見てみましょう。

x2とx1で軸を取って平面を展開した時に

$$
\begin{darray}{rcllll}
x_2 = -x_1+0.5
\end{darray}
$$

の関数を境界に1か0が分かれているので以下のようになるということが分かると思います。

![](/wp-content/uploads/2021/09/3-1-1024x576.jpg)

そして以下の表の組み合わせをy=0を◯、y=1を△にしてプロットしてみると・・・

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody>
</table>

ちゃんと直線で分離することが出来ているのが分かると思います！

この境界範囲ならパラメータを動かしても問題ないでしょう。

しかし、先ほど考えてみた以下の組み合わせはいかがでしょうか？

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
</tbody>
</table>

x1x2を軸に取ってプロットしてみると以下のようになります。

![](/wp-content/uploads/2021/09/4-1024x576.jpg)

実はこれは直線では分けることができないのです。

どう頑張っても、座標（1,1）の◯を直線で捉えにいこうとすると△を内包してしまうことが分かると思います・・

![パーセプトロン](/wp-content/uploads/2021/09/fa48a871ec7d4803b4039c3320cd0c7a-1024x576.jpg)

直線で判別することを線形判別と言いますが、これは線形判別ではうまく分けることができない組み合わせなのです。

しかし、<mark>このような組み合わせは現実問題には多く発生します。</mark>

## 複数のパーセプトロンを重ねる

![stories data](/wp-content/uploads/2021/01/Data-points-rafiki-e1612221774326-1024x765.png)

ではどのようにすればこのような組み合わせを判別できるのでしょうか？

実はここでパーセプトロンを重ねるという発想が登場します。

なんと、単一のパーセプトロンでは上手く表現できないものも複数のパーセプトロンを使うことで表現することができるのです。

![パーセプトロン2](/wp-content/uploads/2021/09/fa48a871ec7d4803b4039c3320cd0c7a-1-1024x576.jpg)

以下の組み合わせによるアウトプットのさらなる組み合わせによって実現されるのです。

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y1</td>
<td>y2</td>
<td>z</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
</tbody>
</table>

x1とx2の組み合わせから生まれたy1とy2からzが生まれています。

分解すると、

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
</tbody>
</table>

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y2</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody>
</table>

は今まで見てきた組み合わせであり、

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>y1</td>
<td>y2</td>
<td>z</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
</tbody>
</table>

yを入力としてzを出力する、このパターンも1つでも0が入力であったら出力が0になる以下の組み合わせと同じであることが分かると思います。

<table border="0" cellspacing="0" cellpadding="0" class="table">
<tbody>
<tr>
<td>x1</td>
<td>x2</td>
<td>y</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody>
</table>

これら1つ1つを切り取ってみると実は今まで登場した組み合わせと一緒なのですが、<mark>複数組み合わせることでより複雑な分類問題に対応できるようになるのです！</mark>

これにより単一のパーセプトロンで実現できないことが実現できました。

これからニューラルネットワークやディープラーニングの世界に入っていきますが、このパーセプトロンの考え方が土台になっており非常に重要なので、必ずおさえておきましょう！

## パーセプトロン　まとめ

ここまででパーセプトロンについて簡単に分かりやすく解説してきました！

:::talk{who="umatan"}
興味のある人は実装もしてみよう！
:::

ここからニューラルネットワークやディープラーニングの世界に入っていきます。

ディープラーニングについては以下の書籍が非常に分かりやすくオススメなので是非チェックしてみてください！

::product[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装]{url="https://www.amazon.co.jp/dp/4873117585?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/513J77QZHgL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/4873117585?tag=statistic08-22&linkCode=ogi&th=1&psc=1" rakuten="https://af.moshimo.com/af/c/click?a_id=858168&p_id=54&pc_id=54&pl_id=616&url=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E3%2582%25BC%25E3%2583%25AD%25E3%2581%258B%25E3%2582%2589%25E4%25BD%259C%25E3%2582%258BDeep%2BLeaning%2F%3Ff%3D1%26grp%3Dproduct"}

パーセプトロンから更に踏み込んでニューラルネットワークやディープラーニングの実装についてはスタビジアカデミー（スタアカ）でまとめているので興味のある方は見てみてください！

[業界最安値のデータサイエンス専門スクール「スタアカ」](https://toukei-lab.com/achademy/)

[![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)](https://toukei-lab.com/achademy/)

また以下の記事でディープラーニングの勉強方法やディープラーニングが学べるスクールについてまとめていますのであわせて見てみてください！

<https://toukei-lab.com/deep-learning-study>

<https://toukei-lab.com/deeplearning-school>