投稿

4月, 2018の投稿を表示しています

Reactで数当てゲーム(NumerOn)を作ってみた

イメージ
こんにちは、ぐぐりら(@guglilac)です。


春休みにReactを始めて、チュートリアルもいくつか終えました。

一番最初のHello Worldをやってみるとこだけ記事にしたと思います。

CodePenでReactのお勉強〜Hello World編〜

チュートリアルは本家の3目並べと、どっかの記事にあったToDoアプリの作成をやってみました。

そろそろ写経じゃなくて実際に自分で考えて書いてみよーかなー、ということで、練習によく使う「数当てゲーム」を作ってみました。

NumerOn(ヌメロン)とか呼ばれたりもします。
テレビかなんかで昔取り上げた番組があった気がします。

NumerOnのルール 一人で行う、数当てゲームです。 ランダムに作られる3桁の数字を当てるゲームです。
各桁の3つの数字は全て異なるように作られます。
プレイヤーは毎回3桁の数字を入力します。
入力した3桁の数字が並び順も含めて全て正解の3桁の数字と一致していればゲーム終了です。
正解していない場合、「入力した数字がどのくらい一致していたか」という情報が返されます。
この情報は、「1H 2B」というように「?H ?B」という形式で返ってきます。

Hの前の数字は、「入力した数字のうち位置まで正解と合致している数字の個数」を表し、
Bの前の数字は、「入力した数字のうち、位置はあっていないけれど正解に含まれてはいる数字の個数」を表しています。
たとえば、
正解が「3 6 7」だった時、
プレイヤーが入力した数字が「3 7 6」だった場合、
位置があっているのは3のみ => 1H 6と7は位置は違うけれど正解に含まれてはいる => 2B
となります。 この情報を手がかりに、正解の数字を当てる、というのがこのNumerOnというゲームです。
(一人で行うゲームと書きましたが、どちらが先に当てられるかを競うという形で2人対戦も出来ます。)
おわりに どこに状態を保存するのがベストなのかとかがまだよくわからず、とりあえず動けばいいやーって感じで書いてしまっています。
時間があればコードの解説とかも書こうかな。


追記
一人で遊ぶだけではさみしいので、CPUと戦えるようにしました! Numeron App
CPUの戦略はまた後日書こうかと思いますが、割と強いと思います。 遊んでみてください。
ア…

パーセプトロン・ADALINE・ロジスティック回帰の違いを整理する

イメージ
こんにちは、ぐぐりら(@guglilac)です。
どれがどれだっけ、ってなってたので知識の整理。

どれも単一層のニューラルネットワークです。

重みの更新の仕方や、損失関数の定義、活性化関数などが違います。

重みと入力ベクトルの内積をとるところは一緒。

$$z=w\cdot x$$

その結果をどうするかによって違いが出ます。

パーセプトロン 内積の結果得られる$z$をそのまま量子化器に入れて分類。
重みの更新には$z$ではなく量子化後の出力ラベルを用います。

すなわち、出力ラベルが正解だったら何もしない、間違ってたら重みを更新する、といった感じ。損失関数とか最適化アルゴリズムとかも出てきません。

パーセプトロンについては、こんな記事も書いてます。

scikit-learnでパーセプトロンを実装して標準化の効果を実感したお話

ADALINE パーセプトロンから、重みの更新のところを改良したのがADALINE。
量子化後の出力ラベルを見て重みの更新をするのではなく、内積を計算して得られる$z$を用いて重みを更新しようぜ、っていうコンセプト。
出力方向の計算はパーセプトロンと一緒で、重みの更新だけ異なります。

ADALINEでは損失関数を定義して、その損失関数が小さくなるように重みを更新していきます。
これ以降、機械学習のアルゴリズム全般に「損失関数を定義してこれを小さくしていく方向で重みを更新していく」という流れがやってきたらしい。
ADALINEの損失関数は誤差平方和で定義されます。 正解ラベルと$z$の差(誤差)の平方のデータの個数分の和です。
データの個数分の和といったように、ADALINEではバッチごとに学習をまとめて行うようにもなりました。
損失関数を減少させる重みを見つけるアルゴリズムには、勾配降下法を用いています。 バッチごとにまとめて更新するので、バッチ勾配降下法と呼ばれたりもする。

ロジスティック回帰
ロジスティック回帰は回帰という名前が付いているのに、分類問題に用いられるというややこしいアルゴリズムです。
ロジスティック回帰は前作ADALINEからさらに改良されたアルゴリズムになっています。
ADALINEでは重みの更新に内積の計算結果$z$をそのまま用いていましたが、ロジスティック回帰ではこの$z$にロジスティック関数を作用させたものを用い…