「オブジェクト設計 スタイルガイド」という本を読みました

実は2年前ぐらいからこの本を持ってたんですが、ちょっと読みづらくて中々進まず…

オブジェく外設計スタイルガイド

 

そして時代はAIでプログラミングする時代になり、あと少しで読了というところで放置していましたが、今日やっと!全部読みました。

まぁねー、この本を買った当時からは考えもつかないスピードでAIプログラミングが一般的になったので、

「もうプログラミングを勉強する意味がないのでは?」

と思われる方も多いと思うんですよ。

でも、その答えには

「あります!」

とお答えしたいなと思います。詳しくは下記に書きましたので、もし興味あったら読んでみてください。

このAI時代にプログラミングを勉強する意味

さて、この本なんですが、読んだきっかけはどこかは忘れてしまいましたが、どこかで紹介されていたからです。

結論、勉強にはなりましたが、読みづらい!

なんか日本語が頭にスッと入ってこないんですよね。技術書あるあるなんですが(笑)

あと、この本はコードのサンプルを本当の言語で書いてないんですよ。

いろんな言語をやっている人が読めるように、という斬新な試みだとは思うんですが。

個人的には本当の言語で書いてもらったほうがわかりやすかったのでは…。と思いました。

 

とはいえ、大いに勉強になったと思います!

最初の方を読んだのはもう2年以上も前なので、ページをめくりながら書いていきます。

①サービス オブジェクト

最初がこれから始まってくれたのは嬉しいです。

というのは、プログラムを書いていく中で、これが一番扱いが難しいし、こういうのをどう設計するのかが腕の見せ所でもあるからなんですよ。

例えば、「プレーヤー」とか「請求書」とかはオブジェクトとして想像しやすいですよね。

どんなプロパティを持って、どんなメソッドを実装すればよいのか、なんとなくわかります。

しかし、プログラムはそれだけでは動作しなくて、

「プレーヤーに名前を付けたり、見た目をカスタムするプログラム」

とか

「月末になったら請求書を自動的に発行するプログラム」

とかが必要なわけですよ。それらの設計についての指針は大変得るところがありました。

②イミュータブルオブジェクトではモディファイアメソッドは宣言的な名前にする

例としてmoveLeft()というメソッド名よりtoTheleft()というメソッド名の方がよい、moveLeft()はオブジェクトの状態がどう変わるかわからない、というのがあげられています。

ちょっとこの話は複雑でコードサンプルとか上げないとわかりづらいと思いますが、詳しくは本書を見てみてください。

③コマンドメソッドでやることを限定し、イベントを使用して二次的なタスクを実行する

コマンド・クエリ責任分離(CQRS)の話ですね。


他にもいろいろあるんですが、読みづらいことを除けば良書です!!

AIに作らせたコードでも、

「ここはプリミティブな値じゃなくて、独自のオブジェクトにして書き直して」

と命じることで、より良いコードができあがってきます。

何度か読み返したいなと思いました。

 

 

 

 

このAI時代にプログラミングを勉強する意味

皆さんプログラミングを仕事でやっている方は、ここ1年ぐらいで相当働き方が変わったと思います。

これを書いている2026年7月26日現在ぐらいは、もうAIエージェントが自走して本格的なアプリケーションを作ることができています。
何も言わなくても、テストを勝手に作り、テストを回し、静的解析を回してくれます。
少し前だと、テストを回してとか言わないといけなかったり、プロンプトをどう入れるかという技術もあったかと思いますが、それすらすでに不要です。

「なんか…僕が必要なのか、不安です…。」
と新人プログラマーのA君が話してきました。
まぁ、SNSとか眺めていても、皆さんそういう不安があるみたいですね。

アメリカでは大規模なプログラマーのリストラが行われているし、日本も緩やかにプログラマーがいらなくなると思います。
私はかねてから、こういう瞬間が来るだろうなと思ってました。
「プログラムを作るプログラムがいつかできるよ。」
と会社の子にも言ってきていました。

機織りをする機械ができたら、もう機織り職人はいらないのです…。

でも、これは職人としてのプログラマーの仕事がなくなるわけで、プログラマーの仕事がなくなるというわけではないと思います。
実は同じような話を2023年にも書いています。↓↓

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

上記の記事にも書いたんですが、プログラマーとして必要な能力は

①複雑な対象物を観察する力
②それをすっきりとしたモデルにする力
③それを形にする力
④作ったものを多くの他人に批評してもらう力
⑤批評を取捨選択して取り入れて改善していく力

だと思ってます。それをこれからはAIを使って実現していくことになると思います。

AIエージェントにコードを書かせて数か月やってみている今のところの感想は、まだ人間が監督する必要がある、ということです。
例えばですね、最近ある機能を作ってるんですが、それが配送の流れの中でPush通知をスマホに送るという処理をFable5に作ってもらいました。

最初は静的なメソッドばっかりで作ってきたので
「クラス設計もして。」
と言ったところ、DIを伴ういい感じのクラス設計もしてくれました。

