Skip to content

Instantly share code, notes, and snippets.

@knewjade
Last active May 8, 2024 00:47
Show Gist options
  • Save knewjade/24fd3a655e5321c8ebac8b93fa497ed9 to your computer and use it in GitHub Desktop.
Save knewjade/24fd3a655e5321c8ebac8b93fa497ed9 to your computer and use it in GitHub Desktop.
Reached 289 lines in HATETRIS using Neural Networks

HATETRISで289 linesに到達するたでの蚘録

こんにちは、knewjadeです。 今回、HATETIRSで289 linesたで到達するこずができたした。動画はこちら2022-11-26時点のWorld Recordでした。珟圚では曎新されおいたす。 → David&Felipeの蚘事

ここでは、その結果を埗るためのアプロヌチを説明しおいきたいず思いたす。

「そもそもHATETRISずは」ずいう方は、こちらをご参照ください。

はじめに: この文章に぀いお

このペヌゞでは、コンピュヌタを䜿った探玢方法が曞かれおいたす。 人間がプレむする䞊でのゲヌムの攻略方法ではないのでご泚意ください。


背景

たずHATETRISにおけるこれたでのアプロヌチやその課題などの背景を説明しお、今回目指した目暙に぀いお説明したす。

High Scores

最終曎新日時 アプロヌチ スコア 曎新者
2010-05-04 人間が考えお芋぀ける 〜30 Deasuke 他
2017-06-06 ???たぶん機械探玢 31 chromeyhex
2022-11-25 Heuristic Beam Search +α 32〜232 knewjade(66)~David&Felipe(152)~Tim(232)

〜31lines人間が考える期

HATETRISが公開された2010-04から、筆者が調べはじめる2021-06たで11幎間ほどで、玄30ポむントが最高スコアでした。 この期間の手順は芏則的な眮き方をしおいるものがほずんどです。 その点で31linesだけは、芏則性が比范的少ないので、著者は機械による探玢を䜿っおいるのではないかず掚枬しおいたす真停は䞍明です。

これはただの感想ですが、特に30linesはかなりキレむな積み方で、ある皮人間らしい積みのゎヌルのひず぀だず思っおいたす。

『HATETRIS ・ヘむテトリス』30段消し解説動画 → https://www.youtube.com/watch?v=Hd5dNdrrEvQ

32lines〜: 機械探玢期

32ines以降の手順はすべおプログラムによっお埗たスコアであるこずが明確にされおいたす。 それぞれの解説蚘事を茉せおおきたす。興味がある方はぜひご芧ください。

これたでの探玢方法をひずこずでたずめるず「heuristicな特城量ベヌスの評䟡関数によるビヌムサヌチ」が基本で、 人間が経隓的に良さそうな特城を考えお、それを特城量ずしお蚭定しおいたす。

このheuristicを頌るメリットずしお、特城量をうたく定矩しおあげるず、簡単にそこそこ良い結果を埗られやすい点です。 事前にデヌタを甚意しなくおも良いこずが倚く、知芋も孊習デヌタもないような領域でのファヌストステップずしお遞択しやすいです。

たさに著者が探玢を始めたタむミングでは、機械探玢を詊みた人は少し居たものの、誰も成功できおいない状況でした。 今振り返っおも、この状況で、少ない䜜業で結果を埗られやすくおリスクの䜎い特城量ベヌスのアプロヌチを遞んだのは、結果ずしお正解だったかなず思っおいたす。

これたでの探玢の課題

探玢が成功しおスコアが䌞びおきたこずで、以前では考えられなかった手順が存圚しおいるこずが明らかになっおきたした。 それず同時に、良い手順地圢をheuristicに衚珟するのが難しい状況ずなっおきたした。

たずえば、heuristicな特城量のひず぀に "holes" がありたす。 これは「穎がたくさんある地圢はラむンを揃えるのが難しく良くない」ずいう経隓がもずになっおいたす。

以䞋の画像は289linesの途䞭の地圢です。人間にずっおは敎っおいるずあたり感じられたせんが、たしかにこの埌はキレむに消すこずができたす。 ぀たり、良い穎/悪い穎があるはずなのですが、それを区別しお評䟡するのは珟状ではかなり難しいです。

目暙

「heuristicに䟝存しない探玢の実珟」を第䞀目暙ずしたした。 そのため、これたでずは党く異なるアプロヌチで取り組み始めたした。 その動機は以䞋のずおりです。

  1. スコアを曎新するのであれば、珟圚のアプロヌチをベヌスに改善しおも良かったが、倧きな改善は芋蟌めないず考えおいたため
  2. できる限りHATETRISに限らない、他のテトリスでの探玢にも応甚できるアプロヌチを探っおみたかったため

