数値計算屋がFortranを捨てるべき3つの理由

パンチカード時代の負の遺産として数値計算系を中心に今も生き続けている言語Fortran。本稿では仮に数値計算用途であってもFortranを使うべきでない理由を説明することで、悪しき文化の終幕を促進したいと思います。

因みに筆者は量子系を中心にした数値計算を生業としています。C++Pythonがメインですが数値計算ライブラリの拡張などの用途でFortran77も90も触ったことがありますし、Fortran製のライブラリは頻繁に利用しています。

あくまで筆者の経験に基づいたものでありFortranを使っている技術者からすれば反論もあるものとおもいます。

 

【1.教材として不適切である】

Fortranの長所として計算向けに設計されているため、行列や複素数の計算が簡単であるという点がよく挙げられます。確かに、Fortranの計算はC++などに比べ直感的で簡単です。しかし、高度なプロダクトを開発する上でボトルネックとなるのは実装ではなく、エラー処理やバグ取りなどの設計/実装後の処理です(*)。バグ取りという観点においてFortranは最悪です。まずユーザが少ないので些細な文法ミスでも原因を探すのに苦労します。C++であれば大抵のバグは誰かが引いていて何らかの記事があるものですが、Fortranでは逆に、大抵のバグの解決方法はQiitaやstackoverflowには記載されていません。

更に悪いことに、Fortranで書かれ現役で使われているライブラリの多くは前時代的で劣悪なコード設計となっています。変数の文字名が1文字であったり、関数の名前が名前から機能を推定するのが不可能なレベルであることはザラです。例えば行列計算でお馴染みのblasの関数の一つ"sgemv"をsingle精度で計算されるgeneralなmatrixとvectorの積であると初見で理解できる人はいないでしょう。この手のネーミングはコードの長さに厳しい制約があった時代の負の遺産であり、今のコーディング規約的には真似するべきではありません。この他にも、Fortranの規約を守っていないため古いgccでないとコンパイルできない量子計算ライブラリ(**)や、入力ファイル、出力ファイル、中間ファイル(全部で10個以上ある)を全て同じディレクトリに置きたがるディレクトリ汚しなど、負の遺産はデザインやUIにも深く根付いています。即ちFortranは先人から学べば学ぶほどクソコードが再生産されるという悲劇的な仕様を持っているのです。


*自身の経験に加え https://www.quora.com/How-much-time-does-a-programmer-spend-on-debugging などを参考にしています。より統計的なデータがあったら教えてください。

** Quantum EspressoかWannier90のどちらかだと記憶しています。どちらだったかは覚えていません。そして再現実験はやりたくないです許してください。


【2.計算が早い言語としての価値が急激に失われている】

Fortranの第二の長所として計算が高速であることが挙げられます。Fortranは用途を狭くする代わりにコンパイラの最適化が行いやすく、他言語で書かれたエンジンに比べ高速で動作することが多いのです。しかし、計算が早いことのメリットは年々小さくなってきています。

高速化の究極的なメリットは時間の節約です。しかし、計算機の普及と計算手段の増加に伴い、計算そのものの高速さは急激に重要度を失っています。クラウドを使えば計算時間をお金で買うことができますが、コーディングそのものはお金で高速化することは出来ません。前世紀と違い、今は人間の時間のほうがコンピュータの時間よりも遥かに高額です。それ故、計算機言語にも学習がしやすく、再利用できる先人の財産が多いといったユーザフレンドリーさが求められています。コミュニティが小さく、学習環境が劣悪なFortranはこの観点においてライバル候補に比べ遥かに劣っています。

また、昨今の計算のニーズの多様化に伴い、高速化の手法にも多様化の波が訪れています。GPUやTPUの躍進に加え、将来的には量子アニーリングマシンが出てくるかも知れません。Rustのように堅牢性と速度を両立した言語も生まれつつあります。幸い、FortranはまだCUDAのサポートは受けられているようですが、早いといえばFortranと言われる時代は何時終わってもおかしくありません。


