誰でもわかる機械学習の解説とビデオ!昔教室でやった”基本形ゲーム”はまさに機械学習だった! ー Tensorflow.jsでのサンプルコード付き
世界一簡単な機械学習トレーニングの解説はこれだ!
前回のメモnoteでは機械学習の基本コンセプトを解説しました。
そこでは「モデル」というものが何であるかを主眼に説明したので、画像認識や音声認識などのモデルがあると、それを使っていろんなAI機能を作れるということは理解できたと思います。しかし、「ではそのモデルって一体どうやって作るの?」という部分はまだよくわからないと思います。
そこで本noteではその核心を解説してみます。ただ、本来ならこの機械学習の中身については高度な数学的知識が必要となるのですが、機械学習の有名なライブラリであるTensorflow(テンソルフロー)が公開している記事とそのビデオが秀逸で、私が今まで見た中では最も簡単で明解に機械学習を説明しています。まずは記事がこれ。
そしてその解説ビデオがこれです。
そして別な人が日本語で解説したビデオはこれです。
英語を学習している方は是非英語版を聞いてみてください。数学的な難しい話もなく、簡単な例で説明しているのがすばらしいです。
日本語版のビデオを見てもちょっとピンとこない方に向けて、ここからはビデオで取り上げている機械学習の仕組みを別角度から解説し、さらにJavaScriptを使ってコードを書いてみます。
「基本形ゲーム」って知っていますか?あれが機械学習なんです!
小中学校のころによくやる、「これが基本形。ではこれは?」というゲームを知っていますか?正式な名前は不明ですが、ネットでは「基本形ゲーム」というのがあったので、とりあえずその名称を使います。ルールはこのサイトをご覧ください。
この時皆さんはどうやって正解を導き出していたか思い出してください。
これが基本形です。(と言って指を2本出す)
そして、これは2です。(と言って指を4本出す)
そして、これは4です。(と言って指を1本出す)
じゃあこれはなんでしょう?(と言って指を3本出す)
(分からないか、3という人が多い)
正解は1です。
これをやっている時に皆さんの頭の中では何をやってますか。
❶ まずは最初の基本形から適当なルールを推測する
まず最初の基本形は「指4本で2」ということなので、例えば
● 指の本数 ÷ 2 =2
みたいに適当なルールがいくつか頭に浮かびます。まずは何も分からないので何でもよいから見当を付けるところから始めます。
❷ 新しい基本形が出ると修正
ところが、次は「指1本で4」なのでそのルールは破綻。では、「4と2,1と4ではどんな共通ルールがあるか?」ということで混乱しながらも「数字の差が2,3、2,3と繰り返すのか?」など必死にルールを考えます。
❸ 新たな正解をもとに”修正作業”を繰り返す
そして質問が来ます。「指3本だと何か?」。さっきの推測だと1(3-1=1)か5(5-3=2)のどちらか。そして正解は1!今のところ「差が2,3,2,3と続く」説が生き残りますが、その先すぐに破綻します。こうして頭が混乱していくというのがこの「基本形ゲーム」の面白いところでした。
前出のHello World of Machine Learningでの解説でも、この基本形ゲームに近い話をしています。次のXとYの数字の羅列を見てください。これが言ってみれば基本形です。そこにどんなルールがあるか分かりますか?
そして質問は「Xが10だったらYは?」です。皆さん分かりますか?
これを機械学習ではどうやるかというと、まずは適当なルールを決めてみます。例えばY=10X+10のようなところからスタートします。これが基本形ゲームでのステップ❶と同じです。
そしてそれがいかに”酷いか”を計算します。XYに関しては6つのケース(これをトレーニングデータと言います)があるので、それぞれに照らして実際に計算してみます。この計算の過程をLoss Function(損失関数)と言います。いかに最初の推測が間違っているかを実際に計算するわけです。これがステップ❷。
そしてその”間違い”を少しでも修正しようとルールを改訂します。これをOptimization(最適化)と呼びます。これによって計算式は例えばY=3X+1などに修正されます。これもステップ❷に含まれていました。
そしてこの損失関数による間違い度合の再計算と、それにもとづいた修正(最適化)を、6つの正解データ(つまり基本形)に対してどんどんと繰り返します。記事での例では500回繰り返すよう設定していました。そして導き出した式がこれです。
Y = 2X -1
皆さんが基本形の数字を見てこの数式に気づいた時もほぼ同じようなやり方で導き出したのではないでしょうか。そして今回は単純な数の計算でしたが、これは紛れもなく機械学習された「モデル」なのです。
ですから、「Xが10だったら?」と聞かれるとY=19とすぐに正解が出てくるのです。
こうやって機械学習ではトレーニングデータをもとに、それを膨大な回数の計算を繰り返すことで最も正しいと思えるルールやパターンを見つけ出すことをやっています。画像分類や音声認識などの高度なAIも基本的にはこのプロセスを使ってモデルを作成します。
これからは機械学習トレーニング=基本形ゲームということでイメージしてみてください。ちょっとは身近に感じることができると思います。
【中級向けコード解説】JavaScriptで機械学習トレーニングをやってみる
先に紹介した記事とビデオではPython上でTensorflowというライブラリを利用してXとYのモデルを訓練・テストしています。Pythonをやっている方はそちらを参考にしてもらうとして、ここでは同じことをJavaScriptでやる方法を紹介します。
まずJavaScriptでTensorflowという機械学習をやるにはTensorflow.jsというパッケージを利用します。
そしてこれを使ってサンプルコードを走らせるにはNode.jsでJavaScriptコードを書きます。
ステップとしては次のようになります。
ステップ❶:Node.jsをインストールする
Node.jsのインストール方法はこのサイトなどを参考にしてください。
ステップ❷:Tensorflow.jsをインストールする
NodeをインストールするとVSCodeのターミナルからNPM(Node Package Manager)が利用できるので、それを使ってTensorflow.jsをインストールします。VSCodeのターミナルを開いて、次のコマンドを実行してみてください。
npm install @tensorflow/tfjs-node --unsafe-perm=true --allow-root
ステップ❸:機械学習のプログラミングコードを書く
例のXYの問題について機械学習させるPythonコードはHello World記事のステップ3~5に詳しく解説されています。
適当にプロジェクトフォルダを作り、そこに例えばtensorflowModeling.mjsというファイルを作ります(これはNodeのモジュールファイルです)。
記事と同じことをTensorfrflow.jsでやるには次のようなコードになります。Pythonと同じく、たった8行程度の短いプログラミングです。
【tensorflowModeling.mjs】
// Tensofrlof.jsをインポート
import * as tf from '@tensorflow/tfjs-node'
// モデルの作成とコンパイル
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
//トレーニングデータの用意
const xs = tf.tensor1d([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0]);
const ys = tf.tensor1d([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0]);
// モデルをトレーニングする
await model.fit(xs, ys, {epochs: 5000});
// できたモデルをテストする(Xが10だったらYは?)
model.predict(tf.tensor1d([10.0])).print();
このコードを書いたらファイルを保存し、コードを実行します。
node tensorflowModeling.mjs
すると計算の過程がズラーっとターミナルに表示されます。以下の表示はイタレーションを5000回(ビデオでは500回です)にした例です。そして最後にmodelのpredictメソッドを実行した結果が出てきます。
・・・省略・・・
eta=0.0 ===========================================================================>
3ms 429us/step - loss=4.12e-11
Epoch 4998 / 5000
eta=0.0 ===========================================================================>
2ms 387us/step - loss=4.12e-11
Epoch 4999 / 5000
eta=0.0 ===========================================================================>
2ms 376us/step - loss=4.12e-11
Epoch 5000 / 5000
eta=0.0 ===========================================================================>
3ms 467us/step - loss=4.12e-11
Tensor
[[30.9999733],]
Xが10だったらYは[30.9999733] (注:このコードの式はビデオと異なり、Y=3X+1となっているので、Xが10だったらYは31です)。Yがどうして31きっかりにならないかというのはビデオでも説明していますが、トレーニングデータがたった6つだけだと確実に31という答えがでてこないということです。
この記事が気に入ったらサポートをしてみませんか?