コードの動作を口で説明してもらう

私はうちのプログラマーさんに

「このメソッド(or クラス)が何をしているか、口で説明して」

と言う時があります。

多分、言われた方は

「え、なんで?後藤さんはコード見てもわからないからかな?」

「面倒だな…。」

と思うかと思います。(笑)

 

しかし、これは意図があってやっていることです。

どういう意図かというと、

そのコードがどういう意味なのか、その人がコードと違う形で出力する必要があるから

です。

大体、「口で説明して」と言って、スパッと帰ってこない場合は、そのコードがよくないケースが多いです。

そういうコードは

・やってることが多すぎる

・書いた本人も実行 or デバッグしないと結果がわからない

というコードなんですよ。

当たり前なんですよね、作った人が何をしようかわかってないのであれば、微妙なものができてしまうのは。

 

書く、言う、図にする。

これらは考えを人に伝えるために重要です。

そして、人というのは他人だけではなくて、自分も含まれます。

人に悩みを聞いてもらって、すっきりした経験がある方は多いと思います。

問題が明らかになるからだと言われていますよね。

プログラミングも一緒です。

プログラムを書いたことがない人にはわかりづらいかと思いますが、プログラミングって抽象的なモヤモヤっとしたことばっかりなんですよ!!

抽象的なモヤモヤっとしたことをいかにわかりやすくするか、というのがプログラマーの仕事なので、口で言うのは、自分で問題を整理する、そのプロセスです。

逆に、私もプログラミングの設計などで悩んでいる時に、スタッフの方に聞いてもらって解決することも多いです。

 

特にAI時代において、小難しいコードを書くこと、小難しいコードを読むことはAIを使えば誰でもできるスキルになっています。

しかし、モヤモヤしたこと、抽象的なことを整理することは、今のところ人間の方ができます。

なので、そのスキルを磨いたほうがよさそうです。

書いたり、話したりしていきましょう!

コーヒーでも飲みながら

 

AIでプログラマーの仕事がなくなるのかという話

よく耳にする話ですよね。

ChatGPTがはやってから、さかんに言われるようになりました。

ノーコードの流行もあると思います。

私の今のところの推測では、

「AIのような仕事しかできないプログラマーはいらなくなるだろう」

と思います。

例えば、ちょっとした処理しか書けないとかですかね。

大体のプログラムが、情報をストレージから読み出して画面に描画し、また入力されたものをストレージに書き込む、というのがおおまかな役目だと思います。

単純に一つの画面に描画する、とかちょっと装飾をした画面にするとか、入力値を読み取ってちょっとしたバリデーションをして機械的にストレージに書き込む、ということしかできないプログラマーの場合、AIやノーコードに置き換えられてしまうと思います…。

ただ、プログラムってそんなに単純なものばかりではないんですよね。

私はプログラミングという仕事は小説家とか写真家とかに近いと思ってます。

プログラミングをしたことのない人にはピンとこない話ではあると思うんですが💦

入口の敷居は低くて、誰にでも小説を書いたり、写真を撮ったりすることができますよね。

しかし、人を感動させる小説や、美しいなと思える写真は一握りの人しか作れません。

それにはノウハウも大切だと思うんですが、積み重ねの実践も大事だと思うんですよね。

 

①複雑な対象物を観察する力

②それをすっきりとしたモデルにする力

③それを形にする力

④作ったものを多くの他人に批評してもらう力

⑤批評を取捨選択して取り入れて改善していく力

 

が必要だと思ってます。

 

AIに今のところできそうなのは③と④でしかないんですよね。

ちょっと話がそれますが、④ってのは、意外とハードルが高いものなのかなと感じています。

多くの人が、

「作品を作ったんだけど恥ずかしくて世に出せない」

という経験があると思います。コードレビューにまつわる問題も色々ありますよね。

仕事であっても、自分の書いたものが少しでも批評されると

「心が折れてしまう」

という人にはもしかしたらプログラミングもそうですが、クリエイティブな仕事には向いていないのかもしれません。

ここはAIは一抹のためらいもないでしょうから、自分の書いたコードを世にさらしてくれるでしょう。(笑)

 

前にも書きましたが

「古池や 蛙飛び込む 水の音」

まで世界をそぎ落とし、表すことができるような能力なんじゃないかなと思います。

 

ソフトウェアを作るというのは楽しい仕事です。

上述したように、まだまだ人間がやる余地があります。

むしろ末端のコードは最近はChatGPTで作れるので、より創造の余地がある仕事にシフトできている仕事だといえます。

弊社では新卒のプログラマーさんを大募集中です!

ウチでは運送業の問題を解決するソフトウェアを作っています。

