はじめに
天鳳(オンライン麻雀)の牌譜を16年分(2009〜2024年)集めて、「人間の打牌を予測するTransformer」を作りました。作ったモデルの中を覗いたら面白いことがいくつも見つかったので、まとめます。
結果から言うと、人間の打牌との一致率(Top-1)は 77.81% でした。Microsoft Research の麻雀AI Suphx の打牌モデル(論文の Table 3 で 76.7%)を、数字の上では上回っています。
正確には、条件がそろった比較ではありません。Suphx とは学習・評価に使ったデータが違い、「強制ツモ切りを除く」かどうかなど、数え方も違う可能性があります(Suphx 側は論文に明記がありません)。私の値は valid で、強制ツモ切りを除いた約670万局面の値です(全局面だと79.07%)。「同じ土俵で勝った」ではなく、「個人でも同じ水準まで届いた」と読んでください。また、これは人間の打牌との一致率で、麻雀の強さではありません。
この記事は網羅編です。全体を一通り見られるようにして、詳しい話は別記事(詳細編)に分けます。
この記事で書くこと:
- 先に見てほしい図(AIの頭の中の3D)
- 何を作ったか(タスク・入力設計・環境・精度)
- 作る途中でつぶした落とし穴(リークの検査など)
- AIは相手のリーチで「降りる」のか(人間と統計的に比べる)
- 安牌は持つのか
- 麻雀好きに見てほしい、その他の解析(序盤の字牌、赤5、取り違え、一択になる局面など)
- AIの頭の中を覗く(Attention・概念の読み出し)
- 限界と、次にやること
先に、いちばん見てほしい図
学習済みモデルの途中の層(層4)で、34種類の牌がどう並んでいるかを3次元のPCAで描いて回したものです(赤丸=萬子、青四角=筒子、緑三角=索子、紫ひし形=字牌)。
同じ色の中で「1と9」「2と8」「3と7」「4・5・6」が近くに集まっています。 牌の数字の大小ではなく、「端からの距離」が似ている牌を、AIが仲間として扱っているように見えます。字牌も別のかたまりになっています。
麻雀を打つ人なら、1・9は端の牌、2・8は端から1つ内側、4〜6は真ん中で、手牌の中での役割が似ていることは直感的に分かると思います。この対応を、AIは「数字の並び」を教えられていないのに作っていました。
この図は探索的な可視化です(「層4の、手牌にあるときの局面平均」をPCAしたもので、因果の証拠ではありません)。入力直後の埋め込みには、同じ並びは出ていませんでした。
何を作ったか
タスク
「ある局面で、人間は何を切ったか」を当てる教師あり学習です(模倣学習)。37クラス(赤5を区別した牌の種類)から1つ選びます。
- データ: 天鳳の牌譜、2009〜2024年(16年分)
- モデル: 6層・8ヘッド・d_model 256のTransformer(約482万パラメータ)
- 学習: 約122万step(バッチ2048、3エポック)、学習時間は約7.3日
- 最適化: AdamW(学習率3e-4、weight decay 0.01、ウォームアップ2,000step、最後は1e-6まで減衰)、dropout 0.1
使った環境
- CPU: AMD Ryzen 9 7950X3D(16コア32スレッド)
- メモリ: 64GB
- GPU: NVIDIA GeForce RTX 4080 SUPER(16GB)1枚
- OS: Ubuntu 22.04、PyTorch
個人のPC1台です。GPUが空いているときは1stepあたり約0.4秒で、3エポックの学習が約1週間で終わりました。
入力設計: 全部を1本の系列にして見せる
最初のモデルは、手牌・河・ドラなどを1本の大きな特徴ベクトルにまとめて、全結合層(MLP)で混ぜていました。作り直して、入力を1本の系列(トークン列)にして、Transformerに全部を一度に見せる形にしました。
- 局情報: 1トークン(局の状況)
- 牌トークン: 37個。「打牌の候補」そのもので、各トークンに手牌の枚数・見えている枚数・残り枚数・現物・スジなどが乗る
- イベント系列: 局の最初からその判断までの、ドラ表示・自分のツモ・全員の打牌・鳴き・リーチを時系列で並べたもの
出力は、各牌トークンの最終隠れ状態に共通の Linear(256→1) をかけた37個のスコアです。「この牌を切るスコア」が牌ごとに出るので、合法手のマスクもそのままかけられます。
イベント系列には、他家のツモを入れていません(牌が伏せられていて、打牌のツモ切りフラグで情報は足りるため)。判断より後のイベントが入らないことは、テストで確かめています。
最初の設計は、特徴が平らに並んだ表の中から「この値はこの牌のもの」という対応を学ぶ必要があり、うまくいきませんでした。牌ごとに値をトークンに乗せる今の設計(v3)に変えると、同じ条件(2023年のデータ、1エポック、6層)で、人間の打牌との一致率(Top-1)が 68.9% から 77.1%(+8.2ポイント) に上がりました。この実験でいちばん効いた変更です。
理由を調べるために、v3 の学習済みモデルの入力を1種類ずつ壊して(バッチ内で入れ替えて)、Top-1の落ち方を見ました。
| 壊した入力 | Top-1の低下 |
|---|---|
| 見えている枚数 | −35.1pt |
| 残り枚数 | −40.9pt |
| 手牌枚数 | −24.6pt |
| 他家の現物 | −3.6pt |
| ドラ値 | −1.8pt |
| 他家の河・手出し・副露 | いずれも−0.1pt以内 |
v3 は、牌ごとの「見えている枚数」「残り枚数」を強く使っています。最初の設計では、同じ枚数の入力を壊しても低下は7〜10ポイントしかなく、牌と特徴の対応をうまく学べていなかったようです。+8ポイントの主な出どころは、これだと考えています(比較の詳細は詳細①)。
派生特徴(牌効率やシャンテン数など、人間が計算した特徴)を追加しても、差は0.1ポイント未満でした(seed 1本)。入力に枚数や河や現物が入っていれば、モデルが自分で導けているようです。
精度
| 指標(検証データ、強制ツモ切りを除く) | 値 |
|---|---|
| Top-1 一致率 | 77.81% |
| Top-3 一致率 | 97.65% |
| 評価局面数 | 6,703,836 |
「強制ツモ切り」(リーチ後など選択の余地がない打牌)を除いた、約670万局面での値です。これは人間の打牌との一致率であって、麻雀の強さそのものではありません。人間が最善とは限らないので、100%を目指す指標でもありません。
検証データ(valid)での値です。モデルの精度評価にテストデータはまだ使っていません(一度見ると選び直せないため、最終確認まで取っておきます)。
作る途中でつぶした落とし穴
+8ポイントは大きいので、最初に疑ったのはリーク(正解が入力から漏れていないか)です。
- 判断より後のイベントを入れ替えても入力が変わらないことを、テストで確認した
- 生成器とは別に、牌譜の再生器を一から書き直して照合した。2023年のvalid全19,343試合・約924万件で、正解・合法手・牌トークンの25チャネルなどにずれは0件
- 「見えている枚数」が打牌を先に数えていないか、副露のない21,938局面で数え直して全件一致を確認した
他にも、前の版で見つかった問題を直しました。
- 鳴いた直後の打牌が抜けていた(ポン・チーの直後の打牌、2023年だけで約373万件、全体の+4.2%)
- 鳴かれた牌を河と副露で二重に数えていた(「見えている枚数」が最大6になる行があった)
- 東風戦と半荘戦が区別されていなかった(2023年の13.2%が東風戦)
- 想定外の牌譜を例外で握りつぶして先に進んでいた
「想定外は黙って通さず、止まる」方針に変えて、生成器を作り直しました。
AIは相手のリーチで降りるのか
ここからは、16年分で学習した強いモデルを使った解析です。模倣学習のモデルが「降り」まで再現しているかを、2024年のvalidの局面(他家のリーチ中、約9,000局面)で調べました。
- 降り=手を崩してまで現物(リーチ者が通った牌)を切ること
- ただの現物切り=要らない牌がたまたま現物だった場合。これは降りと数えない
結果、降りの割合は人間が 15.36%、モデルが 15.48% で、ほぼ一致しました。差は−0.12ポイントでした。
| 他家リーチ中の打牌 | 人間 | モデル |
|---|---|---|
| 押し(現物でなく、手を崩さない) | 30.7% | 30.6% |
| 現物をただで切る(手を崩さない) | 49.1% | 49.1% |
| 降り(手を崩して現物) | 15.4% | 15.5% |
| 手を崩して現物でない牌 | 4.8% | 4.8% |
「押すか降りるか」の選択になる局面(現物を切ると手が崩れる局面)で、現物を切る率はこうなりました。
| 手の進み具合 | 人間 | モデル |
|---|---|---|
| 聴牌 | 17.1% | 18.4% |
| 1向聴 | 48.2% | 48.4% |
| 2向聴 | 72.0% | 71.0% |
| 3向聴 | 86.2% | 83.9% |
手が遠いほど降り、聴牌に近いほど押す、という曲線が人間とそっくりです。
さらに、モデルの「降る確率」は確率として正しいことも確かめました。
- 「モデルが降ると言った確率」ごとに、人間が実際に降った割合を見ると、点が対角線の上に乗る(校正の傾き1.019、理想は1)
- 人間が実際に降った局面を、モデルの降り確率で見分けられる(AUC 0.977)
リーチの情報を消すと、どうなるか
モデルは本当にリーチの情報を使って降りているのか。他家リーチ中の9,015局面で、入力のリーチ関連の部分を消して確かめました。
| 入力の書き換え | 現物を切る確率 | うち降り | 人間の打牌との一致率 |
|---|---|---|---|
| なし(原本) | 64.6% | 15.5% | 81.2% |
| 局情報のリーチ情報を消す | 64.0% | 15.0% | 81.2% |
| 相手の現物チャネルを消す | 56.5% | 13.5% | 72.5% |
| リーチ宣言イベントを消す | 61.3% | 13.7% | 80.1% |
| 3つとも消す | 55.5% | 11.9% | 74.3% |
リーチの情報を消すと、降りは減ります。 ただ、減り方は思ったより小さい、というのが正直な感想です。
実は、同じ実験を学習データ1%の弱いモデルでもやっていて、そちらは大きく崩れました。
3つとも消したときの降りは、弱いAIで15.4%→4.5%、強いAIで15.5%→11.9%。強いAIは、明示的なリーチの目印を消されても、他の情報から補っているように見えます(たとえば、リーチ後の打牌の並びや、牌ごとの枚数の情報など)。なぜ補えるのかは、まだ調べていません。
入力を消した局面は、学習のときには見ていない入力(分布外)で、数字の大きさはそのまま読めません。向き(消すと下がる)を見る実験です。また、人間の打牌と一致していることは「人間らしく降りる」ことで、「正しく降りる」ことではありません。
安牌は持つのか
「安牌(通りやすい牌)をわざと手に残す」動きがあるかも調べました。ここは意外な結果でした。
同じ人の判断を順に追って、牌が手に来てから切られるまでの「生き残り方」を見ます(手が遠い局面、リーチなし)。
| 手に来た牌 | 1回の判断後に手に残る割合(人間) | 8回後(人間) | 8回後(モデル) |
|---|---|---|---|
| 字牌・場に2枚以上見えている(安牌候補) | 30.8% | 7.4% | 7.2% |
| 字牌・場に0〜1枚 | 65.0% | 11.0% | 11.4% |
| 孤立した端牌(1・9) | 48.0% | 6.6% | 6.8% |
安牌候補の字牌が、いちばん早く手から出ていきます。 人間は安牌を取っておくのではなく、使い道のない牌として先に処理していました。場に見えていない字牌(まだ対子・刻子になる見込みがある)の方が長く残ります。
そして、モデルの予測する残り方は、人間とほぼ同じです(差は数ポイント以内)。どの牌をどれだけ持つかまで、人間の持ち方を再現しています。
他家のリーチを最初に受けた判断(4,371軌跡)では、完全安牌の字牌(残り0枚)を持っていたのは12.9%で、その牌を切る率は人間56.6%、モデル57.5%でした。リーチを受けても半分前後は手に残して、他の牌から処理しています。
これは「安牌を抱える打ち方は、平均的には見えなかった」という結果です。強い人だけを取り出したり、持っていた理由(対子候補・役牌など)を分けたりすると違う結果になるかもしれません(未確認)。
麻雀好きに見てほしい、その他の解析
降りと安牌のほかにも、強いモデルと人間の打牌を並べて、いろいろ見てみました(2024年のvalid約5.3万局面)。
序盤は字牌から、終盤は中張牌へ
何巡目に、どの牌が切られるかを、人間とモデルで並べました。
序盤(1〜4巡目)の打牌の 48.1%が字牌、29.1%が老頭牌(1・9) で、5〜8巡目になると字牌は26.1%に下がります。終盤は中張牌も切られるようになります。この変化を、モデルはほぼそのまま再現しています(右の「モデル−人間」の図は、ほとんど白)。
5と赤5を両方持っているとき
同じスートの5と赤5を両方持っているときに、切る牌を比べました(n=6,508)。
| 普通の5を切る | 赤5を切る | |
|---|---|---|
| 人間 | 4.13% | 0.05% |
| モデル | 3.89% | 0.12% |
赤5は、ほぼ切られません。 赤は打点になる牌なので、当たり前と言えば当たり前ですが、AIは「赤ドラは大事」というルールを一言も教えられずに、これを覚えています(入力に赤かどうかが入っているだけです)。
字牌は、場に出るほど切られる
手に1枚だけの字牌が、場に何枚見えているかで、その字牌を切る率を比べました(序盤8巡目まで、リーチなし)。右の図のとおり、見えている枚数が増えるほど切られます。
| 場に見えている枚数 | 人間 | モデル |
|---|---|---|
| 0枚 | 27.2% | 26.5% |
| 1枚 | 40.2% | 40.4% |
| 2枚 | 48.9% | 49.7% |
| 3枚 | 49.1% | 49.7% |
「場に出ている字牌は、もう対子・刻子になりにくいので先に切る」という打ち方を、人間もモデルもしています。
AIが間違えるのは、どんな牌か
人間の打牌と違った予測(誤り)が、どの牌とどの牌の取り違えかを見ました。
いちばん多いのは、 「人間は白を切ったが、モデルは中と予測」(全局面の0.14%) で、次が「白→發」(0.13%)、「中→發」(0.10%)と、三元牌どうしの取り違えが並びます。その次は「北→西」「南→北」など、風牌どうしです。数牌どうし(同じスートの別の数字)の取り違えは、誤りの15.5%にとどまります。
どの字牌を先に切るかは、局面から決まらない好みや読みの部分が大きく、人間にとっても「どっちでもいい」場面が多いのだと思います。AIはそこで迷っている、と読めます。
当てやすい場面、当てにくい場面
- 手の進み具合: 聴牌のときの一致率は92.2%、1向聴は81.8%、2向聴は77.7%、3向聴は73.8%、4向聴以上は69.1%。手が遠いほど、人間の打牌がばらけます
- 巡目: 1〜4巡目は75.6%、9〜12巡目は82.8%。序盤ほどばらけます
- 鳴いた後: チーの後は84.6%、ポンの後は81.8%で、ツモ後(79.2%)より高い(理由は調べていません)
「何切る」の正解が1つに絞られる局面
モデルが出す確率を、高い順に並べたときに、どの順位のところで確率が大きく落ちるか(落差)を調べました。1位の直後で落ちるなら、「この1つが他より圧倒的に有力」という局面です。
- 聴牌では、66.3%の局面で1位の直後に落差があります(聴牌を維持する打牌が1つに絞られる)
- 3向聴以上では18.8%まで下がり、候補が広く残ります
- 序盤(1〜6巡)は23.2%で、候補がなだらかに並びます
人間は、落差より上の候補を98.6%の局面で選んでいます。ただ、モデルの確率から予想される割合(98.7%)とほぼ同じなので、「人間が特別に絞って選んでいる」というより、モデルの確率が人間の選び方とよく合っている、ということです。
ここで言う「確率」は、人間の打牌をどれだけ予測できるかの確率で、打牌の正しさの評価値ではありません。「確率が高い=良い手」とは言えません。
AIの頭の中を覗く
Attention はどこを見ているか
各層で、牌トークンが何を見ているかを、グループ別に集計しました(強いモデル、検証データ3,008局面)。
- 2層目以降は、牌トークン同士の比較が7割前後を占める
- 河(他家の打牌)を見る割合は少ないが、河の情報は牌トークンの入力にも入っているので、「河を見ていない」とは言えない
- 最終層では、ツモや打牌といったイベントを見る割合が戻る
Attentionの重みは「その情報を使った」証拠にはなりません。そこで、入力を1つずつ消した場合の精度の落ち方や、IG(Integrated Gradients)など6種類の帰属手法も比べました。6種類とも、重要と判断した入力を消すと、ランダムに消すより確率が大きく下がりました。ただ、手法どうしで重要とする入力の順位はあまり一致しません(トークン単位のSpearman相関の中央値は0.26や0.08)。「これが正解の説明」と言える手法は、まだありません。
中間層から「概念」を読み出せるか
層4〜5の隠れ状態から線形で読み出すと、シャンテン数はR²=0.885で予測できました(ランダム初期化のモデルでは0.467、入力層では0.193)。「手がどれだけ進んでいるか」は、中間層に線形に表現されています。
一方で、読み出せることと、判断に使っているかは別です。その方向の成分を操作しても、確率の変化は最大0.1ポイントほどで、ほとんど動きませんでした。「読める」と「効いている」は分けて考える必要があります。
限界と、次にやること
- 一致率は人間の打牌との一致です。強さの指標ではありません(人間が最善とは限らない)
- 精度は検証データでの値で、テストデータは最終確認まで使っていません
- Suphxとの比較は、データ・評価条件が違う参考値です
- 降りの解析は2024年のvalidの一部(他家リーチ中9,015局面)、1つのモデル・1つのシードです
- 可視化・解析には探索的なものを含みます(各所に明記しました)
- 次にやること: 実際に対局できるAIにして、強さを測る(判断モデルの追加など)
まとめ
- 天鳳16年分で、人間の打牌を77.8%(Top-1)で当てるTransformerを作った(Suphxの打牌モデルの76.7%を、条件の違いはあるが数字の上では超えた)
- 入力のまとめ方を変えただけで+8ポイント。牌ごとの「見えている枚数」「残り枚数」を直接使えるようになったのが主因
- リーチへの降りは人間とほぼ同じ割合(15.5% 対 15.4%)で、確率としても校正されていた
- 安牌候補の字牌は、むしろ早く手から出ていく。モデルも同じ持ち方をしていた
- 序盤は字牌から切り、赤5はほぼ切らず、場に出た字牌ほど先に切る、という打ち方も人間とそっくりだった
- 層4では、1と9・2と8のように「端からの距離」が似た牌が近くに集まっていた
- 中間層からシャンテン数などは読み出せるが、操作しても判断はほとんど変わらなかった
詳しい話は、上のシリーズ一覧の各記事に書きました。質問や、「ここを詳しく」があればコメントで教えてください。