【3.Fortranのライブラリを拡張するのにFortranの知識は必要ない】

私自身は量子物理系の数値計算屋としてFortranのライブラリを解析/拡張したことがあります。先人のライブラリの流用はFortranの利用が正当化される数少ないケースです。しかし、Fortranで書かれた100のプロダクトを101にする上でFortranの知識は重要な要素にはなりません。

というのも、先人のライブラリを拡張する上で一番時間がかかるのはコードを書くことではなく、ライブラリの意図を理解することだからです。そして、先人のコードを読む上で重要なのはFortranの知識ではなく、ライブラリの実装が糞であるか否かに依存した運の良さと、クソコードの設計思想を脳内でエミュレートしてコードの意味を忖度する勘の良さだからです。

C++erがFortranのコードを読む上で理解しなければいけない文法はそう多くありません。モジュールの読み込みのルールと、配列のdimensionが可変であることあたりを理解していれば大体読むことが出来ます。コードを書くとなると配列が1スタートであるとか、多次元配列のアクセス順序がC++と異なるとかを覚える(そして苛つく)必要がありますが、コードを読む作業に比べれば誤差みたいなものです。

できるだけ既存ライブラリを書き換えない形で拡張が出来ないかを考え、無理だったら祈りながらコードを読み、書くべきコードが理解できたら検索とコピペを繰り返して実装するぐらいがFortranとの適切(かつ、合理的な)付き合い方だとおもいます。


【4.最後に】

私はFortranを激しく嫌っていますが、Fortranが生み出した様々なプロダクトの恩恵を享受してもいます。素晴らしいプロダクトを生み出してくれた先人たちには感謝しているし、尊敬もしています。ただその一方で、計算機系の研究室に入ったからFortranでプログラミングを勉強するという行為は絶対に避けるべき愚行であると考えていますし、乳歯が生え変わるようにFortranはその役割を次の言語に託し滅びるべき時代に入ったと思っています。

億万長者になった暁にはFortran製のライブラリを滅ぼしてくれる計算系研究者に科研費をばらまくのでその時はよろしくお願いします。いや、それまでに滅んでいてくれFortran

レート4390ぐらい(今のSOTA+20-30)の評価関数orqha1018を公開します

将棋ソフトのレーティングサイト基準で、最強格と言われる評価関数に55%〜60%程度勝ち越せる評価関数orqha1018を公開します。

 

ダウンロードは此方のページからお願いします。

https://www.qhapaq.org/shogi/kifdb/

 

【使い方】

使い方は下記サイトを参考にすると良いでしょう。

migigyoku.com

【主な測定結果】

レーティングはこちら

illqha3(今のSOTA)に対して 278-232

QQR(KPPTのSOTA) に対して 228-96

 

【以下、ポエム】

orqhaはillqha1からの追加学習で作られています。WCSC29のルール的にorqha1018を直接用いることは(流用は勿論、追加学習の元としても、教師生成の元としても) 難しいと思われます。大会ルールで解らない点は大会運営にお問い合わせください。

 

【謝辞】

illqhaの開発者のめきっとさん、測定に協力してくださったロタさん、素晴らしいライバルであるたややんさん、NNUEの開発者であるtnkチームの皆さん、やねうら王の開発者やねうらおさん、その他コンピュータ将棋を盛り上げてくれた皆様にお礼申し上げます。楽しんでいただければ幸いです。

コンピュータ将棋のセミナー@東大 で出てきた Q&A 抜粋

コンピュータ将棋セミナー@東大に参加してくださった皆様、ありがとうございました。

www.issp.u-tokyo.ac.jp

備忘録を兼ねて、セミナーで出てきたQ&A(のうち、比較的単体で理解できそうなもの)を書き下していきます。

 

# 質問、回答ともに解説記事向けに内容を編集しています

# 何となく数学ネタを中心に集めましたが、「この質問も加えてちょ」的なコメントをツイッタか何かでいただければ追記します

 

こうしてみてみると、今回の参加者の数学レベル超高いな......

 