一緒に世の中をよくする仕事をしていきましょう!

新卒募集の詳細はコチラから!

一緒に働く仲間を募集しています!

「コンピュータシステムの理論と実装」という本を読みました

この本はですねー。

本当に読むのに時間がかかりました…。


多分、2年近くかかってると思う(;’∀’)

読むきっかけは、

ゼロから作るDeep Learningという本を読みました

で紹介した、「ゼロから作るDeep Learning」という本で、この本が紹介されていたからです。

Deep Learningを勉強していくなかで…NandとかXorとかがすぐに理解できなかったんですよね。

 

私は、ずっと文系で来て、学校でコンピューターのことを学んだわけではありません。

なんかねー、そういうことを勉強してきた人にかなわないなって普段思ってるんですよ。

 

読むのに時間がかかった理由は、内容が難しいというのにプラス、コードを読んで、それをエミュレーターで実行しないと理解が進まない(;^ω^)

そして、そのエミュレーターの使い方が英語でしか説明がない…(つД`)

ありがたい話で、nand to tetris(原題:Nandからテトリス)ってググるとどなたかが作ったサンプルにたどり着きます。

プログラマーとして、日々プログラムを書いてちゃちゃっと実行していますが、ここに人類がたどり着くのに、すごい、道のりがあったんだなと。

よくこんな仕組みを思いついたな~と感動があります。

 

本当にいい本ですよ。買ってよかったし、読んでよかった。勉強になったし、面白かった。

私のような文系出身プログラマーにはお勧めです!

 

量子コンピューターが世界を変えるのかも

表題の話は、おとといぐらいにニュースになってましたね。

スパコンで1万年かかる計算を3分20秒で? 量子コンピューター

https://www3.nhk.or.jp/news/html/20191024/k10012146191000.html

すごいことだと思います。

IBMが反論していることも話題になってますね。

私には、真偽のほどはまったくわからないですが!

AIって、計算にすごく時間がかかるんですよ。AIによる生産革命にもっと拍車がかかるかもしれませんね。

逆に、暗号がすぐに破られるのではないかという懸念もされてますよね。

秘密にしたいような情報は、ネット上にはおけない時代になるのかもしれないし、逆に誰もが見れる情報には価値がなくなっちゃうのかもしれません。

それにしても、こういうわくわくするようなニュースに出会えて、5年後はどうなっているかわからない。

新しいことにどんどん出会える。

それがIT業界のいいところだと思います!

それにしても、量子コンピューターのイラストがあるなんて、いらすとやさん、しゅごい…。

Alpha Go Zeroの論文の翻訳 その5

うわぁ。

以前、下記を書いて、「まだまだ続くよ!」とか言ってましたが…

Alpha Go Zeroの論文の翻訳 その4

7月20日のことでした。(;^ω^)

もう4か月も経ってるやんけ!!!( ゚Д゚)

いやー、光陰矢の如し。7月末からいろんなことがあったなぁ…( ˊᵕˋ )

…と、ついつい楽しい夏の思い出を思い返しちゃいましたが、本題は、Alpha Go Zeroの論文の翻訳の最後を書くことでした。

仕事でもAIの開発を進めておりまして、少し詳しくなったと思います。

では、Go!

 

原文はこちら。

https://www.nature.com/articles/nature24270.epdf

 

前回の続きということで、付録的な、「METHODS」という部分の後半になります。

 

Domain knowledge というところからですね。ではGo!

 


 

Domain knowledge

 

Domain knowledgeとは、専門知識のことである。碁のプログラムでいえば、碁のうちかた、どうやって強い手を繰り出すか、というような専門知識のことである。

Alpha Go Zeroの一番の功績は、専門知識なくして人間を超える知力を達成したということにある。

この功績を明らかにすべく、Alpha Go Zeroが使っている専門知識をトレーニングプロシージャーやMCTS内にかかわらず、数え上げてみることにする。

これらは、ほかのゲーム(マルコフゲーム プレーヤーが1対1で進める手によって勝率などが左右される、オセロ・将棋・碁などのゲームの総称と思われ。)に使うときは、置き換えられるものである。

 

①ゲームのルール

Alpha Go Zeroはゲームのルールについては、完全に知っている。MCTSのポジションのシミュレーションや最終手を打った時のスコアをつけるのに使われている。

ゲームは両方のプレーヤーがパスしたときと722手進んだ時に終了する。また、プレーヤーはルールにのっとって、有効な手を打つ必要がある。

②スコアリング

Alpha Go ZeroではMCTSのシミュレーションとセルフプレイのトレーニングの最中にTromp-Taylorスコアリングを使っている。

なぜかというと、韓国式・日本式・中国式にせよ、人間のスコアリングはよく定義されてないからである。

ちなみにAlpha Go Zeroで採用しているのは中国式である。(この辺、私が囲碁わからないのでよくわからなかったです(;´・ω・))

③盤面

盤面は、19×19の画像的なイメージで扱われる。ニューラルネットワークはこのボードに合わせた形になっている。

④盤面の回転など

碁のルールは盤面を回転しても反転しても盤面の強さは変わらない。

それを利用して、MCTSの途中で、盤面の回転と、反転状態もデータの中に入れることができている。

komiっていうものを抜かせば、碁は色を取り換えてもなりたつ。色を変えても成り立つことにより、盤面をどちらのプレーヤーから見るか、と言ったことが成り立たせられる。

 

以上が、Alpha Go Zeroが使っている専門知識の全部である。Alpha Go Zeroがディープニューラルネットワークを使っているのは、MCTSの末端のノードを評価するときと、手を選択するときだけ。

ロールアウトポリシーも使ってないし、ツリーポリシーも使っていないし、MCTSは他のヒューリスティックだったり専門知識によるルールによって評価されたりもしない。

ルール違反の手は使わない。プレーヤーの「目」を埋めることもしない。(多分、碁の話と思われ)

 

このアルゴリズムはランダムな初期パラメーター(ニューラルネットワークに入れるやつ)で始められた。

ニューラルネットワークの構造は、先進的な画像認識の構造である。ハイパーパラメーターは学習の中で変わっていく。

MCTSの探索パラメーターは1個前にトレーニングしたニューラルネットワークを使ったセルフプレイを最適化するために、ガウス過程最適化(でいいのかな?)を使って選択されていく。

より大きい実行のために(40ブロック、40日かける実行)MCTSの探索パラメータはより小さい実行でトレーニングされたニューラルネットワーク(20ブロック、3日)を使って再最適化される。

トレーニングのアルゴリズムは人間が介在することなく、自主的にアップデートされていくのである。

 

Self-play training pipeline

 

Alpha Go Zeroのセルフプレイのトレーニングパイプラインは3つに分かれていて、全部が非同期で平行に動作する。

ニューラルネットワークのパラメーターΘは継続的にセルフプレイのデータで最適化されていく。

Alpha Go Zeroのプレーヤーαは継続的に評価されていく。

ベストなプレーヤーはセルフプレイのデータを生み出すために使われていく。

 


今日はここまで~ ハァハァ(*´Д`)

