サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
掃除・片付け
tadaoyamaoka.hatenablog.com
5/3~5/5に開催された第34回世界コンピュータ将棋選手権にHEROZチームとして、「dlshogi with HEROZ」というプログラム名で参加しました。 大会の概要 世界コンピュータ将棋選手権は、1990年より毎年開催されている歴史のあるコンピュータ将棋の大会です。 今回は34回目の開催で、45チームが参加しました。 第1予選、第2予選を通過した上位8チームで総当たりのリーグ戦で決勝戦が行われました。 大会の結果 決勝リーグでは最終戦で自力で勝てば優勝でしたが千日手になり、トップの「お前、 CSA 会員にならねーか?」(tanuki-チーム)と勝ち点同一でSB差で準優勝という結果になりました。 なお、二次予選は昨年とは異なり苦戦を強いられて、ボーダーラインで辞退があったため繰り上げで決勝に進めました。苦戦した事情は後述します。 今大会の特徴 定跡が出回った 先手勝率が高い角換わりの
先日、dlshogiをPyTorch Lightningに対応させてマルチGPUで学習できるようにした。 これは、より大規模なモデルで将棋を学習するための布石でもある。 Transformerを使ったLLMで使われている技術を将棋に応用することを計画している。 「Deep Learning Shogi」(dlshogi)にちなんで、「Large Language Shogi」(llshogi)として開発していきたい。 ※モデルサイズは昨今のLLM並みに数兆パラメータとかにはできないので、LargeはLLMの技術を使うという意味で。 ベースラインの方針 まずベースラインとして、「Grandmaster-Level Chess Without Search」を参考にして、Transformerによる将棋の方策を実装したい。 トークン 以前に、将棋でTransformerモデル(Multi-He
書籍「Kaggleに挑む深層学習プログラミングの極意」を読んだので内容をまとめる。 以下の内容は、ほとんどClaude3 Opusを使用して作成している。 はじめに 本書は、画像やテキストを用いるKaggleコンテストでの著者らの知見を体系的にまとめたものである。第1章では、コンテストの概要、歴史、データセットや課題別の例、必要となる計算資源について説明する。第2章では、探索的データ分析、モデルの作成・検証・性能向上の方法を整理する。第3章から第5章では、画像分類・画像検索・テキスト分類のコンテストに実際に取り組む。特に近年主流となっているニューラルネットワークについて、基本的な考え方やPyTorchでの実装方法を解説する。 印象的なフレーズ ・「人工知能」「機械学習」「深層学習」などのキーワードが世間を賑わす中、機械学習を題材にしたコンテストの認知度が高まってきました。 ・機械学習コンテ
書籍「機械学習エンジニアのためのTransformers」を読んだので内容をまとめる。 以下の内容は、ほとんどClaude3 Opusを使用して作成している。 第1章 入門Transformers いる。さらに、Transformer系モデルのGPTとBERTが紹介され、自然言語処理の分類、固有表現認識、質問応答などのタスクにおいて、TransformersライブラリがTransformerモデルを簡単に適用できることが示されている。最後にはHugging Faceのエコシステムが概観されている。 重要なポイント Transformerはエンコーダ・デコーダのフレームワーク、アテンション機構、転移学習を組み合わせている GPTやBERTなどの代表的なモデルが登場し、自然言語処理のベンチマークを更新した Hugging Faceのエコシステムを使うことで、最先端のモデルを簡単に利用できる 理
書籍「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を読んだので、内容をまとめた。 以下の内容は、ほとんどClaude3 Opusを使用して作成している。 まえがき・第I部 イントロダクション まえがき ソフトウェアシステムの構造を決定するルールは、システムの種類に関係なく普遍的である。ソフトウェアアーキテクチャの目的は、システム構築に必要な人材を最小限に抑えることであり、設計の品質は開発・保守に必要な労力で測ることができる。アーキテクチャは仮説であり、実装と計測によって証明すべきものである。本書は、時代を超越した不変のルールを解説する。 印象的なフレーズ 恋のおそろしい化け物とは、意欲は無限だが実行は有限、欲する心ははてしないがおこなうには限度がある。 優れたアーキテクチャのコストが高いと思うなら、劣ったアーキテクチャにすればいい。 速く進む唯一の方法は、うま
DeepMindがarXivで発表した、AlphaZeroからチェスの新しい概念を抽出して人間のパフォーマンス向上に使えるようにする方法について述べた「Bridging the Human-AI Knowledge Gap: Concept Discovery and Transfer in AlphaZero」を読んだ際のメモ。 概要 AlphaZeroから隠されたチェスの知識を概念として抽出する 概念は、AlphaZeroの中間層から概念ベクトルとして抽出する 人間が知らずAlphaZeroだけが知っていること発見する 学習可能かつ新規な概念を抽出する 人間のグランドマスターが概念を学習可能か検証した 結果 概念と局面を提示することで、チェスのグランドマスターのテスト局面の正解率が向上した AlphaZeroが学習した知識は、人間の理解を超えるものではなく学習可能な知識であることが示さ
最近、ソフトウェア開発を行っているので、ソフトウェア設計に関する勉強をしている。 「エリック・エヴァンスのドメイン駆動設計」を読んだので、内容をまとめた。 以下の内容は、ほとんどClaude3 Opusで書いている。 概要 第1部 ドメインモデルを機能させる 本書の第1部は、ドメイン駆動設計の中核をなす考え方を説明している。複雑なソフトウェアに立ち向かうには、問題の本質を捉えた優れたドメインモデルが不可欠である。そのモデルを作り出すには、ドメインの知識を注意深く分析し、実装に適した形に洗練する「知識のかみ砕き」のプロセスが必要だ。 モデルはチーム全体で共有され、「ユビキタス言語」を通してソフトウェアに反映されなければならない。開発者は言葉の使い方に細心の注意を払い、コードがモデルを如実に表すようにする。モデルとコードの間に乖離があってはならない。 したがって、伝統的な「分析」と「設計」の分
大規模なモデルの学習に効果があるとされる学習率スケジューリングの手法にWarm-upがある。 しかし、Pytorchの標準のスケジューラには、Warm-upに対応したスケジューラが提供されていない。 PyTorch Lightning Boltsには、Warm-upに対応したCosineAnnealingLRがある。 Linear Warmup Cosine Annealing — Lightning-Bolts 0.7.0 documentation まだレビュー中のステータスで、機能的にもリスタートや減衰には対応していない。 深層学習界隈でよく使われるtimmには、Warm-upの他にリスタート回数や減衰率の調整が可能なCosineAnnealingLR学習率スケジューラがある。 SGDR - Stochastic Gradient Descent with Warm Restarts
DeepMindがarXiv上で発表した、深層強化学習のモデルを段階的な枝刈りすることでモデルサイズのスケーリングが可能になることを示した「In deep reinforcement learning, a pruned network is a good network」を読んだ際のメモ。 概要 深層強化学習はモデルサイズをスケーリングことは困難だった 段階的に枝刈りすることでスケーリングが可能であることを実証した 枝刈りすることでパフォーマンスも向上する 導入 深層強化学習では訓練中に多数のパラメータが休止状態になる 最近の研究でResNetバックボーンのDQNで段階的な枝刈りで元のパラメータの10%で50%パフォーマンスが向上ことが発見された この論文では、段階的な枝刈りによって、ネットワークのサイズに比例してパフォーマンスが向上することを示す 関連研究 深層強化学習でネットワークを
dlshogiの学習は、PyTorchを使用して、モデルの訓練処理を独自に実装していた。 マルチGPUによる分散学習に対応させようと考えているが、独自に実装するより、PyTorch lightningに対応させた方が実装が楽になるため、dlshogiをPyTorch Lightningに対応させたいと考えている。 まずは、訓練の基本部分の実装を行った。 PyTorch Lightning CLI ボイラープレートをできるだけ削除するため、PyTorch Lightning CLIを使用して実装する。 PyTorch Lightning CLIを使用すると、コマンド引数のパース処理など含めて自動で行ってくれる。 起動部分の処理は以下のように記述するだけでよい。 def main(): LightningCLI(Model, DataModule) if __name__ == "__main
ほぼ個人メモ。 HTMLのtextareaは、入力に応じて高さを自動で調整する機能がない。 ChatGPTの入力欄のように、高さが自動で変わるテキストエリアを作るには、CSSとJavaScriptで実装する必要がある。 JavaScriptで高さを計算するのはややこしいので、非表示のdivタグに内容をコピーして、そのタグの高さにflexのrelativeとabsoluteを使って合わせる方法がある。 The Cleanest Trick for Autogrowing Textareas | CSS-Tricks - CSS-Tricks このサンプルでは、Alpine.jsを使っていたので、Reactで実装する方法を調べた。 React+TailwindCSSで実装 Reactとlessを使って実装する以下のページを参考に、React+TailwindCSSで実装した。 入力文字の行数で
LLMを使用してポケモンバトルをプレイするPokéLLMonの論文を読んだ際のメモ。 概要 LLMを使用して、ポケモンバトルをプレイするエージェントを作成する。 現在の状態をテキストとして与え、行動を生成する 以前のターンの結果をテキストとして、コンテキストに与える「インコンテキスト強化学習」 外部知識として、技や能力の効果、タイプ相性をコンテキストに与える パニック スイッチング(強い相手のときに交代を繰り返す)を防ぐため、プロンプトエンジニアリング手法のSelf-Consistency(SC)を使用 行っていないこと 探索は行わない モデルのパラメータの学習は行わない アルゴリズムの概要は、図4が分かりやすい。 結果 オンライン対戦(Pokemon showdown)において、ラダー戦で勝率49%、招待戦で勝率56%を達成 平均的な人間レベル 課題 長期計画に弱い 短期的な利益を達成で
ディープラーニング系の将棋AIは、従来の将棋AIと比べてNPSが低くても強いという特徴がある。 NPSがどれくらい違うのか質問を受けることがあるので、測定を行った。 NPSのカウント方法の違い やねうら王(元はStockfishのソース)のNPSは、探索中にdo_moveを行った回数をノード数としてカウントしている。 一方、dlshogiは、ノードをニューラルネットワークで評価した回数をノード数としてカウントしている。 そのため、NPSをそのまま比較するのは公平ではない。 そこで、やねうら王のノード数のカウント方法を、qsearchでevalを呼び出したタイミングでカウントするように変更したバージョンでも測定を行った。 測定条件 ハードウェア CPU AMD EPYC 7742 64コア×2 GPU A100×8 ソフトウェア ソフトウェア、バージョン 条件 水匠4 やねうら王V6.04、
前回の記事で、LLMを使用して数学的発見を行うFunSearchの論文を紹介した。 FunSearchは、LLMを使用してプログラムの変更を行い、進化的アルゴリズムでスコアの高いプログラムを選別することで、最適な解を出力するプログラムを生成する。 この仕組みは、深層学習のモデル構造の改良にも使えないかと思い試してみた。 進化的アルゴリズムを行うには評価に時間がかかるため、今回はLLMにより、モデル構造を変更する部分を試した。 対象 dlshogiで使用しているResNetブロックを初期バージョンとして、改善したバージョンをLLMに出力させる。 class ResNetBlock(nn.Module): def __init__(self, channels, activation): super(ResNetBlock, self).__init__() self.conv1 = nn.C
畳み込みの入力データの形式には、NHWCとNCHW があるが、どちらがTPUに最適か実験してみた。 TensorFlowのデフォルトはNHWCで、ChainerのデフォルトはNCHWになっている。 cuDNNはNCHWに最適化されている。 https://www.tensorflow.org/guide/performance/overview しかし、TensorCoreは、NHWCに最適化されている。 Volta Tensor コア GPU が AI パフォーマンスの新記録を達成 | NVIDIA なお、TensorFlowのCPUモードでは、MaxpoolingはNHWCしかサポートしていない。 TPUではどちらに最適化されているか調べてもわからなかった。 そこで、カラー画像のデータセットであるCIFAR-10を使って、2層の畳み込み層のあるネットワークを学習させて、実際に測ってみた
C++で、gzipの圧縮解凍を標準ストリームで行いたかったので、ライブラリを調べたところ、Boost.IostreamsにZlib Filtersを追加することで対応できることがわかった。 しかし、Windowsではデフォルトでは有効になっておらず、「conda install -c conda-forge boost」のビルド済みパッケージにも含まれていない。 そのため、ソースからビルドする必要がある。 この記事では、zlibを有効にいsてビルドする方法について記す。 Windows boostダウンロード boostをダウンロードする。 https://www.boost.org/ 適当な場所に解凍する(以下、boost_1_75_0をC:\に解凍したとして記述する)。 zlibのソースダウンロード zlibのソースをダウンロードする。 https://zlib.net/ 適当な場所に
週末の12/2、12/3に開催された第4回世界将棋AI電竜戦に参加しました。 HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。 結果 予選を1位で通過し、決勝リーグでは、最終戦で水匠に敗れて、準優勝という結果になりました。 1位、2位は僅差で、3位以下を大きく引き離しています。 予選では、水匠に先手、後手で連勝していましたので、優勝する可能性も十分あったと思います。 予選で用意した定跡の一部を見せたことで決勝で対策されてしまったのは作戦が甘かったかもしれません。 定跡自動生成 今大会では、定跡自動生成にすべての計算リソースを投入しました。 モデルは、第33回世界コンピュータ将棋選手権と同じものを使用しました。 第33回世界コンピュータ将棋選手権の結果報告で書きましたが、角換わり基本図からの先手角換わり定跡が将棋AI同士の対局では先手必勝
以前より不完全情報のボードゲームで強化学習のアルゴリズムを試したいと思ってる。 簡単すぎるゲームやマイナーなゲームでは、開発のモチベーションが続かない気がするので、日本で人気のある麻雀AIを開発したいと考えている。 麻雀は、「Lucky J」や「Suphx 」で強化学習が試されており、人間の高段者くらいの強さになっている。 それらのAIで使われている手法を自分で実装してみて理解したいと思っている。 また、MuZeroのようなモデルベースの手法を麻雀AIで試してみたいと思っている。 Pythonライブラリ まず、Pythonで使える麻雀ライブラリを探したが、点数計算用のライブラリが見つかったが、1局通して対局できるライブラリが見つからなかったので、自分で作ることにした。 Python以外の言語向けのオープンソースのライブラリでは、対局までできるものが見つかったので、参考にして実装した。 以下
前回、拡散モデルで将棋の方策を学習できることを確認した。今回は、マルチGPUで学習できるように学習処理をPyTorch Lightningで実装し直す。 LightningCLI LightningCLIを使うと、ハイパーパラメータやオプティマイザの設定をconfigファイルに記述できて便利である。 モデルクラスと、データクラスを定義すると、以下のように記述するだけで、学習部を実装できる。 LightningCLI(DiffusionPolicy, MyDataModule) 実行するときは、サブコマンド「fit」を指定して python train_lightning.py fit --config config.yamlのように実行する。 データローダ 前回データローダをシングルワーカで実行していたが、複数ワーカで実行できるように、データローダをマルチプロセスに対応した。 データローダ
オープンソースで開発しているPythonの将棋ライブラリcshogiにドキュメントを追加した。 tadaoyamaoka.github.io 今まで、READMEと強い将棋ソフトの創り方に主要な部分のみ説明を記載しているくらいで、詳細なドキュメントがなかった。 今回、全体的にコードにdocstringを追加して、Sphinx+autodocでドキュメントを生成した。 GPT4でdocstringを生成 docstringの内容は、GPT4を活用して記述した。 GPT4は、ソースの意図をくみ取って、自分で書くよりも適切な説明文を生成してくれた。 GPT4は、将棋の知識や、USIプロトコルに関する知識も持っているらしく、ソースからコンテキストをくみ取ってくれた。 プロンプト 基本は、以下のプロンプトを使用した(Cythonのコードの場合は、Pythonの部分をCythonにした)。 以下のPy
個人メモ Hugging Faceで公開されているLlama2のモデルを使用して、4bit量子化を有効にして、70Bのモデルを1GPU(A100)で推論する方法について記述する。 dockerコンテナ作成 NVIDIAのPyTorchイメージを使用してDockerコンテナを作成する。 ※ホストのドライババージョンが古いため、少し前のイメージを使用している。 コマンド例 docker run --gpus all --network host -v /work:/work -w /work -it nvcr.io/nvidia/pytorch:22.12-py3 PyTorchバージョンアップ xformersがpytorch 2.0.1を要求するためPyTorchをアンインストールしてからインストール pip uninstall torch torchvision torchtext to
拡散モデルで、将棋の方策を学習できないか試してみた。 拡散モデル 拡散モデルは、高品質で多様なサンプルを生成できる生成モデルである。 昨年8月にStable Diffusionが公開されたことで注目を集めている。 拡散モデルは、確率微分方程式によって表される確率分布を近似するモデルで、モード崩壊を起こさず多様な分布を学習できるという特徴がある。 また、プロンプトと呼ばれるテキストにより条件付けを行い、テキストに従った画像を生成できる。 将棋の方策 将棋の方策は、座標と移動方向の組み合わせで表現でき、dlshogiで採用している表現方法では2187次元になる。 つまり、指し手は、局面によって条件づけられた2187次元の確率分布からサンプリングを行っていることになる。 拡散モデルの可能性 条件付けを行い高次元の確率分布からサンプリングを行うという仕組みは、将棋の方策においても適用できると考える
先日、PyTorchでFXグラフモードで量子化認識トレーニングを試して、精度が大きく落ちることなく、CPUでの推論が速くなることを確認した。 そこで、dlshogiのモデルで量子化認識トレーニングを試して、CPUで強くなるかを検証した。 量子化認識トレーニング 先日の記事にも書いたが、量子化認識トレーニングは、訓練時に量子化(浮動小数点を整数にする)のスケールパラメータを学習することで、精度を保ったまま整数化により推論を高速する手法である。 PyTorchのFXグラフモードを使うことで、比較的簡単に量子化認識トレーニングを実装できる。 ONNX化の課題 dlshogiのモデルを量子化認識トレーニングすると、ONNXに出力する際、 Exporting the operator 'quantized::batch_norm2d_relu' to ONNX opset version 14 is
LLMで思考ゲームのような推論が必要なタスクを可能にする手法に関する論文「Tree of Thoughts: Deliberate Problem Solving with Large Language Models」を読んだ際のメモ。 LLMはアイディアを出したりする創作的なタスクや、要約や翻訳のような変換のタスクは得意だが、論理的な思考が必要なタスクは比較的苦手である。 Chain-of-thought (CoT)のようなプロンプトエンジニアリングによって、数学の問題もある程度解けるようになっているが、例えば将棋のような思考ゲームをプレイするようなことはできない。 この研究では、LLMとヒューリステックな探索を組み合わせることで、Game of 24という簡単な思考ゲームを解くことができる手法を提案している。 LLMの特性として、トークンを順番生成する過程で、途中で間違いに気づいても後
以前に、Whisperでリアルタイムに文字起こしするアプリを公開したが、記事にアクセスが多く需要があるようなので、ONNXに変換する処理とアプリのソースコードを公開した。 ONNXへの変換処理は、メールで記事を読んでもわからんので、ソースを公開して欲しいという要望をいただいていた。 ONNXに変換する処理 github.com to_onnx.pyを実行すると、encoder.onnxとdecoder.onnxが出力される。 ソース中にサンプル音声のファイルパスがハードコードされているので、修正が必要である。 リアルタイムに文字起こしするアプリ github.com ソースはC#で実装しているので、Unityに組み込んでリアルタイム音声認識することもできると思う。 音声の無音期間を実装が簡単なため音声の音圧が低い区間で検出しているが、no_speechトークンと、timestampトークン
ディープラーニングのモデルを推論する際、通常GPUが必要である。しかし、GPUがない場合でも、モデルのパラメータを浮動小数点から整数へと変換する手法を使うことで、CPUだけでも推論処理を高速に行うことが可能である。この手法を量子化と呼ぶ。 PyTorchの量子化 PyTorchには、量子化の方法がいくつか用意されている。 実装は「Eager Mode Quantization」と「FX Graph Mode Quantization」に分かれており、「FX Graph Mode Quantization」の方が新しい実装で、「Eager Mode Quantization」ではモデルのレイヤー融合を手動で行う必要があったところが自動化されている。 また、一般的に量子化の手法として、 ダイナミック量子化 トレーニング後の量子化 量子化認識トレーニング がある。 ダイナミック量子化は、キャリブ
勝率測定などに「たややん互角局面集」を使わせてもらっている。 ただ、抽出条件の「36手目の局面まで、全ての指し手について評価値が±100以内となっている対局のみ」だと、dlshogiの棋譜が除外されてしまう点が気になっていた。 dlshogiは、開始局面で160付近の評価値を付けるため、この条件だとdlshogiの先手番の棋譜がすべて除外される。 なお、dlshogiの評価値は若干大げさと言われることがあるが、勝率から変換する際のスケーリングの問題なので、一度ちゃんと調整した方がいいのかもしれない。 抽出条件の変更 たややん互角局面集の抽出条件は良く考えられており、24手目で互角という条件だけだと、その後すぐに形勢が傾く局面も含まれてしまうため、互角局面集としては使いにくい。 たややん互角局面集では、さらに36手目でも互角で、24手目が一意という条件になっているため、24手目を互角局面とす
今年の世界コンピュータ将棋選手権で、dlshogiチームはA100x8のサーバを9台使用してMultiPonderによるクラスタ構成を採用していた。 9台使用していても、Ponderにヒットした1台しか実際の指し手には影響せず、多くのケースではMultiPonderなしの通常のPonderと結果は変わらない。 準優勝のやねうら王チームは、vast.aiというサービスを利用して、RTX4090x9のマシンを使用していた。 RTX 4090は、A100よりも新しい世代のチップで推論性能は、dlshogiチームのA100よりも高かった。 参考:第33回世界コンピュータ将棋選手権準優勝記 | やねうら王 公式サイト カタログスペックで比較すると、RTX 4090の方がスペックが上であることがわかる。 CUDAコア数 Tensorコア世代 Tensorコア数 RTX 4090 16384 第4世代
5/3~5/5に開催された第33回世界コンピュータ将棋選手権に参加しました。 HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。 大会の概要 世界コンピュータ将棋選手権は、1990年より毎年開催されている歴史のあるコンピュータ将棋の大会です。 今回は33回目の開催で、46チームが参加しました。 第1予選、第2予選を通過した上位8チームで総当たりのリーグ戦で決勝戦が行われました。 大会の結果 決勝リーグでは最終戦で上位3チームが1敗で並び優勝を争う展開になりました。 dlshogiは最終戦で勝って、同じく最終戦で勝ったやねうら王とはSBの差で、優勝(二連覇)という結果になりました。 優勝につながったポイント 今大会では、二次予選の結果で、上位ほど強い相手に先手番であたることができるというルールでしたので、二次予選を1位で通過したことが有利に
次のページ
このページを最初にブックマークしてみませんか?
『TadaoYamaokaの開発日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く