TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

2023-01-01から1年間の記事一覧

LLMを活用した深層学習モデルの改善

前回の記事で、LLMを使用して数学的発見を行うFunSearchの論文を紹介した。FunSearchは、LLMを使用してプログラムの変更を行い、進化的アルゴリズムでスコアの高いプログラムを選別することで、最適な解を出力するプログラムを生成する。この仕組みは、深層…

Mathematical discoveries from program search with large language modelsを読む

DeepMindがNatureで発表した「Mathematical discoveries from program search with large language models」を読んだ際のメモです。 概要 大規模言語モデルを使用して数学的発見を行うFunSearchを提案 解を生成するプログラムを生成する LLMを使用してプログ…

麻雀AIを深層強化学習で作る その10(自己対局で特徴量記録)

電竜戦があったりで先月は麻雀AIの開発に手を付けられれず、前回から1か月近く空いてしまったが、麻雀AIの開発を再開したい。 自己対局で特徴量記録 前回、自己対局で牌譜を生成するところまで実装した。 自己対局で生成した牌譜を元に、Learnerで特徴量を生…

第4回世界将棋AI電竜戦 結果報告

週末の12/2、12/3に開催された第4回世界将棋AI電竜戦に参加しました。HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。 結果 予選を1位で通過し、決勝リーグでは、最終戦で水匠に敗れて、準優勝という結果になりました。1…

麻雀AIを深層強化学習で作る その9(自己対局)

前回は、牌譜の記録/再生処理を実装した。 今回は、自己対局で牌譜を生成する処理を実装する。 処理方式 強化学習のアルゴリズムにPPOを使用予定で、PPOはオンポリシーのアルゴリズムのため、 現在のモデルで牌譜生成 現在のモデルで生成した牌譜でモデルを…

麻雀AIを深層強化学習で作る その8(牌譜の記録/再生)

強化学習実装の準備として、牌譜の記録/再生を実装した。PPOでは、エピソードの終端の報酬を、GAEで各ステップの状態に割り当てるため、エピソードの各ステップの状態を再生できるように記録しておく必要がある。 また、ランダムな初期局面からの対局を再生…

麻雀AIを深層強化学習で作る その7(初期局面からランダムプレイ)

前回作成した初期局面生成処理で生成した初期局面から、ランダムにプレイしても和了できるか確認を行った。深層強化学習ではモデルが初期値の状態ではランダムに近いため、ランダムでもある程度和了できると学習の効率的に学習できる。 初期局面からランダム…

麻雀AIを深層強化学習で作る その6(初期局面生成)

以前に考察した通り、強化学習でゼロから麻雀AIを学習する場合、偶然和了した際の報酬のみで役を学習するのは困難と考える。 そこで、ランダムに選択した役のN向聴の状態からゲームを開始して、補助タスクとして和了した役も学習させることにする。今回は、N…

麻雀AIを深層強化学習で作る その5(役の手牌をランダム生成)

N向聴の初期局面を生成するための準備として、特定の役で和了した手牌をランダムに生成する機能をcmajiangに実装した。 二盃口の手牌を生成する例 random_erbeikou() 和了の手牌を生成する処理 役ごとの制約を満たしながら、刻子もしくは順子をランダムに選…

麻雀AIを深層強化学習で作る その4(特徴量作成とモデル実装)

前回までは麻雀AIの作成方針を書いたが、今回から実装に着手する。 まずは、特徴量作成とモデル実装を行った。 特徴量作成 以前に検討した通り、入力特徴量は複数チャンネルの9×4の画像で構成する。特徴量作成をPythonで実装すると遅いため、C++で実装してpy…

麻雀用語の各国語対応表

作成している麻雀ライブラリで、クラス名、メソッド名、変数名などに中国語のピンインを使用しているため、訳語を調べる必要があるため、自分のために参考資料を整理しておく。 中国語 参考にしている電脳麻将のソースで使われている中国語一覧 電脳麻将のプ…

麻雀AIを深層強化学習で作る その3(初期局面と補助タスク)

麻雀の役は14枚の牌を組み合わせて作る必要があるため、初期値のモデルからはじめて偶然役ができる確率は極めて低い。 人間が麻雀を覚える際もまずは役の形を覚えて、それを目指して手牌をそろえていく。 知識ゼロから偶然和了した場合の報酬のみで役を覚え…

麻雀AIを深層強化学習で作る その2(特徴量設計)

前回はこれから作成する麻雀AIの方針を立てた。 今回は、麻雀AIの特徴量を検討する。 方針 畳み込みニューラルネットワーク 麻雀の牌は、萬子、筒子、索子、字牌の4種類で構成されており、萬子、筒子、索子は1~9の数字を持っている。 面子は、順子は隣合っ…

PyTorchでPPOを実装する

麻雀AIの準備として、PyTorchでPPOアルゴリズムをスクラッチで実装した。はじめ、最近リリースされたTorchRLで実装しようと思って試していたが、連続環境でのチュートリアルはあるが、いろいろ試したが離散環境に対応することができず断念した。Stable Basel…

麻雀AIを深層強化学習で作る

Pythonの麻雀ライブラリができたので、麻雀AIの開発を試そうと思う。深層強化学習を使ってゼロから強い麻雀AIを作ること目標にしたい。 先行研究 日本ルールのリーチ麻雀で、強化学習を使用して成功している麻雀AIには、テンセントが開発した「LuckyJ」があ…

