年の瀬にドグラマグラを学習した特級呪物AIを生み出してみた【2022】
TIP
ドキドキ! gpt-2-japaneseにドグラ・マグラを死ぬほど学習させたら、精神を崩壊させる文章を生み出し続ける特級呪物が生み出せるんじゃないの選手権!
WARNING
目次
初めに
近年、AIは高度化・民主化され、比較的簡単に開発や学習を行えるようになってきました。そのタスクのひとつとして、文章生成があります。 小説を学習させて、小説を書かせようという試みですね。 絵を描かせたり、音楽を作らせたり、人間がしたいことばかりさせるのって贅沢なことだよなと思いつつ。
普通に小説を書かせるのは先駆者たちが手をつけているので、今回はちょっとしたお遊びです。
三大奇書のひとつとして数えられるドグラ・マグラ。読んだことはなくても名前だけ知っている人も多いかと思います。それをAIに食わして、読む人の精神を崩壊させるようなデジタルドラッグを生み出しちゃおうというプロジェクト、はっじまっるよー。
基本用語
用語 | 意味 |
---|---|
ドグラ・マグラ | 夢野久作の小説 |
gpt-2-japanese | 文章生成タスクで高い性能を誇るモデル。gpt-3もあるがパラメータ数が膨大でかつ無料で利用できないため採用 |
スクリプトファイル | .shの拡張子のファイル。bash file.shでコマンドをまとめて実行できる |
実現までの流れ
- 青空文庫からドグラ・マグラのテキストファイルをダウンロードしてきて、AIに食わせるための前処理をする。
- ここは今回は深く触れません。気が向いたら別の記事として書くかもです。
- gpt-2-japaneseをクローン
- モデルをダウンロード
- 動作確認
- ファインチューニング(学習)
- 成果物確認
技術的解説
結果だけ見たいひとは成果物まで飛ばして見てね。
gitlabリポジトリ
https://gitlab.com/hiranorm/create_text
前提
- python構築済み(うちは3.10.9でやってます)
- GPU使える環境構築済み(CUDA等)
- スクリプトファイル実行できる(まあ
bash file.sh
するだけだけど)
ソースコード説明
data_makeディレクトリ以下には学習データ作成のためのjupyterファイルが入っています。今回は説明を省略します。 気が向いたら別の記事で。
0_venv.sh
pythonの仮想環境を構築します。
# 仮想環境構築時のみ実行
python -m venv venv
1_gpt2_ja_install.sh
リポジトリをクローンして仮想環境のpythonにライブラリをインストールします。CUDAを使う場合はここでtensorflowがちゃんと認識できているか問題が浮上したりします。
# 環境構築時のみ実行
source venv/bin/activate
git clone https://github.com/tanreinama/gpt2-japanese
cd gpt2-japanese
pip uninstall tensorflow -y
pip install -r requirements.txt
2_download.sh
モデルをダウンロードします。MODELのところの-mediumを-largeとか-smallにしたらそのモデルをインストールして配置します。
ゴミは残さない。きっちり仕事をこなせ。
export MODEL=gpt2ja-medium
wget https://www.nama.ne.jp/models/$MODEL.tar.bz2
tar xvfj $MODEL.tar.bz2
mv $MODEL gpt2-japanese/$MODEL
rm -r $MODEL.tar.bz2
3_generate.sh
文章を生成します。今回は学習させたモデルに対して生成するのを主としてます。
ダウンロードしたモデルを使うなら、--modelのところを単にgpt2ja-mediumとすると良いです。
source venv/bin/activate
cd gpt2-japanese
python gpt2-generate.py --model checkpoint/gpt2ja-finetune-dogura-medium --num_generate 10
cd ..
4_finetune.sh
学習させます。 --epoch の数を変えればそれだけループするようにソースを変更してます。
具体的に言うと、gpt2-japanese/run_finetune.pyに対し、
parser.add_argument('--gpu', default='0', help='visible gpu number.')
の下に、
parser.add_argument('--epoch', metavar='epoch', type=int, default=100, help='epoch num')
を追加。
if counter % args.save_every == 0:
の上の、while True:
を削除し、その行に、
for i in range(args.epoch):
を追加しています。
source venv/bin/activate
cd gpt2-japanese
python ./Japanese-BPEEncoder/encode_bpe.py --src_dir text_data --dst_file finetune-dogura
python run_finetune.py --base_model gpt2ja-medium --dataset finetune-dogura.npz --run_name gpr2ja-finetune-dogura-medium --epoch 10000
cd ..
gitlabリポジトリ
https://gitlab.com/hiranorm/create_text
成果物
10個文章を生成させて、擬似的に小説のような形にしています。
ドグラマグラのみエポック1000学習モデル(gpt2-japanese-mediumから学習)
本文
その間に、呉一郎の頭がだんだんと澄み渡って来て、やがて何事かを思い出したらしい様子で、口を開いた。
これは、実に痛快極まる実直な研究だ。吾輩が若き時分に、かように夢うつつの体で「脳髄の実験」というものに精を出していた処から見ると、その深刻、惘痛烈な内容の一端が、吾輩の興味とのせめぎあいに外ならないのだから止むを得ない。吾輩はどこまでも付きまとう困難を打ち払って、悠々と大学に復旧するつもりである。
……それから後、どのようなものが正木博士の心に触れたのでしょうか……彼は、何かしら正木博士に関する一つの嫌疑を投げかけておられたように思います。たとえば或る狂人の解放治療に関する疑いから……或る精神病者の解放治療に関する疑いから……或る学術研究に関する疑いから……。
「……………」
……何だかこの事件の真相が色々と不可思議で……。
あの時から私は貴方に云って聞かせたい事が色々とありましたから、とにかく今迄通りに貴方と関係を継続しますと同時に、もう以前の通り、貴方と同棲する係りを私とお受ちになるのが順当ではないかと思いまして、その上でこの通り貴方に直接のお返事を頂ければ、私はそれを最初のうち一つの目標に過ぎないのですが、如何でしょうか」
……どうも。……この間の七月二十火曜日に、あの七号室で見た少女……千世子の美しい少女の解剖像と、御覧の通りの部屋の状況ですが、実に御覧の通りですと、やはり頭の上の台の上には、何か白い長方形のようなものが載っているように思います。けれども、これは何か判然りませんので、今一挺の絵筆で模様を調べてみますと、やはり四角頭と呼ばれる頭の上の冠の形をしているので、これと思う処の冠ひもを解いてみると、やはりそうなったのはやはり白い絹の帯で、薄い金糸で括り引っ張ってあるところでしょうか。細い、丸い足が四本ありますから、お尻が見えますね。
思い出したように、眼の底が……ガラリと変った。それは……そういえば今朝から今朝の間に起ったタマ一個倍の……何かしら深い……不可思議な裡面に何かしら感じ初めたような……………………。
それを見た正木博士は思わず吹き出した……が、それが余りにも妙に面白くて堪らなかったので、思わずうなずきつつ片手を上げて応えた。
しかし、あの青年はそうしなかった。やはり私を、狂人の狂麻痺から救い出すべく藻掻いたのだろう。それともあの青年以外に、私自身の狂麻痺の正体を知らしめるくべく、最後の手段として何かしら狂人の血を取り入れる材料を探していたのだろうか……何にせよ私の記憶に残っている限りでは、あの青年がそうしたように私に近付き、或は私と同じ方向へ倒錯性痙攣させようとした事なぞは、微塵も記憶えていない。
評価
元の文章に近い気がするものの、文章としては読めるしドグラマグラの雰囲気も出ています。
ドグラマグラのみエポック10000学習モデル(gpt2-japanese-mediumから学習)
本文
すると今度は若林博士もそうした、私の気持ちを察したらしく又、どこか含みのある返事を寄越した。
……どうして……どうして私は今の今までこの事実に気付かなかったのだろう……。
……若林博士もそう云った。私も若林博士もその時に、そうかというようにうなずいた。
……どうして……どうして私は今の今まで……こうして貴方の手を引こうとしていたのだろう……。
御末座様は、そうした御立場に於ては、この事件の真相を明らかにするどころか、却って墜落の恐怖を来しつつ、自身の過去の御記憶を喚び起すべく、苦心されておられるようで御座います。そうして黙って事件の真相を迎え入れざるを得なくさせられるような、徹底した推理の行き届く頭を持っていなければなりませぬ。……というのがその考え起したる説明で御座います。同時に、その説明が行き交っておりますうち悸息しております程のよそおい……とかさね……云々。
すると今度は若林博士も、やおら卓子の端に両手を支いた。そこに突伏したまま、頭を左右に振りながら、ヨロヨロと起き上った。
。
……どうして……どうして私は今の今までこの事実に気付かなかったのだろう……。
ノートと白紙を二重に重ねたようなその綴込は、しかし、誰が、どうして、どうしてこんなものを、私の手に持って来たかという事は、もう、とうとなってしまっている。私は溜息をした。さよなら、今度こそこを去るべき機会だ。
……どうして……どうして私は今の今までこの事実に気付かなかったのだろう……。
評価
過学習している感じがしますね。 事実に気づきがち。
続・ドグラマグラのみエポック1000学習モデル(gpt2-japanese-mediumから学習)
私は逆立ちをした。という文章から作成してもらいます。
本文
往来に出て、人の頭を支えたまま、ズルズルと座り直した。その時に、若林博士が背後から、抱き止めてくれた。しかし私の全身は、今までの倍近い速さで、夢中遊行状態に陥って行った。
女の両手を握って、思い切って引っ繰り返した。
眼の前が世界中の眼で無くなり、全身が見る見る青乾きになって行くのを、どこか足りないと思いながら、どうにかして元の廻転椅子に帰りたいと最初の一所懸命に努力した。
眼の前が一瞬にして真暗になった。息が詰った。喘ぎ出した。眼の前が急に真暗になった。……何も見えなかった。音も聞えなかった。扉の閉った音も聞えた。顔も名前も姿もチットモわからない男たちが、私の足と、顔と、顔と、顔をスッポリと舌で絡め合って、喘ぎ出すような声も、喘ぎ出したような気がした。中には魂を喰われたような表情をしている者までいた。その気味の悪い室内の中を、ホントウに、どこからか流れて来る疲れ切った人々の息も洩らし切った声と身振りと、身振りとがドッと流れて、一つの歌みたようなものになって終おうとしていた。けれどもその中に、まだ何者かハッキリと聞き分けられぬ人間が、何者かという尋ね方から、サリーか何かを遣っているに違いない事を察していた私は、なおもソロソロと前へ出て、歌を唄い続けた。
ががが……と立ち上って、ヨボヨボの姿でヨチヨチとアトカタの方へ行った……ように見えた。……が……急に立ち止った。顔を上げて、周囲を見廻した……次の瞬間には、自分の耳を疑った。
眼の前に倒れている正木博士の頸部を、狙い澄まして落ち付いて狙い詰めた。」
眼の前が真暗になって、いつの間にか室の中にいて、自分の思い通りになっている『キチガイ地獄』の世界に陥った。……何もかも真実になって、この教室を去って行かれる『尺稼ぎ』のために……正木博士の次の仕事を引受るために……この通りを歩いて、この窓を覗いて……そうして、正木博士の部屋の前に来ると、ピタリと立止まって、正木博士の死んだ眼を見ていた。……この世からなる地獄の底に沈んで行くような……正木博士の冷然とした声が聞える……。
自分の呼吸が、自分の心臓が、そうして何の苦もなく引っかかって、お陀仏になるように、ピッタリと密着してくれば、最早何もかもすぐに事足に出来ると思って……。
皮膚が破れ、肉が破れ、骨が折れ、血が流れ出して、全身の意識を引き釣り込んで、どこへか消え失せて行くように感じた。
けれども、このままでは木更は来ない。そうして、自分の犯した罪の重さを思い知った。この絵巻物を失敬して、この家の番をして、そのために、この絵巻物を持ち出して、呉青秀の手に握り込んだこの男にまん延する事になるのだから、たまらなくなった。
評価
頭がおかしくなりそうな雰囲気が出ている! 過学習の可能性を考えるため、tensorboadで損失関数の収束を見てみます。
何度か途中で学習を切ってしまっているせいで、どれくらいで収束するかはわかりませんが、おそらく4000ループ程度で収束するので、一応再度学習させてみます。
まとめ
ドグラマグラを学習させると頭がおかしくなりそうな文書生成AIが作れました!
ただし、ちゃんと元の文章以外で作成できるようになるにはもうちょっと工夫が必要そうでした
他にも、夢野久作のデータは収集済みなので、学習させて試してみたいと思います。
Thank you for reading!