ポーカーとAI

最近はAIの開発をしていまして、最近はAlpha Zeroの話をよく書いてました。

Alpha Go Zeroの論文の翻訳 その4

 

で、これを読んだ人から疑問をもらいまして

「後藤さんが取り組んでるようなAIって、囲碁みたいな完全情報ゲームにしか使えないんでしょ?」

と言われました。

そんなことはありません。応用次第で、いろんなことに使えますよ!

それに、AIと言っても、本当に幅広いのです。

 

加えて、AIが使える分野は完全情報ゲームだけではなく、不完全情報ゲームでも実績を上げ始めているので、それは証明されている、と思います。

 

で、不完全情報ゲームと言えば、ポーカー、麻雀などですが、最近、テキサスホールデムというポーカーのゲームにはまってるので、ちょうどそのテキサスホールデムをAIでやるという話を書いておきます。

不完全情報ゲームのポーカーで人間を倒したAI「Libratus」が採っていた戦略が論文で公開される

 

なぜ人間はポーカーでAIに負けたのか? 日本トッププロが解説する“違和感” (1/2)

 

ニュースなどで報じられているカーネギーメロン大学のAI

Libratus

 

さんについては、論文とかしか情報がなさそうなので、おいておいて…(;^ω^)

Deep Stack

 

さんのサイトを見ました。で、動画も見ました…が、英語、むずい… 一回見ただけじゃあまりわからなかった(;^ω^)

その場で行う再計算(re-solving)、の完全にゲームを計算して推理するのではなく、ある程度の当て水量でゲームをするDeepStack’s “intuition”(本能的にという意味) 、Sparse lookahead Trees(完全に計算するのではなく、ある程度のツリーで計算する)など、がミソと書いてますね。

