終末 A.I.

データいじりや機械学習するエンジニアのブログ

CNNを利用した自然言語処理技術まとめ(2017年1月)

年末に Language Modeling with Gated Convolutional Networks が一部界隈でバズったこともあり、CNNを用いた自然言語処理が注目を集め始めています。今年の後半あたりには、派生手法や関連手法が多く登場していくのではないかと思われます。

CNNはRNNに比べて並列処理に優れているため、処理速度が圧倒的に速いという利点がありますが、時系列データの処理に特化したRNNと比べると、特に言語モデルにおいては最終性能がやや劣っているという理解が一般的でした(テキストクラシフィケーションではタスクによってはCNNのほうが性能がいいものもありました)。

Gated Convolutional Networks では、Gated Linear Unit および Residual 層を利用し学習を効率化することにより、WikiText-103 のタスクで state-of-the-art の性能を達成しました。

テキストクラシフィケーションの分野では、Gated Convolutional Networks が登場する前にも state-fo-the-art を達成した手法がいくつかありました。この記事では、それらの手法を中心にCNNを自然言語処理に利用するにあたって使われている技術をご紹介していきたいと思います。

A Convolutional Neural Network for Modelling Sentences(2014)

A Convolutional Neural Network for Modelling Sentences は、Dynamic k-Max Pooling 層を使うことにより、センチメント解析のタスクで既存のモデルより(RNNは含まれていませんが)性能を出すことに成功しています。

この手法では、まずエンベッティング層で単語系列をベクトル系列に変換します。その後、Wide Coonvolution 層で畳み込み操作を行い、Dynamic k-Max Pooling 層をはさむ処理を複数回繰り返して、最後に全結合層でクラシフィケーションタスクに適用します。Convolution 操作も Pooling 操作も時系列方向にだけスライドし、ベクトルの次元方向の長さは変化させないように行うことに注意してください。

Dynamic k-Max Pooling 層は、名前の通りk個のMax値をPooling操作により取得する操作なのですが、kの値が層により可変で、Lはネットワークの層の総数、sは入力されるセンテンスの長さ、{k_{top}} は最後のプーリング層でのkの値とした時に、l層でのkの値は下記のような式で決定します。

{ \displaystyle
k_l =  max(k_{top}, \lceil \frac{L-l}{L}s \rceil)
}

式を見ていただくと分かる通り、入力長によってピックアップする数を変えることにより、過不足なく必要な特徴を抽出することを目標としています。

Convolutional Neural Networks for Sentence Classification(2014)

Convolutional Neural Networks for Sentence Classification は、word2vec で pre-trained したエンベッティングを利用したシンプルなCNNのモデルで、テキストクラシフィケーションのタスクで RNNよりも性能を出したモデルです。

このモデルのポイントは二つで、

  1. pre-trained なエンベッティングとそれを fine-tuning したエンベッティングの二つのエンベッティング層を利用
  2. 2つのエンベッティングにそれぞれいくつかのウィンドウサイズを持ついくつかのフューチャーマップを出力するConvolution層を適用した後、時系列方向 にmax-poolingを行う

これにより、入力するセンテンス長を制限せず、さらにsemi-supervisedなトレーニングのような効果を得ることができています。

fine-tuning したエンベッティングの結果は、元の word2vec で得られたベクトルよりも、タスクによって与えられる単語の意味を反映することもできたと論文中では述べられています。

Character-Aware Neural Language Models(2015)

Character-Aware Neural Language Models は、Charcter-Aware なエンベッティング操作をCNNで行い、その出力をLSTMに入力することで、Penn Treebank で作成したランゲージモデルで、LSTM単体で実現された state-ofo-the-art な手法より60%少ないパラメーター数で肉薄するPLLを実現することができています。

この手法の肝は、もちろんCNNによる Charcter-Aware な単語エンベッティングの取得です。モデルの全体像は下記の図の通りになりますが、後半は単語エンベッティングを用いたただのLSTMになります。

f:id:KSKSKSKS2:20170122133509p:plain:h400

※ 論文より抜粋

エンベッティングを行うCNNには、単語を文字単位で入力しその単語のエンベッティングを出力します。まず、文字のエンベッティングを出力する層を通した後、複数のウィンドウサイズのコンボリューション処理を通した後、時系列方向のmax-poolingを通して、固定長のベクトルを生成します。そのベクトルに highway network を通したものをエンベッティング層の出力とします。

LSTMを利用していますが、2層のLSTM相当の性能を1層のLSTMで出すことができており、CNNを用いた言語モデルの中では、Gated Convolutional Networks に通じる成果だと言えるでしょう。

Character-level Convolutional Networks for Text Classification(2015)

Character-level Convolutional Networks for Text Classification は、文字レベルの入力をエンベッティング層を通した後、複数のコンボリューション層とプーリング層を通した結果を全結合層に入力してテキストクラシフィケーションを行います。

入力長が限られてしまう手法ではあるのですが、いくつかのタスクで state-of-the-art な性能を達成することができています。

Language Modeling with Gated Convolutional Networks(2016)

さて最後に、金字塔を打ち立てた Language Modeling with Gated Convolutional Networks ですが、Gated Linear Unit と Residual 層を利用することにより、WikiText-103 のタスクで state-of-the-art の性能をもつランゲージモデルの作成を達成した手法です。

手法の全体図は下記のとおりですが、ある層の出力のフューチャーマップに二つのコンボリューション処理を適用し、その出力を Gated Linear Function を通してその層の出力とします。この Gated Linear Unit を Residual 処理でラップしたものを一つの層として積んでいきます。

Gated Convolutional Networks では、一切の RNN 処理を挟まないため一層のLSTMの20倍の速度で、state-of-the-art なPLLを達成しています。

f:id:KSKSKSKS2:20170122144729p:plain:h500

※ 論文より抜粋

まとめ

Gated Convolutional Networks の結果をもってRNNが下火になるかと言われればそうはならないでしょうが、さくっと商業ベースで使う方や個人で使うような火力がない方にはCNNでやる方が良い、という認識が広まっていくのはないだろうかと思います。

この記事では主に自然言語処理で必要となる技術を紹介しましたが、CNNには独自に発展した技術も多くあります。Gated Convolutional Networks で使われているような Residual 層がその代表例でしょう。CNNが自然言語処理でどんどん使われるようになっていき、タスクに依存しない技術の交流が活発に行われていくようになると思うと胸熱ですね。

個人的には、Word Representation の技術が発達するのか、Character-Base な手法が発達するのかも注目ポイントです。畳み込み処理で一気に片付けられるという点では、RNNよりはCNNの方が Character-Base の手法を有効活用できそうで、形態素解析に伴うもろもろの問題を回避できそうかなとも感じています。

いずれにせよ、自然言語処理からますます目が離せなくなるのは必至ですね。