Q. NNUEの非線形性はどのように機能しているのでしょうか?

A. 3駒以上からなる重要な特徴量を扱えている可能性が高いと考えています。表現力として過不足がないかを確かめる方法は現在のQhapaqの研究対象の一つです。愚直にやるならback propagationですが、それで十分なのかなど。

 

Q. 探索部の最適なパラメタは評価関数の質に依存するのではないでしょうか?

A. 依存すると思われます。それ故に、探索パラメタの最適化の高速化は重要な課題です。

 

Q. 過学習回避のために行う、特徴量の出現回数を利用したフィルタリングについて、ノイズの大きさの絶対量ではなく、S/N比を指標としているのなぜでしょうか?

A. 3駒関数では学習にAdaGradを使っていて、目標関数の勾配の絶対量が各ステップの特徴量の変位には影響しないからです。即ち、AdaGradを使わないような問題については別の方法(学習率の調整など)で対応する必要があります。

 

Q. 正規化の代わりにフィルタリングを使う理由はなぜでしょうか?

A. 現状の強化学習の関数の多くが正規化を用いておらず(経験的にそのほうが強い)、極端に少ないデータで学習をする際に正規化を行うと本来消してはいけないデータも消えてしまいかねないからです。

 

Q. 評価関数の教師の質の良し悪しを神の評価値と深く読んだ場合の評価値の差の絶対値で現すとして、その関数の形を明確に定義する(一次関数かも知れないし、logかもしれない)のは困難なのではないでしょうか。その条件下でも出現回数によるフィルタリングは機能すると言えるのでしょうか?

A. 関数の形の定義は困難だと思います。故に、神の評価値と深く読んだ評価値の差が平均値0の分布を持っていることを仮定する必要があります(そんなに無理な仮定ではないと思っています)。この仮定を認めれば、中心極限定理を用いることで、ノイズの大きさをガウス分布に焼き直すことができます。

 

Q. 定跡生成のアルゴリズムから量子アニーリング感があんまりしない気がします

A. 確かにそうですね。モデルを構築する際は定跡の固有状態とか、定跡のエネルギーを決めるハミルトニアンとかを定義していたのですが、最終的なアルゴリズムの形は進化アルゴリズムに近く、アルゴリズムの頑強性を量子アニーリングのアナロジーで確認しているという方が正しいかも知れません。

 

Q. AlphaZeroの論文と比べ、生成された定跡の手が広い気がしますが、学習の長さやランダム項の大きさの違いなどが原因でしょうか?

A. 将棋は囲碁に比べると定跡空間が狭く、相手と定跡が被るリスクが高いです。故に、AlphaZeroのような比較的一般的な戦型は相手にも対策されている可能性があります。大会では相手によって定跡を切り替えることが許されているので定跡の手は広く確保しておくのが大会戦略として実戦的なのです。

 

Q. 持ち時間制御について、序盤中盤終盤の割り振りの他に各手の複雑さに起因した割り振りも必要なのではないでしょうか?

A. その通りです。現在の将棋ソフトの時間の割り振りは、1.残り時間から消費時間の指標値を決める 2.消費時間の指標値から、読み筋のブレの許容値(消費時間の指標値に反比例)を決める 3.探索の過程の中で手のブレ幅モニタし、2の許容値を下回ったら探索を終える という作りになっています。ブレ幅の定義や導出は割愛しますが、消費時間の指標値を一定にすることで、局面の複雑さが変化するような場合でも、各手の消費時間の増加に対する勝率の上昇値は一定にすることが出来ます。

 

Q. 数理を用いてゲームAIに進出する上で問題の難易度を見積もるにはどんな指標がありますか?

A. 合法手の多さ、局面を表現する要素の多さ、エミュレータの作成の難しさが指標になると思います。

東大(柏キャンパス)でコンピュータ将棋のセミナーをやります

【注意】場所が変更になりました