へぇぇ~ なるほど(´ω`)

だいぶ、人間っぽい!!

 

ちなみにポーカーの戦略の組み合わせは、10の160乗あるらしいです。(ー_ー) 10の160乗は、宇宙全体の物質の数より多いらしいです( ゚Д゚)

 

なんとプログラムもダウンロードできるので、時間あれば見てみたいなと思ってます。

実際のゲームの動画もあるので、見てみると、特徴としては、微妙な手で微妙な金額を賭けてくる、ということでしょうか?

もっとポーカー好きで詳しい人が見れば人間とは違うところがわかるのでしょうが、私はまったくのシロートなので、そんぐらいしかわかりませんでした。


なんというか、手が強いとか、弱いとかより、いかに報酬を最大化するか、ということに気を配るべき、というのも思いましたね~。

 

話はそれますが、Deep Stackのサイトの中で、ジョン・F・ノイマンという有名な科学者の名言(?)がありまして、

“Real life consists of bluffing, of little tactics of deception, of asking yourself what is the other man going to think I mean to do.”

 

「現実の人生は、ブラフや、戦略や欺瞞や、自分自身への自分がすることにより、他人がどう思うかという問いかけによってなりたっている」

というのが紹介されています。ふっ 深いィィィィ

 

ジョン・F・ノイマンは、ITの方なら、「ノイマン式コンピューター」という言葉を聞いたことがある方もいるかもしれませんが、そのノイマンさんです。

超天才のノイマンでしたが、ポーカーがあまり得意ではなく、そのためにゲーム理論を考え出した…などと言われております。

へぇぇ

ノイマンさんの方に興味が移ってしまい、色々調べていると、本当にすごい人ですね。

私の仕事的な興味とすれば、モンテカルロ法、マージソートもノイマンが考案したものらしい。SUGEEE

Wikipediaさんの抜粋ですが

「ENIACとの計算勝負で勝ち、「俺の次に頭の良い奴ができた」と喜んだ。」

「赤狩りのときには、エドワード・テラーと対立してロバート・オッペンハイマーを擁護し、さらにソ連のスパイだったクラウス・フックス水素爆弾を共同で開発していたこともあり、非難されている。また、日本に対して原爆投下の目標地点を選定する際には「京都が日本国民にとって深い文化的意義をもっているからこそ殲滅すべき」だとして、京都への投下を進言した。このような側面を持つノイマンは、スタンリー・キューブリックによる映画『博士の異常な愛情』のストレンジラヴ博士のモデルの一人ともされている。」

らしいです。へぇぇ。(´ω`)

 

そういえば、ゲーム会社で働く友人から、

「歴史上の人物で、そんなに有名じゃないけど、聞けば、あー、あの人ね(´ω`)ってなる人教えて~」

って聞かれてた。今って歴史上の人物がカードになるカードバトルとか、とにかく流行じゃないですかwww 歴史上の有名人、枯渇してきてるよな~。

ノイマンさん使ったらどうですかね?中二病的要素は非常に多いと思われ。あっ、でも有名じゃないか。

 

博士の異常な愛情、見てみたいですね。しかし、キューブリックの映画って怖いんだよな(´ω`)

Alpha Go Zeroの論文の翻訳 その4

途中で挫折しそうだったこのシリーズ…。

Alpha Go Zeroの論文の翻訳 その3

の続きでございます。

またまた、間違いなどありましたら、指摘してください。m(_ _)m

原文はこちら。
https://www.nature.com/articles/nature24270.epdf

 

論文本体はもう翻訳し終わってますが、付録みたいなのがまだでした。

今回は、その付録

METHODS

の翻訳です。

