👌

『創作作家AI』というツールを作った&使ってもらった話

2021/12/08に公開

こちらは創作+機械学習 Advent Calendar 2021 の8日目の記事になります。

この記事は

「うすい」というものが『創作』をする人たちの支援をするようなツールを作ったり、使ってもらったりして遊んだお話です。

機械学習は初学者で、まだなんも分からんくらいなので、大したことはできません。

現在、「ノベルアッププラス」というサイトで 主に NLP、Transformer を使った創作ノベル関連のサービスを作ったり、投稿をしたりしています。

そんな自分ながら、やっと人に触ってもらえるようなツールが出来始めたのでご紹介と、多少でもこの「創作+機械学習」界隈を応援するための投稿です。

何がしたいか

一言で言えば クリエイターがたくさん増えてほしい です。

漠然とした内容でスミマセン。
今の時代、非常にエンジニアが「クリエイター」や「自分の好きな世界を構築する」ことが容易な仕組みが整ってきていると感じてますし、そういった自分の作品を発表したりセルフプロデュースしたりするのが何であっても重要になって来てるのではないかと。

私自体は、「エンジニアっぽいモノ」ですが、個人的には色々な分野に興味があります。
文章を書く「作家」のようにもなりたいし、「絵」も描いてみたい。直前まで、ニコニコでMMDとか作っていましたし、ボカロもできることならチャレンジしたい。芸能人に憧れはないけど、「YouTuber」みたいな表現は面白そうだ……とかとか。

そんな私は「エンジニアもクリエイターもAIでどっちもできるようになるんじゃね?」的な世界観を夢見てます。

鈍器で殴るように雑な絵だとこんな感じです。

雑な世界観で始めたこと

こんな超雑な世界観を達成するため、手始めに「創作小説」界隈で自分で創作もしながら、AIを使うサービスををしてみようと思いました。

ちょうど、昨年から Transformer が大きく話題になって、 驚異的な性能を持つGPT-2,GPT-3が大きく取りざたされていたことがきっかけだったように思います。

といっても、正直Webノベルほとんど読まんし、今更「なろう」というのも……。
紆余曲折ありまして、まだ比較的新しい 「ノベルアッププラス」 という小説投稿サービスに書いてみて、「創作」でなにができるか、なんか考えるかなーと走り始めました。

「ノベルアップ+」書いてみた

始めてみたのが、「うすいのお茶の間開発日誌」というエッセイっぽいものです。
https://novelup.plus/story/942595339

この中で当時、覚えたての NLP 文章生成 GPT-2 で文章生成をし始めます。
当時、日本語版GPT-2 を公開してくれた稀有な方(tanreinamaさんという異能vation採択された方と思います)がおり、その方の事前学習済みモデルを使わせてもらいました。

結構、創作作家様の反響もありまして、AIの書いた文章や、やり取りを 「面白い!」 と言ってくれた方がいらっしゃったのが素直に嬉しかったです。

他の小説投稿サイトはあまり存じませんが、変に「職業作家になってやる!」という感じでもなく、「自分の好きなものを書けたらいい」みたいな温度感のなんとなくいい人が多いサイトだと感じます。

このサイト内で、継続して「開発日誌」を書き続けており、12月7日現在、ブログ/活動報告ランキング で月間7位、年間3位、累計12位 だそうです。
これも、ひとえにつながり、応援してくれている創作作家様の賜物だと思います。

創作作家AI

創作作家様と話しながら少しずつ「このツール、公開したら意外と使ってくれるのじゃないか?」という感触が出てきて、作成した機械学習を利用したサービスが 「創作作家AI」 です。

このサービスを、一言で言うと 事前学習済みGPT-2で創作作家様の文章を読み込んで作家様のような文章がかけるAIを作ろう みたいなツールです。こちらを、単純に Google Colab で回せるように説明を入れながら書いただけ。

学習量、文章生成の精度、速度、どれも同様にGPT-2の自動生成を提供されている大曽根さんのサービス 「Buncho」 とは比べるべくもないくらいのクオリティです。

本当に 「Buncho」「AIのべりすと」 と比べるのもおこがましいくらいのサービスですが、差別化要因があるとすれば、「創作作家様の文章を学習させるよ」 という点です。創作作家さんのクセやキャラがその中に出てくるのが面白いと思ってくれている人がいるようですね。

創作作家AI Webバージョン

創作作家様との対話は、色々と勉強になります。まず、Google Colab バージョンを出したところ、思ってもみない問い合わせや質問が結構来ました。

有り体に言えば 「Google Colab難しくね?」 ということです。
エンジニアにとって、「これほど機械学習やデータ分析が楽に使えるツールはちょっと奇跡的」 なツールであっても、非エンジニアにとっては 「意味ワカンネ」 となってもおかしくないのだと教わりました。

この為、急遽 「Web バージョンとしてサービスを提供しよう」と思い立ち、公開しているのが「創作作家AI Webバージョン」となります。