場所 : 東大柏キャンパス物性研究所本館6階 第5セミナー室 (A615)→ 物性研究所本館6階 大講義室(A632)
※:同じフロアの大きい部屋になりました
 

 

嘗て物理を学んだ柏キャンパスに凱旋できるとは感慨深い......

www.issp.u-tokyo.ac.jp 

日程 : 2019年1月28日(月) 16:00 - 17:00
場所 : 物性研究所本館6階 大講義室(A632) (同じフロアの広い部屋に変更になりました)
注:柏キャンパスです。千葉です。駅から遠いです。徒歩だと20分位掛かります
注:誰でも参加できます。よろしやす
 
【講義の内容】
コンピュータ将棋の数理をお題にゲームAI開発に殴り込む方法を紹介したいと思います。数学レベル的には大学生〜大学院生を主な対象としています。
 
昨今のAlphaZeroなどの躍進で、機械学習強化学習を知っている人が増えている一方で、問題への優れた知見(例えば将棋の有段者であるとか)を持つ人や、高度な数学を使いこなせる人がAI開発に乗り込むのには未だ大きな課題が残っています。
 
私が特に足りていないと感じているのは、AI開発における水面下の戦いに関する情報です。水面下の戦いは悪く言えばマニアックですが、マニアックだからこそ、多様な人材が多様なスキルを駆使して殴り込む余地があるとも言えます。
 
そこで本公演ではQhapaqがこれまで水面下で使ってきた小技を中心に、コンピュータ将棋に潜む豊かな技術課題を紹介していきたいと思います。
 
 
【スライドのサンプル】
# 既に60ページぐらい創っていますが現在未だ改良中です
 

長文を3行ぐらいで纏めてくれるエンジン IMAKITAを作ってみました

まさかのGigazineデビューをしました。ありがとうございます。現在、鯖の具合がやや悪く503が出るようです。フォームの再投稿で大半は解決しますが、恒久的に動かないなどありましたらご連絡ください。ご不便をお掛けします。

gigazine.net

 

唐突ですが皆様は偉い人の長話に苛々したことはないでしょうか。言いたいことは短いのに枝葉をつけた長文を送られるのにウンザリしたことはないでしょうか。

 

そんな皆様の声(?)を受けて、長文を3行ぐらいで纏めてくれる(厳密には、文章全体の中で特に重要度の高い文を抽出してくれる)エンジン IMAKITAを作ってみました。

https://www.qhapaq.org/imakita/

 

使い方:

・テキストボックスに文章を入れる(日本語は「。」/「!」/「?」、中国語は「。」区切り、英語、スペイン語、ドイツ語、フランス語、ポルトガル語、イタリア語は「.」区切り。日本語のみ改行も区切る機能を試験的に導入中)

・Squeezeボタンを押す

・結果を楽しむ

 

使用上の注意:

・無保証です

・文章が長すぎると落ちます(nginxの仕様と思われる)

・稀にpythonが文字列の処理をしくじるようです

・日本語、英語以外の言語は動作チェック以上のことをしていないので酷い挙動をしているかも知れません

# 何らかの動作不良を起こした方、ご報告いただけると幸いです

 

【使い方の一例】

キング牧師の演説を5行に要約すると

・しかし100年を経た今日、黒人は依然として自由ではない。
・今日、私には夢がある。
・この信念があれば、われわれ は、いつの日か自由になると信じて、共に働き、共に祈り、共に闘い、共に牢獄に入り、共に自由のために立ち上がることができるだろう。
・自由の鐘を鳴り響かせよう。
・われわれはつい に自由になったのだ!」。

 

になります。英語原文だと

 

・But one hundred years later, the Negro still is not free.
・And they have come to realize that their freedom is inextricably bound to our freedom.
・It is a dream deeply rooted in the American dream.
・Let freedom ring from every hill and molehill of Mississippi.
・From every mountainside, let freedom ring.

 

となります。論文、演説、ニュースあたりが得意なようです。逆に[1]のような記号が入ってしまうwikiや小説の類はあまり得意ではないようです。

 