Pythonの麻雀ライブラリを作る その2

前回作成したPythonの麻雀ライブラリ「cmajiang」に、手牌をSVG画像で表示する機能を追加した。Jupyterノートブックで、 from cmajiang import * Shoupai("m340p123z1z1,s340-,z2222") のようにすると、このようにSVG画像が表示される。 牌の画像 牌の画像は…

Pythonの麻雀ライブラリを作る

以前より不完全情報のボードゲームで強化学習のアルゴリズムを試したいと思ってる。 簡単すぎるゲームやマイナーなゲームでは、開発のモチベーションが続かない気がするので、日本で人気のある麻雀AIを開発したいと考えている。麻雀は、「Lucky J」や「Suphx…

拡散モデルで将棋の方策を学習する その4

前回、マルチGPUで学習できるようにしたので、拡散モデルで将棋の方策を学習してどこまで精度が上がるか確認した。 学習条件 訓練データ:約14億 バッチサイズ:512 学習ステップ:10万ステップ 学習率:1e-4 オプティマイザ:AdamW GPU数:2 検証データ:fl…

拡散モデルで将棋の方策を学習する その3

前回、拡散モデルで将棋の方策を学習できることを確認した。今回は、マルチGPUで学習できるように学習処理をPyTorch Lightningで実装し直す。 LightningCLI LightningCLIを使うと、ハイパーパラメータやオプティマイザの設定をconfigファイルに記述できて便…

cshogiのサンプルプログラム(αβ法)

先日、cshogiにMinMax探索のサンプルプログラムを用意した。 今回は、駒得のみの評価で3手読みするαβ法のサンプルプログラムを用意した。 リポジトリ github.com αβ法のサンプル from cshogi import * import random PIECE_VALUES = [ 0, # NONE 100, # BPAW…

cshogiのサンプルプログラム(MinMax探索)

先日、cshogiにドキュメントを追加して、初めての方にも使いやすくした。 リファレンスのみだととっつきにくいので、使い方を理解できるように以下の2つのサンプルプログラムを用意した。 ランダムで終局まで指すサンプルプログラム 駒得のみで評価する3手読…

GPT4を使ってcshogiにドキュメントを追加

オープンソースで開発しているPythonの将棋ライブラリcshogiにドキュメントを追加した。tadaoyamaoka.github.io今まで、READMEと強い将棋ソフトの創り方に主要な部分のみ説明を記載しているくらいで、詳細なドキュメントがなかった。今回、全体的にコードにd…

floodgateの棋譜の詰みの手数

拡散モデルで将棋の方策の学習を試しているが、詰みの手順も学習できるか試したいと考えている。 そのために、floodgateの棋譜から詰みの局面を抽出した。 また、詰みの手数の統計を調査した。 抽出方法 詰みの局面かの判定には、「KomoringHeights」v1.0.0…

Llama2の70Bモデルを4bit量子化して1GPUで実行する方法

個人メモHugging Faceで公開されているLlama2のモデルを使用して、4bit量子化を有効にして、70Bのモデルを1GPU(A100)で推論する方法について記述する。 dockerコンテナ作成 NVIDIAのPyTorchイメージを使用してDockerコンテナを作成する。 ※ホストのドライバ…

拡散モデルで将棋の方策を学習する その2

前回の続き。 tadaoyamaoka.hatenablog.com前回訓練損失が下がるところまで確認したが、正解率は0%のままだった。 その後学習を継続し、126,504ステップ時点で、訓練損失と正解率は以下の通りとなった。 学習結果 訓練損失 正解率 floodgateの棋譜に対する、…

拡散モデルで将棋の方策を学習する

拡散モデルで、将棋の方策を学習できないか試してみた。 拡散モデル 拡散モデルは、高品質で多様なサンプルを生成できる生成モデルである。 昨年8月にStable Diffusionが公開されたことで注目を集めている。拡散モデルは、確率微分方程式によって表される確…

ChatGPT APIのFunction callingを試す

Chat Completions APIに新しく追加された機能である「Function calling」を試してみた。 Function calling and other API updates Function calling Bingチャットを使っていると、質問に応じて必要なときに検索を行う処理を行っている。同じように状況に応じ…

dlshogiで量子化認識トレーニングを試す

先日、PyTorchでFXグラフモードで量子化認識トレーニングを試して、精度が大きく落ちることなく、CPUでの推論が速くなることを確認した。そこで、dlshogiのモデルで量子化認識トレーニングを試して、CPUで強くなるかを検証した。 量子化認識トレーニング 先…

React+TailwindCSSで高さ可変のテキストエリアを作る

ほぼ個人メモ。HTMLのtextareaは、入力に応じて高さを自動で調整する機能がない。 ChatGPTの入力欄のように、高さが自動で変わるテキストエリアを作るには、CSSとJavaScriptで実装する必要がある。JavaScriptで高さを計算するのはややこしいので、非表示のdi…

【論文】Tree of Thoughts: Deliberate Problem Solving with Large Language Models

LLMで思考ゲームのような推論が必要なタスクを可能にする手法に関する論文「Tree of Thoughts: Deliberate Problem Solving with Large Language Models」を読んだ際のメモ。LLMはアイディアを出したりする創作的なタスクや、要約や翻訳のような変換のタスク…