読者です 読者をやめる 読者になる 読者になる

Coding Memos

try {coding} catch {questions}

パーセプトロンを論理回路に適用して使う【ゼロ作DL_6】

基本情報の勉強をちょろっとした時に学んだ話ですね。 こういうコンピュータサイエンスの基礎的な話も理解できるようにしたいところです。

f:id:codingmemos:20170226001156g:plain

ANDゲート/NANDゲート

{
y = w_1x_1+w_2x_2
}

パーセプトロンの簡単な式でした。これを、論理回路(AND/NAND/ORゲート)につかうというのが、今回の学習記録です。

式を見ての通り、2入力1出力です。

ANDゲートの場合

{x_1} {x_2} {y}
0 0 0
0 1 0
1 0 0
1 1 1

A君はBさんとCさんの意見を聞き、両方がGoサインを出したら、 実行しようみたいなケース?
ニューロン的に言えば、近隣二つのニューロンからの入力が来た時のみ、自分も出力することができる。複数からの入力を必要とする場合ですね。

NANDゲートはこれの出力を反転

{x_1} {x_2} {y}
0 0 1
0 1 1
1 0 1
1 1 0

思春期で多感なA君は、両親(B, C)の言うことに反発したくて仕方ない。両親二人からやりなさいと言われたことはやりたくない。みたいなケース?
近隣二つのニューロンからの入力を受けてしまうと、出力ができなくなってしまうパターン。近隣のニューロンが抑制入力をした時に、出力が止まるケースなどがこれに当てはまりそうです。

ORはどっちかが1であれば、出力は1

{x_1} {x_2} {y}
0 0 0
0 1 1
1 0 1
1 1 1

A君は社会人になり、同じくらい尊敬する上司を二人持った(B,C)BとCは言うことが反対だったが、どっちかがGoを出す場合には、実行しよう。。みたいなケース?
かなり活発なニューロンて感じしますよね。どこかしらからの入力が来れば出力するケースですね。

例え話はテキトーですw イメージつきやすくなればなっていうことで書いてあります。

定式化

ANDゲート

def AND(x1, x2):
  w1, w2, theta = 0.5, 0.5, 0.7
  tmp = x1*w1 + x2*w2
  if tmp <= theta:
    return 0
  elif tmp > theta:
    return 1

変数に対して値を代入する書き方ですが、こんな書き方あるんだなって思いました。 一応確認として

>>> a, b, c = 1, 2, 3
>>> print(a,b,c)
1 2 3

と、インタプリタで確認してみました。

>>> import logiccircuit as lc # logiccircuit.pyのディレクトリにて
>>> lc.AND(0,0) # 引数は x_1とx_2
0
>>> lc.AND(0,1)
0
>>> lc.AND(1,0)
0
>>> lc.AND(1,1)
1

これで、ANDゲートのテーブルと同じ結果が出ましたね。

NANDは反転すればいいので、パラメータを負にすればいいかなと思います。 式としては、returnの0,1を逆にすればいいと思うんですが、それはパーセプトロンアルゴリズムに沿ってないのかな? とおもって、パラメータの方を負にしています。

def NAND(x1, x2)
  w1, w2, theta = -0.5, -0.5, -0.7
  tmp = x1*w1 + x2*w2
  if tmp <= theta:
    return 0
  elif tmp > theta:
    return 1
>>> import logiccircuit as lc
>>> lc.NAND(0,0)
1
>>> lc.NAND(0,1)
1
>>> lc.NAND(1,0)
1
>>> lc.NAND(1,1)
0

できました。

ORゲートは、両方とも0でなければ、OKなので、{x_1,x_2} が両方とも0の時だけ、0を返すように書きました。

def OR(x1, x2):
  w1, w2, theta = 1.0, 1.0, 0.7
  tmp = x1*w1 + x2*w2
  if tmp <= theta:
    return 0
  elif tmp > theta:
    return 1

私はこのように書きました。本書では、考えてくださいということで、パラメータの設定はなかったので、参考になればとおもいます。 出力結果も、

>>> import logiccircuit as lc
>>> lc.OR(0,0)
0
>>> lc.OR(0,1)
1
>>> lc.OR(1,0)
1
>>> lc.OR(1,1)
1

となり、これもテーブル通りでしたね。

本書では、このあと、バイアス(中学数学における切片とかそんな感じ。ゲタばきっおもってもいいです)を導入して 考えます。

プログラムや出力結果などで2000文字を超えたので、本稿はここまで。