スクラッチでAIをプログラムしてみよう

ブロックの応用テクニック
Scratch星人
Scratch星人

最近は様々なところでAIという言葉を耳にするようになりました。

でも、AIってなんなのでしょう?ロボットのことでしょうか?

この記事ではAIのプログラミングを作って動かしてみることで、AIについての理解が進む入門的な内容を書いていきます。

AIってなに?

AIは人工知能と言われていますが、まだ明確な定義は定まっていないようです。

AIと同じくらい耳にする言葉に「機械学習」というものがあります。
これは、AI(人工知能)の一種であると言われています。

機械学習には「教師あり学習」「教師なし学習」「強化学習」というものがあります。

それぞれの詳しい説明は省略しますが、ここでは「強化学習」というものに挑戦し、AIについて学んでいこうと思います。

強化学習とは

子どもが成長していく過程のように、試行錯誤を繰り返しながら、いい結果に近づいていくものを「強化学習」と呼ぶことが出来ます。

具体的にスクラッチで何をするかと言うと、内容は以下の通りです。

  • ネコがドアを開けるとケーキ(当たり)か、バツ印(ハズレ)が出現する
    • この時、当たりが出る確率はスタート時に自動で設定される
  • ドアを開けるたびにネコは学習して、当たりが出る確率を予測する
    • ドアを開ける回数は自分で設定する

文章にすると、いまいち意味が分かりにくいですね。。。

ということで早速作っていきましょう!

用意するスプライト

今回は背景にもコードを書いていくので、計5つのスプライトを用意します。

ひとつめは初めからいるネコです。(今回の主役AI)

ふたつめはケーキ(Cake)です。
当たりのために用意するので宝石やドーナツなどでも大丈夫です。

みっつめはBatです。
これは最後に正解を教えてくれるスプライトなので、犬やクラゲなどでも大丈夫です。

よっつめはバツ印(Button5)です。
これもハズレっぽいものなら大丈夫です。

最後に背景ですが、Castle1を選びました。
ドアを開ける音なども付けるので、ドアのある背景なら大丈夫です。

これでスプライトの準備は完了です。

スクリプトの作成

今回はAIに触れる内容なので、スクリプトの作成方法などは、あまり詳しく解説しません。

操作方法が不安な場合は、他の記事などで確認してみてくださいね!

ケーキ(当たり)のスクリプト

このように作成してみて下さい。
「変数名」や「~~~を受け取ったとき」などの名前は後で使うので、同じにしてくださいね。

バツ印のスクリプト

上で作った「当たりのスクリプト」に似ているので、コピーして必要な部分だけ直すといいかもしれません。

Batのスクリプト

これは最後に結果を教えるだけなので、とても簡単です。

背景のスクリプト

ここまでのみっつのスクリプトはゲーム上の演出に関するものでしたが、ここからは、AIに直接関わる内容になるので、説明をいれながら紹介していきます。

「旗印」が押されたとき

まずは様々な変数の値を「0」にして初期化します。

4行目でケーキが出る確率を乱数にすることで0~100%の間の確率が自動で設定されます。
この時、「0から1まで」ではなく「0から1.0まで」と入力してくださいね。

9~10行目では、ドアを開ける回数を尋ねます。
これには理由があります。強化学習は基本的には回数を重ねるほど精度が上がっていくので、それを体感してもらうために、あえて回数を決める仕様にしています。

最後の11行目では「学習率」を送ります。
これも非常に重要なので、ネコのスクリプトで詳しく説明します。

スタートを受け取ったとき

ここではドアを開ける演出を設定しています。

「報酬」と「学習」という言葉が出てきました。

「報酬」については次に、「学習」についてはネコのスクリプトで説明しますね。

報酬を出してを受け取ったとき

上で出てきた「報酬」をこのブロックで設定します。

ここで言う報酬は、「当たり=1」「ハズレ=0」で表します。

3行目の「もし~なら」の部分の考え方が少し厄介なのですが、ケーキの出る確率がゲームスタート時に自動で「0.6(60%)」に設定されたとします。

それを、0から1.0までの乱数と比較するのですが、分かりやすく整数で説明すると、乱数が「0~59までなら当たり」で「61~100までならハズレ」となります。

つまり、60%の確率で当たりが出ることになります。

これで背景のスクリプトは完成です。
次はいよいよAIの設定です。

ネコ(AI)のスクリプト

スタート時の設定

背景で設定した通り「旗印」が押されると、「学習率」というメッセージが送られてきます。

それを受け取ったら、ネコをクリックしてもらいます。

その時「ケーキが出る確率の予測」を0.5にしていますが、これはAIの初期設定のことです。

まだ何も始まっていないので、0~1.0の真ん中である0.5に設定して、ゲームがスタートすると学習しながら予測の数値を変化させて精度を上げていきます。

次に、学習率の入力を求めます。
学習率とは「アルゴリズムのパラメータ」などと、難しい呼ばれ方をします。

このゲームにおいては数値が大きい(例えば0.8など)と収まり(だいたいの正解の目星をつける)は速いけど予測の精度がブレると覚え、反対に数値が小さい(例えば0.02など)と収まりは遅いけど、予測の精度はあまりブレないと覚えましょう。

・・・とても分かりづらいですが、後でゲームをプレイしたときに「こういうことか~」と分かるはずなので、安心して下さい。

強化学習の設定

ここがAIのいちばんのキモです!

ドアが開くたびに背景のスクリプトから「学習して」のメッセージが送られてきます。

「学習して」を受け取る度に「ケーキが出る確率の予測」を上書きして更新していきます。

右側の式は実際の結果(報酬が獲得できたかどうか)を基に、予測を更新していくための公式のようなものです。

例えば、学習率を0.2に設定したとします。

その場合の式は「0.8x予測+0.2x報酬」となります。

1回目は当たり、2回目も当たり、3回目はハズレの場合、予測はこのように変化していきます。
なお、当たりは「1」ハズレは「0」で、初めの予測は設定した0.5からスタートします。

【1回目】
0.8x0.5+0.2x1=0.6(この数字が次の予測に入る)

【2回目】
0.8x0.6+0.2x1=0.68

【3回目】
0.8x0.68+0.2x0=0.544

このように予測の数値は、結果(報酬)によって変化していきます。

この仕組みが強化学習の基本となっています。

Scratch星人
Scratch星人

なかなか難しい内容ですが、一気に覚えようとせず、「変化する=学習している」と思ってもらえれば、まずは大丈夫です!

最後のスクリプト

お疲れさまでした。
あとは最後にコウモリに結果を尋ねるスクリプトで終了です。

ゲームの遊び方

まずは、あまり多くない回数(10~20回程度)で遊んでください。
(1000回などにしてしまうと終わるまですごく時間が掛かり飽きてしまいます!)

その時、学習率を毎回変えながら、どんな変化が起きるかを観察してみて下さい。

次にもっと多い回数を設定したくなったら、ハイスピード版を作ったので、下のリンクをクリックしてそちらで遊んでみて下さい。

https://scratch.mit.edu/projects/450846466

まとめ

AIを作ってみましたが、いかがでしたか?
あれ?こんな感じ?と想像とは違ったかもしれません。

今回は強化学習の基本を利用してゲームを作成しましたが、この技術をもっともっと高度で複雑に使用することで車の自動運転のAIなどが出来上がります。

まずはAIを作ってみた、という経験を大切にしてもらえればこの記事を書いたScratch星人は嬉しいです!!


コメント

タイトルとURLをコピーしました