上手く行った一例を挙げるとDeepMind社が出したAlphaZeroの論文

 

We apply AlphaZero to the games of chess and shogi as well as Go, using the same algorithm and network architecture for all three games.
In chess, AlphaZero first outperformed Stockfish after just 4 hours (300,000 steps); in shogi, AlphaZero first outperformed Elmo after 2 hours (110,000 steps); and in Go, AlphaZero first outperformed AlphaGo Lee (9) after 30 hours (74,000 steps).
In Go, AlphaZero defeated AlphaGo Zero (9), winning 61% of games.
In chess, AlphaZero defeated Stockfish, winning 155 games and losing 6 games out of 1,000 (Fig.
In shogi, AlphaZero defeated Elmo, winning 98.

 

と要約してくれます。

 

アルゴリズムについて】

AI屋の受けが意外と良かったのを受けて、現在論文執筆中です。ご意見、アドバイス、質問などお気軽にお願いします。

AlphaZeroに投了宣言しないといけないかも知れない

AlphaZeroの論文が出てきました。arxivに出してた論文はイケてなかったですが今回のはイケてます。

 

前回の論文に対しては今の御時世でWCSC27のelmoに勝ったぐらいで convincingly defeated a world champion program とか言わないでよとか、投了の基準が900点なの意味がわからんとか、定跡はどうしたのかとか、棋譜がないのはどういうことかとか散々な評価をした記憶があります。

 

が、なんと今回は棋譜があります。しかも羽生竜王棋譜コメを貰ったようです。棋譜の公開に伴い、戦型の分布も明らかになりました。Zero言いながらちゃんと居飛車を指します。WCSC28でCrazyShogiも矢倉組んでたので驚くほどではないかも知れません。

 

そして、棋譜の公開と同じくらいイケてるのがaperypaq(Apery-Qhapaq関数、略してaperypaq。2017年末から2018年頭ぐらいにかけてsotaだった)を相手にも対局をしていることです。というのも、AlphaZeroとやねうら王+KPPTとでは探索も評価も異質であるため、AlphaZeroとやねうら王系列のレートを同じ土俵で扱って良いのか解らなかったからです。

 

QRLのレーティングではelmoとaperypaqのレート差は170程度、AlphaZeroとelmoのレート差が(勝率91%、400ちょい。なおelmoもaperypaqも探索部のバージョンが4.79にあがっている)なので、AlphaZeroとaperypaqのレート差は230程度となり、AlphaZeroの勝率は80%程度と予想されます。aperypaqを相手にした勝率は図でしか与えられていませんが

 

f:id:qhapaq:20181207215404p:plain

 

こんな感じになっており、図の長さから測定すると約88%(勝率から換算されるレートはaperypaq+340)程度の勝率であると推測できます。測定誤差の範囲かもしれませんが、KPPT同士の対局で強くなってもAlphaZeroに対する勝率があまり上がらないことが示唆されています。

 

個人的にそれに輪をかけてきな臭いのが先手の圧倒的な勝率の高さです。今のコンピュータ将棋が先手ゲーであることは間違いないですが、先後のレート差は精々50程度(先手6割行かないかなぐらい)です。しかし、AlphaZeroの先手は後手に比べてレートに換算して100程度の上昇を果たしています。未だ我々が知らないだけで将棋は想像以上に先手ゲーなのかも知れません。AlphaZero同士の対局での先手勝率が知りたい!!

 

さて、こうなるとorqhaやnnuekai7がelmoに対して90%前後の勝率を出していたとしても、AlphaZeroにはすり潰されてしまう危険があります。後手番なんて特に危ないでしょう。

 

が、このまま引き下がるのも悔しいので手元に潜ませているもっと強いorqha(レートnnuekai7+40ぐらい)の棋譜を公開します(ロタさんありがとう!)。orqhaでもelmoに9割は勝ちます。しかもTPUを買わなくてもサクサク動く。凄い!

 

CPUとTPUの差とか電気代とか学習コストとかを考えるとAlphaZeroの convincingly defeated a world champion program はある程度は話を盛っている気がしますが、前回の論文と違って今回の論文を読んだ感じ、予算度外視で戦えばAlphaZeroが勝つだろうと言わざるを得ません(前の論文の時はそこまで強そうじゃなかったんですが)。即ち相手としてAlphaZeroは追わねばならない存在なのだなと感じました。お見事。

 

【余談】

視力の良い人なら気付くかもしれませんが、前回の論文ではelmoがElmoとtypoされていましたが、今回の論文でもaperyqhapaqがaperyphapaqとtypoされています。あとelmoもElmoのままです。AlqhaZEroェ......

 

これを機にコム将棋海外勢が増えたら良いなと思い、将棋ソフト導入wikiを創ってみました。良ければ編集よろ

コンピュータ将棋wiki強化月間開始のお知らせ

平素よりQhapaq Research Labをご愛顧いただきありがとうございます。

 

コンピュータ将棋の情報を纏めるべく運用を開始したwikiですが、現状記事が集まらなくて苦慮している状態です。

 

特に大きな問題となっているのは、各ソフトの基本情報が纏めきれていないことです。より具体的には、各ソフトが何処でダウンロードできるかや、各ソフトの歴代成績、アピール文のリンクが足りていません。

 

コレがあるだけでも大分、情報量が変わってくる(そして、将棋ソフトに興味を持ってくれた人の役に立つ)と考えています。ソフトの解説を書こうとすると難しくて手が止まってしまう(かくいう私もだ)かもしれませんが、情報を纏めるでよければ敷居は大分下がるでしょう。

 

そこで、コンピュータ将棋wikiの強化月間と称し、10月30日までに将棋ソフトの情報を書き入れてくれた人にamazonギフト券によるギャラを支払うことにしました!

 

【注意】

amazonギフトのメール形式以外での支払は対応していません

・大会出場ソフトではないソフトについてはギャラ支払の対象外です

・最初に必要なリンクを全て揃えた人にのみギャラが支払われます。書くなら一度に書きましょう

wikiのコンフリクトは保証の対象外です。お許しください

・1ソフトに付き200円のギャラが出ます

・既に必要なリンクが揃っているソフトも対象外です

・纏めて支払を行いたいため支払が遅れる可能性があります

 

【記事の書き方】

例:Ponanzaについて書くとこんな感じになります

・コンピュータ将棋wiki上でユーザを作ってください

・コンピュータ将棋wikiのアカウントにギャラ支払用のメールアドレスを登録してください

・開発者の名前、大会成績、開発者webページヘのリンク、アピール文章へのリンクを将棋wiki上に書いてください

・開発者のwebページは代表開発者(開発者名の一番最初に書かれてる人)だけでokです。

・大会成績、アピール文は直近の6大会分まででokです(6回以上参加してないソフトについては全部書いてください)

・将棋ソフト一覧の後ろにある*印を除去してください

・記事を執筆した旨を管理者のメールアドレス

f:id:qhapaq:20180424225620p:plain

までご連絡ください(私自身もwikiの履歴は見ますが、見落とす可能性も高いので申告していただいたほうが確実です)

 

【その他】

・既に記事を書いてくれた方

生まれたばかりの胡散臭いwikiの執筆に時間を費やしてくれた方々にこそ一番感謝をするべき、ということで、遡ってのギャラの支払をする予定です。ギャラの額は記事によって変わる予定ですが、兎に角支払います。履歴を遡るのが困難であるため、やはり連絡頂けると助かります。

 

・解説文章

解説文にもギャラが出るかも知れません。ただし時価です。ハイテク株依存ですし、額も保証できません。申し訳ないです。

 

・なんでこんな企画をやるのか

理由1:wikiを触るという経験を皆様にしてもらいたいから

理由2:技術書典の泡銭を使いたいから

理由3:ソフトの紹介文を書きたいけど、ソフトの情報(アピール文とか大会成績とか)を調べるのが面倒だという人(私含む)が少なからず居ると思うから