cocolog:91382428
田中&富谷&橋本『ディープラーニングと物理学』に目を通した。その感想とは関係ないが、ずっと気にしているおもちゃの自動車の自動運転がらみのアイデアをブレイン・ストーミング的にここで少し考える。 (JRF 8296)
JRF 2019年10月12日 (土)
Amazon の商品紹介には「人工知能技術の中枢をなす深層学習と物理学との繋がりを俯瞰する。物理学者ならではの視点で原理から応用までを説く、空前の入門書。」…とある。第I部と第II部にわかれ、>第I部は「物理学の観点から機械学習の方法を理解すること」、次に第II部では「物理学の諸問題と機械学習の方法の関連を見いだすこと」を目的<(p.iv)とし、第I部は教科書だが、第II部は発展トピックとしている。
JRF2019/10/129316
基本的には機械学習…ディープラーニングについて理解があることを前提としているように思う。私は、『ゼロから作る Deep Learning』のシリーズの 1巻を [cocolog:87181973] で、2巻を [cocolog:90214777] で読み、『scikit-learnとTensorFlowによる実践機械学習』を [cocolog:90343301] で読んでおり、準備はできていたといったところ。
JRF2019/10/124631
で、今回の本を、読んで理解したかと言われるとキビしく、私は「目を通した」と言っておくぐらいが吉だと思うが、ハミルトニアン=エネルギーを用いた説明はおもしろいとは思った…かな。
第II部は、一つ一つが、やってみたらできましたという体の論文になっていて、物理学に関心があれば、そこから参考文献などを辿っていけるようになっているのだと思う。が、物理学徒ではとうにない私は正直得るところがなかった。
第I部については、どういうことを書いていたか少し説明しようと思う。
JRF2019/10/126939
……。
学習すべき確率 P(x, d) に対し、パラメータ J に依存する Q_J(x, d) というモデルを作り、J を変更することで学習していくことを考える。
そのとき、相対エントロピー D_KL(P || Q_J) というのが重要でそれがいってみれば誤差(または損失)となり、それが 0 に近づくよう J を更新していく。そのときに、勾配を計算して行うのが、確率的勾配降下法となる。
JRF2019/10/124108
具体的なモデルを作るときは、ハミルトニアン(=エネルギー)を考え、ボルツマン分布 Q = (1/Z) * exp(- H / (k_B * T)) (H がハミルトニアン=エネルギー, k_B * T は定数でだいたいイコール 1 と考える) のうち、H 内のパラメータ J を動かすことで、任意の確率 P に近づけることができると考える。
JRF2019/10/125048
d = 0,1 のとき、J と位置 x をかけあわせただけのような最も簡単なハミルトニアンを考えて、誤差 D_KL を経由して平均的出力〈d〉を求めると、シグモイド関数を使う「機械学習でよく見た式」が得られる。d を多値にしたり実数値 d in [-inf, inf] としても、「機械学習でよく見た式」が得られる。
JRF2019/10/125885
H の作り方を工夫することで ReLU (Rectified Linear Unit) のような活性化関数も作れることが示されるが、ここは理解できなかった。自由度 h ってプラスだけ? なんで出てきたの? ってのがわからなかった。近似もよくわからない。
JRF2019/10/124201
それでそこがわからなかったので、その次の深層ニューラルネットワークにする部分もいまいち理解できない。>和を平均に置き換える近似を入れると<(p.60)…とか、なんでそんな近似しちゃっていいの?…となった。
JRF2019/10/120968
……。
ブラ・ケット記法を利用した誤差逆伝播法の説明や、畳み込み(CNN)や LSTM の説明もある。前からそうだが、この辺とくに、元の概念がわかってないと理解できないだろう。ブラ・ケットは、そう書けるのか…というぐらいで、私には難し過ぎる。
JRF2019/10/122416
サンプリングのところは不明で、とくに、後半の熱浴法や詳細釣り合いなんて何がいいたいのがよくわからないが、機械学習ではギブスサンプラー(Gibbs sampler)というものを使うことがあるらしく、そことの関連で出てくるのだろう。私は機械学習についても生半可な知識しか持ちあわせておらず、ギブスサンプラーとか言われてもサッパリなのだが…。
JRF2019/10/120489
……。
第6章では教師なし学習が説明され、フェイク画像などを作るための GAN (generative adversarial network, 敵対的生成ネットワーク)が説明される。
JRF2019/10/124096
D (discriminator, 識別器) と G (generator, 生成器) を同時に学習していくのだが、説明の識別器の目的関数 V_D のほうは理解できる。本物を入れたとき識別器がちゃんと本物とし、偽物を入れたときは本物としない…ということであろう。しかし、 V_G はイコール - V_D というのはわかりにくい。V_G は生成したものが識別器をだませるかが問題で、もとからある本物については、何も言わないのが正しいのではないかと私は思った。
JRF2019/10/124813
実際、本の説明でもそういうふうな構成のほうが実際に使われているとのこと、でも、VG = - V_D のような目的関数でないと、(極限において) P = Q_G になるということが証明できないということらしい(2019年4月現在では)。
ただ、V_G, V_D のとり方を少し変えた Energy-based GAN では、V_G は生成したものが識別器をだませるかだけを問題とした V_G でも、P = Q_G になることが証明できるようだ。
あと、Wasserstein GAN というものも説明されているが、理解できなかった。
JRF2019/10/123883
第6章ではもう一つ、ボルツマンマシンというのが説明されている。(ボルツマン分布とはいちおうまた別。) どうも、シンプルで自然な導出というのがなされていて、それが美しいということのようだが、私には何がやりたいのかすら理解できない。学習においては>第2項は Q_J(x) の形がわかっていたとしても計算は困難です。なぜなら分配関数の計算が必要だからです。<(p.138)…とか言われても「はぁ?」といった感じ。
JRF2019/10/120803
ググってボルツマンマシンのことを調べようとするが、あまりいい情報がない。Wikipedia は数学辞典に似ていつものごとく、すでに知っている人にはわかるが、初学者にはわからない書き方。それでも↓から続くページで一応、何のことかはわかるようになった。
《ゼロから始めるDeepLearning_その2_ホップフィールドネットワークとは - 分からんこと多すぎ》
http://rishida.hatenablog.com/entry/2014/03/03/174331
JRF2019/10/122642
が、この本も、やはり「わかっている人」向けにあっさりと美しく書いているということなんだと思う。
JRF2019/10/124026
さらに、この本では制限ボルツマンマシン(RBM) について書かれていて、CD 法(Constrastive Divergence 法)についてもあっさりと書いているが、他の人にとって、CD 法は鬼門であるらしく、「わからない」と書いているページがある。私はもちろんわからない。ただ、この本では、上に書いた詳細釣り合いや熱浴法の説明があり、わかった人が書いた少し詳しい説明になっているように思う。わかる人から見たら「これが欲しかった」という情報なのかもしれない。
JRF2019/10/125060
……。
この本の説明はこれぐらいで。
JRF2019/10/125103
……。
……。
私は深層学習に興味を持っていて、工場や農場などの機械を AI で動かせるようになったらすごい、それにニートな自分が貢献できたらいいな…ぐらいに思っている。でも、今のところ目標としているのは、おもちゃの自動車の自動運転という「しょぼい」ものである。
JRF2019/10/120476
keyword: おもちゃの自動車
そして、まだ、それに向けていろいろ学んだり、ブレイン・ストーミングぎみにアイデア出しを行っている段階で、プログラミングにはほぼまったく入っていない。
プログラミングに入るのは、まだ相当先のような気もするので、いい機会だから、機械学習について学んだついでに、考えているアイデアをいくつか紹介したい。アイデアは当然まだ実験にもさらされておらず、今後、いかようにも変化する可能性のあるものである。
JRF2019/10/127232
……。
おもちゃの自動運転とは別に「カエルがある力でジャンプするとして、目的の距離を行くために、想起した行動の行動結果がその目的よりも小さければ、より力を込めるようにする…といった学習をしなければならない。」…といったことも考えていた。
これに競争的学習…とくに負例の学習が使えないか…とか考えていた。
《ニューラルネットで負の学習: 競争的な学習の実験 その2》
http://jrf.cocolog-nifty.com/software/2019/05/post-3c97df.html
JRF2019/10/129339
「 [環境] + [(操作)提案] → [予想] として [結果] を得る」(第一マシン)というのを先に学習しておき、「 [環境] + [目標] → [提案] と想起して提案された操作を実行して [結果]」(第二マシン)を得て、[結果] と [予想]に違いがあるときは、その差が、第一マシンに [提案] をつっこんで得られた [予想] が [結果] と違ってもそれを基準として、[提案] を動かしたものを複数作り、それを第一マシンに突っ込んで得た [予想] の差が、第二マシン の [結果] - [予想] の形に一番近いものを基準に(次はその方向に動いたほうがいいものとして)第二マシンを学習する。
JRF2019/10/120954
第二マシンの [結果] - [予想] の形に近いのを基準に…というのは競争的学習の枠組ともとれる。ここに負例の学習も持ちこめるのではないか?…と考えた。
JRF2019/10/121174
しかし、これで競争的学習にうまくもちこめるだろうか? 「 [提案] を動かしたもの」はマシンの想起によるものではないから。 また、[提案] を動かしたものを第一マシンに突っ込んだものと[結果] の差が、動かさない「零点」と [結果] の差より小さくなる保証はない。提案をランダムにとるとき、その半径を指定するようにし、それを小さくしていけば、[結果] - [予想] が [結果] - [零点] よりも小さくなる…とし、その上で、もっとも近いものを勝者とすればいいんだろうか…。
JRF2019/10/129617
いや、むしろ、微分…誤差逆伝播法…をうまく使えばいいのではないか? 第一マシンの[予想] に対する正例として [結果] が得られたとしたとき、逆伝播すれば [提案] をどれぐらい動かすべきかも得られるはずではないか? それを第二マシンに逆伝播させればいいはず。…ほんとに? 何か簡単なモデルで試してみるべきだ。
JRF2019/10/127207
いや、「 [予想] に対する正例として [結果] が得られた」ではダメだ。第一マシンの [環境] は第二マシンの [環境] より貧弱でいいことも考慮すべき。[提案] に基づく実行 [結果] と、[提案] からの [予想] は別もので、[目標] を考慮しないといけない。[予想] に対して、[目標] - [結果] + [予想] が正例として得られたとして backward すべき(だろう)。
JRF2019/10/123824
つまり…、
[環境] + [(操作)提案] → [予想] = [結果] という「第一マシン」を、先に環境・提案をランダムにして学習。
JRF2019/10/124503
[環境] + [目標] → [提案] と想起して提案された操作を実行して [結果]を得るという「第二マシン」をオンライン学習していく。
JRF2019/10/126656
そのとき、第一マシンで、[目標] - [結果] + [予想] が正例として得られたとして backward して微分として得られる [提案] 部分の差を、第二マシンの [提案] の誤差として受け取って学習する。
第一マシンの [環境] は第二マシンの [環境] より貧弱でいい。
…とすればよいのではないか?
JRF2019/10/123918
ただ、これをおもちゃの自動車にどう適用すればいいのかは難しい。[結果] とか [目標] とかが「道の真ん中を通る」とするとき、[目標] - [結果] + [予想] は意味のあるデータになるだろうか? カエルがジャンプする例や何らかの姿勢制御では何か意味があるのかもしれないが…。
JRF2019/10/128042
おもちゃの自動車の場合、[結果] [予想] などの詳細データは、道の真ん中を一定の速度で走ったかどうかで与えられるとすると、詳細な教師データを与え続けなくても、「左」「右」「真ん中」といった操作入力がずっとなくても、道の真ん中を行くことは学習できるのではないか?「道の真ん中を行く」というデータの与え方に何か、「固有値」的なチートがありそう。
JRF2019/10/128757
……。
「歩行」などのシーケンスを学習することを考える。例として、おもちゃの自動車で、「S字に進む」ということを学習させることを考える。「左に曲がる」と同様に「S字に曲がる」というコマンドを順に LSTM で学習するのではなく、「S字に進む」とはどういうことかを先に学習させ、進んでいる途中で、S字からどれだけ離れたかをバックプロパゲーションさせられないか。
JRF2019/10/122720
S字から逆に求めるのは、左右といった要素還元情報の場合もありうるし、バックプロパゲーションが大きな力をもつ上の [目標] のような詳細な生情報であることも考えられる。
JRF2019/10/120677
「右に曲がる」や「S字に曲がる」という「コマンド」。コマンドを操作入力にして学習するモデルを考えた一方で、コマンドを出力としてそこからバックプロパゲーションをするモデルも考えた。二つをイメージ上で合わせると、コマンドを出力するモデルを「折り曲げて」あたかも入力のように見なし、コマンドごとに接続を切り替えるモデルが思い浮かぶ。
JRF2019/10/122867
このモデルだと、「S字に曲がる」中に「右に曲がる」が含まれていることや、「右に曲がる」や「左に曲がる」をしていると「S字に曲がる」ということが、接続部分で反射することでシミュレーション的に言えそうに思うがどうだろう? そうできないか。
JRF2019/10/120555
反射するときに、Deep Dream や Deep Fake のようなことをするのだろうか? 「右に曲がる」が 1 に近いようになるようにバックプロパゲーションし、少し変形したものを再びネットにかましてその出力が 1 に近いようになるように…というのを繰り返して 1 に近いものを求めていくのだろうか? それともそのような操作は一回で十分なのだろうか?
状態遷移は、LSTM でやるということなのだろうか。ずっと過去の重要な遷移を圧縮して覚えるとはどうしたらいいのだろう?
JRF2019/10/120078
……。
話を変える。
おもちゃの自動車について、OpenAI Gym に適当なものがあればいいのだが、なければ自分でシミュレーション環境を作ることになる。そのとき、環境の入力はどうすればいいのだろう? もっとも素直だが難しいものとして、自動車のフロントガラスからみた 3D 画像を生成するというものが考えられる。それを CNN などで画像認識するということになる。
JRF2019/10/127783
他には、左右・直進の道のある方向についてベクトルで入力するということも考えられる。これはかなりデータが恣意的になり、できることが限られるが、実装は簡単になるだろう。
他には、2D 表示も考えられる。周囲の道路を回転させながら2Dで表示するというものだ。これは CNN と相性がよく 3D ほど計算力もいらないし、私のプログラミング力でも可能と思われる。
どれにするか迷っている。
JRF2019/10/127062
……。
あと、物理でおもちゃを作ったりすると、数値化できない環境の変化などで、同じ環境が入力されても出力が違うということが起こる。カオス的な変化もあるかもしれない。それを考慮できないかというのがある。
JRF2019/10/120055
平均と分散を出力してランダムさを含む結果を予想するニューラルネットというのが考えられるのではないか。山を二つ含むようなものは、平均と分散を二つずつ出力して、どちらかが近ければいい…とするといいのではないか。ただ、まずは、一つずつの出力で考えるべきだろう。
これを学習するときは、同じシチュエーションについての複数の結果をバッチして、バッチの平均と分散に関して学習するのが、もっとも適当であろうが、同じシチュエーションというのが得がたい。
JRF2019/10/128610
そこで、一つはシチュエーションをデジタル化して、「同じシチュエーション」を起きやすくすることが考えられるが、しかし、平均や分散もデジタル化してしまうことになり、あまり良くない。
むしろ、逐次に、分散よりも遠くにあれば、分散を大きくし平均を移動し、平均に近ければ、分散を小さくする。学習初期は平均を移動するが、後期はあまり動かさないようにする…等が考えられる。ただ、これでうまくいくかは実験してみる必要がある。
JRF2019/10/121879
素子レベルで、平均と分散に対応することも考られる。同じ(環境)入力なのに違う出力が得られるというのは分散が大きいと学習するような素子である。ただ、これは、どういう演算ルールにするかが難しい。二つの素子が絡んだ結果、相互作用が起き、むしろ分散が小さくなるような場合にも対応しないといけないだろうから。
JRF2019/10/124674
そのようなものとしてボルツマンマシンがあるのかな…と思ったが、どうやらそうではないようだった。
JRF2019/10/127012
……。
まぁ、AI の歴史はもう長いので、ここに述べたアイデアは有効なものなら、すでに試されていると思う。ただ、そうであったとしても、個人的な練習として、やってみるつもり。もちろん、そういうものが・似たものが、あるよ!…と知っている方は、教えていただけると大変ありがたい。
JRF2019/10/120685
……。
……。
追記 (2020年2月7日)。
第一マシン、第二マシン、そして「S字に曲がる」などを覚える第三マシンについて、それぞれ Predictor、Actor、Recollector と名付けた直した上で、実験を行った。
《Predictor - Actor (- Recollector) モデルと負の学習》
http://jrf.cocolog-nifty.com/software/2020/02/post-c87651.html
JRF2020/2/72489
Recollector に関しては今回はほぼ上に述べたような実装はしていない。Predictor と Actor につういては逆伝播を使う実装を行った。
その実装を行っている途中で、[環境] + [(操作)提案] → [予想] を第一マシン(Predictor)が覚えているとき、同じ [環境] [(操作)提案] [予想] のデータを用いて、[環境] + [予想] → [(操作)提案] という学習を行えば第二マシン(Actor)が学習できることにやっと気付いた。
JRF2020/2/70918
逆伝播を使う学習はある程度うまくいくのであるが、そもそも逆伝播を使わないくてよく、そのほうが早く良く学習できるのだった。
私のアイデアは今のところまったく無駄になってしまっている。
JRF2020/2/79500
『ディープラーニングと物理学 - 原理がわかる、応用ができる』(田中 章詞 & 富谷 昭夫 & 橋本 幸士 著, 講談社, 2019年)
https://www.amazon.co.jp/dp/4065162629
https://7net.omni7.jp/detail/5110616846
JRF2019/10/120260