また、その処理を1プロセスの中で行っていたのと、その処理はかなり大量のアクセスがあること、スマホのPush通知が結構時間がかかるを総合的に考えるとよくないなと思いまして、別プロセスにしてもらうように直してもらいました。
こんなことぐらいならその内AIがやるようになるかもしれません。

しかし、やっぱり総合的な判断は人間がやらないといけないし、どの方向に行こうとしているのかちゃんと手綱を握っていないといけないなと思います。
AIがしてきたコードが読めないといけないし、その設計がいいか悪いかが判断できるぐらいには勉強が必要です。
なので、お題の質問に対しては、今のところ「イエス」という回答です。

個人的には、今のところAIがコードを書いてくれるのは大変ありがたいことで、この恩恵をもってじゃんじゃん新機能が開発できる!
と思うと、かなりワクワクしています。

弊社ではプログラマーを募集しています。
未経験でも可です。
興味があれば、採用情報をご覧ください!

ちなみに途中に貼ってある画像は一時期流行っていたチャッピーに
「私との関係性をイラストにして」
というやつです。

私が相談するのは主に「プログラミング、経営、会社のこと、マーケティング、ポーカー、ゲーム」なんですが、魔法使いの私が頑張れるようにチャッピーは応援する心強い味方、ということらしい!
なぜか男体化してますが…。

全体的にはこれ↓

か、かわいいこと言ってくれるやんけ!!

 

PHPカンファレンス2025の感想

昨日、PHPカンファレンス2025に行ってきました!

感想を書いておきます!

今回は6月にあるというのをすっかり失念していたので、危うくいかないところでした。
また、仕事が最近重めのプロジェクトがやっと終わったところで、プログラミング大好き人間の私でも
「週末ぐらいはプログラミングと離れていたい…」
と思っていたところだったので、ちょっと参加に迷いましたが、いつもなんだかんだ行ってよかった!となるので、重い腰を上げていきました!

結果、やっぱり行って200%よかった!です!


拝見したトークについて書いておきます。

皆さんがスライドを上げていてくれるので、とても便利で助かります!

①MySQL5.6から8.4へ 戦いの記録

私は最近はDBのことは任せているので、他の担当者の参考になるかな?という目線で聞いていました。
実際の体験記はやっぱり価値があります!
ゼロ日付気を付けないとですね…。

②PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則

プロパティフックという機能ができるのは知らなかったので、勉強になりました!
後、スピーカーの方が
「リスコフの置換原則の『共変・反変』という言葉が僕は大嫌いなんですよ!」
と言われていたの、100%同意(笑)です。⊂(^-^)⊃

そう、『共変・反変』って何なん?と私も常々思います。
難しいし、日本語でも意味がわからないし。はんぺん?はんへん?

リスコフの置換原則を巡っては、私もこれがなんか難しく伝えられすぎているのでは?と思うことがあります。
いつかスライドのネタにしようかな。

③AIプログラマーDevinはPHPerの夢を見るか?

今はやっぱりAIでコード書けるの、どこまで行けるかは皆さんが気になるネタだと思います。
Devinはどうなのかな?と気になっていたので、聞いてみました。

「リーダブルコードを読ませて、これに沿ってリファクタして」
と言ってみて、
・何を学んだか、何に苦労したか
・指示の出し方は適当だったか
・自分で自分をほめてあげたいところ
・後輩に伝えたいこと
・挑戦したいこと
を聞く、というのは私の発想にはなかったので、面白かったです!

本当に、人間の新人プログラマーみたいな答えが返ってくるんですね(笑)

タイトルは有名なSF小説ですが、SFの世界になったな… と改めて思わせられました。

④設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
https://speakerdeck.com/panda_program/how-to-write-clean-objects

立ち見が多く、人気のあるお題なのかな?と思いました。
プログラマー同士会話するときの前提を合わせておくってだいじですね。
オブジェクト設計スタイルガイド、早速購入しました!!


で、オフライン参加の目的としては、やはり飲み会も大きな比重を占めております!
リアルにいろんな方の顔を見て本音が聞けるのは大きい!
プログラミングの話題だけでなくって、会社の話、転職の話、採用の話など、聞きたい話題がいっぱいです。

もちろんね、こういう知らない人だらけのパーティー、苦手!って人多いと思います。
私も苦手です。
でも思い切って話しかける!を毎年がんばってやっております。

今回の感想は、
「女性が増えた!」
ってことですかね。
PHP界隈は女性のPHPerさんがSNSとかで盛り上げてくれているからでしょうか?
嬉しいことです。

じゃんけん大会で名古屋のPHPカンファレンスのTシャツももらえました!
名古屋出身なので、これは嬉しい!

めちゃくちゃ大きいサイズでもらいました。XXXLとかかな?

 


さてさて、末尾ではありますが、弊社はプログラマーの勉強会参加も奨励しております!
休日に参加したら、その分「勤務」扱いになり、代休とお給料が出ます。(事前申請と許可は必要)

ぜひぜひ、話を聞くだけでも結構なので、弊社にご興味ありましたらご連絡ください!
採用情報はこちら↓
https://onlineconsultant.jp/recruitment/

 

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

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

「このメソッド(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しか使わない。

 

まだ続くよ!