対話の応答文をいい感じにスタイル変換するための実験

# 導入

> ぼくのかんがえたさいつよの 対話システム をつくりたい

僕の過去の投稿を見ればなんとなくわかると思いますが、僕がここ数年研究している内容は特に深層学習を用いた対話システムの一部だったり全体だったりです。

ところでさいつよの対話システムなるものを思い描いているわけですが、みなさんの考える「さいつよ」とはなんでしょう。

例えばそれはお願いしたいことをきちんと汲み取って、さっさとその処理を完了させてくれることを指したり、或いは意図を上手く汲み取ってくれることを指したりするかもしれません。

そんな中で僕の思い浮かべる「さいつよ」とは、**めっちゃ人っぽい！** というものです。人っぽい、というのは例えば好きな食べ物があったり、ジェットコースターが苦手だったり、性別が何となく透けて見えたり、”特定の口調”があったりすることを指します。

今回僕が紹介するのは、そんな「さいつよ」の要素の一つ、 **特定の口調** を持たせる部分の実験です。

<a id="orgef7f4a5"></a>

# 関連研究

文章に対してスタイル付けを行うというタスクは、マイナーな ように見えて実際マイナー **でした** 。なぜなら評価が簡単に出来るものではないからです。画像のスタイル変換なんかは Inseption Score なんかを使うことが出来るようですが、自然言語処理でそのような枠組みはあまりしっかりと確立されていません(今年になって、こういう評価をしようぜ、という[論文](https://arxiv.org/abs/1904.02295) が出ているので、この分野を研究したい人は参考にすると良いでしょう)。

後はこのタスクにあんまり需要がない、というのもあります。訛りのある文章を修正したり、 [某ーナスさんみたいに人間の気持ちを理解した文章に修正したりする場合](https://gigazine.net/news/20181023-linus-torvalds-return-to-linux/) くらいしか実用的な使い道が見えない、ということです。とはいえ最近では(というか2019年度は)びっくりするくらい論文が出ているので、"いよいよ時代が来たな"、という心持ちです。

そんな中で関連研究として挙げられるものは、[Sequence to Better Sequence](http://people.csail.mit.edu/jonasmueller/info/Seq2betterSeq.pdf) 、[Style Transfer from Non-Parallel Text by Cross-Alignment](https://arxiv.org/abs/1705.09655) 辺りが有名でしょう(~~僕が研究していた当時はこれらが有名でした~~)。Style Transfer from Non-Parallel Text by Cross-Alignment については DL輪講の [SlideShare](https://www.slideshare.net/yuyasoneoka/dlstyle-transfer-from-nonparallel-text-by-crossalignment-81453311) がわかりやすかったので、こちらをおすすめします。また関連研究の一覧を見たいのならば、こちらの [Githubのページ](https://github.com/fuzhenxin/Style-Transfer-in-Text) がおすすめです。
Sequence to better Sequence についての簡単な説明はこちらの [研究発表の動画](https://vimeo.com/240608222) が公式な感じなので良いのではないでしょうか。


<a id="orgef34799"></a>

# 実験に用いる手法

今回実験に用いるのは、**Sequence to Better Sequence** をちょっと弄ったモデルと **CopyNet** と呼ばれるモデルです。


<a id="orgdb0dc14"></a>

## Sequence to Better Sequence をちょっと弄ったモデル

Sequence to Better Sequence は **文のスタイル変換** を行うための手法です。これは **VAE** を用いて手法で、簡単に説明すると、VAEによって得られる潜在表現に **スタイル度** を評価する軸を導入し、同じ意味の範囲内でその軸に従って文の意味を表す潜在ベクトルを滑らせることで、スタイルが付与された文の潜在ベクトルを得る、というようなことをします。

その学習過程において、VAEを用いて学習データを潜在空間に映し出すプロセスが存在します。このプロセスでは、入力にノイズをかけて出力でノイズがかかっていないものを予測する、というようなプロセスで行うと性能が良くなる可能性があります。これは **Denoising Auto Encoder**（DAE）なんかの資料を読むとわかると思います。

そこで僕は Sequence to Better Sequence に DAE のアイデアを持ち込もうとしました。これがちょっと弄った、という意味になります。

とはいえあんまりデータの量が足りていないので、比較実験とか真面目な実装とかはしていません（実験したかったんですが、**たかだかモデルちょっと弄っただけで大したことしてねえじゃん**、って大学で言われてしまいあんまり研究させてもらえなかったとかなんとか）。

ソースコードは [僕のレポジトリ](https://github.com/MokkeMeguru/seq2bseq) にあります。``seq2bseq/model/trainfromcsv.ipynb`` に従って実行してください。データセットは、 [ここ](https://github.com/MokkeMeguru/st-data) にあります。個人で作っているのでデータ数はめっちゃ少ないですが、変なデータは入っていないということでご勘弁下さい。またソースコードにはやたら滅多に日本語の解説をぶち込んであるので Tensorflow で自然言語処理みたいなのやりたい人は参考になるかもしれませんし、ならないかもしれません。

![概図](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/style-transfer/img/s2bsimage.png)

<a id="orgd5eda5a"></a>

## CopyNet

CopyNetは **文章の要約のタスク** で用いられたり、 **機械翻訳のタスク** で用いられたりするモデルです。このモデルの利点は、**未知語に対しての対応が出来る**、というものです。このモデルが行っていることを簡易に説明すると、入力文に含まれている単語を出力文で使われる場面を想定して、その単語をコピー出来るようにする、というものです。

大幅な言い換えでもない限り、文中の単語が大きく書き換わらないだろうという予測と、頑張れば教師データを用意できそう（CopyNetを使った場合、必要なデータセットは並行なデータセット、つまり同じ意味のペアな文によるデータセットが必要になります。一般にこのようなデータセットを集めるのはかなりしんどいです）だったことのため、こちらでも実験してみよう、ということになりました。

ソースコードは [僕のレポジトリ](https://github.com/MokkeMeguru/simple-copynet) にあります。訓練自体は ``simple-copynet/trainfromcsv.ipynb`` に従って実行して下さい。しかし如何せんデータ数が足りないのでほぼほぼまともな訓練が出来ないため(ハイパーパラメータを弄り回せば良いんですが、手間が凄まじいです)、訓練後のモデルを [Google ドライブ](https://drive.google.com/drive/folders/17XFYOJRcTFLWbur8hT1L12esFAB9LShA?usp=sharing) で公開しました。こちらからダウンロードして ``./model/test-model/test-model_199.pt`` に保存、そして train.py を実行して下さい。

![概図](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/style-transfer/img/copynet-arch.png)

<a id="org50d5b6e"></a>

# 実行結果

昔報告書にした際の結果報告をそのまま貼り付けておきます。
S2BSは Sequence to Better Sequence、S2BS with DAE というのは Sequence to Better Sequence を弄ったやつです。


![結果1](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/style-transfer/img/result.png)


後は CopyNet でのスタイル変換をうまいことhogehogeして簡易WebAPIにして実験していた際、こんな面白い結果が得られました。

![結果2](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/style-transfer/img/result2.jpg)


データ数の割にはそれなりに面白い結果が得られたかななどと　**自己満足** しています。


<a id="org45ee7e2"></a>

# 今後の課題

今年になってからスタイル変換に関する論文は沢山出てくるようになりました。また、スタイル変換を行う際に用いられる文の分散表現なんかが、**BERT-as-Service** 辺りで良い感じに得られるようになっていますし、スタイルを学習する際に用いられる機構もGANs の Discriminator だけでなく強化学習を用いることが出来るようになってきています。

日本語は特に自然言語にスタイルが多く含まれる言語ですし、こういったAIみたいなものに性格が欲しいという需要が高いのも日本だと思っています。そのためこの分野の研究は個人的にももっと追求していきたいです。