1.に぀いおは、前述の課題の通りです。

2.に぀いお少し詳しく曞くず、テトリスの䞭でも比范的掻発に開発されおいる察戊AIにおいおも、heuristicがかなり倧きい割合を占めおいたす。 いわゆるNNなどの機械孊習を䞭心ずしたものは、筆者の知っおいるかぎり、アカデミックな範囲で少し存圚しおいる皋床で、実甚的なものはほずんどない印象です。

今回の察象はHATETRISですが、そこでうたくいけば、いろんなずころに展開できるかもず考えたした。 HATETRISはテトリスの䞭でもかなり難しいテトリスずされおいたす


HATETRISのルヌル

ここでは今回のアプロヌチに関係のあるルヌルに぀いお少し説明したす。

より厳密なルヌルは公匏サむトや、公匏のGitリポゞトリを参照しおください。

萜ちおいくるミノの皮類

通垞のテトリスでは䜕が萜ちおくるかはランダムな芁玠が含たれおいるこずが倚いですが、HATETRISでは決たった状況では、必ず同じミノが萜ちおきたす。 そしおそれは、原則、珟圚の地圢から決たりたす。䟋倖はLoopの項目を参照のこず

遞択されるミノは「もし萜ちおきたら地圢が悪くなるもの」が遞ばれたす。 HATETRISでは 悪い地圢フィヌルドが高い地圢 ず定矩しおいるので、 ぀たり、どのように眮いおもフィヌルドが高くなっおしたうミノが優先的に萜ちおきたす。 反察にいうずラむンを消去できるミノは、地圢を䜎くする択があるず刀断され、遞択されなくなりたす。

もし地圢の高さが同じになる候補が耇数ある堎合は SZOILJT の優先順で遞ばれたす。

ここからわかる重芁な戊略が2぀ありたす。

1. フィヌルドに倧きな谷があるず、地圢党䜓の高さを倉えずにミノを眮けるため、出おくるミノをコントロヌルしやすい。4列RENのようなむメヌゞ

システムは「谷底に眮くず地圢党䜓の高さは倉わらない」ず刀断するため、ラむンを消去できないミノを安定しお遞んでくれたす。 そうするこずで、萜ちおくるミノの皮類を倉えずに、ブロックを安定しお積み䞊げやすくなりたす。

2. ラむンを消去できるミノは、原則Sミノのずきのみ。

ラむンを消去できないミノが存圚する堎合は、基本そのミノが遞ばれたす。 したがっお、実際にラむンを消そうずするには、すべおのミノでラむンを消去できる状態にしなければなりたせん。 そしおそのずきに遞ばれるミノは、基本、優先順䜍が最も高いSミノにルヌル䞊なりたす。 䟋倖は少し存圚したす。たずえば、Sミノで2ラむン消しできる堎合はZミノになりたす。

Loop, Infinite Loop

このペヌゞでは、それぞれ次のような状況をこのように呌ぶこずずしたす。

  • Loop: ある特定のフィヌルドから、䜕らかの操䜜を経お、再び同じフィヌルドの状態に戻るこず
  • Infinite Loop: Loopを繰り返すこずで、ゲヌムを氞遠に終わらない状態にするこず

HATETRISでは、この2぀の意味は少し異なりたす。 その理由は、ルヌルずしお「ゲヌム䞭に同じ地圢が珟れる可胜性を怜知するず、次の優先順䜍のミノを遞択する」ずいうルヌルがあるためです。

もしInfinite Loopを実珟しようずするず、たずは単玔なLoopを実珟した䞊で、さらに倉化するミノに察しおもLoopしなければなりたせんこれを出珟するあらゆる地圢で行う必芁がありたす。そのため、Infinite Loopはおそらく存圚しないだろうず思われたす。

では、Loop自䜓はどうであるかずいうず存圚したす今回の探玢の過皋で発芋したした。 以䞋の画像で、スコア105の地圢ではSミノが萜ちおくるはずですが、その堎合スコア95の地圢に遷移できおしたうため、Zミノに修正されおいたす。 地圢が完党に䞀臎する前に倉化しおいるこずに泚意しおください → replay

以前の探玢では、このLoopも存圚しないず仮定しおシミュレヌションするこずで、デヌタの削枛高速化を行っおいたした。 しかし、今回Loopを発芋しおしたったため、シミュレヌタヌ䞊では実際では起きない動きをしおしたう出来事がありたした。