ハァハァ(´Д`)ハァ… がんばろう…!!

Reinforcement learning

ポリシーの繰り返しは、昔からあるアルゴリズムで、ポリシーを改善する一連の流れである。

どのように実現するかというと、ポリシーの測定と、ポリシーの改善(ポリシーの測定を使う)を繰り返し行って、ポリシーを改善していくのである。

ポリシー改善のシンプルなアプローチ方法としては、どん欲にバリュー関数に沿って、手を選んでいくというのがある。

広大な選択肢の空間では、大体でやる、というのが必須である。

分類をベースとした強化学習はシンプルなモンテカルロ探索を使ってポリシー改善をしている。

ゲームを最後まで行ってみる。平均的に価値が最大になる手だけが正の値で、それ以外の手は負の値として、トレーニングのサンプルが記録される。

こうやって、ポリシーは手を正か負かに分類さて、次のゲームに使われる。

このやり方の後継版のようなことを、Alpha Go Zeroでも、γが0に近い場合、ポリシー部分のトレーニングアルゴリズムで使っている。

 

最近の例で行くと、分類ベースのポリシー改善は(CBMPIというらしい)、ポリシーの測定をゲームの結果に向かって回帰するバリュー関数で行っている。(これもAlpha Go Zeroでやっていることに近い)

この手法は、テトリスなどでは非常に良い結果を残している。

しかし、これらの研究結果はシンプルなゲーム結果とか手作りの近似的な関数に頼っていた。

 

Alpha Go Zeroのセルフプレイのアルゴリズムは、前述のやり方によく似ている。

ポリシーの改善は、ニューラルネットワークのポリシーで始まり、MCTSベースのポリシーの推薦と、より強いポリシーを探索してまたニューラルネットワークに返す。

これらのステップはニューラルネットワークをトレーニングして、探索の確率を、セルフプレイの結果に近づけていくことにより達成される。

 

グオさんは、同じくMCTSの結果をニューラルネットワークに入れることを試みた。

探索結果に回帰するバリューネットワークを使うか、MCTSによる分類のどちらかによってである。

この試みは、アタリのゲームをニューラルネットワークを使って解くことに使われた。しかし、MCTSが固定されていて、ポリシーの反復がなかったことと、訓練されたニューラルネットワークを利用していなかった。

 

Self-play reinforcement learning in games.

 

我々のアプローチは、完全情報ゲームで、ゼロサムゲームには直接応用ができるだろう。

その後の一文、ちょっと意味がわかんなかったです。(^_^;

We follow the formalism of alter­ nating Markov games described in previous work12, noting that algorithms based  on value or policy iteration extend naturally to this setting39.

 

セルフプレイ+強化学習という手法は、以前も碁につかわれたことがある。

「ニューロ碁」はバリュー関数にニューラルネットワークを使っていたし、碁の知識をベースにした洗練されたアーキテキチャーを持っていた。

このニューラルネットワークは、タイミングをずらした学習で、セルフプレイの次の手でのテリトリー(碁の陣地のことでしょうね)を予想していた。

関連した試みで、「RL碁」はバリュー関数を線形の組み合わせではなく、3×3の石の置き方のパターンを数え上げる方法だった。そのニューラルネットワークはタイミングをずらした学習で、セルフプレイの勝者を予想するというものだった。

「ニューロ碁」も、「RL碁」も、弱いアマチュアのレベルにしかならなかった。

MCTS自体もセルフプレイの強化学習ともいえる。

探索木のノードはポジションに応じたバリュー関数を持っている。これらのバリューはセルフプレイのシミュレーションでの勝者を予想する。

MCTSのプログラムは碁ではそれなりに強いアマチュアレベルまでは達成している。しかし、それは手作りの早くゲームを終わらせる関数を作ったりしていて、ポリシーも手作りの関数でできている。

セルフプレイの強化学習のアプローチは、チェス、チェッカー、バックギャモン、オセロ、スクラブル、つい最近ではポーカーで非常によいパフォーマンスを残している。

すべての例で、バリュー関数は回帰、あるいはタイミングをずらした、セルフプレイの結果による学習でトレーニングされている。

トレーニングされたバリュー関数は、アルファ・ベータサーチ(シンプルなモンテカルロ探索)あるいはの counterfactual regret  minimization中で評価関数として使われる。

しかし、これらの手法は手作りの特徴入力を使ったり、手作りの特徴のテンプレートを使ったりしている。

加えて、学習のプロセスで教師あり学習を最初の「重み」を算出するために使ったり、手作業でコマの価値を出したり、手作業で手の制限をしたり、すでにある別のプログラムを使って敵手の戦績を作ったりしている。

最も成功し、広く使われている強化学習の手法は、ゼロサムゲームの分野で、最初に登場した。それは、タイミングをずらした学習で、最初にチェッカーのプログラムで使われた。一方で碁にはMCTSがつかわれていた。

しかし、似たようなアルゴリズムは、その後ビデオゲームやロボティクスや、産業用、レコメンデーションシステムなどで使われた。

 

AlphaGo versions.

 

我々は、Alpha Goの3つのバージョンを比べてみることにする。

(1)AlphaGo Fanは以前公開したプログラムで、ファン フイさんと2015年に対戦したプログラム。176GPUも使っていた。

(2)AlphaGo Leeは2016年3月にリーセドル氏に4-1で勝利したプログラム。

これは公開していないが、AlphaGo Fanとだいぶ似ている。しかし、公正な比較のためにいくつかのカギとなる違いを上げておく。

最初に、バリューネットワークは、ポリシーネットワークによるものではなく、素早いゲームの結果によってトレーニングされていた。

これらは何度も繰り返される。

次に、ポリシーとバリューのネットワークは、もともとの論文に書かれているより大きい。

256個の平面のレイヤーのある、12個の畳み込みネットワークと、さらに反復回数が多かった。

このバージョンはGPUでなく、48TPUを利用し、探索の間にニューラルネットワークをより早く評価できるようになっていた。

(3) AlphaGo Masterは2017年の1月に人間のトッププレーヤーを60-0で負かしたプログラムである。

このプログラムは公開されておらず、この論文に載っているのと同じニューラルネットワークと、強化学習とMCTSのアルゴリズムを使っている。しかし、まだ手作りの特徴とAlpha Go Leeと同じゲームを最後まで行う手法、そしてトレーニングは教師あり学習により初期化されていた。

(4) AlphaGo Zero この論文のプログラムである。セルフプレイの強化学習であり、ランダムな重みを最初に使い、ゲームを最後まで行わず、教師は必要ない。ただ単に、ボードの状態があればよいのである。Google Cloud上のたった4TPUしか使わない。

 

まだ続くよ!

 

Alpha Go Zeroの論文の翻訳 その3

空梅雨なんでしょうか?
意外と晴れの日が続いてうれしいですね!!ヾ(´ω`○).

