パーセプトロン
最近、仕事が忙しい&立て続けに資格試験を受けなくてはならなくてゲーム作りをまったくしていない。今年はOracleSilver12cから始まり、最近はG検定というのを取得した。続いて、E資格というのを取得する必要があるので、勉強のためにゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装という本を読み始めた。 (E資格の前にExam DP-100: Designing and Implementing a Data Science Solution on Azureという資格も取らなくてはならない。今年は勉強の1年だ。。。) DeepLearningは実装にpythonを使うのが主流のようだが、趣味でソースを書く文にはC言語が好きなので本にある実装をC言語に置き換えながら勉強を進めていきたいと思う。で、とりあえず2章パーセプトロンのソースをC言語で書いてみた。ゲーム作りをしていないせいでブログも全く書いていないので、勉強の経過も気が向いたら書こうと思う。
実装
ソースを載せる前にパーセプトロンというのはどんなものかを箇条書きにしておく。
- パーセプトロンは入出力を備えたアルゴリズム。ある入力に対して決まった値が出力される
- パーセプトロンでは、「重み」と「バイアス」をパラメータとして設定する
- 単層パーセプトロンは線形領域しか表現できない。多層パーセプトロンにすると非線形領域を表現できる
と、こういったものらしい。
では、それを踏まえてC言語で書いたのが以下になる。
#include <stdio.h> int AND(int, int); int NAND(int, int); int OR(int, int); int XOR(int, int); int main() { printf("AND(0, 0): %d\n", AND(0, 0)); printf("AND(0, 1): %d\n", AND(0, 1)); printf("AND(1, 0): %d\n", AND(1, 0)); printf("AND(1, 1): %d\n", AND(1, 1)); printf("NAND(0, 0): %d\n", NAND(0, 0)); printf("NAND(0, 1): %d\n", NAND(0, 1)); printf("NAND(1, 0): %d\n", NAND(1, 0)); printf("NAND(1, 1): %d\n", NAND(1, 1)); printf("OR(0, 0): %d\n", OR(0, 0)); printf("OR(0, 1): %d\n", OR(0, 1)); printf("OR(1, 0): %d\n", OR(1, 0)); printf("OR(1, 1): %d\n", OR(1, 1)); printf("XOR(0, 0): %d\n", XOR(0, 0)); printf("XOR(0, 1): %d\n", XOR(0, 1)); printf("XOR(1, 0): %d\n", XOR(1, 0)); printf("XOR(1, 1): %d\n", XOR(1, 1)); return 0; } int AND(int x1, int x2) { double x[2] = {x1, x2}; double w[2] = {0.5, 0.5}; double b = -0.7; double tmp = x[0]*w[0] + x[1]*w[1] + b; if (tmp <= 0) { return 0; } else { return 1; } } int NAND(int x1, int x2) { double x[2] = {x1, x2}; double w[2] = {-0.5, -0.5}; double b = 0.7; double tmp = x[0]*w[0] + x[1]*w[1] + b; if (tmp <= 0) { return 0; } else { return 1; } } int OR(int x1, int x2) { double x[2] = {x1, x2}; double w[2] = {0.5, 0.5}; double b = -0.2; double tmp = x[0]*w[0] + x[1]*w[1] + b; if (tmp <= 0) { return 0; } else { return 1; } } int XOR(int x1, int x2) { int s1 = NAND(x1, x2); int s2 = OR(x1, x2); int y = AND(s1, s2); return y; }
所感
XOR以外はどの回路も重みの違いのみで表現できているのがおもしろい。XORも単層パーセプトロンを重ねて2層にすることで表現できているので、とどのつまり、単層パーセプトロンを重ねていく(たぶんこの辺がDeepということなんだろうか)ことで複雑なものも作れるということのようだ。昔、シーマンという、おそらく推論と探索を駆使したゲームがあったが、それみたいにDeepLearningを学んでゲーム作りに活かせたらおもしろいなぁとおもう。