Posted at

【初心者】Pythonで本当に簡単にAI(笑)を作ってみる。


自己紹介

初めまして。なこーです。自分はAIに興味は持っているのですが、実際詳しい仕組みを理解しているわけではありません。

基本的にはずっとDjangoとかと戯れて趣味でサイトを作ったりしてたくらいです。

今回作成したプログラムも色んな開設サイトをあさってこんな感じかなと書いてある数式を書いただけです。

何回も言いますが、本当に簡単なプログラム、私自身AIについての知識はほとんどありません!!

それでもいいよって方この記事を読んでいってください。


作成するAI

今回作成するAIは0を1に変換するだけです。要するにNOTをわざわざAIで書くような感じです。

本当は一行で書けることをAIにさせるという...

0 → AI → 1

1 → AI → 0


チョー簡単なざっくりとした説明

今回は単純パーセプトロンを作っていきます。

ニューラルネットワークの基礎です。 って書いてありました。

具体的にどんな感じなのかアバウトに説明すると

人間の脳は神経回路(ニューロン)によって構成されています。電気信号を受け取るとなんか反応して次に伝えて~みたいな。

こういうことです。

setsumei1.png

setsumei2.png

これを沢山してるのが脳なんです。すごい。

それで実際にはこの伝わってくる途中の道(図でいうと矢印)の部分で電気が強くなったり弱くなったりしてるんですね。

それを重みとかいうらしいです。w1とかw2とか。これは入ってくる電気*w1 みたいなことをします。

たまに電気の量を引いたりとかもするらしいです。hです。なぜ引くのかはわかりません。自分の見た解説サイトにそう書いてありました。

不思議。

実際に数式で表すとこうですね。

i = 1 入ってくる値(電気)

w = -1 重み

h = 0 なんか引くやつ

o = i*w-h 結果

でこの値oを巨大な丸に渡します。

巨大な丸を活性化関数とかいうらしいです。

活性化関数にも種類があって、ステップ関数(0以上なら1, 以下なら0) とかシグモイド関数(うにょっって)とかなんとか....

今回はステップ関数を使います。

今回の場合いわゆる学習というのは 重みとか引くやつ(h)とかをいじっていくことになります。簡単ですね。


学習の方法

重みとか引くやつとかはどのようにいじっていくのでしょうか。

まず、テストデータとそれに対する答えを用意します。

最初はランダムに重み、引くやつを決めます。

i = 1 入ってくる値(電気)

w = -1 重み

h = 0 なんか引くやつ

o = i*w-h

a = もしもoが0以上なら1 それ以外は0です。

ってことをして、aと実際の答えを比較します。

もし間違っていたらいじります。

まず、重みの更新ですね。

入ってくる値にaと実際の答えの差をかけます。それに更新料をかけます。(ここでは0.5)そしてそれをもとの重みにかけます。

w = w+w*(a-実際の答え)*0.5

こういうことですね。

つぎに引くやつは

入ってくる値にaと実際の答えの差と更新料をかけます。それを引くやつから引きます。

h = h - (a-実際の答え)*0.5

こうです。

なんでこうなるのかはよくわかりません。調べてください。本当に知らないんです。ごめんなさい。

だれか頭のいい人教えて


書く!

というわけで書いていきます。

今回は入ってくるデータ(1 or 0)を反転させればいいわけです。

データセットを

In = [1,0,1,1,0,1,0,0,0,1,0]

Answer = [0,1,0,0,1,0,1,1,1,0,1]

このようにします。反転してますね。

で、上に書いたような計算をしていくわけです。

#1が入ってきたら0を返す。0が入ってきたら1を返す。NOT AIを実装する

from random import randint as ra

#データセット
I = [1,0,1,1,0,1,0,0,0,1,0]
A = [0,1,0,0,1,0,1,1,1,0,1]

#活性化
f = lambda x:1 if x >= 0 else 0

w = ra(-1,1)
h = ra(-1,1)
print("start")
print(w,h)

for kkk in range(15):
for i,ans in zip(I,A):
i = w * i #重みと入ってきたデータをかける
i = i - h #引く!
rans = f(i) #活性化関数に投入!
if rans != ans: #あってるか確認
sa = ans - rans #実際の答えと間違えた答えの差の計算
w = w+(i*sa*0.5) #重みの更新
h -= sa*0.5 #引くやつの更新!

print("FINISH")
print(w,h)
#試す。
while True:
i = int(input())
i = w * i
i = i - h
rans = f(i)
print("answer:",rans)

はい、無事実装できました。説明構雑になってしまいましたが本当に知らないので許してください。

もしなにかいい記事知ってるよ!詳しい説明できるよ!とかいう人がいたらコメントに書いてくださると幸いです。

実際に自分の手で書くとなかなかAIというものを身近に感じれて面白いですね。最後に一行で終わるNOT処理を書いて終わります。

print((lambda x:1 if x == 0 else 0)(int(input()))

意味のないことに無駄な技術を使ってはダメですねぇ...