Alpha Go Zeroの論文の翻訳 その2

の続きです。

またまた、間違いなどありましたら、指摘してください。m(_ _)m

原文はこちら。
https://www.nature.com/articles/nature24270.epdf

 

Empirical analysis of AlphaGo Zero training

 

Alpha Go Zeroにはランダムなアクションから初めて、450万回のセルフプレイをさせたそうです。

セルフプレイ中、それぞれ1600回のMCTS(モンテカルロ木探索)を行います。

つまり、MCTSが7,200,000,000回、回ったわけですね。

7200億回ですよ。ほげーー!!!

それぞれの手を進めるのに、0.4秒だそうです。

学習に使うミニバッチは2048のポジションのミニバッチで、70万個あるそうです。

 

上記でいうと、かなり大変な演算をしているように思いますが、Alpha Go Zeroは、たった1台のマシン・4TPUで、多くの(笑)マシン・48TPUのAlpha Go Leeを打ち負かしています。

しかも、トレーニングを始めて、わずか37時間後に、Alpha Go Leeが何か月もかかって到達したレベルに達したんです。

すごい。すごすぎる。

72時間後には、Alpha Go Leeがリ・セドルさんを負かした、あの記録的な試合の状態と同じAlpha Go LeeとAlpa Go Zeroが戦って、Alpa Go Zeroが100戦100勝しています。

どんだけ強いんだ!範馬勇二郎みたいですね!

この章は、後はどれだけAlpa Go Zeroが今までのAlphaシリーズより優れているか、というデータなどになります。

ので、割愛します。

Knowledge learned by AlphaGo Zero

 

Alpha Go Zeroは、囲碁の伝統的な手法も覚えたけれども、まったく新しい手法も覚えたということです。

定石も覚えたのですが、新しい定石の方を好んで使うらしいです。

最初はランダムだったプレイが、だんだんと碁のコンセプトを理解した洗練されたうち筋になり、布石とかテスジ?とかコ、ヨセなどの手法も取り入れていくそうです。(この辺、囲碁がわからないのでわからない…(>_<))

しかし、シチョーという人間だったら最初に覚えるような手法は、Alpha Go Zeroは相当後に覚えたそうです。

 

Final performance of AlphaGo Zero

 

もっと大きなニューラルネットワークに投入してみたらどうだったかという話。

40日間かけて、トレーニングしてみました。

2900万回のセルフプレイ、2048個のミニバッチが3100万個でトレーニングしました。

このニューラルネットワークは40個の residual blockでできています。

その場合、グラフを見てもらった方がよいのですが、Eloの指標が5日で4000を突破し、25日後ぐらいに5000を超え、その後も緩やかに増えています。

前述したパターンだと、4000に到達するのは35日あたりで、5000に届いていなかったので、こちらのやり方の方が強くなる、ということです。

その後は、他のAlphaシリーズと対戦させてみたけど、やっぱりAlpha Go Zeroが強かったよという話。

すごいぞ!かっこいいぞー!

 

Conclusion

結論!

…結局のところ、教師あり学習よりも、純粋な強化学習はよい結果を残せる。

さらに、この純粋な強化学習は、教師データがいらないし、数時間しかトレーニングにかからないし、それでいて教師あり学習よりずっと強い。

最後に妙に残酷なこと書いてありますが…。

 

人間は、何百万もの棋譜を数千年かけてつみあげ、パターンにし、本にして囲碁を研究してきた。

しかし、Alpha Go Zeroは数日で、何もないところから、囲碁の知識を再発見したり、今までに考えられなかった手法も生み出したのだ。

 


 

なんか、最後の方、真面目に囲碁に取り組んでこられている方々に石を投げられそうな話ですね(>_<)

ジブリでいえば完全に悪役ですね。

論文に書いてあるママなので、ご容赦ください。m(_ _)m

余談ですが、「ヒカルの碁」がすきだったのですが、サイがこの話を聞いたら嘆きそうですね。。。ρ(。・_・、)

それとも、喜んでAIと対戦するのでしょうか??

 

