畳み込みな機械翻訳手法、Pervasive attention を読む

# 導入
  [Pervasive Attention](https://www.aclweb.org/anthology/K18-1010) [1] というのは 2018 年 11 月に CoNLL (Conference on Computational Natural Language Learning) に掲載された機械翻訳に関する論文です。個人的なこいつの凄いところは **Convolutional Neural Network を用いた機械翻訳手法** で当時の機械翻訳のSOTAに食い込んだという点だと思っています。ある意味では、Transformer が **Attention Is All You Need** (後述するAttention機構に注視したモデルであるという意味)とされるならば、Pervasive Attention は **[Convolution Is All You Need](https://www.reddit.com/r/MachineLearning/comments/9alses/r_180803867_pervasive_attention_2d_convolutional/)** とも言えるようなモデルです。
  
  Transformerで沸き返っている界隈からすればやや日陰者感がありますが、それでも大変趣深い論文なので読んでみることにし、ついでに紹介ができればということで記事にしました。

# 機械翻訳って何？
  機械翻訳というのはある自然言語（英語とか）からある別な言語（ドイツ語）へ **翻訳** を行う、 **自然言語処理の中の一タスク** です。こいつができると **Google 翻訳** みたいなことができるようになります。

# 機械翻訳の関連研究って何？CNN で機械翻訳？
  かつては辞書を用いた機械翻訳などがありましたが、最近では深層学習を用いたものが有力になっています。というわけで今回は深層学習の、特に論文中に取り上げられているものを、以下の**３つの観点**から眺めてみます。

### 一般的な(昔からある)機械翻訳の手法 (RNN を用いた encoder-decoder モデル)
   恐らくこの分野の研究で一番ベーシックなものとして考えて良いのがこの形のモデルでしょう。これは **RNN**(Reccurent Neural Network) を用いた、**AutoEncoder** のようなモデルです。以下の概略図を見てください。EncodeとDecoder というブロックが latent vector というベクトルで繋げられていることがわかると思います。Encoder は入力文を単位ごと（例えば単語ごと）に RNN セルに通すことを次々に繰り返します。Decoder は先頭を示す記号(\<s\>)を頭につけた出力文を単位ごとに RNN セルに通すことを次々に繰り返します。そして Decoder の RNN セルからの出力が期待する翻訳文となります。機械翻訳に対して最も影響力のあったモデルはこの形の、Googleの研究者らが発表した Sequence to Sequence [2] というモデルであり、こいつは Seq2Seq という略称で親しまれています。

![input_architecture](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/seq2seq_arch.png)


   これに対して改良策として RNN セルを LSTM/GLU/BiRNN/BiLSTM セルに置き換えたり、Attention機構 (Encoder の途中の情報を Decoder に直接的に反映させていく考え方、詳細は Luong Attention [3]) を加える考え方などが提案されています。



### CNN を用いた手法
   脚光を浴びていたRNNを用いた手法ですが、訓練時間的な問題があったりするため、CNNで代替できないかという話が持ち上がっています。

   もう少し理論的な話をすると、RNNやLSTMは時間的に並行に学習することが構造上難しいのに対して、CNNは並列に計算することが可能な点がこの考えのモチベーションの一つになっています。またAttention機構が**本手法の**CNNの構造的に最初から含まれているという点も挙げられます。(入力文と出力文をまとめて畳み込んで出力しているので、実質Attention、みたいなことらしいです。尚他のCNNを用いた関連手法すべてにこれが適応されるかは…謎です)

   関連手法として有名なものを挙げるとすると、ConvS2S [4] が挙げられます。これは Facebook の研究者が出したペーパーです。詳しい説明については複雑なので省略しますが、この [論文解説](http://deeplearning.hatenablog.com/entry/convs2s) はとてもわかり易く解説しているので興味があれば是非ご一読ください。
   


### その他(Attention is all you need)
   その他の例としては上の２つと大きく異なる構造を持った **Transformer** というモデルが有名です。Attention is all you need[5] という論文で提案されたモデルで、昨今の自然言語処理の**スイスアーミーナイフ**ばりの立ち位置を確立しています。(どこかのツイッタラーさんが、自然言語処理を始めるならMeCabなんぞ捨ててまずBERT[6] をやってみろ！みたいなことをツイートしていましたが、このBERTのベースとなる手法です。)
   
   この特徴としては、一般的な(昔からある)機械翻訳の手法 でちらっと触れた **Attention機構** を注視してRNNの機構を取り去ったようなモデル、ということになっています(少なくとも界隈ではそう言われています)。この解説としては [The Illustrated Transformer](https://jalammar.github.io/illustrated-transformer/) のページを見ると良いです。(英語の記事に対して中国語、韓国語の翻訳はあるのに日本語の翻訳がないところが、この国の技術力って感じで趣がありますね)
   
   


# どのくらいの性能が出たの？

![Pervasive Attention :  Table 3](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/pa_results.PNG "Pervasive Attention :  Table 3")

  大体のスコアはこんな感じになっています。De-En/En-Deというのは、**BLEUスコア** で、簡単に言うと0-100の連続値を取る評価で **高いほうが良い** です。これを見る限り、Pervasive Attention は割とつよつよ、という感じになっています(但し後に出した改訂版(？)ではTransformerに若干性能で負けています)。また計算量 Flops を見ると、Transformerよりも少ないものの、全体的に見ると少し多いかな？という印象があります。しかしパラメータ数 prms を見ると、相当に抑えられていることがわかります。

  つまり簡単にいうと、**そこそこの計算量・小さいパラメータ・つよつよのBLEUスコア** ということになります。

  尚、**Word-based** というのは文を単位に区切る際に **単語ごとに区切る** ということ、**BPE(byte-pair encoding)-based** というのは（簡単に言うと）単語分割よりも語彙数を抑えられるように文を単位に分割していくことです。BPEの最近の発展としては、日本でやたら滅多に有名で有力な万能ツールと叫ばれている **SentencePiece** なんかがありますね。SentencePieceはあんまり詳しくないですが [Sentencepiece : ニューラル言語処理向けトークナイザ](https://qiita.com/taku910/items/7e52f1e58d0ea6e7859c) が最も信頼における記事だと思います。

  しかしこの実験結果には少しだけ問題があります。それは用いたデータセットである **IWSLT はそんなに大規模なモデルとは言えない**という点 (参考までに紹介すると IWSLT は 200K サンプル /　WMT は 15.8M サンプル) 、**多言語での実験結果がないため、別言語でどうなるかはなんとも言えない**という点です。(日本語のこういったコーパスはやたら高い上に制約も強いので Fr-En あたりで実験してみたいものです)
  
  また別の着眼点としては、入力文の長さに対してどのようなBLEUスコアがつくか、というものがあります。つまり短い文と長い文をこのモデルに突っ込んだらどのくらい精度の差がでるの？ということです。
  
  下の図を見てください。これを見ると、特に**短い文に対して高い性能**が出ていることがわかります。逆に**長い文に対しては比較的に強くはない**ようです。
  

![Pervasive Attention (改訂版):  Figure 5](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/pa_bleu_len.PNG " Pervasive Attention (改訂版):  Figure 5")

# この構造はどんな形をしているの？
  さてそれでは簡単にモデルの概要図を説明していきましょう。
### 入力データ
  まず入力文と出力文を畳み込みできる形にしてみましょう。以下の図を見てください。大体こんな感じで入力文と出力文を畳み込み可能な形(つまりTensor)に構成しています。なんとなく**入力文と出力文がクロスしていること**、**コピーをして行列サイズを合わせていること**、入力文のTensorと出力文のTensorが **Embedding Depth 軸に結合されていること** が想像できれば良いと思います。
  尚論文では当然のこととして言及されていませんが、Target Sequence の 頭と尻尾には、文の終わりと始まりを示す記号がそれぞれついています。(出力としては頭がないものを予測しています。このあたりは「一般的な(昔からある)機械翻訳の手法」と同じです。)

![Pervasive Attention : Input Tensor](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/input_architecture.png "Pervasive Attention : Input Tensor")

  
### DenseNet'
 Pervasive Attention は先述の Tensor に対して **特殊なフィルターを持った DenseNet** を通します。
   
  まずDenseNet[7] について説明すると、これは画像分類のタスクに提案されたネットワークです。基本単位はDense Block と呼ばれる BN->ReLU->Conv->BN->ReLU->Conv->Dropout の層で、まずこれを複数直列に繋ぎます。次に、前のBlockから次の次の Block へ手を伸ばす、というようなことを行い、複数の以前のBlockの結果を現在の層に接続します。これによって、前の層で落ちてしまった情報も読み取ることができるという利点があります。

  具体的な図としては、DenseNet の以下の図がわかりやすいでしょう。入力から前の方へ向かっていくつかの線が途中の層を跨いで伸びていることがグラフィカルに解ると思います。
  
  ![Densely Connected Convolutional Networks : Figure 1](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/dense_arch.PNG "Densely Connected Convolutional Networks : Figure 1")
  
  DenseNet についてなんとなくイメージがつかめたところで、本題の **特殊な** という部分について触れていきます。端的に言うならば、特殊性が指すものは **畳み込み** の部分です。

  まず入力の概要図を示した図、Input Tensorの部分をもう一度参照してください。これを見ると、恐らく上から見ると、入力文と出力文が丁度 x 軸と y 軸に沿うような形で並んでいる様を想像することができると思います。その様を用いてこの畳込みの特殊性は説明できます。

  
  ![Pervasive Attention : Figure 1](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/special_conv.PNG "Pervasive Attention : Figure 1")

  
  これが丁度 Input Tensor を上から見て畳み込みの概形を示したものです。**青い部分と灰色の部分**があることが解ると思います。Target sequence 方向に見て、後の方が灰色になっていることが解ると思います。つまり**出力文の後の方を参照しないようにしたい**と言う意図が見えると思います。やや飛躍したことを言えば、後の方を参照しないということは実質RNNのような、次の単語を予測する、という機能を見込むことができるわけです(ちなみに Transformer も似たような隠す処理を行っています)。Pervasive Attentionでは、DenseNetの一部にこの畳込み手法を用いています。
  （また畳み込み処理には更に GLU(gated linear units) という手法も用いることがあったのですが、結果が芳しくなく、ちょっと長くなるのでここでは省略します。解説は [Language Modeling with Gated Convolutional Networks](https://mil-tokyo.github.io/paper-summary/papers/20161229-language-modeling-with-cnn) あたりがお手軽かと思います。）
  

### 予測 
   出力文の予測には少し特殊な手続きを踏んでいます。すべてを説明するのは少し長すぎるので、一部を省略して簡潔に紹介します。省略して、というのは実は予測の手法には４種類存在しているのですが、そのうちの一番良いものにのみ着目する、という意味です。
   
   さて、では DenseNetから出力されるTensorを想像してみましょう。Input Tensor のような四角い箱、見えましたね。この箱の軸は、Target Sequence の Time Step 軸、Copy(Input Sequence の Time Step)軸、そしてChannels と呼ばれる所謂埋め込みベクトルの高さの軸(Input Tensorの Embedding Depth に近い)の３軸で構成されています。
   
   まずこれの軸の一つ、 **Copy 軸** を潰します。どのように潰すのかと言うのは、以下の図を見てください。 **Max Pooling** (論文中ではこう言ってますが、正しい表現か疑問です) と **Self Attention** を用いている、ということがなんとなくわかると思います。
   
   Max Pooling がややわかりにくいので実装を元に説明すると、これはCopy軸について取り出したベクトル $v \in R^{|s|}$ にの最大値を取る、という操作を Channel 軸方向に繰り返す操作です(ちょっと自信がないですが、実装上そのはずです)。もっと詳しい操作については、[実装](https://github.com/elbayadm/attn2d/blob/master/nmt/models/pooling.py#L14-L34) の方を見ると良いと思います。

![Pervasive Attention :  Output Vector](https://raw.githubusercontent.com/MokkeMeguru/seminar/master/pervasive-attention/img/output_tensor.png "Pervasive Attention :  Output Vector")
  
  こうすることで得られた Output Vector ですが、これは厳密にはまだ出力される単位（単語）を表していません。これを出力の単位にするには、Output Vectorを **出力する語彙数の長さに伸ばして** あげて、それを **確率分布の形に直す** 必要があります。
  
  つまり以下の式を行います。尚、$H_i \in \mathbb{R}^{|t|\times 2 f_L}$ は Output Vector で、$E \in \mathbb{R}^{|\nu|\times 2 f_L} \ where\ \nu\ is\ output\ vocabulary$  は変換の行列です。$p_i \in \mathbb{R}^{|V|}$ が確率分布です。
  
  $$p_i = SoftMax(EH_i)$$
  
  以上で出力単位（単語）が予測できるようになり、これが **Target Sequence 方向に繰り返されると、出力文が得られる** わけです。(実際出力文を生成するときは、一単位(単語)ずつ順番に生成していくようです。)
  
# 読んだ感想とか
  CNN を用いた手法はこのように **パラメータ数が少なくてもうまく回るよう** なので、これを応用して言語モデルを考案すれば、BERTには及ばないものの軽量な言語モデルが出来そうですね。
BERTやGPT-2(OpenAI が開発している言語モデル、恐らくBERTと性能を競っている) といったパラメータ数が多いものとは違った特徴を持っているので研究する価値は十分にあると思います。
(但しFlopsはかかるようなので、日本の某大学なんかでは ~~GCEやAWSみたいな計算資源を使おうとすると会計が面倒ということで渋い顔をされるという話があったりするので~~ 難しそうっすね)

  また DenseNet 部の改良にも面白そうなものがありそうですね。(多分無理ですが)最近出てきた [OctConv](https://arxiv.org/pdf/1806.06284.pdf)[8] なんかと組み合わせるとよりパラメータ数が抑えられることも相まって高速に計算ができる＆性能が微上昇することが期待でいるかもしれません。
  
  この記事を書く終盤あたりで、[改訂版(?)](https://arxiv.org/abs/1808.03867) が arxiv に上がっていたことに気が付き、なんとも言えない気持ちになりました。arxiv は結構論文の修正版が上がっているので、論文を見るときはこっちを優先的に探したほうが良いのかもしれませんね。

# 参考文献
[1]: Pervasive Attention (Maha Elbayad, Laurent Besacier, Jakob Verbeek)
[2]: Sequence to Sequence Learning with Neural Networks (Ilya Sutskever, Oriol Vinyals, Quoc V. Le)
[3]: Effective approaches to attention-based neural machine translation. (Luong, H. Pham, and C. Manning. 2015.)
[4]: Convolutional Sequence to Sequence Learning (Jonas Gehring, Michael Auli, David Grangier, Denis Yarats, Yann N. Dauphin)
[5]: Attention Is All You Need (Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin)
[6]: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova)
[7]: Densely Connected Convolutional Networks. Gao Huang, Zhuang Liu, Laurens van der Maaten, Kilian Q. Weinberger
[8] Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution (Yunpeng Chen, Haoqi Fan, Bing Xu, Zhicheng Yan, Yannis Kalantidis, Marcus Rohrbach, Shuicheng Yan, Jiashi Feng)