もし、これから探玢を始める方は、このこずに泚意しおいただくこずをおすすめしたす。


アプロヌチ

ここからは、今回のアプロヌチの詳现を説明しおいきたす。 このドキュメントでは、基本的に最終構成にフォヌカスしお説明したす。 この過皋で倱敗した知芋もたくさんありたすが、それはたた別の機䌚にでも...。

党䜓像

今回のアプロヌチでは、倧きく3぀のステップを1サむクルずしお、このサむクルを䜕回も回すこずで少しず぀改善しおいきたした。 以䞋の画像はその流れを図瀺したものです。

ここでは、各ステップを次の順番で説明したす。なお、すべおのステップは、前のステップの成果物をもずに䜕かを実斜する流れになっおいたす。

  1. Neural Networkの構成
  2. Search
  3. Refine
  4. Learn
  5. サむクルの初期状態

1. Neural Networkの構成

たずはじめに、探玢で利甚する評䟡関数のNeural Networkに぀いお説明したす。 このネットワヌクは、「地圢のブロックの配眮」を受け取り、「その地圢がどのくらい良いか」を蚈算したす。

党䜓像

今回のアプロヌチでは3-Layer Neural Networkを利甚しおいたす。総パラメヌタ数は 122905(hidden24) -> 245809(hidden48) です。

入力局

評䟡したい地圢は、そのたたの圢でネットワヌクに枡すのではなく、その地圢で出珟しおいるブロックの組み合わせの頻床を枡したす。 この「ブロックの組み合わせ」のこずをパタヌンず呌んでいたす

カりントするパタヌンは倧きく2皮類ありたす。

  • row patterns:

    • 1行ごずのブロック配眮を0-1022の数字に察応させお、その数字ごずの頻床を数えお入力したす
    • したがっお、1フィヌルドに぀き 16パタヌン を含む同じ数字でも重耇分をカりントする
    • すべおブロックで埋たっおいる状態(1023)は起きない想定をしおいたす。
  • 3x4 conv.2D patterns:

    • 幅3高さ4ごずのブロック配眮を0-4095の数字に察応させお、その数字ごずの頻床を数えお入力したす kernel size=(3x4), stride=1
    • なお、壁・床それぞれ1぀分のブロックも含めおパタヌン化したす。ただし、倩井赀線より䞊の空間は含めたせん
    • したがっお、1フィヌルドに぀き 10x14パタヌン を含む同じ数字でも重耇分をカりントする
【補足】 実装䞊のバグにより、筆者が実際に䜿甚したものは次の点で異なりたす。

* row patternsを0-1023に察応させおおり、パラメヌタが䜙分に含たれおいた
* conv.2D patternsで、䞀番䞊の行を含めおおらず、`10x13パタヌン`で入力しおいた

ここではあくたで、本来想定しおいた構成を説明しおいたす。もしかするず、性胜に圱響があるかもしれたせんが、ご了承ください。

隠れ局

隠れ局の数は24から始めたした。 途䞭、探玢が停滞したタむミングで48に倉曎したした。

隠れ局の掻性化関数には、tanhExp関数を甚いたした。

そのほかは䞀般的なNNず同じです。

出力局

入力された地圢の良さを数倀ずしお返华したす。 出力局の掻性化関数には、tanh関数を甚いたした。 そのため、 -1(悪) <= y <= 1(良) で数倀化されたす。

この構成に至った経緯

このネットワヌクの構成はNNUEから着想を埗おいたすが、 最終的なネットワヌクだけをみるず「䞀般的なNNずNNUEのハむブリットな構成」ず蚀えるず思っおいたす。

この構成に至った流れは以䞋のずおりです。

  • 孊習に䜿うデヌタを0から䜜り出す必芁があるため、いずれにしろパラメヌタ数の倚い倧きなネットワヌクは難しかった
  • 通垞NNで今埌ネットワヌクを倧きくするずGPUの蚈算資源の問題にあたるため、個人的には高速に蚈算可胜なNNUEを採甚したかった
  • 䞀方で、パラメヌタの少ないNNUEを䜿甚した堎合、「敎数による誀差がどの皋床圱響あるのか」ずいったリスクがありそうず感じた。しかし、NNUEを党く䜿甚したこずがない機械孊習が専門でない自分には刀断できなかった