以上でこの論文は終わりですが、この翻訳はまだまだ続きます!

おまけの部分に、実装の詳しい部分が掘り下げられているのでその部分を次回に紹介します~。

 

Alpha Go Zeroの論文の翻訳 その2

はぁー 寒いような変な天気の日が続きますね。

早く、毎日30度以上の気温になる日々が来てほしいです…。(´ω`)

 

さて、前回↓

Alpha Go Zeroの論文の翻訳 その1

https://summer-snow.onlineconsultant.jp/2018/06/15/alpha-go-zero%e3%81%ae%e8%ab%96%e6%96%87%e3%81%ae%e7%bf%bb%e8%a8%b3%e3%80%80%e3%81%9d%e3%81%ae1/

 

の続きです!

またまた、間違いなどありましたら、指摘してください。m(_ _)m

原文はこちら。
https://www.nature.com/articles/nature24270.epdf

 

今回から本格的な実装の話!わくわく。てかてか。

 

Reinforcement learning in AlphaGo Zero

 

fθがニューラルネットワーク。
(p, v) = fθ(s)

sは盤面の場所。
pはその場所にいく可能性。vはプレイヤーがsにいて、且つ可能性で価値。

pは1次元テンソルでaという動作を次に取る確率で

pa= Pr(a| s)

としてあらわされる。

vは0次元テンソルで現在のプレーヤーがポジションsに於いて勝利する可能性。

このポリシーネットワークとバリューネットワークの役割を組み合わせて一つにしたようなニューラルネットワークで、Residual Blockを含んだ畳み込みレイヤーで、batch normalizationとrectifier nonlinearities(ReLU  Rectified Linear Unitではない?)はでできている。

 

Alpha Go Zeroのニューラルネットワークは新しい強化学習のアルゴリズムで、セルフプレイのゲームでトレーニングされる。

それぞれのポジションsからの動作の勝率πをMCTS(モンテカルロ木探索)でfΘを参考にして計算する。

この確率は、普通はニューラルネットワークから得た確率より強い動作を選択する。

MCTSは強力なpolicy improvement operator(訳せない…)として働くように見えるだろう。

探索を伴ったセルフプレイ…より強力になったMCTSベースのポリシーが手を選ぶ。
その時、ゲームの勝者zをバリューのサンプルとして動作する。

zはpolicy evaluation operator(訳せない…)とみなされる

 

我々の強化学習のメインアイデアは、探索者(MCTSのことだと思う)をポリシー改善のイテレーションの中で繰り返し使うことである。

ニューラルネットワークはp,vをπ、zに近づけるようにアップデートされる。

そのパラメーターは次のイテレーションに使われる。

MCTSはニューラルネットワークfΘをその計算のために使う。

それぞれのエッジ(s, a)は事前確率P(s, a)と訪問回数N(s, a)、アクションバリューQ(s, a)を保存する。

それぞれのシミュレーションはルートから始まって、葉ノードのstまで信頼上限(Q(s, a) + U(s, a),)が一番高い動作を選択していく。

信頼上限は、事前確率を訪問回数+1で割った数に比例する。

U(s, a) ∝ P(s, a) / (1 + N(s, a))

この葉ノードは一回だけ(P(s′ , ·),V(s ′ )) = fθ(s′ )を取得するために拡張されて、評価される。

それぞれのエッジ(s,a)はN(s, a)をインクリメントカウントするためと、これらのシミュレーションたちの平均的な(?)アクションバリューになるようにアップデートされる。

s,a→s‘とはシミュレーションがsからの動きaが最終的にs’に行きつくということを示している。

 

MCTSはセルフプレイのアルゴリズムのように見えるだろう。

MCTSはニューラルネットワークのパラメーターΘとルートポジションのsを渡され、そのポジションでの勝率に近い手πを算出する。

πはそれぞれの動作の訪問回数のべき乗に比例する。

 

ニューラルネットワークはセルフプレイで一手ごとに強化学習のMCTSを使ったアルゴリズムでトレーニングされる。

最初に、ニューラルネットワークはランダムな重みΘで初期化される。

続くイテレーションで、セルフプレイが続けられる。(図1a この図よくできてるのでぜひ参照してください。)

それぞれのタイムステップtでMCTS πt= α=θi-1(st) が繰りかえされるが、それぞれのMCTSでは、前回使われたニューラルネットワークの結果を使っている。

ステップTで最後。

探索の価値が終了の閾値まで下がったらあるいは最大の手の数を超えたら終わり。

ゲームは最終的な報酬である、-1か1を返す。

それぞれの手のデータは保存されている。

(st, πt, zt)

Ztはー1か1。勝者かそうでないか、ということ。

平行して、NNのパラメーターΘはずっと、(s,π,z)の値で次のようにトレーニングされる。

vがzに近づくように(vとzの間のエラーが少なくなるように)、pがπに近づくように。

パラメーターΘは損失関数l、勾配降下法(平均二乗誤差と交差エントロピーの合計)によって最適化されていく。

損失関数lの式。

パラメーターcは、過学習を防ぐためのL2正則化のレベルためのパラメーター。

図1の説明(この図がよいので、原文を見てみてください)

図1a

プログラムはゲームを自分自身を相手に進める。s1,s2,…sTと手を進めていく。

それぞれのポジションsでニューラルネットワークfΘを利用してMCTS αΘが実行される。

手はMCTSの計算結果によって選択されていく。最後のポジションsTで、ゲームの勝敗zを算出する。

図1b

Alpha Go Zeroにおけるニューラルネットワークのトレーニングについて。

ニューラルネットワークはボードのポジションstをそのまま入力として受け取る。

ニューラルネットワークはstを入力すると、いくつかの畳み込みレイヤーにパラメーターΘと一緒に入力され、次の2つを出力する。

①pt(ベクトル(1次元テンソル))

このベクトルptは動作の確率分布。

②バリューvt(スカラ(0次元テンソル))

現在のポジションsからの現在のプレーヤーの勝率

ニューラルネットワークはpはπへの類似が最大になるように、vはzと比べた時のエラーをなるべく少なくしていくようにアップデートしていく。

新しいパラメーターは次のセルフプレイの繰り返しの時に使われる。

 

 

——————————————————————————————————————————————–

以上でReinforcement learning in AlphaGo Zeroの部分は終わり。

MCTSの計算で使うパラメーターをニューラルネットワークでアップデートしていくわけです。

ニューラルネットワークで使うパラメーターp,v,πはMCTSで生み出されるわけです。

MCTSとニューラルネットワークが相互に依存しながら進化しあっていくわけですね~。

Alpha Go Zeroの論文の翻訳 その1

前回

Alpha Go Zeroのすごさを機械学習とか知らない人向けに説明してみる

https://summer-snow.onlineconsultant.jp/2018/06/13/alpha-go-zero%e3%81%ae%e3%81%99%e3%81%94%e3%81%95%e3%82%92%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92%e3%81%a8%e3%81%8b%e7%9f%a5%e3%82%89%e3%81%aa%e3%81%84%e4%ba%ba%e5%90%91%e3%81%91%e3%81%ab%e3%83%89/

で紹介した、下記の論文を自分の理解のために翻訳していこうと思います。

Mastering the game of Go without human knowledge

https://www.nature.com/articles/nature24270.epdf?author_access_token=VJXbVjaSHxFoctQQ4p2k4tRgN0jAjWel9jnR3ZoTv0PVW4gB86EEpGqTRDtpIz-2rmo8-KG06gqVobU5NSCFeHILHcVFUeMsbvwS-lxjqQGg98faovwjxeTUgZAUMnRQ

 

今回から、Deep learningの知識がある方向けです。

ちなみに、英語がつらかったw

そして、私は論文を読むのに慣れてるわけでもなく、ただのプログラマーですので、間違いなどあるとは思いますが、ご容赦頂ければと思います。

間違いあれば、ぜひ指摘してください!m(_ _)m

 


 

最初の部分は、今までのAlpha Goである、Alpha Go FanとAlpha Go Lee,の説明。

 

Alpha Go Fanは2つの深層ニューラルネットワークからできていた。

一つはポリシーネットワーク。移動の確率と、バリューを生み出す。

人間のエキスパートの動作を予測して強化学習によりその値を新しくしていた。

バリューネットワークは、ポリシーネットワークで生み出されたポリシーを使って、勝者を予測する。

モンテカルロ木探索をこれらの2つのネットワークと融合。ポリシーネットワークを使ってより可能性の高い手を選択、バリューネットワークを利用して(モンテカルロ木探索のRollout(勝負を最後まで疑似的にしてみる)を利用)その手の価値を計算していた。

 

次の世代のAlphaGo LeeもほぼFanと一緒。

 

Alpha zeroはLee、Fanと違って、人間のエキスパートの動きの予測は一切しない。(ので、人間のエキスパートのデータはいらない)

インプットするのは、盤面の白い石、黒い石の位置だけ。

たった一つのニューラルネットワークを使用する。

シンプルな木探索で、モンテカルロ木探索のRolloutみたいなことがいらない。


 

あっ あっさり終わっちゃいましたね。

ま、これは冒頭部分だけですから!

次回がAlpha Go zero実装に関係ある部分ですね。(`・ω・´)