- 1980年代の Mark V. Shaney プログラムに着想を得て、約 30行のPythonコード で実装されたシンプルなマルコフテキスト生成器 Mark V. Shaney Junior を制作
- このモデルは 3単語(trigram) ベースで次の単語を確率的に予測し、200本余りのブログ記事(約20万語) を学習データとして使用
- 生成された文は Lisp、Emacs、数学、プログラミング などブログの話題に関する単語を混ぜ合わせた 意味のない文(gibberish) の形で出力
- モデルの 次数(order) を上げると文はより一貫するが、5以上では原文をそのまま引用して 創造性が失われる
- 大規模言語モデル(LLM)の時代でも、このような 単純なマルコフモデルの構造的な明快さ は、言語生成の原理を理解するための良い出発点として示される
Mark V. Shaney Junior プログラム概要
- Mark V. Shaney Junior は、1980年代のUsenetで活動した架空のユーザー Mark V. Shaney を模したテキスト生成器
- 原典はマルコフモデルを用いて投稿を自動生成していたプログラム
- 今回の実装はそのアイデアを単純化した ミニマル版 で、GitHubに公開されている
- 全体のコードは約 30行のPython で構成され、効率性より単純さ を重視
- マルコフモデルに初めて触れる人でも 20分以内で理解できる レベル
趣味としての実験的プログラミング
- 著者は特定の問題解決ではなく、アイデア探求を目的としたプログラミング を好んで行っている
- さまざまな状態空間を持つマルコフ連鎖を何度も実験
- こうした実験コードを整理してGitHubやCodebergで共有
- Mark V. Shaney Junior もそのような実験の一つであり、完成度を高めて公開した事例
ブログデータを使ったテキスト生成
- モデルを チャールズ・ディケンズの『クリスマス・キャロル』 で学習させてテストした後、
24年分のブログ記事(200本余り、約20万語) を入力データとして使用
- 生成された文は プログラミングコマンド、数学用語、エディタコマンド などが入り混じった 非論理的な文 として出力
- 例: Emacsコマンド、Lispコード、数学用語などが無作為に結合された文
- 一部の文はブログ内の特定の記事から単語を取り出して 意味のない組み合わせ を形成
- 例: “Lisp source file” と “self-esteem” が別々の記事から抽出されて結合
マルコフ性とアルゴリズム構造
- 基本設定は trigram(3単語) ベースで、
前の2単語をキー(key)、3つ目の単語を値(value)として保存する マップ構造 を使用
- テキスト生成プロセス
- 任意の単語ペアを選択 → 取り得る次の単語のうち1つを一様確率で選択
- 新たに選ばれた単語と直前の単語で新しいペアを構成して繰り返す
- もはや後続単語がないか、100語制限 に達したら終了
- 同じtrigramが複数回登場すると、その後続単語がリストに重複して保存されるため、
出現頻度に比例した確率的選択 が行われる
- この過程は 現在の状態のみに依存する確率的遷移 であり、
数式では P(Xₙ₊₁ | Xₙ, Xₙ₋₁, …, X₁) = P(Xₙ₊₁ | Xₙ) の形で表される
- この 記憶なし(memoryless) 特性がマルコフ性の核心
追加実験とモデル次数の調整
- 基本の次数(order)は2で、コマンドライン引数で変更可能
- 次数を3〜4に上げると文は より一貫し、自然になる
- 例: IRCコマンドと数学概念が混ざった比較的論理的な文を生成
- しかし次数を5に上げると 原文をそのまま複製 する傾向が生じ、
創造的なナンセンス(gibberish) が失われる
- 初期プロンプトを与えてテキストを生成することもできる
- 例: “Finally we” で始まる文を入力すると、
Emacs、MATLAB、GNU bash などの単語が混ざった長い文を生成
単純なモデルの意義
- 2025年現在、大規模言語モデル(LLM) が主流だが、
マルコフモデルは 大域的な構造や長期依存性 を捉えられない
- それでも、単純な設計と実装の明快さ によって、
言語生成の原理を学ぶための入門モデル として価値がある
- 著者は「このモデルこそ言語モデルの ‘Hello, world’ だ」と表現している
1件のコメント
Hacker Newsの意見
Markov Modelとは、現在の状態だけをもとに次のトークンを確率的に生成する状態機械の統計的バージョンである
状態とトークンの関係を明確に定義してはじめて意味のある議論が可能になる
たとえば、状態が最後のk個の観測値の関数なら、これはk次のMarkov Chainと呼ばれる
RNNは、以前の状態と直近のトークンの関数として状態を定義する拡張形と見なせる
状態遷移確率は決定的でも確率的でもあり得て、文脈長も可変に定義できる
ただし、すべてのMarkov Modelが学習可能なわけではない
1992年にEgghead Softwareでこういうプログラムを3ドルで買った記憶がある
自分の5年分の日記のような文章を入れて、出てきた結果を見て笑っていた
古い例としては Babble 1.0.20 と、関連フォーラムの投稿 Software Spotlight: Babble を参照できる
この記事を見て自分もMarkovモデルを試してみた
文字単位から始めたが、2次モデルにしても大差なかった
3次(trigram)にすると少し自然になった
その後、BPE(Byte Pair Encoding) でトークン化したテキストに1次のMarkovモデルを適用したところ、結果にやや一貫性が出た
しかし2次に上げると原文をそのまま複製してしまった — BPEが反復トークンを除去し、遷移が決定的になったためだ
トークン数を制限すると(例: 894 → 800)、再び非決定的になり、テキストも少し自然になった
次数を高くしすぎると(例: 5次)、テキストが乾いていて事実を並べるだけの感じになる
結局のところ、Markovモデルは単純だが、実験するにはかなり面白い道具だ
後続トークンが1つしかないチェーンを除去すれば改善しそうだが、文法構造まで消してしまう危険がある
長い単一チェーンを避けるもっと良い方法を探している
可能な経路が1つしかないなら4単語に減らす、といった具合だ
あるいは、私たちが孤独で、混沌の中に秩序を見出そうとする心の働きなのかもしれない
以前、自分も似たような実験をしたことがある
20年間で書いたファンタジーやSFの文章、約50万語をMarkovモデルに入れ、2〜5グラムのスライダーで調整していた
インスピレーションが必要なときに取り出す**「夢の井戸」**のような道具だった
子どものころに辞書の適当なページを開いて書くきっかけを探していた習慣の延長のようだった
こういうコーパスで試すとかなり面白いプロジェクトになりそうだ
発表動画 もある
個人の文章全体を学習させて、自分だけのモデルを作れるのだろうか?
どのモデルやツールを使えばいいのか、そしてシステムプロンプトなしでも自分の文体で書けるのか知りたい
さらに、電話応答やDiscordのメッセージにも自然に対応できるのか気になる
Markov Chainで作られたハリー・ポッターのファンフィクションがある
タイトルは Harry Potter and the Portrait of What Looked Like a Large Pile of Ash
botnik.orgのリンク で読める
冒頭の一文だけ見ても空虚なテキストのように感じられた
人間が書いた最悪の本よりも感情や意味がないと思う
“I Fed 24 Years of My Blog Posts to a Markov Model” のような試みは、すでに多くのLLMが繰り返してきたことでもある
Barbara Cartwrightのように、700冊以上の似たロマンス小説を書いた作家は、Markovモデルで再現できそうだ
妻もときどき、すでに読んだ小説をまた買って読んでいることがある
2000年代半ばのIRCでMarkov chainボットを見た記憶がある
GPTが出るまで、それより良いものはなかった
これは実際にはMarkovモデルというよりtrigramモデルに近い
4-gram以上に拡張すれば、ずっと自然な文が出てくるはずだ
以前「infini-gram」という超大規模n-gramモデルの研究があり、一部のドメインではLLMに近い性能を示したと聞いた
24年分の経験と思索を共有してくれて感謝している
今のように消費と刺激ばかりがあふれる時代に、こうした心のこもった共有は特別なことだ