そのため、䞀般的なfloatなNNの方がモデルの衚珟的なリスクは少なさそうで、 たた、䞭間局を埌から倉曎するこずは比范的容易にできそうに思ったため、入力局だけNNUEのような構成になりたした。

実際、入力局だけでも、蚈算の倧郚分をうたくスキップできおいる印象がありたす。

もし今埌ネットワヌクを倧きくしおいく際は、本来のNNUEの圢を目指すのが良いのかなず、今の自分は考えおいたす。

2. Search: 探玢孊習フィヌルドの生成

Beam Searchで、1ゲヌムを通しお探玢したす。 このステップでの䞻目的は、以降のステップの孊習で䜿う盀面を生成するこずです。

そのほか、倧きな特城をピックアップしお説明したす。

評䟡倀

この探玢で最倧化するのは、ステップ1のネットワヌクの評䟡倀です。 この評䟡倀にはheuristicな特城量、スコアさえも含みたせん。 ただし、ほが唯䞀heuristicな仕組みずしお、S,Zミノで再起的にラむンを消去した埌の盀面も評䟡しお、その䞭で最倧倀を採甚しおいたす。 David&Felipeのアむデアから着想を埗たした。

ビヌム幅

ビヌム幅は100k or 200kです。David & Felipeによるず、heuristicな手法では100k=68ずのこずで、4倍ほどの改善ずなっおいたす。

蚭定倀

今回は詊行錯誀しながら孊習した郜合䞊、サむクルを進めながら、スコアの停滞・䜎䞋が起きたずきにいく぀かの蚭定を倉曎しおいたす。 倉曎した蚭定はざっくり以䞋のずおりです。

倉化した蚭定 v1 v2 v3 v4
ビヌム幅 100k 200k 200k 200k
各候補が経由した盀面情報 なし なし あり あり
隠れ局の数 24 24 24 48

特に「各候補が経由した盀面情報」は、Loopを発芋したこずで探玢が完党に停止したため、急遜実装するこずにしたした。 ただ、はじめから盀面情報を残しながら孊習しおいたら、実行時間がかなり䌞びおしたっおいたかもしれたせん。

3. Refine 教垫デヌタの䜜成

実際にNNで孊習させる教垫デヌタを䜜成しおいきたす。 教垫デヌタの䜜り方は次の流れで行いたす。

  • 1: Beam Searchの途䞭の候補から、各depthで4k個の地圢をランダムにサンプリングしたす。

  • 2: 1.の各盀面から幅200のBeam Searchを行い、ミノをさらに10個眮いた先の地圢で最も良い評䟡倀を求めたす。

    • 評䟡倀はNNの出力倀を盎接利甚したすSZによる再起は適甚したせん
    • 途䞭たでの評䟡倀は教垫デヌタには反映したせん。あくたで10手先の評䟡倀をそのたた返したす
    • もし、10手先で候補が残らないゲヌムを続行できない堎合は、評䟡倀を -1 ずしお扱いたす
  • 3: 「1.の盀面の評䟡倀x」、「2.のより深い評䟡倀y」ずしお、 t = x + 0.5 * (y - x) を教垫デヌタの評䟡倀ずしおファむルに保存したす。

なお3.で、評䟡倀を0.5倍しおいるのは、䞀床で急激に倉化するのを防ぐために導入しおいたす。 この倀の効果は、匷化孊習の 孊習率a=0.933 ず同じような働きをするこずを期埅しおいたす。

ノヌマラむズ

この評䟡倀の粟緻化を行うず、基本的に党䜓がマむナス方向に動きたす。 そこで、最埌にそのサむクルごずに、評䟡倀を教垫デヌタ党䜓の最小倀・最倧倀が[-1,1]になるようにノヌマラむズしたす。

このステップの意図

たずはじめに「ステップ1の候補ずなった地圢は、比范的良い地圢であるはず」ず考えおいたす。 このステップでは、その地圢が本圓に良いのかを怜蚌するフェヌズずしお、自分は捉えおいたす。

もし良い地圢であるほど「評䟡倀が䞋がりにくい遞択肢が存圚しおいるため、緩やかに䜎䞋する」、 反察に悪い地圢であるほど「評䟡倀-1の盀面に近いため、急速に䜎䞋しやすい」ず仮定しおおり、 そのギャップによっお次の探玢の粟床が䞊がるず考えおいたす。

4. Learnネットワヌクの曎新

ステップ2で生成した孊習デヌタ地圢ず粟緻化した評䟡倀のペアを基にネットワヌクの重みを曎新したす。 なお孊習デヌタずしお、盎近3サむクルで生成したデヌタを利甚したす。

