← 返回洞察文章
賽局理論13 分鐘閱讀

我們相信的 GTO,其實綁在 solver 的抽象上

打開 solver,看到「這邊 100% 要 fold」。多數玩家的反應是把它背起來:這個 spot 一律棄牌,然後不再多想。直到實戰桌上發現對手在這個 spot 會放詐唬,你才開始懷疑:solver 寫的 100% fold 是不是錯了?問題在於,solver 顯示的 100% fold 不一定代表棄牌就是真理;它是在某一組 abstraction (抽象) 下算出來的:特定的下注選項、特定的對手範圍假設、特定的可選 action 都會影響這個結論。換掉 abstraction,「100% fold」就可能消失。我們現在相信的「GTO」,有很大一部分綁在後面這個設定上。

撲克的原始遊戲樹大到沒辦法直接解,光是 HU 100bb 一個結構,把 flop × turn × river × 每個節點可選的 action 全部展開,決策點數量就估計在 1016110^{161} 量級(Libratus 論文常見的尺度)。每個節點理論上可以有大量下注尺寸、加注尺寸、不同街道組合與不同牌型資訊。Solver 不會直接把這個完整宇宙原封不動丟進計算,而是先把遊戲壓縮成一個可計算的模型。

Abstraction 可以有很多層:牌力或牌面可以被分群、下注尺寸可以被離散成幾個選項、某些 action 可以被保留或刪掉。這篇文章主要談的是 action abstraction,也就是 solver 在每個節點被允許選哪些行動:哪裡可以 check、bet、raise?下注可以用哪些 size?OOP 能不能 donk?SB 可不可以 limp?

Abstraction:solver 看到的決策樹

同一個 spot,不同 abstraction 看到的 action 不同

OOP 河牌決策?CheckBet 33%Bet 75%Bet 125%Bet 200%在 tree 裡(solver 會評估)不在這個 abstraction(solver 看不到)

Solver 只在實線分支上找均衡。虛線的 action 在現實撲克裡都存在,但這棵 tree 沒收錄,所以 solver 連選的機會都沒有。換掉 abstraction,「100% 應該打 75% pot」可能就會變成「125% pot 才是最佳解」。

沒設進 abstraction 的 action,solver 永遠發現不了。Solver 不是在真實遊戲裡任意探索,它是在你給的 action tree 上找最佳反應。
Solver outputNash solution inside Gabstract\text{Solver output} \approx \text{Nash solution inside } \mathcal{G}_{\text{abstract}}

回到開頭那個「100% fold」。當 solver 顯示「這裡 100% 要棄牌」時,它可能代表兩件完全不同的事:第一,在 solver 假設的對手範圍與 sizing 下,棄牌的 EV 真的勝過跟注或加注;第二,現實對手在這個 spot 的詐唬頻率比模型假設的高,或用了 solver 沒模擬過的線,這時候 100% fold 就不再是事實。這兩種 100% 在頻率表上長得一模一樣,含義卻完全相反。把第二種背成「這邊就是要 fold」,等於把現實裡存在的 bluff 從自己的應對範圍裡刪掉。

Solver 是怎麼「發現」新策略的?

很多玩家回頭看 solver 歷史,會把「SB limp」「overbet」「donk bet」「block bet」這些概念想成 solver 某天突然發現的新大陸。更準確的說法是:每個現代發現幾乎都經過兩段式流程。

  1. Solver 開發者把某個 action 加進 abstraction:例如 SB limp、125% pot、200% pot、OOP donk、小阻擋注、不同 raise size。
  2. Solver 重新計算後告訴你:在這個更大的策略空間裡,它會用這個 action 用得多兇、在哪些牌面用、和哪些手牌混合。

所以 solver 的「發現」不是單方面突破,而是人類和 solver 的迭代。人類先提出一個可能有價值的 action menu,solver 再檢驗這個 menu 裡的行動是否真的有 EV。當某個新 size 被放進去後高頻出現,我們才會把它命名成「現代策略」。

不是 solver 不想用,是 tree 裡沒有

PokerAlpha 在內部把同一個 spot 餵進幾組不同的 action abstraction、再比對輸出,發現一個一致的 pattern:很多被當成「solver 不喜歡這個動作」的策略,拆開 tree 之後才發現那個動作根本沒被允許出現。實驗加入這些 action 後,solver 會衍伸出原本看不到的新策略。

SB Limp

如果一個 HU 或 BvB preflop abstraction 只允許 raise / fold,solver 永遠不可能輸出 SB limp。這不代表 limp 在理論上沒有價值,只代表這個模型沒有給它存在的空間。等 limp 被加入 action tree,solver 才能回答真正的問題:在什麼 stack depth、rake、ante、position 結構下,limp 應該佔多少比例?

Overbet

超池下注也是同一件事。如果 flop / turn / river 的 size menu 只有 33%、66%、100% pot,那 solver 再聰明也不會產生 150% pot。早期簡化解裡「沒有 overbet」,不一定代表 overbet 不好;它可能只是 size abstraction 沒打開。當 125%、150%、200% 被加入後,solver 才能顯示哪些牌面有足夠的 range advantage、nut advantage 或 equity denial 需求來支撐超池。

Donk Bet

Donk bet 的歷史更容易被誤解。很多早期教學把「翻前防守者不要主動領打」講成鐵律,但這常常跟 solver tree 的設定有關。如果 OOP 在某些節點只能 check,solver 當然會「從不 donk」。當 donk action 被允許後,你會看到它不是到處亂出現,而是在特定轉牌、河牌、範圍轉移、牌面改變 nut ownership 的 spot 裡冒出來。

