Apple silicon専用の機械学習フレームワークMLXと,MLXを用いた大規模言語モデル(LLM)を利用するためのツール群MLX-LMを用いて,芥川賞作家円城塔の小説を模倣する(ことが期待される)小説生成機関を作成したので,作成方法や運用結果について記す.
導入
Appleは,自社で開発したApple silicon専用の機械学習フレームワークMLXを公開し,またMLXを用いた大規模言語モデル(LLM)を利用するためのツール群MLX-LMを開発・公開している.
一方,芥川賞作家である円城塔は,自身のGitHubで小説データセットを公開している.データセットには2000字×100ファイルの『通信記録保管所』,10000字×4ファイルの『花とスキャナー』の2種類があり,いずれもCC BY-NC 4.0で公開されているうえ,“個人的な読書,非営利での朗読/機械学習のデータなどに利用することができます”として,機械学習の学習データとして利用することを明確に許可している.
また,国立情報学研究所は,学習済みの日本語大規模言語モデルとしてllm-jp-3-13bを開発・公開している.
これらは,いずれも無料で利用可能であり,しかもその作成手法は合法であると推定される.今回は,追加学習元となる円城塔データセットが小さいため,追加学習にはLoRAを採用した.これらの技術を活用すること,さらにその活用に関する実際の手法を共有することによって,機械学習の成果を安全に活用した創作活動の拡大に貢献する.
方法
MLXがApple silicon専用のため,Apple siliconを搭載したmacのみを想定する.当方はM4 mac mini (RAM32GB)を使用している.学習にはRAMを20GB以上使用するため,RAM24GB以上を搭載したマシンで実行することを勧める.
あらかじめ,Pythonパッケージマネージャのuvを導入しておくこと.uvについては,こちらを参照のこと.
以下のコマンドを実行して,作業ディレクトリを用意する. MLX-LMのデータセットと,円城塔の学習用データセットも同時に用意する.
# 作業ディレクトリを配置したいディレクトリに予め移動しておく # 依存関係から,pythonのバージョンは3.12を指定すること uv init -p 3.12 enjoe_lora cd enjoe_lora uv add datasets mlx-lm #llm-jp-3-13bをquantizeしたモデルに置換する mlx_lm.convert -q --hf-path llm-jp/llm-jp-3-13b --mlx-path llm-jp-3-13b-q git clone https://github.com/EnJoeToh/stories_2000.git . .venv/bin/activate
以下のPythonコード(split_doc.py)を用意し,作業ディレクトリ(ここではenjoe_lora)直下に配置する.
from datasets import load_dataset dataset_enjoe = load_dataset("text", data_files="stories_2000/0*.txt", sample_by="document") dataset_enjoe = dataset_enjoe['train'].train_test_split(test_size=0.1, shuffle=False) dataset_enjoe["train"].to_json("stories_2000_sample_by_document/train.jsonl") dataset_enjoe["test"].to_json("stories_2000_sample_by_document/test.jsonl")
上記のPythonファイルを実行する.
python split_doc.py
続けて,LoRA*1の学習を行う.以下のコードを実行し,70分ほど待つ.RAMは20GB前後使用する.
cp stories_2000_sample_by_document/test.jsonl stories_2000_sample_by_document/valid.jsonl mlx_lm.lora --model llm-jp-3-13b-q --train --data stories_2000_sample_by_document --batch-size 1 --iters 100 --adapter-path llm-jp-3-13b-q_it100_seed42 --seed 42 --steps-per-report 20 --save-every 50 --max-seq-length 1300
これが完了すると,小説の生成が行えるようになる. 以下のようにして小説を生成する.
mlx_lm.generate --adapter-path llm-jp-3-13b-q_it100_seed42 -m 1300 --temp 0.8 --seed 2 --model llm-jp-3-13b-q --ignore-chat-template --prompt " 誰もがいつかは帰ってこられると考えて旅立つが、帰ってきたものは誰もいない。"
この呪文のうち,temp, seed, および最後に入力するpromptが主なパラメータであり,これらを適当にいじることで,無数の差分を得ることが出来る.
作業を中断する場合は,deactivateを実行して,仮想環境を終了する.
deactivate
作業を再開する場合は,作業ディレクトリ(ここではenjoe_lora)に入り,もう一度activateして仮想環境を開始する.
. .venv/bin/activate mlx_lm.generate --adapter-path llm-jp-3-13b-q_it100_seed42 -m 1300 --temp 0.8 --seed 2 --model llm-jp-3-13b-q --ignore-chat-template --prompt " 全ての可能な適当な文字列。そこに全ての小説が含まれているというけれど、僕にはそうは思えない。"
結果
生成された小説の中から,以下の一例を示す.
誰もがいつかは帰ってこられると考えて旅立つが、帰ってきたものは誰もいない。
そんなに暗い話でもない。
もちろん帰れなくなった者もいるにはいるが、大半はわざと帰れない。
内心のしこりを解消したり、気になる疑問を解決したり、様々な理由で人々は異世界へと飛び立つ。あるいは異世界が人々の前に姿を現す。
「異世界」は好んで人の前に姿を現そうとはしないが、「異世界」に人々が好まれて現れようともしないのだから同じようなことである。
異世界への入り口は案外多い。
都市の中心部にある巨大な石の柱、行方不明者が帰ってきた場所として有名な山のふもと、海や湖の岸辺、郊外に残された廃墟、ダンジョンの扉、書物を納める書庫の奥。わけのわからない巨大な迷宮をさまよっても異世界にたどり着けるかも知れない。
異世界への入り口は多くの場合、本人の心の内側にあって、誰もがその姿を見ない。
異世界との入口は目に見えるものではない。光として見えるものでもない。
異世界へと通じた扉は、強い力を持っている者にとっては扉として見える。穴の口として見える。
強い力を持っていない者は扉の横を通り抜け、穴の横を通り過ぎる。
そして強い力を持っている者だって、穴の口や扉に見えるのはその事態のときだけで、通りすがりに穴の口があり、扉があってみても、そんなものが見えたことはない。
現実が、現実の世界に見えている。
現実は現実の世界に見えているのだし、現実は現実の世界に見えている。
現実は現実の世界に見た目では見えない。
私たちの脳みそは、現実の方を現実であったこととして処理する。
現実の方を現実として処理する。
そのために現実ははないものとされ、世界は様々に変質する。
このことについて正確に述べるのは難しい。
私達は確かに目でなにかを眺めている。
しかし目で眺めている現実と、脳が処理している現実とでは、その内容はかなり違っている。
私達が現実を脳に伝えているのではない。
私達は脳の現実を眺めている。
多くは、そして継続的に、穴の口や扉の向こうを見通す力はない。
穴の口や扉の向こうを見通す力を持たない人物は、多くはその力の存在に気づいていない。
穴の口や扉のむこうへは行くことができない。
三平方の定理は穴の口や扉では真にならない。
穴の口や扉は、もっと強い力によって奪取できる。
穴の口や扉のむこうへは行くことができない。
でも行ったやつがいる。
別に行ったやつを非難するつもりはない。
ただ、行ったやつは観測の網から漏れ落ちる。
穴の口や扉のむこうへは行くことができない。
穴の口や扉のむこうへは行くことができない。
穴の口や扉のむこうへは行くことができない。
穴の口や扉のむこうへは行くことができない。
これは極めて良くできた方の作品であることに注意したい.このレベルの作品は,20-50個生成させて出てくるかどうか,という肌感である.無論,これが最も優れた作品というわけではない.最も優れた作品については,数個をまとめて,創元・早川・星新一の各賞に応募することを考えているため,ここでは公開しない.
また,生成中にシェルを破壊されて強制終了する事態がしばしば発生した.おそらく,シェル上で表示できない破壊的な文字列を流し込まれているものと思われる.これを回避するには,シェルへの標準出力を省略し,パラメータを変えて生成を繰り返すようにして,後から文章を確認する形にすればよい.
#!/bin/zsh #echo "test" for SEED in {0..99} ; do for TEMP in {75..84} ; do TEMP_para=0.${TEMP} mlx_lm.generate --adapter-path llm-jp-3-13b-q_it100_seed42 -m 1300 --temp $TEMP_para --seed $SEED --model llm-jp-3-13b-q --ignore-chat-template --prompt " 結果があって、原因がない。そんなことはありふれていて、例えば化石として見つかる生物の肢体がそれにあたる。" > s${SEED}t${TEMP}.txt done done
議論
国立情報学研究所が公開するllm-jpの元データの再配布に関する著作権法上の問題
国立情報学研究所(NII)は,国立国会図書館(NDL)が収集・公開している国立国会図書館インターネット資料収集保存事業(WARP)で収集したPDF・HTMLに含まれる日本語文書の提供を受け,これをllm-jpの元データとしてHugging Faceで公開・再配布しているが,これは著作権法上のグレーゾーンではないかと考えられる,
一般に,インターネット上の公開情報であっても,サイトを構成するデータを保存・再配布することは著作権法上の制限を受けると解釈される.NDLにおけるWARPが合法とされているのは,NDLがインターネット資料*2を保存・公開(再配布)するにあたっては,著作権による制限を受けないことが著作権法および国立国会図書館法で定められているからである.
一方で,NDLがWARPで収集した情報をNIIが再配布することは,著作権法および関連法規等に明記されていない.したがって,NIIがHugging Faceにデータセットを公開することは,WARPの収集対象(大元の公的団体等のウェブサイト*3)とWARPの収集個体群が公開情報であるとしても,著作権法上のグレーゾーンではないかと考えられる.
円城塔の模倣を生成するために,エンジニアが円城塔を模倣する必要がある問題
今回の試験運用で,円城塔らしい文章の模倣をする小説生成機関の作成に成功したが,実際には,円城塔らしい出力を得るためには,最初の入力を円城塔っぽくした方が具合が良さそうである,という知見が得られた.これは私の感覚的なものに過ぎないのだが,現状では円城塔っぽい入力の方が打率がいい気がする.
円城塔を模倣するためには円城塔を模倣する必要があるのはそうなのだが,この程度なら円城塔ファンである自分自身が模倣した方が精度・速度ともに優れているという結果になりそうである.真に工学的な生成を目指すのであれば,操作手に依らず十分な出力が得られることが期待されるため,より一層の技術開発が必要となるだろう.
確認のために結局人力査読が必要な問題
これまでの経験から,promptを固定し,tempを0.75-0.84の範囲で舐めながら,seedを変化させていくという形で2次元パラメータ空間の探索をするのが一番効率的なように思われる.ただ,結局のところ,高速で小説を生成させたところで,その評価をするのが人間であっては,人間が律速となってしまう.したがって,生成された小説を機械的に篩い落とす仕掛けが求められている.
感想
出力させること自体は面白いし,出力自体も完成度が高くて見る分なら楽しいのだが,商業作品として買ってもらうまでには距離があるように感じる.ただし,日本語として破綻していたり,変なアトラクタに吸引されてしまったりしたものを機械的に除いた場合,訓練されていない人間の書いた文章よりまともである.この感覚を確かめるために,星新一賞に最も優れた出力をそのまま応募することを考えている.
円城塔は,アトラクタに吸引されて言葉遊びを繰り返しつつも,言葉遊びによって導かれた一見矛盾することが実は本質であり,それによって思いもよらない事物同士が数理的には同一であることを指摘し,アトラクタから一気に脱却してSF的ヴィジョンを提示する,という構造を多用する作家である.今回作成した確率論的円城塔模倣機関には論理と数理がないので,言葉を捏ねくり回すだけに留まる場合が多く,円城塔の魅力の一部を確実に持ち合わせていない.
また,円城塔は多義的な言葉遣いや,情景描写をほとんど行わない作家である.これは自覚的なものなのだが,件の確率的円城塔模倣機関は,トークンが確率的に並べられているだけであるがゆえに,多義的で開かれた読みを可能とする文字列を提示することがある.円城塔コーパスと出現確率が同一であるのに,描かれる情景などが極端に異なることは,強烈な異化作用を文字列に与えている.今回のような,特定作家の模倣という取り組みは,同一出現確率であるにもかかわらず,元の文字列と全くかけ離れた文字列を出力するという方向で創作・研究に寄与する可能性がある.
おまけ
円城塔作品の書き出しは,実のところ,あまり円城塔っぽくないことが多い.そこで,円城塔っぽい書き出し案をいくつか挙げるので,これらを用いて生成に挑戦してみてほしい.これらは,私が実際に生成に用いたことがある文字列である.
数学者を、珈琲を定理に変換する装置であるとするならば、ぼくはその逆だ。
それは猿がキーボードを適当に叩いた結果ではない、というのが結論ということになった。
結果があって、原因がない。そんなことはありふれていて、例えば化石として見つかる生物の肢体がそれにあたる。
なんとか例えるとすれば、ここは踊り場。無論、オアシスでもある。ロプノールではないことは、必ず保証する。
ここから話すつもりはなかったのだけれど、どこから話すべきかというものもないので、こうして話しはじめることになる。
参考文献
Akimasa Kitajima, Apple silicon専用機械学習フレームワークでLLMのファインチューニングをやってみた, 2024, https://qiita.com/asamiKA/items/3fdf89771084e3625643
Apple, MLX, https://github.com/ml-explore/mlx
Apple, MLX-LM, https://github.com/ml-explore/mlx-examples/tree/main/llms/mlx_lm
Shinichiro Tabayashi, uv (pythonパッケージマネージャー)の使い方 詳細版, 2024, https://zenn.dev/tabayashi/articles/52389e0d6c353a
国立情報学研究所, llm-jp/llm-jp-3-13b, 2024, https://huggingface.co/llm-jp/llm-jp-3-13b
Edward J. Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weizhu Chen, LoRA : Low-Rank Adaptation of Large Language Models, 2024, https://doi.org/10.48550/arXiv.2106.09685
著作権法, https://laws.e-gov.go.jp/law/345AC0000000048
国立国会図書館法, https://laws.e-gov.go.jp/law/323AC1000000005
*1:Low-Rank Adaptationの略.既に学習済みのモデルに対して,新たに少数の学習データを追加し,この新たに追加した学習データの特徴へのファインチューニングを行うのに便利な機械学習の手法.円城塔の短編「ローラのオリジナル」に登場するローラはこれのこと.特定の特徴を学習することに有利であることから,特定の作家を模倣した学習モデルの生成に用いられることが多い.
*2:国立国会図書館法第25条の3第1項の規定により同項に規定する“インターネット資料”を指す.これは著作権法第43条に表れている“インターネット資料”と同一であることが明記されている.
*3:公的団体のウェブサイトには著作権を認めないとする意見もあるだろう.しかし,実際の公的団体のウェブサイトには,著作権保護期間中の俳人・詩人の作品が丸ごと掲載されている事例がしばしば見られる.短歌・俳句・川柳は一句だけで作品全体と見做されるため,著作権の保護対象となる作品が非合法に含まれてしまっている例が除ききれない.したがって,そもそもWARPの収集対象が著作権的にクリーンである保証はない.