GPT-3による村上春樹風の文章自動生成

#概要
GPT-3モデルに村上春樹氏の小説の一節を与えて、村上春樹風の文章を自動生成できるか試行します。

#背景
以前、Reformerを用いて自動生成した時は、期待するような文章を生成することが出来ませんでした。（記事「[村上春樹風の文章自動生成](https://qiita.com/artisanbaggio/items/9a1c12632deec1dbcc07)」参照)
この時の原因は学習データ不足です。村上春樹風の独特の言い回しを獲得するには、より多くの学習データが必要と結論づけました。
ただ、現実的に小説データを取り込むのに手作業が発生して手間や時間がかかりますので、簡単に解決できるものではありませんでした。

今回、GPT-3のAPIを使えるようになりました。（誰でも使える訳ではなく承認制です。）
GPT-3の精度を体感する良い機会と考えて、文章自動生成を試してみます。
もしかすると、村上春樹氏の表現も事前学習されているのではないかという期待もありました。

#GPT-3について
イーロン・マスク氏らが設立した非営利団体OpenAIによって2020年5月に発表された自然言語モデルです。
文章を自動生成する精度が非常に高く、人間が書いたのかGPT-3が書いたのか判別できない場合も多いです。さらに、単なる文章生成だけでなく、小説などの文学作品のパロディを作成したり、HTMLのソースコードも自動生成するということですから、いよいよ社会に応用できるレベルに到達したモデルだと思います。

####GPT-3モデル概要####

* 学習データ：約5兆語（45TB）
* ハイパーパラメタ：1750億個
* モデル作成コスト（推定）：460万ドルから1200万ドル

2020年9月にMicrosoftがGPT-3の独占ライセンス契約を結び、非公開になってしまうのかと心配しましたが、継続してAPIは公開されるということですので一安心です。

#村上春樹氏について
私が思う村上春樹氏の小説の特徴は、状況描写が細かくて分かりやすいという点です。
言葉で伝えるのは難しいのですが、細かいニュアンスを的確な言葉で描写することによって、かなり明確なイメージを頭の中で描くことができます。

例えば、擬音語や擬態語などで描写することによって、状況が頭の中でイメージしやすいです。

```inyou:『騎士団長殺し』より引用１
私の耳に届くのは、ワイパーの劣化したゴムが立てるかすれた音と、タイヤが濡れた路面を進む、しゃーっという途切れのない音だけだった。
```

また、洋楽やクラシック、小説、映画、オペラまで幅広い芸術作品が登場します。


```inyou:『騎士団長殺し』より引用２
私はシェリル・クロウのCDをプレーヤーから取り出し、そのあとにMJQのアルバムを入れた。
『ピラミッド』。
そしてミルト・ジャクソンの心地よいブルーズのソロを聴きながら、高速道路をまっすぐ北に向かった。
```

<!--```inyou:「騎士団長殺し」より引用３
その うち の 一 枚 は イ・ムジチ合奏団 の 演奏 する メンデルスゾーン の 八重奏曲 、 その 音楽 を 聴き ながら ドライブ を する の が 妻 は 好き だっ た 。  
```
-->

時には、具体的な地名も多く登場します。

```inyou:『騎士団長殺し』より引用３
西麻布の交差点から外苑西通りを青山に向かい、青山三丁目を右に折れて赤坂に向かい、あちこち曲がった末に四谷に出た。  
```

<!---
#タスク１
 小説の続きを生成できるか
--->



#試行環境
今回、GPT-3モデルを利用する環境は、OpenAIが公開しているplayground環境を使用します。

この環境に文章を幾つか入力して、例えば、「要約せよ」の意味である「tl;dr: 」を与えて実行すると入力した文章を要約してくれます。
下図では試しに夏目漱石著『坊ちゃん』の冒頭を与えて要約させてみました。下図の太字が与えた文章で黄色のマーカーが自動生成された要約文です。
![GPT-3_playground_紹介_坊ちゃん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/f472866b-4d5c-f039-a98f-d937c4ac588a.png)
ご覧の通り、二階から飛び降りたり、ナイフで指を切ったことを「**いつも損している**」と表現できていますので、的を得た要約になっていると思います。
初期パラメタで実行すると毎回結果が異なりますが、いずれもある程度、納得できる文章が生成されます。

<!---
なお、下図の通りパラメタを変えて単語の出現しやすさを調整できますが、今回は初期値のままで実行してみます。
<kbd><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/3343b270-5177-bd39-251c-19381a000b6f.png" width=25%></kbd>
--->

今回はこのようにOpen AIによって十分に事前学習されたモデルを使用します。

<!---
それが、自分で学習データを与えずにここまでの精度の日本語を生成できているのは、普通は出来ず、ガーファ
--->


#試行内容
一般的な場面を村上春樹風の表現で言いまわせないか試行します。
前回と同じように、企業の採用面接で村上春樹氏はどのように志望動機を説明するのか試してみようと思います。
具体的には、村上春樹氏の小説の一節に続けて、志望動機でよく使われる以下の３つの冒頭を与えた時に、後続の自動生成文が村上春樹風になるか確認します。

* 「志望動機は」
* 「前職では」
* 「職務経歴書にありますように」

#試行
###学習データ
主人公が同居している彼女から突然別れを告げられ、疑問を抱きながらも荷物をまとめて家を出ていくシーンの一節を与えてみました。（下図の太字の箇所）

####試行１－１
その後に「志望動機は」を与えて自動生成を実行です。
自動生成されたのは、下図の黄色マーカーの箇所です。

![学習データ１_志望動機_村上風〇_マーカー追加①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/ad8951bc-8e5f-7707-a614-196bd81fdb64.png)
※冒頭は村上春樹著「騎士団長殺し」より引用


```:実行結果「志望動機は・・・」
志望動機は何だっただろう？私はそれをどこかで見つけることができるだろうか？そしてそれは何だったのだろう？それがどうして私が彼女のことを好きになったのだろう？それはどうして私が彼女を愛したのだろう？それはどうして私が彼女を恋しく思ったのだろう？それはどうして私が彼女と一緒にいたいと思ったのだろう？それはどうして私が彼女に自分を捧げたいと思ったのだろう？
```

志望動機を説明する場面で「**志望動機は何だったのだろう？**」という、まさかの疑問形からスタートしました。その後も「**私はそれをどこかで見つけることができるだろうか？**」と疑問が続き、最終的には「**それはどうして私が彼女に自分を捧げたいと思ったのだろう？**」という彼女との関係性に対して繰り返し疑問を投げ続けました。

面接で疑問を投げかけたり、第三者である彼女のことを勝手に話してしまうと、不採用となるのは間違いありません。一方で自動生成された内容を見ると、前段で与えた文章が主人公自身が疑問を抱いている状態でしたので、その内容をうまく引き継いで表現できていると感じました。

この結果だけを見ても前回よりもかなり優秀なモデルであることが分かりました。

####試行１－２
冒頭の文は変えずに「前職では」を与えて自動生成しました。
青色マーカー以降が自動生成された箇所です。
![学習データ１_前職では_村上風〇、面白文章◎_マーカーあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/a69917eb-6e5a-3563-06c4-ba8db6f8ae47.png)

```:実行結果「前職では・・・」
前職では、私はたいてい時間をそのままにしていた。それは私が仕事を終えて出社した時に、最初に私が言う言葉だった。『時間はそのままにしておいて』と。
```
冒頭から驚きの発言をしています。「**時間をそのままにしていた。**」と。文字通り時間を停止させるのか、それとも別の意味なのか判断がつきませんが、出社する度に「**時間はそのままにしておいて**」と言う訳ですから、朝飯前で出来ることなのでしょう。

自身に疑問がある状態で唐突に前職の話をするときっとこうなるのでしょう。面接までに自己分析はしっかりやっておく必要がありそうです。。。

内容はともかく、自動生成された文章は「**たいてい**」「**最初に**」の単語を活用することで状況を細かく表現しています。何となく、村上春樹氏の細やかな状況描写が再現できているのではないかと感じました。

####試行１－３
冒頭の文は変えずに「職務経歴書にありますように」を与えて自動生成しました。
![学習データ１_職務経歴書_文学っぽい。筋が通っている。◎マーカーあり。これだけでも良いかも.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/94650b50-09b2-8dc4-9103-f768295b4a3d.png)

```:実行結果「職務経歴書にありますように・・・」
職務経歴書にありますように、私は約二年間、米国の大学で教鞭をとった。その間に、私は数十人の若い学生たちに、英語を教えてきた。その中には、私が最も気に入った学生がいた。彼女は私が教えていた英語の授業を、とても真剣に受け止めていた。そして、私が英語を教えていたときに、彼女は私が英語を教えているときに、そして私が英語を教えていないときにも、私にいつも懇切丁寧に接してくれた。私は彼女をとても気に入っていた。そして、彼女は私をとても気に入っていた。それは私が彼女に英語を教えているときだけではなく、私が英語を教えていないときでも、・・・
```
小説として秀逸な文学的な作品が生成されてしまいました。
ここまでのレベルで自動生成されるのは非常に驚きです。

生成された冒頭が「**職務経歴書にありますように、私は約二年間、米国の大学で教鞭をとった。その間に、私は数十人の若い学生たちに、英語を教えてきた。**」です。
採用面接でそのまま使えるのは、この最初の2文程度ですが、話が進展し「**その中には、私が最も気に入った学生がいた。彼女は私が教えていた英語の授業を、とても真剣に受け止めていた。**」と、前段で与えた彼女との別れのシーンにおいて、彼女と初めて出会った時のことを振り返るということは、本当に素晴らしい文章構成かと感じます。

こうなると私が与えた「**職務経歴書にありますように、**」が完全に邪魔ものになってくるくらい、自動生成された文章が強く印象に残ります。


###見解
今回の3つの結果を見ると、前回のReformerの時に自分で学習させた結果よりは、はるかに精度の高い結果を得られました。さらに、自動生成された文が前段の文章を受けているため、それだけでも村上春樹風と言えなくもないです。今後は、もう少し、前段にはない独自の表現が出てくるとさらに面白いと感じました。

#感想
当初、GPT-3で日本語を扱えるのか不安がありましたが、問題なく生成できました。しかも「***普通の日本語***」と言って良いレベルの文章です。
これまでのモデルでは、この「***普通の日本語***」を生成するだけでも相当に大変でした。文章を生成できたとしても単語を並べただけで助詞が適当で文の意味を理解できない事はしょっちゅうありましたし、仮に十分な日本語を学習させて何となく日本語っぽい文章を生成できたとしても、前後の文との繋がりがなく、何を言いたいのか想像できない事も多々ありました。

今回、生成された文章は、どれもレベルが高い文章でした。
この内容であれば、確かに人間が作成したのかAIが作成したのか判断するのが難しいこともあるでしょう。

なお、時間の都合で1例しか公開出来ませんでしたが、他にも異なる文章を与えてみると、やはり面白い結果が得られました。時間が出来たら追加で更新したいと考えています。


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