(The mountain is steeper than expected, so winter climbing will be difficult for general climbers.)
The photos shown here are taken from:
http://www.town.rishiri.hokkaido.jp/rishiri/
I am a professor emeritus of CS at Kanagawa Institute of Technology, Japan. Originally my specialty was parallel and distributed systems. My current interests include machine learning, natural language processing, creating mobile apps with MIT App Inventor, and quantum computing. In the web version of this blog, clicking the icon on the right (a plastic sphere) will take you to the "List of Quantum Computing Articles". - Fujio Yamamoto (for e-mail, add "@ieee.org" after "yamamotof")
【what is this】最新のDeep Learningで作られたFake(偽物)DeepFakesは、ポジティブ、ネガティブの両面を持ちます。以下のチュートリアルは、「Artificial Intelligence with MIT App Inventor」の第9弾(beginner level)です。簡単なスマホアプリ作成「Make Your Own Fake Voice!」から始めて、現代のDeepFakesの利用や問題点を議論し、社会に与える影響と将来の姿を考えさせます。主に生徒向けに作られたものですが、一般の大人にも有用な情報が含まれているかと思います。
■簡単なFake Voiceアプリの作成■
第一ステップでは、MIT App Inventorを利用した簡単なFake Voiceアプリを作成します。音声認識と音声合成を使いますが、本当の”DeepFakes”ではありません。音声合成の際に、音のpitchとrateを適宜変更するという単純なものです。出来上がったアプリのブロック図は、図1のとおりです。こんな簡単なものですが、それでもFake Voiceの体験ができます。
例えば、図1のスマホ画面にある「方丈記」の一節「ゆく河の流れは絶えずして、... 」をこのアプリが読み上げます。その際、デフォルトの音声合成よりも、pitchとrateをかなり低くした方が、この随筆にマッチしていて、趣があります。これは、Fake Voiceのポジティブな応用と考えたい。
一方、例えば、「おれだけど。ちょっと風邪引いてさあ。声が変なんだけど。実わあ...電車の中に鞄を…」をこのアプリで(低pitch、低rateに設定して)電話をかけるとすれば、これは悪用でしょう。
■最新AIによるDeepFakesを概観する■
第二ステップでは、最新のDeepFakesはどのように作成され、利用されているかを、ビデオで学びます。適用分野として、音声、音楽、映像、画像、テキスト、などの生成がありますが、ここでは、音声を中心に以下の6件を取り上げてみます。
(1)合成された故ケネディ大統領の声で幻の演説を聴く
故ケネディ大統領は、凶弾に倒れる前に、ある演説の原稿を用意していました。実現されなかったその演説を、大統領自身だと思えるような声で実現させたプロジェクトがあります。彼が実際に行った831件の演説の録音を元に、AIと音響工学を駆使して、特有の間合いや強調のしかた、それにボストンアクセントも反映させた、彼らしい音声を合成したのです。下記のビデオでそれを聴いてみましたが、なかなかの出来栄えだと思います。“In a world of complex and continuing problems, … America’s leadership must be guided …”
●President Kennedy Deepfaked
https://www.youtube.com/watch?v=wZF59wIIBLI
(2)月面着陸に関する「別のバージョンの歴史」
1969年、米国は人類初の月面着陸に成功しました。しかし、その任務は非常に危険だったので、悲惨な結果になった場合を想定した大統領談話原稿が用意されていました。もちろん、月面着陸はうまくいき、そのスピーチは行われませんでした。しかし、2020年に、MITのチームは、当時のニクソン大統領が沈痛な面持ちでそのスピーチを行う、ディープフェイクビデオを作成しました。これにより、「別のバージョンの歴史」を体験できることを示しました。これがどんなん意味を持ち、どんな影響を与えるかは議論があるところでしょう。
●Moon Disaster
https://moondisaster.org/film
(3)音声データバンクが声を失った人々を救う
スコットランドのSpeakUnique社は、病気(運動ニューロン疾患)で発声できなくなった人のために、その人らしい声でテキストを読み上げることができるFake voiceを設計製作しています。蓄積された膨大な音声サンプルを利用し、きめ細かく、好みや特性を考慮した調整を行い、個人向けのユニークな高品質音声を作ってくれます。AndroidやiOS向けのアプリとしても、それを提供しています。
●Voice Banking Helps People with Motor Neuron Diseases
https://vimeo.com/403687789
(4)人に代わって美容院やレストランを予約
米国でも、小規模な店の約60%はネット予約システムを持たずに、電話受付けしているそうです。Googleでは、DeepFake voice(Google Duplex Assistant利用)が美容院やレストランへ予約電話をかけてくれるサービスを始めるとのことです。
以下のデモビデオでは、客に代わって電話したDeepFake Voiceが、店側の人間から混雑状況を知らされて、最初の希望時間を変更して予約を取っていました!人が発する自然言語をも理解していたのですから、誰しも驚きます。店員は、人間が電話してきたと思っているようでした。(個人向けには需要はなさそうですが、社用で定常的に顧客接待で会食予約する場合などは、人間のコスト削減に繋がるかも。)
●Haircut appointment or Restaurant reservation
https://youtu.be/D5VN56jQMWM
(5)銀行強盗(詐欺)に使われた例
英国のあるエネルギー会社の従業員は、会社のCEOから、遠く離れた会社に243,000ドルを送るようにという電話を受けました。その従業員は、CEOの声だと信じて、送金してしまいました。その声はFake voiceでした!下記のこのビデオは、このような事件がどのようにして起こるかを説明しています。
●Fake Voices Pull a Bank Heist
https://www.youtube.com/watch?v=EGEID-_XWCM
(6)金融犯罪、金融危機を引き起こす可能性
以下の短いビデオは、将来、(音声だけでなく、ビデオやドキュメントを巧みに偽造した)ディープフェイクが起こす金融犯罪、さらには金融危機の可能性について、イラストを用いて分かりやすく説明しています。
●Could AI-Powered Videos Cause an Economic Collapse?
https://youtu.be/YE0i7IpqVfk
■DeepFakesの適用分野や社会へのインパクトについて考察■
最後の第三ステップでは、ここまでの情報にもとづき、各グループ毎に、DeepFakesの適用分野や将来の可能性について議論させます。さらに、全体会合で、他のグループの見解も聞き、さらに議論を深めるようにしています。指導者に対して、図2のような指針が示されています。(ここでは省略しましたが、もう少し詳しくブレークダウンした指針もこのカリキュラムユニットの資料に含まれています。)
【what is this】ディープラーニングを用いた画像認識は、小学生による体験から実用レベルまで、利用が広がっています。そうなってくると、次の段階は、「どうやって認識しているのか」が気になるはずです。それに答えるのは簡単ではありませんが、少なくとも「画像のどこに着目して認識しているか」を示してくれれば、かなり良いです。簡単な原理でそれを実現する(子供向けの)Scratchプロジェクトがありました。大人でも試してみると楽しい!
■ 認識対象の例とTeachable Machineによる深層学習
画像認識の対象として、図1に示した4種の木製の小さな置物を取り上げます。それぞれを300枚程度、Webカメラの位置を変えたり、傾けたりしながら撮影します。それらにラベルをつけて学習させることは容易です。例えば、Google Teachable Machineを利用すれば誰にでもできます。
その学習結果のモデルに対して、別途撮影した画像を入力した場合、それが4種類のどれであるかは、どの置物でも、99%程度の確かさ(conf = cofidence)で判別できます。
■ 深層学習では画像のどの領域に着目しているか
こんなに高いconfidenceで認識されても... 深層学習は画像のどの部分に注目して判断しているのでしょうか?それを調べるための簡単な原理が、Scratch3のプロジェクト「Explainable AI」に示されています。これは、子供向けのAIを開発しているML4K (Machine Learning for Kids) が公開しているものです。
さっそく試してみましょう。図2(a)はAppleですが、適当なサイズの(紫色の)ブロックで、適当な領域を隠して撮影しています。「へた」の部分を隠した画像に対しての認識では、confidenceはほとんど変わらず99.5%でした。ところが、「中央」を隠した場合は、confidenceが50.1%まで大幅に低下しました。この観察から、「へた」よりも「中央の膨らみ」の方が、より重視されていると推定されます。
■ 注目領域を自動的に検出して表示する
ここまでは、画像を隠す小さなブロックの位置を適当に手動で移動させながら調べました。それをもっと組織的にやってみましょう。そのやり方もこの「Explainable AI」に示されていますが、基本的には、手動で調べたのと同じ原理です。
画像をメッシュにして、その各ブロック部をひとつづつ隠して行き、confidenceの低下を調べます。低下の度合いが大きい(すなわち、重要であった)部分ほど明るくすればよいのです。図3は、Bearの場合ですが、手動で調べた図2(c) のとおり、「目と耳の領域」を最も重視して認識していることが分かりました。こんな簡単な方法なのに素晴らしい!
■子供向けのScratchプロジェクトだが、学生などにも有用
上に述べたとおり、この方法は図4のScratchプロジェクトで実現されています。主に子供を対象としたものですが、かなり高度な内容と言えそうです。実際、図3を眺めていると、自然言語処理などでも注目されているアテンション(Attention)に通ずるように思います。
この「Explainable AI」では、TensorFlowをラップして使いやすくしたTeachable Machineの学習結果を取り込みます。そして、それを使った予測(prediction)のための基本的なブロックが用意されていますので、図3のような解析と表示が簡単にできるようになっています。学生や大人にも十分有用だと思います。
【what is this】以前、MLB投球の機械学習に関して、球面SOMを用いた分析を行いました。今回は、タイタニック号の乗客データについて、同様に球面SOMで分析しました。技術的なことは別として、SOMの素晴らしさを改めて感じられると思います。
■ タイタニック号の乗客の「生死」の自動分類
タイタニック号のデータの詳細は、前の記事をご覧下さい。その記事で扱ったFeatured Dataset には、全部で1,043人乗客データ(生還415名、落命628名)があります。それぞれに、9項目(9の特徴量)の値が記載されています。そして、各人に、「生 / 死」のラベルが付与されています。
このデータから、乗客の生死を球面SOMで自動分類させるのです。ここで注目すべきことは、球面SOMは、「生 / 死」のラベルは全く利用せずに、(9項目から成る)入力データを何らかのクラスタに分類してくれます。すなわち、ラベル無し(教師信号なし)に機械学習してクラスタを作ります。その結果の一例を図1に示します。
【what is this】ディープラーニングでは、「必要な特徴量は自動的に見つけてくれる」とも言われますが、多くの場合、人間による慎重な特徴量設計が必要([1], [2])となるでしょう。この分野の定番MNIST(手書き数字認識)と同様に有名なものとして、「タイタニック号の乗客の生死」に関するデータセット([3], [4])があります。今回はこれに関する機械学習を行うえで、どのように特徴量を設定すべきかを、参考資料[3]に従って体験しました。
■ タイタニック号の乗客のデータの機械学習
本稿は、Gant Laborde氏による書籍[3]第9章の解説の追体験記になります。乗客のデータは、図1「(1)原データ」にあるとおり、全部で12種の特徴量(12カラム)からなります。氏名、年齢、性別などの他に、Survived(生/死)が含まれています。整数値、実数値、文字列などの値が含まれています。
総計1,309名分ありますが、機械学習の観点から、train用891名分、test用418名分に分けられています。そして、目的は、Survived(生/死)をラベル(教師信号)として、train用データを学習させ、その学習結果を使って、test用データ(validation用データとも呼ぶ)の乗客のSurvived(生/死)を予測させ、正解率を計算することです。
■ 機械学習のために、適切に特徴量を設定(Feature Engineering)
図1(1)原データにおいて、上記の機械学習にとって、寄与度が低いと考えらるものは除外した方がよいです。ここでは、「(2)不要カラム削除」にあるとおり、4要素を除外しました。これを元に、以下の2つのデータセットを作りました。
●NaiveDataset
一つでも空白の(値の無い)セルを含む行を削除します。さらに、SexとEmbarkedの値が文字となっているので、これをカテゴライズして、整数値(0,1,2など)に変換します。
●FeaturedDataset
NaiveDatasetに対して、Sexを削除して、新たに2つの特徴量としてmaleとfeamaleを追加します。さらに、年齢層(10歳未満、40歳未満、40歳以上)を表すAgeBucketを追加します。そして、各特徴量の値を、MinMaxScalerで、0〜1の間の実数値(両端値を含む)にスケーリングします。
この3つの特徴量を追加した理由は、図2にあります。実は、この悲劇の事故は映画化されたのですが、その中で、多くの乗客が、"Women and children first!"と叫んでいるそうです。図2をみると、それが事実だったことが分かると思います。すなわち、男に比べて女の生存率が圧倒的に高い!また、子供の生存率も大人よりもかなり高いのです。
■ 特徴量の設定の機械学習への効果
上記のとおり、不要のカラムを削除しただけの「NaiveDataset」と、特徴量を新たに設定した「FeaturedDataset」を用意しました。これらを、図3に示すNeural Network(TensorFlow.js使用)で学習させた結果を示します。
■ Tensorflow.jsについて
ここで参考にした書籍[3]は、TensorFlow.jsプログラムをNode.jsサーバで動かす例題を示しています。しかし、小生のMac環境では、Nodeを正常に動作させることができなかったので、独自に、通常のWebサーバで実行できるように改変しました。その過程で、TensorFlow.jsの詳細を学ぶことができました。
また、入力データの様々な加工には、Python環境でのPandasに相当するDanfo.jsを使うことができました。このDanfo.jsの利用によって、上記で述べたFeaturedDatasetの作成を効率的に行うことができました。
参考資料
[1] ディープラーニングは自動で特徴を抽出してくれる?
https://www.hellocybernetics.tech/entry/2019/06/23/010201
[2] 機械学習に欠かせない、特徴量とその選択手法とは
https://ainow.ai/2020/07/14/225092/
[3] Gant Laborde:"Learning TensorFlow.js - Powerful Machine Learning in JavaScript", O'Reilly, 2021-05-07.
[4] codexa増田秀人,ウイリアム・スタイメル:"機械学習のプロセス徹底解説-タイタニック号から生還できるのは誰?", 日経ソフトウェア, 2019年1月号, pp.6-27.
【what is this】多くの場合、Tensorflowは、Python環境で使われているようです。しかし、いくつかの理由から(その一例はここにありますが)、JavaScriptで動かすTensorflow.jsへも注目が高まっているようです。本記事は、Tensoflow.jsの基礎を解説したテキスト[1]の例題で発生した、幾つかのエラーに対処した時のメモです。推奨すべき対処法かどうかは分かりませんが、取りあえず正常に動かすための備忘録です。
■ テキスト「Learning Tensorflow.js」
このテキスト[1]は、今年5月に刊行されたばかりです。Tensorflow.jsの利用に関する基礎知識を与えるものです。例題の解説も分かりやすいです。全部で12章ありますが、8章までは、通常のWebサーバの元で、第9章以降はNode.jsサーバで動かす例題があります。
■ Tensorflos.jsの例題実行で発生したエラーへの対処
(1)importに関するエラー
例えば、あるJavaScriptファイルindex.jsの中の以下のimportです。
import * as tf from "@tensorflow/tfjs";
これを実行すると以下のエラーが発生しました:
Uncaught SyntaxError: Cannot use import statement outside a module
ネットで調べると、以下のようにすれば良い、という説明がありました:
Add "type": "module" to your package.json file.
{
// ...
"type": "module",
// ...
}
でも、その通りにしても、相変わらずエラーのままです。そこで、以下のようにしてみました。
このimportを削除する。(コメント化して残す。)
htmlの<body>の中に以下を挿入する:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>
以上にようにして、このhtmlファイルをVisual Studio CodeのOpen with Live Serverで起動させたところ、正常動作しました!
(2)moduleに関するエラー
例えば、あるJavaScriptファイルindex.jsの中にある以下の3つのimportです。
import * as tf from "@tensorflow/tfjs";
import "core-js/stable";
import "regenerator-runtime/runtime";
これに対して、以下のエラーメッセージが出ました:
Uncaught TypeError: Failed to resolve module specifier "@tensorflow/tfjs". Relative references must start with either "/", "./", or "../".
以下のように対処しました:
3行とも削除する。(コメント化して残す。)
さらに、(1)の場合と同じく、htmlの<body>の中に以下を追加。
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>
このように改変した結果、正常動作となりました!
(3)Danfo.jsに関するエラー
Danfo.jsは、PythonのPandas相当の機能を使えるようにするものです。これも、上記(1)、(2)の場合と同様に、JavaScriipt内でのimportに失敗する場合は、htmlのタグで指定すれば正常に使えました。
これをコメント化する-> import dfd from "danfojs-node"
さらに、htmlの<body>の中に以下を追加。
<script src="https://cdn.plot.ly/plotly-1.2.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/danfojs@0.3.4/lib/bundle.min.js"></script>
なお、Dataframe object dfを使って、各カラム毎の統計値を計算できるのですが、その際、非数値(あるいはnull項目)のカラムを取り除いた後に、df.describe().print() を実行する必要があります。
■ 第9章以降の例題の実行
以上で、第8章までの例題は問題なく動作するようになりました。Mac miniでもLet's NoteでもOKでした。第9章以降では、Node.jsサーバを利用する例題があります。Node.js環境がうまく設定できない場合には、通常のWebサーバで動くように改変しようと思います。
【what is this】前回の記事では、MLB投球の球種分析を球面SOM(自己組織化マップ)[1]で行いました。今回は、主審が誤審して「ストライク」コールしたと思われる投球について、球面SOMで可視化して眺めてみました。(信憑性に欠けるか、誤った論述になっている部分があると思いますが、後日、自分のための何らかのヒントになり得ると考えて書き留めます。)
■ 主審が誤審したと思われる「ストライク」309球の球面SOM表示
以前の記事で、MLBでの多数の投球判定[2]のうち、主審が誤って「ストライク」コールしたと思われる309球の分析を示しました。「誤審」と思われる根拠についても、その記事で述べました。
今回は、その309球のデータ(5features = 5成分から成る)を球面SOMで分析しました。図1をご覧下さい。これは、各成分毎に(各成分を軸として)この309球のデータをクラス分けした(はずの)図です。簡単な場合から行きます。例えば、成分5は、左打者か右打者かの2値を取ります。誤審したストライクを、左打者、右打者毎に分離してもいびつにならない(明瞭にクラス分け可能)。すなわち、そのように分離しても、類似性の高いデータ(5次元ベクトル)同士は近くに集まって表示される。図はそれを示しているようです。右打者の方が数が多いので、奥のキノコ状の球面が大きいようです。
また、ストライクゾーン面を通過したx座標とy座標である、成分1と成分2についても、大きなキノコ状の球面2つがほぼ明確に分かれています。これは、ストライクゾーンの左右方向(成分1)と上下方向(成分2)に関して、誤審されたストライク球のデータをほぼ明瞭にクラス分けできることを示しているようです。
[2] Predicting balls and strikes using TensorFlow.js
https://medium.com/tensorflow/predicting-balls-and-strikes-using-tensorflow-js-2acf1d7a447c
【what is this】MLBでの投球に関する機械学習の続編です。今回は、投球7,000球のそれぞれに球種ラベル(2-seam, 4-seam, sinker, など7種)が付与されたデータを機械学習させ、その結果を使って、テスト用に用意された700投球で球種を予測させました。さらに、その700球の球種を、球面SOM(自己組織化マップ)で可視化してみました。
■ MLB 7,000投球のデータ
MLBの公開データのうちに、7,000投球について、以下に示す球速等と左右投手の識別子のデータセットがあります。そして、その各投球に球種ラベルが付与されて、参考文献[2]で解説されています。
■投球データのfeatures(特徴量8要素);
ball velocity (vx0, vy0, vz0)
ball acceleration (ax, ay, az)
starting speed of pitch
whether pitcher is left handed or not
■球種ラベル(pitch_code 7種):
2-seam, 4-seam, changeup, curveball, slider, cutter, sinker
(プルグラム中では、0〜6の整数で表される)
これらのデータの具体例を示します:
(投球データの次は、左(1)/右(0)投手を表す。最後は球種ラベル。)
vx0, vy0, vz0, ax, ay, az, start_speed, left_handed_pitcher, pitch_code
7.699, -132.225, -6.583, -22.508, 28.311, -16.585, 91.1, 0, 0
6.680, -134.215, -6.355, -19.660, 26.703, -14.343, 92.4, 0, 0
2.565, -135.398, -2.916, -14.784, 27.808, -21.573, 93.1, 0, 0
. . .
2-seam => training:0.822, validation:0.701
4-seam => training:0.899, validation:0.618
changeup => training:0.841, validation:0.718
curveball=> training:0.970, validation:0.804
slider => training:0.864, validation:0.607
cutter => training:0.900, validation:0.591
sinker => training:0.811, validation:0.443
上記で、"training"は、学習に用いた7,000件についての、そして、"validation"は、これとは別に用意したテスト用のデータ700件についての球種予測(prediction)の正解率です。 "validation" では、cutterやsinker正解率は低めですが、投球の複雑な物理現象を考えれば、全般的には、かなりよく球種を予測できていると思います。
書評みたいなことは書きませんが、小生がじっくり読んで学んだ「強化学習」の参考書は以下の2点でした。
[1] 中井悦司, ITエンジニアのための強化学習理論入門, 技術評論社、2020-7-30初版
[2] 伊藤 真, Pythonで強化学習を学ぶ, 日経ソフトウェア2021年7月号, pp. 24-39
本日(2021-11-20)、Amazonに予約してあった下記の新刊が到着しました!
上記[2]の記事を書かれた伊藤真氏による新著です。また、学ぶ楽しみが増えました。
[3] 伊藤 真, 「強化学習」を学びたい人最初に読む本, 日経BP, 2021-11-22初版
本書は、タイトルは控えめになっていますが、かなり高度な内容も含まれます。しかし、そこを一歩一歩丁寧に叙述しているのが最大の特徴のようです。
Q-Learningにおいて、Qテーブルをダイナミックプログラミングで(厳密解を)求解するという基本線はもちろんです。それに加えて、ニューラルネットワークを利用する近似解法とその性能検討、さらにその向上策にも、じっくり取組んでいます。
中井氏の[1]と伊藤氏の[3]は、ともに、丁寧な叙述で、かなり高度なところまで導いてくれる素晴らしい本だと思います。具体的なコードもフォローしやすく、広範な読者層に向いていると思います。
これら以外にもいくつか強化学習の和書や訳本は出版されていますが、小生の知る限りでは、内容がやや古かったり、最新技術に言及しているがやや理論寄りだったり、難解な感じで少しとっつきにくいものが多いように思っていました。そのなかで、[1]と[3]が出版されたのは非常に喜ばしいところです。
【what is this】MLB(前回記事(2)で示したアプリにより、メジャーリーグ主審のストライク/ボールの判定状況を観察しました。その結果、学習をもとに作成されたAI主審の判定を利用すれば、メジャーリーグ主審の誤審がある程度分かるのではないかと考え、検討しました。
■ MLB主審とAI主審の判定結果の相違
MLBでの実際の5,000投球に対するMLB主審とAI主審(=学習済みニューラルネットワーク)の判定結果は以下のとおりでした:
■ 両者の相違の詳細分析
上では、相違例を2例だけ示しましたが、5,000投球の全てについての状況を、図2と図3に示します。図2は、相違のあったうちの、「MLB主審はボールで、AI主審はストライク」だった152球すべてを表示しています。図2右には機械測定によるストライクゾーン(打者により変動するので重なっています)この図を見ると、MLB主審の「ボール」判定(青丸)の何割かは、ストラークゾーンに入っているか接しているので、ストライクとすべきだった誤審と思われます。
一方、図3は、相違があったうちの、「MLB主審はストライクで、AI主審はボール」だった309球すべてを表示しています。これを見ると、このうちのかなり多くは、ストライクゾーンから外れており、MLB主審による誤審であり、AI主審の判定(ball判定)の方が正しいように見えます。
参考資料:
[1] Gigazine「メジャーリーグ11シーズン・400万球分の投球データを分析して審判がどれだけ正しくジャッジできているのかを分析した結果」
https://gigazine.net/news/20190423-analysis-how-many-mistakes-umpires/
[2] A new study of MLB pitch calls makes a strong case for robotic umpires
https://techcrunch.com/2019/04/08/a-new-study-of-mlb-pitch-calls-makes-a-strong-case-for-robotic-umpires/
【what is this】MLB(前回記事(1)では、メジャーリーグ)の主審によるストライク/ボールの判定結果(5,000投球)を学習させて、約90%以上は同じ判定をするニューラルネットワーク(AI主審)を構成できました。今回は、これをスマホで楽しみながら、判定確認するためのアプリを作りました。「ストライクゾーン」の縦方向の範囲は、打者によって変化するわけですから、その即時の見極めの難しさ(というか醍醐味)が少し分かった気がします。
■ MLB主審とほぼ同じ判定をするAI主審スマホアプリ
このアプリは、Tensorflow.jsを利用して、5,000投球を学習させたモデルを、スマホに取り込んで作動させます。実行結果を以下に示します。テストに使った入力は以下のとおりです。
ランダムに100投球のデータを入力する。各データは、以下の5項目から成る。
図1に、左打者と右打者に対するストライク判定例を示します。下図左は、ストライクゾーンに僅かにボールが触れたと判定され、ストライクです。一方、下図右は、微妙ですが、触れていないとの判定でボールです。これには文句は付けられない!
【what is this】MLB(メジャーリーグ)の主審(アンパイア)によるストライク/ボールの判定結果が公開されています。これを学習させれば、MLBの平均的な主審と同じ能力を持つ判定ロボットが作れそうです。実際、5,000投球のデータを学習させた結果、人間の主審と比べて、約95%は同じ判定をするニューラルネットワークができました。これは、多次元データの2値分類問題ですので、技術的には特に新鮮味は無いのですが、MLBの実際のデータを使った結果なので現実感があります。
■ ストライクゾーンと投球の判定
ストライクゾーンについて、筆者が調べた結果は、図1右側に示したとおりです。ストライクゾーンは、ホームプレートを底面とする5角柱の立体です。ただし、高さ方向の範囲は、図のとおり、打者(とその構え)で変化します。つまり、プロット図の中の緑の長方形の枠は、平均的な打者のストライクゾーンを示したものであり、打者によって異なります。
図1のプロット図は、主審が判定した、ストライク(オレンジ色)とボール(青色)を示しています。投球された球が僅かでもストライクゾーンに触れた場合はストライクです。球の直径はMLBの場合約7.5cmですから、ストライクゾーンの外でもストライクの場合が多いようです。中には、正面からはストライクゾーンに触れなくても、球筋が変化して、立体のゾーンの側面や底面に触れてストライクになる場合もあります。もちろん、誤審でストライクにした場合も含まれるでしょう。
■ 学習の結果
学習用のデータは、上に示したように、5,000個です。評価用にも、これと同じデータセットを用いました。10エポックの学習(毎回ランダムに構成したバッチサイズ50のミニバッチを100個を学習)結果、正解率0.959が得られました。すなわち、このニューラルネットワークは、MLBの標準的な主審の判定結果と約95%合致(学習条件により若干変動)する結果を与えるものとなりました。つまり、投球のストライク/ボールの判定に関しては、理論上、MLB主審を努められそうな結果です!
epoch 1 , steps= 100 , loss= 0.339 ,acc= 0.879
epoch 2 , steps= 100 , loss= 0.281 ,acc= 0.839
epoch 3 , steps= 100 , loss= 0.332 ,acc= 0.859
. . .
epoch 8 , steps= 100 , loss= 0.235 ,acc= 0.899
epoch 9 , steps= 100 , loss= 0.206 ,acc= 0.879
epoch 10 , steps= 100 , loss= 0.129 ,acc= 0.959
baseball.js:95 training done !
■ 感想
プロ野球に限らず、他のスポーツでも、判定や採点の機械化の方向があるようです。しかし、プロ野球の場合、機械あるいはAIが主審の代役となることが望ましいのでしょうか。スポーツの人間味っぽいところが好きな人も多いはずです。投手、打者、審判とも、一瞬にして見極める技術を向上させているはず。また、観客も、「あれ、誤審じゃないの」とか、「あの主審は低めに厳しいよなあ」などと言い合いながら観戦するのも捨てがたい気もします。もちろん、判定で揉めた場合のリクエスト(現在でも実施されていますが)に対応するための、最新測定機器やAIの出番はもちろん増えるでしょうが。
参考文献
[1] Nick Kreeger, Visualizing ML training using TensorFlow.js and Baseball data
https://observablehq.com/@nkreeger/visualizing-ml-training-using-tensorflow-js-and-baseball-d
[2] Predicting balls and strikes using TensorFlow.js
https://medium.com/tensorflow/predicting-balls-and-strikes-using-tensorflow-js-2acf1d7a447c
【what is this】引き続き、「スマホでニューラルネットワーク」にこだわります。以前の記事 [1]では、Q-Learning(強化学習)をニューラルネットワークで行うための基本手法を検討し、実装しました。今回は、さらにそれを深めた手法である「Experience Replay + Target Networks」があることを知り、それをTensorflow.js (JavaScript環境)で構築し、妥当なQ値が得られるまでPCで学習させました。さらに、その学習済みモデルをスマホへ格納し、スマホのアプリとして、Q-Learningを用いた2Dグリッドの経路探索課題を解きました。
■ ExperienceReplay+TargetNetworksによるQ-Learningスマホアプリ
この手法によるQ-Learningの結果を先に示します。課題は参考文献[1]で扱ってきた、2Dグリッドでの経路探索です。Fig.3にあるように、ロボットが壁や障害物を避けて宝石(緑色の球体)に最短距離で到達するように学習させます。その学習結果を、スマホアプリで示したのがFig.3です。この例では、ロボットが障害物(黒色の正方形)を避けてうまく宝石に到達するルートを学習したことが分かります。
■ ExperienceReplay+TargetNetworksの概要
強化学習は一般に、「教師付き学習ではない」と言われています。強化学習では、固定した正確なラベル(目標)を設定すること自体が困難です(というよりも、それ自体が求める解なのですから)。しかし、刻々変化するラベルを対象として、ニューラルネットワークで「教師付き学習」させる方式があります。それが、文献[1]で検討したものです。
しかし、この方法には、2つほど欠点があります。一つは、「ある状態に対してある行動を取った場合」の一組づつしか学習できない。つまり、ニューラルネットワークで本来の性能を発揮するためのミニバッチ処理(多数の入力の一括処理)ができないことです。第二は、もっと本質的な問題ですが、この方法では、「状態と行動」が強く結合した学習となってしまい、多様な入力(状態)に対する学習が収束しずらいか、振動してしまう可能性が高いことです。
これを解決すべく登場したのが、今回の「Experience Replay + Target Networks」なのです。小生の場合、参考文献[2]と[3]を読んでその概要を学びました。Fig.1に示すPseudo codingは文献[2]から引用したものです。これに従って、独自にJavaScript(Tensorflow.js使用)でそれを試作することができました。
【what is this】分類問題等で保持しているデータを使って機械学習させ、その結果を利用して、未知のデータを予測(分類など)したい場合があります。最近では、Tensorflow/Kerasなどを使えば、それは比較的楽に実現できます。ここでは、学習結果をスマホアプリに組み込み、スマホで利用することを行いました。Javascriptから使えるTensorflowJSやML5JSを利用しました。
■ 例題:1700万種の彩色を9種に分類するJapanese summary 本シリーズのPart1とPart2では、スマホ向けのQ-Learningアプリを開発し、それを簡単な例(直線の廊下でロボットが宝石を得る)に適用しました。今回は、このアプリを改訂し、2次元グリッドでロボットが行動できるようにしました。そして、グリッドサイズが大きくなるにしたがい、これまでのQ-tableを保持してQ値を更新する方法は、メモリ量と処理量の急増により破綻することを確認しました。それに変わる有望な方法として、Neural Networkの利用を検討し、それを(スマホではなく)PC上のPythonで実現した結果を示します。
Abstract
In Part 1 and Part 2 of this series, I developed a Q-Learning app for smartphones and applied it to a simple example (a robot gets a gem in a straight corridor). This time, I revised this app so that the robot can act on the 2D grid. However, as the grid size increases, the traditional method of holding the Q-table and updating the Q value becomes difficult due to the increase in memory capacity and processing volume. As a promising alternative, I considered using a neural network. And here's the result of doing that with Python on a PC (not a smartphone).
● Revised version of the Q-Learning app
In the revised version of the smartphone app, as shown in Fig. 1(a), the robot is trained to reach the gem while avoiding barriers on the 4x4 grid. The Q-Learning algorithm is basically the same as last time. There is one gem and one barrier, and their positions change randomly for each play (every episode). The robot also starts from a random position. After sufficient training, the robot can always reach the gem in the shortest route. On the other hand, if not well trained, the robot often gets lost and hits a wall, as shown in Fig. 1 (b).
● Memory capacity required for Q-Learning
The size of the Q-table required for this learning can be calculated according to the grid size and the number of gems and barriers. See Fig.2. The number of Q-table entries (i.e., the number of keys) is the total number of possible states, which in Case 1 (4x4) is 3,360. At this level, it can be held sufficiently even on a smartphone, and the amount of calculation is within an acceptable range. However, in Case2 (5x5), the total number of states increases sharply to over 6,000,000, even though only one gem and one barrier have been added. In this situation, regardless of whether it is a smartphone or a PC, processing is almost impossible due to both the amount of memory and the amount of calculation.
● Calculate Q-values with neural network (without holding Q-table)
For cases like Case2 above, you can think of a way to calculate the required Q-value with a neural network without holding the Q-table. To do this, transform the Q-value update formula for the neural network, as shown in Fig.3. This makes it possible to compare output and target ([1]). It can be used to solve this problem with common supervised machine learning. This machine learning iteration allows the output to be closer to the target and, as a result, the Q-value to be closer to the exact value.
Fig.4 clearly shows how to use this neural network in the case of Case1. Note that in this example, the action "W (west)" is taken in the current state S. In this way, one learning is done only for one action in one state. This learning should be repeated for as many actions as possible, in as many states as possible.
● Calculation example of Q-value by neural network
I implemented a learning method using such a neural network in Python and executed it on a PC. This program is based on the Python program (using Tensorflow / Keras) published by Dr. Makoto Ito in reference [1]. Fig.5 shows the learning process for Case1 (4x4). It shows the situation where 10000 episodes were randomly trained. In the upper graph, the average sum of rewards per episode has reached about 0.8. On the other hand, when the neural network is not used, as shown in the figure on the right of Fig. 1(a) (although the characters are small and difficult to see), it is 0.8305, so both results are almost the same. The lower graph shows that the average number of steps a robot takes to reach the gem is about 2.9. This value is also valid considering the situation in Fig.1.
Acknowledgments
I was able to create a Q-value calculation program using a neural network by referring to the Python program published in the reference [1]. I would like to thank Dr. Makoto Ito, the author of this article.
References
[1] Makoto Ito's Blog Article: M-note Program and Electronic Work (in Japanese)
http://itoshi.main.jp/tech/
Japanese summary 前回の記事では、スマホ向けのQ-Learningアプリを開発し、それを簡単な例(ロボットが宝石を得る)に適用しました。今回は、ロボットの行動にいくつかのバリエーションを与えてみました。その場合でも、新しい行動の記述を追加する以外は、このスマホアプリをほとんど変更していません。今回の例題でも、Q-Learningによる学習の結果、ロボットは宝石を得るための最適な手順を自ら発見できました。
Abstract
In the previous article, I developed a Q-Learning app for smartphones and applied it to a simple example (a robot gets a gem). This time, I gave some variations to the behavior of the robot. Even so, I haven't changed much of this smartphone app, except to add a new behavioral description. In this example as well, as a result of learning by Q-Learning, the robot was able to discover the optimal procedure for obtaining the gem.
# For the case where the robot moves on the 2D grid, please see this revised version.
● New examples (two cases)
As in the last time, as shown in the figure below, the task is for the robot to move the corridor and get the gem. The actions that the robot can take are different from the last time, but learning the best steps to successfully acquire a gem is the same.
● Learning results in Case1 and the robot moving example
As a result of fully executing Q-Learning for Case1, we obtained a highly accurate Q-table. Using it, the robot was able to discover the optimal procedure for obtaining the gem, as shown in Fig.1. In the initial state of this example, the positions of R (Robot) and G (Gem) are expressed as "R . . G . .". The corresponding maximum value of Q-table is given by "Forward" and "Jump" (where, both values are 3.0.). Whichever is adopted, it will be the same after all, but here, "Jump" was taken. At the transition destinations after this, the action that maximizes the Q-table value was also taken, so the gem was successfully acquired. This is the best procedure.