Block Bet 與小 Size

河牌 block bet 也一樣。如果 OOP 河牌只被允許 check 或下注 75% pot,你就不會看到 20-33% pot 的小注策略。把小 size 放進去後,solver 才能展示它的雙重功能:薄價值、低成本 bluff、以及阻止 IP 建立極化大注範圍。這不是 solver 突然變聰明,而是 action space 變完整了。

為什麼 abstraction 會不斷擴張?

第一個原因是算力。每加一個 size,節點的 fan-out 就上升;每多一條街保留更多 action,整棵 game tree 的規模就爆炸。早期連 limit holdem 都需要大量工程才能逼近解,後來才逐步進入 NL heads-up 的簡化 abstraction,再到多尺寸、多人數、ICM、PKO、不同 rake model 的現代解。算力允許,solver 開發者才敢把更多 action 放進去。

第二個原因是直覺積累。Solver 開發者會觀察 solver 在現有 menu 裡的行為:某些 spot 是否一直把頻率擠在最大 size?某些中等牌是否看起來像需要一個小 size?OOP 是否在某張轉牌上被迫 check 太多?這些訊號會讓人推測「menu 可能不夠」,接著加入新的 action 驗證。

第三個原因是 pro 對戰回饋。頂尖玩家會發現某些 solver 推薦線在實戰中打起來怪,或某些人類線長期有效但 solver 解裡不存在。這不一定代表人類比 solver 聰明,也不一定代表 solver 錯;它常常只是提醒我們:目前這個解的 abstraction 沒有完整描述那個 spot。

這不表示 solver 沒用,反而表示你要更精準地讀 solver

最糟的結論是「既然 abstraction 有限制,那 solver 都不可信」。這剛好理解反了。Solver 仍然是目前人類研究撲克最強的顯微鏡;問題只是你不能忘記顯微鏡的鏡片形狀。你看到的是透過某個 abstraction 投影出來的策略,不是沒有條件、沒有模型邊界的宇宙真理。

真正成熟的 solver 使用方式,是每次看到 output 都多問四個問題:

  • 這個節點允許哪些 action?有沒有 limp、donk、raise、overbet、小注?
  • size menu 是哪些?33 / 75 / 125 與 25 / 66 / 150 可能會導出完全不同的策略。
  • 不同 size 的 EV 差距多大?如果 EV 很接近,實戰簡化通常比死背頻率重要。
  • 這個解的目標是建立 baseline 還是研究邊界?兩種目的需要的 abstraction 寬度不一樣。

對實戰玩家的真正啟示

對實戰玩家來說,這篇文章的重點不是「以後每個 spot 都要放十種 size」。那做不到,也沒有必要。真正的重點是:不要把 solver output 當成靜態教條,而要把它當成一個有邊界的研究結果。

當你學到一條規則,例如「這裡不能 donk」「這裡只下小」「這裡沒有 overbet」,下一步不是直接背下來,而是問:這個結論是在什麼 abstraction 下得到的?如果加入另一個合理 action,它還成立嗎?如果成立,這條規則就更可靠;如果不成立,你看到的不是 GTO 本身,而是某個簡化模型的影子。

PokerAlpha 的角色也應該放在這個位置:不是叫你盲信某一個答案,而是幫你把手牌、牌面、範圍、對手類型和可能 action 拆開。當你開始追問「這條線為什麼存在」「如果多一個 size 會不會改變答案」,你才真的從背 solver 進入理解 solver。

結語:GTO 不是一張地圖,而是一個解析度問題

我們現在相信的 GTO,是當前算力、solver 開發者的直覺、產品設計、action abstraction 共同塑造出來的版本。它非常有價值,但它不是終點。下一次有人把 solver 截圖當成最後答案時,先問細節:對手範圍是怎麼設定的?這個解的 action menu 有多寬?sizing 拆得多細?raise 在哪幾個節點被允許?這些設定才是這張截圖背後真正的策略。

說到底,每個人在牌桌上都是在把撲克做抽象,然後在腦中計算。Solver 把無限的 action space 壓縮成一棵可以求解的 tree,人類把對手、牌面、籌碼結構壓縮成幾個可以快速反應的類別。差別只在抽象的解析度。抽象越少、保留的細節越多,打出來的策略就越精準。

參考文獻

  1. [1]Regret Minimization in Games with Incomplete Information - Zinkevich, Johanson, Bowling, PiccioneCFR 的代表性論文,說明如何在不完全資訊賽局中用 regret minimization 逼近均衡
  2. [2]Solving Heads-up Limit Texas Holdem - ScienceCepheus 團隊對 heads-up limit holdem 的解,展示大型撲克賽局求解與 abstraction / computation 的歷史里程碑
  3. [3]Libratus: The Superhuman AI for No-Limit Poker - IJCAILibratus 論文,涵蓋 no-limit poker 中 abstraction、nested subgame solving 與 self-improvement 的工程框架
  4. [4]What is a Solver in Poker? How Solvers Work & How to Think About Them - Upswing Poker從玩家視角解釋 solver 運作機制與限制,明確指出 solver 並非真正在解 NLHE,而是在玩家給定的 sizing 與 action 限制下找最佳解,並強調理解 why 比背頻率更重要

想實際體驗 AI 撲克分析?

Download on the App StoreGet it on Google Play