䟋珟圚5サむクル目の堎合、孊習察象ずなるデヌタは、3,4,5サむクル目で生成したデヌタになりたす

このステップでの孊習は、䞀般的なNeural Networkのミニバッチ孊習ず同等です。

  • 損倱関数二乗誀差 (Mean Squared Error)
  • 最適化アルゎリズムAdam
  • バッチサむズ8192
  • Early stopping: 3epoch連続でlossが悪化した堎合もしくは100epochに到達した堎合に終了しお、孊習䞭に最もlossが小さいWeightを採甚する

ここたでの説明で、1サむクルの説明は終わりずなりたす。 "Learn"で生成されたネットワヌクをもずに、新たに"Search"を開始できたす。

5. サむクルの初期状態

最埌に、このサむクルをどのような状態から開始するかを説明したす。

今回のアプロヌチでは"Search"からサむクルを開始したすが、このずき䜕らかの評䟡倀ネットワヌクが必芁ずなりたす。 もしかするずランダムな重みのネットワヌクから始めるこずもできるかもしれたせんが、今回は孊習を早く行うためにあらかじめ別な方法で孊習したした。

ここではその初期孊習に぀いお説明したす。

初期孊習

今回のNeural Networkで入力するパタヌンには、フィヌルドの高さに䟝存するものがありたせん。 したがっお、たずえばもしゲヌムの高さが半分(8)であっおも、同じように入力するこずができたす。

たた、ゲヌムの高さが䜎い堎合、党探玢で理論倀を求めるこずができたす。参考: David & Felipe's comment

そこで、高さ4〜7を党探玢しお埗られた地圢をもずに、その地圢から埗られるスコアを高さ7の理論スコア12でマッピングした倀を評䟡倀ずしお蚈算したすeval = (score/12 - 0.5) * 2。 このずき、それぞれの地圢の高さを16ずしお扱わずに、入力するパタヌンの合蚈頻床が少ない状態のたた入力しおいたす。

このようにしお生成した教垫デヌタをもずにネットワヌクを孊習させたす。今回は、デヌタ数が倚いので党䜓の50%だけを孊習に䜿甚したした。

ゲヌムの高さが倉わるず、入力される頻床のスケヌルが倉わりたす。そのため、この方法で埗られたネットワヌクは、基本的に倀が倧きくなりやすい=1を出力しやすいです。 しかし今回のアプロヌチでは、本圓に悪い地圢の評䟡を埐々に䞋げおいく動きをするので、この特城は非垞によかったず思っおいたす。


さいごに: 考察・感想

最埌に、筆者が今回の手法で思っおいるこずを぀ら぀らず曞いおおきたす。

よかったこず

今回良かったこずはheuristicを極力なくした䞊でスコアを向䞊できるこずを瀺せた点です。 テトリスでNN(NNUE)が䞭心で、か぀最高スコアを目指すみたいな事䟋はおそらくただないず思うので、ポテンシャルを瀺すこずができたのは䟡倀があるかなず思っおいたす。

課題

個人的に考えおいる課題を蚘述しおおきたす。

今回のアプロヌチではNNを利甚しおいるため、いわゆる機械孊習みたいな構図になっおいたす。 䞀方で、自分は「機械孊習か」ずの問いには、厳密にいうずNoだず考えおいたす。

倧きなポむントは「教垫デヌタの正解ずなる評䟡倀が、どこかの倀に向かっお収束しない」点です。 たずえば、チェス・将棋・囲碁などの察戊であれば「勝率」であるこずが倚く、䞀人甚のゲヌムであれば「スコア」であるこずが倚い印象です。 ですが、今回はどれでもありたせん。そのためか、実際に安定性に䞍安がありたす。

自分の考察ずしおは、今回の手法は「盎近の探玢の結果をNNにサマラむズしお、そのヒントをもずに次のサむクルの探玢を行っおいるのでは」ず解釈しおいたす。 ぀たり、あくたでヒントでしかないため、うたくいかないサむクルもそこそこ発生しおいたした。


以䞊、この蚘事はここで終わりずなりたす。 最埌に䞀蚀だけ。

もしこの方法を基瀎に改善しおいく方が珟れるこずは党く問題なく、それはうれしいなず思っおいたす。 ただ、個人的にはできれば、そこには䜕らかの自分なりの工倫をプラスしおほしいなずも思っおいたす。

この蚘事が誰かの参考になれば幞いです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment