ディープラーニング: おたんこなすGPT-2で遊んでみる

テスラのイーロン・マスクも出資していたOpenAIのGPT-2ですが、「あまりにも危険過ぎる」と論文もコードも公開が延期された、という触れ込みの割にはあまりにファニーでステキなクオリティでした。

おそらくただの宣伝でしょう。

段階的にGitHubで公開されまして、現時点で以下のようなモデルデータに分けられています。
・124M
・355M
・774M
・1558M

これはパラメータの数とのことですが、数字が増えるほどにハイクオリティなはず。

ただしNVIDIAのGPUが必要だったり、ある程度のメモリが必要なため、うちでは355Mまでしか試せませんでした。
どうしても1.5Gで試したい場合はAWSを使うという手もあります。

しかし、ハイクオリティでも日本語では英語ほどのクオリティは出ないと思われます。

早速実装してみましょー。
pipは最新版を、pythonはバージョン3が必要です。

基本的にオフィシャルに書かれているように実行していけば可能です。
どうせコロコロ変わりますんで、できなくなっていたらオフィシャルをご参照ください。
https://github.com/openai/gpt-2/blob/master/DEVELOPERS.md

Dockerを使うと簡単なので、どうせゴミになりますし、オフィシャルどおりDockerを使いましょう。

まずはgpt-2を置くディレクトリに移動します。

git clone https://github.com/openai/gpt-2.git
cd gpt-2

Tensorflowがバージョンエラーを起こしまして、現時点では1.13.2でないとダメになってました。

pip install tensorflow==1.13.2
pip install -r requirements.txt

真面目にやりたいなら1558Mなのですが、ここは厨ニクオリティで遊ぶところなので355Mにします。

python download_model.py 355M

MacのGPUは使えませんのでCPU版にしてDockerをビルドし実行します。

docker build --tag gpt-2 -f Dockerfile.cpu
docker run -it gpt-2 bash

これでDockerが走り出したはず。
一応オフィシャルどおり、

export PYTHONIOENCODING=UTF-8

しておきます。
何も文章を与えずに自作AIクンに文章を作ってもらう場合は、

python src/generate_unconditional_samples.py | tee /tmp/samples

を実行すればいいのですが、これだとサンプルが8つ作られてしまい時間がかかるので、いったん置いておきます。

指定した文章の後に関連した文章をつなげたい場合は以下を実行します。

python src/interactive_conditional_samples.py --top_k 40 --model_name=355M

そうすると、

Model prompt >>> 

で止まるはずなので、適当に何か文章を入力しリターンします。
基本的には英語ですが、日本語でも反応します。

ここではとりあえず「The relationship between the characters of “Attack on Titan” Ellen and Mikasa」と入れてみます。
「進撃の巨人」エレンとミカサの関係は、と入れたつもりだったのですが、、、答えは、

The relationship between the characters of "Attack on Titan" Ellen and Mikasa Ackerman, who became the titular A Titan last year, has always been complicated.

After all, the series first introduced a "friend," a Titan-like robot named Mikasa Ackerman, who became the central figure of "Attack on Titan," and then a girl named Sasha. Mikasa is seen as an enemy by both Ellen and Sasha.
...(略)

Google翻訳にかけてみます。
——————————–
「進撃の巨人」エレンのキャラクターと、昨年正義のA巨人になったミカサ・アッカーマンの関係は、常に複雑でした。
結局、シリーズは最初に「友人」、ミカサ・アッカーマンという名前の巨人のようなロボットを紹介しました。ミカサ・アッカーマンは「進撃の巨人」の中心人物となり、その後サシャという名前の女の子になりました。ミカサはエレンとサシャの両方から敵と見なされています。
「10エピソードかそこらでミカサを知ったのは、サシャがショーのメインキャラクターになったことを知っていたからです。彼女がワルだということは誰もが知っています」と、女優はEWに語りました。 「つまり、彼女は完全に狂っていたが、彼女はとても頭が良かった。」
しかし、より複雑なのは、アッカーマンが夫のミカサの父親と出会い、二人が転落し始めたときであり、彼女のコースがどうなるかはミカサ次第です。
——————————–
( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \
  ( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \
    ( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \

といった具合です。
今度は日本語で聞いてみましょう。

デスノートを拾ったんだけど

答えは、
——————————–
デスノートを拾ったんだけど、することがしぇ捨てたいは、ために「ともちんこと」のはもっという。
精神が、敬月って自由の日本語が過去しています。
——————————–
なんとなく面影はありますw

ディープラーニングは本来日本語で学習を行わないと意味がないのですが、GPT-2は英語のみです。

オープンソースというからには学習する部分のコードも公開すべきだと思うのですが、悪用される恐れがあるため、として一番性能の低いモデルでしか公開していません。
「Beginner’s Guide to Retrain GPT-2 (117M) to Generate Custom Text Content」

実際に学習してみた方のツイートを見つけました。

はっきり言って20年前のクオリティから変化ありませんね。
むしろ落ちてるwww

結論、実用性はありません。
遊ぶにはおもしろいですけどね。


追記

GPT-2の1.5Gをお気楽に試せるサイトがありました。
http://textsynth.org/
英語のみです。