https://share.streamlit.io/xbarusui/streamlit_authorai_v2/main/app.py

こちらの Web は、 Streamlit という python で簡単に Web アプリが作れてしまうという神ツールで作りました。しかも 公開githubとの連携なら無料ホストも使える という、これまた金を払う覚悟のないヘタレにも優しいサービスとなっており、少しずつ機能を追加しながら3週間くらいで作りました。

ここで、GPT-2日本語版事前学習済みモデルをrinna社提供のものに切り替えてます。
軽量で高速ながら、小さいモデルでもそれなりに整合性の取れた文章が生成されるのが魅力で、どうしても Web 利用だと長時間学習がさせられないたいめ xsmall を利用しています。

現時点でのStreamlit版のコードはこちらです。

https://github.com/xbarusui/Streamlit_AuthorAI_V2

直感で書いた汚いソースコードですみません。機能拡張重視でどんどん進めており、どこかでリファクタリングとマニュアル整備は進めようと思うのですが手が付かない……。

見るべきところは多くないですが、streamlit で直接 huggingface を呼んでいるソースコードは少ないので、streamlit から利用したい場合は参考になるかもしれません。

        train_dataset,test_dataset,data_collator = load_dataset(f.name,f.name,tokenizer)

        model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-xsmall")

        training_args = TrainingArguments(
            do_train=True,
            do_eval=True,
            save_total_limit=3,
            output_dir=st.session_state.model_dir, #The output directory
            overwrite_output_dir=True, #overwrite the content of the output directory
            num_train_epochs=epochnum, # number of training epochs
            per_device_train_batch_size=1, # batch size for training
            per_device_eval_batch_size=1,  # batch size for evaluation
            save_steps=5000, # after # steps model is saved 
            prediction_loss_only=True
            )


        trainer = Trainer(
            model=model,
            args=training_args,
            data_collator=data_collator,
            train_dataset=train_dataset,
            eval_dataset=test_dataset,
        )

        trainer.train()

@st.cache(allow_output_mutation=True, max_entries=10, ttl=3600,suppress_st_warning=True)
def load_dataset(train_path,test_path,tokenizer):
    train_dataset = TextDataset(
          tokenizer=tokenizer,
          file_path=train_path,
          block_size=128)
     
    test_dataset = TextDataset(
          tokenizer=tokenizer,
          file_path=test_path,
          block_size=128)   
    
    data_collator = DataCollatorForLanguageModeling(
        tokenizer=tokenizer, mlm=False,
    )
    return train_dataset,test_dataset,data_collator

次に目指すもの

Streamlit、Webアプリが超簡単に作れるとはいうものの、作りたいアプリのPOCくらいにしか使えず、本番運用には恐ろしく不向きだということが、その後運用してみた結論です。

作りたい機械学習アプリを作っただけで、設計がほぼ出来ていないというのもありますが、最大2ユーザくらいしかさばけません。

3ユーザ同時実行すると、もうサイトが落ちて再起動するまで動かないというシングルユーザ向けアプリになってしまいました。しかも、長時間のファインチューニングができず、かなりしょぼいものになっております。

今現在は、現サイトでの構築を諦め、学習と生成を分散し、かつ安価でも済むようにサービスを再設計しているところです。

今回得たこと

今回の体験を通じて、得たものはたくさんありますが、一番重要なものを絞るとすると。

まずは、「ノベルアッププラス」 での創作作家様とのつながり です。
AIを切り口に創作作家様とつながれたのは、単純に自分のサービスのフィードバックをしてくれる以上に大きな意味があると思っています。

次に、 創作機械学習LT を始めとしたコミュニティのつながり です。これも、大変貴重な資産であると思います。
コミュニティを通してどんなふうに機械学習を応用したサービスを考えているのか、作っているのか、その知識や論文などがつながりの中で分かります。

最後に、 この先も「この活動を続けられる」という気持ち 、でしょうか。
恐らく、来年もクリエイターに寄与する学習や活動をやっているのではないかと思っています。
まず、機械学習、深層学習という分野は奥が深いのに、すそ野が広い。それにも関わらず、まだまだ発展途上という魅力的過ぎる環境です。
ノベルアップでの活動、文章生成サービス改善はしつつ、ひょっとしたら別のジャンルに手を出しているかもしれません。

いずれにせよ 「機械学習を用いてクリエイターを増やす支援をする」 という活動をこれからも続けていきたいなと思っています。

最後に

今回、私は「創作+機械学習アドベントカレンダー」の支援を行っております。

@xbar_usui賞(機械学習を知らない人でも楽しめる記事を書いた方に授与)

ということで、正直機械学習の難しいところは置いておいて、アドベントカレンダーで、機械学習が分からずとも創作を楽しめるような記事、あるいはツールを提供してくれた方に、粗品(3000-5000円くらいのアマギフを想定)を贈呈する予定です。

まだ、空いている枠もありますので、もし良かったら、投稿してもらえたらと思います。

最後までお読みいただき、ありがとうございました!

Discussion