概要
青空文庫に収録された明治期の作家 14 名の作品(約 7.5M 字)で、日本語 LLM llm-jp/llm-jp-3-3.7b をファインチューニングしました。現代的なプロンプトに対して明治論説文風の出力が出ます。
機械学習が専門ではないため、手法の詳細には立ち入らず、手順と結果の記録として共有します。(というより、正味よくわかってないです)
デモ
以下で実際に試せます(無料 CPU Space で動かしているため、1 回の生成に数十秒〜数分かかります)。
プロンプト先頭に 【福沢諭吉】 【夏目漱石】 などの作家タグを付けると、その作家の文体に寄せられます。
どんなものか
プロンプト: "電子計算機とは、"
電子計算機とは、何を指していうのか。その名の如く計算機という意味か。
それとも、単に電気的に動く機械ということか。この質問は非常に重大な
問題である。なぜなら、もし電気的に動くものなら、その価値は甚だ小さい。
というのは、今日においても、電気的運動は、人間の頭脳に対してなんらの
作用も及ぼさないからである。しかしながら、もしこれが、或る種の特殊の
機械であるならば、それは大なる価値がある。というのは、それが人類の
ために有用なものであって、将来もなお
福沢諭吉の『学問のすゝめ』『文明論之概略』に出てくるような自問自答の論法が再現されます。
題材
青空文庫で公開されている明治期の作家 14 名の作品を使用しました。福沢諭吉、森鷗外、夏目漱石、樋口一葉、幸田露伴、正岡子規、二葉亭四迷、尾崎紅葉、泉鏡花、徳冨蘆花、国木田独歩、北村透谷、中江兆民、田山花袋。
理由:
- 文語体・漢文訓読体の特徴が明確
- 文明開化期の新訳漢語(「社会」「個人」「自由」など)を含む
- 著作権が完全にクリア
- 作家ごとに文体の癖が強く、学習の効果を確認しやすい
やったこと
青空文庫の txt は Shift-JIS で独自のマークアップ(ルビ、注記、底本情報)を含むので、まずそれを除去しました。
import re
text = re.sub(r'|', '', text)
text = re.sub(r'《[^》]*》', '', text) # ルビ
text = re.sub(r'[#[^]]*]', '', text) # 注記
text = re.sub(r'底本[::].*', '', text, flags=re.DOTALL) # 底本情報以降
学習データの各作品冒頭に 【作家名】 タグを挿入し、推論時にタグで文体切り替えできるようにしました。
ファインチューニング手法は QLoRA を使用しています。RTX 5070 (12GB VRAM) で 3.7B モデルを扱うため、4bit 量子化 + LoRA でベースモデルの重みを凍結して差分だけを学習する手法です。今回はライブラリ(transformers + peft + bitsandbytes)の既定設定寄りで回しました。
試してみて
- 3.7B モデルでも VRAM 12GB で QLoRA なら十分動く
- 作家タグによる文体切り替えは思ったより効く
- 明示的な指示なしに、学習データの文体(文語活用、論説構文、作家ごとの語彙)が出力に反映される
生成結果を見ると「冗長」「賢そうに書こうとしている感じがある」という印象を持つかもしれません。これはモデルの問題ではなく、学習データである明治論説文・小説の文体そのものが反映されていると思います。実際の学習データからいくつか抜粋します。
福沢諭吉『学問のすゝめ』初編より:
「天は人の上に人を造らず人の下に人を造らず」と言えり。されば天より人を生ずるには、万人は万人みな同じ位にして、生まれながら貴賤上下の差別なく、万物の霊たる身と心との働きをもって天地の間にあるよろずの物を資り、もって衣食住の用を達し、自由自在、互いに人の妨げをなさずしておのおの安楽にこの世を渡らしめ給うの趣意なり。
1文で 150 字を超え、主張と理由と結論がひとつの文に畳み掛けられています。
夏目漱石『草枕』冒頭より:
山路を登りながら、こう考えた。
智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい。
ここはまだ簡潔な文章になっていますが、この直後に続く展開は:
住みにくさが高じると、安い所へ引き越したくなる。どこへ越しても住みにくいと悟った時、詩が生れて、画が出来る。(略)ただの人が作った人の世が住みにくいからとて、越す国はあるまい。あれば人でなしの国へ行くばかりだ。人でなしの国は人の世よりもなお住みにくかろう。
「住みにくい」を 5 回反復しながら、同じ語を軸に観念を展開していく構造です。
森鷗外『舞姫』冒頭より:
石炭をば早や積み果てつ。中等室の卓のほとりはいと静にて、熾熱燈の光の晴れがましきも徒なり。今宵は夜毎にこゝに集ひ来る骨牌仲間も「ホテル」に宿りて、舟に残れるは余一人のみなれば。
一文ごとに雅文調の修飾を重ねていきます。「いと静にて」「晴れがましきも徒なり」のように、状態を形容詞を連ねて詳述する書き方です。
生成例で見られた「何を指していうのか。〜という意味か。それとも〜ということか」という疑問文 3 連発も、こうした明治文の反復・畳み掛け・詳述のパターンを、モデルが統計的に再現しているのだと思います。
実は今回に至る前に、もっと小さなモデル(rinna/japanese-gpt2-medium)でフルファインチューニングを試していて、そちらはベースの日本語能力を壊してしまい、意味不明な文字列が混ざる結果になりました。設定をうまく合わせれば避けられたのかもしれませんが、今回は QLoRA に切り替えた方が安定して回せた印象です。
参考
- 青空文庫: https://www.aozora.gr.jp/
- llm-jp/llm-jp-3-3.7b: https://huggingface.co/llm-jp/llm-jp-3-3.7b