ACL2021のBest PaperのVOLTを日本語文書分類で試してみた結果...!

こんにちは。 リサーチャーの勝又です。 私はレトリバで自然言語処理、とくに要約や文法誤り訂正に関する研究の最新動向の調査・キャッチアップなどを行っております。

今回の記事では、先日開催された自然言語処理のトップカンファレンスである、ACL-IJCNLP2021でBest Paperとなった、VOLT(VOcabulary Learning approach via optimal Transport)を日本語文書分類で試してみた話をします。

概要

一般的に、機械学習を用いた自然言語処理では、あらかじめ使用する語彙を学習コーパスなどから用意し、学習などを行います。 たとえば文書分類タスクの場合、学習データのテキスト中の単語から頻度の高い順に数千〜数万語を語彙として使用します。 その際、いくつかの単語は語彙に含まれないので、それらをすべて未知語トークンに置換することで対応します。

この未知語を減らすための方法として、サブワードを用いた単語分割方法が研究されています。 サブワードは、従来の単語をさらに小さい部分文字列として取り扱い、実質的に機械学習モデルが扱うことのできる語彙を増やすことができます。 たとえばByte Pair Encoding(BPE)と呼ばれるサブワード分割手法1を用いて語彙構築を行う場合、最初にハイパーパラメーターとして語彙サイズ2を決めてしまえば、あとはアルゴリズムが学習コーパスから最適な部分文字列を抽出します。

問題はこの最初にハイパーパラメーターとして決める語彙サイズです。 自然言語処理ではこの語彙サイズは経験則から決めることが多い印象です。 たとえばニューラル機械翻訳であれば、30Kから50Kの中で、開発データの性能を見ながら決めます。 私自身、新規のタスクで語彙サイズをどうするかは少し悩むところで、これまでの経験から適当な値を使うことが多いです。 そんな状況の中、VOLT3と呼ばれる語彙決定手法が提案されました。 なんと、このVOLTは適切な語彙サイズを自動で決めることができます。 今回の記事ではこのVOLTを日本語文書分類タスクに試してみようと思います。

VOLTとは?

VOLTの概要

VOLTは前述した通り、語彙決定アルゴリズムです。 VOLTは入力としてサブワードで分割済みの学習コーパスと、語彙サイズの候補を受け取り、そこから適切な語彙を返します。 仕組みとしてはMUV(Marginal Utility of Vocabularization)と呼ばれる尺度を導入し、与えられた語彙サイズの候補の中からもっとも良いものを選択するアルゴリズムです。

VOLT内部の尺度であるMUVについて

語彙サイズは増やせば増やすほど、コーパスエントロピーは減少します。 しかし、語彙サイズが増えていくと、学習時に使われない語彙が増えてしまったり、モデルのパラメーター数が大きくなってしまいます。 この語彙サイズとエントロピーの関係を、経済学の限界効用(語彙サイズがコストで、エントロピーが効用)になぞらえてMUVとして定義しています。 具体的に論文中でMUVは次式のように定義されています。


\mathcal{M}_{v(k+m)}=\frac{-\left(\mathcal{H}_{v(k+m)}-\mathcal{H}_{v(k)}\right)}{m}

ここで、v(k)v(k+m)は、それぞれ語彙サイズkk+mの時の語彙を表しています。 また、\mathcal{H}_{v(k)}は語彙v(k)の際のエントロピーを表しています。

VOLTの著者は、このMUVと機械翻訳タスクの相関があることを報告し、MUVの尺度としての有効性を示しています。 そのため、VOLTはMUVの最大化を目指していくアルゴリズムとして設計されています。

f:id:ssskkk420:20210823153004p:plain
図1: MUVと機械翻訳タスクの相関図。図は紹介論文より引用。

VOLTのアルゴリズム

ここで問題になってくるのが、MUVの最大化の方法です。 MUVは定義の通り、語彙サイズに対するエントロピーの変化量であるため、結局何らかの手法を用いて語彙を構築する必要があります。 著者たちはこの何らかの手法として、最適輸送を用いた手法を提案しています。 つまり、VOLTはある語彙サイズのときに最適輸送を用いて語彙を構築し、その語彙でのエントロピーを計測、また別の語彙サイズでも同様に語彙とエントロピーを計測することでMUVを算出します。 ただし、この語彙サイズ自体はあらかじめ人手で用意する必要があります。

VOLTのアルゴリズムは次の通りです。

f:id:ssskkk420:20210823153458p:plain
VOLTのアルゴリズム。紹介論文から引用。

上記アルゴリズム\mathbb{L}はサブワード分割済みの学習コーパスD_c中の各単語を頻度の高い順で並べたもので、\mathbb{C}が学習コーパス中の各文字です。 そして\boldsymbol{S}が前述した人手で用意する必要がある語彙サイズです。 アルゴリズムのコメントにある通り、VOLTは最適輸送としてSinkhorn algorithmを使用しています(語彙構築から最適輸送の形式への定式化は論文中に記載されているのでそちらをご参照ください)。

具体例を挙げてVOLTアルゴリズムを解説します。 あらかじめある程度大きな語彙サイズ(たとえば30K)で学習コーパスをサブワード化します。 その後、語彙サイズ候補を\boldsymbol{S}=\{1K, 2K, \ldots, 29K, 30K\}のように設定します。 するとVOLTは各語彙サイズごとに最適輸送を用いて語彙を決定し、その時のエントロピーが算出されます。 そして、語彙サイズが1Kの時と2Kの時のエントロピーの変化量、2Kの時と3Kの時のエントロピーの変化量などを比較していき、MUVが最大となる語彙サイズを決定しています。

著者たちはこのVOLTを利用することで、機械翻訳タスクにおいて従来の語彙サイズよりも小さいサイズで同等の精度が達成できることを示しました。 今回は日本語文書分類タスクでこのVOLTを試してみようと思います。

実験

今回はVOLTが正しく語彙を選べているかどうか実験するため、VOLTで選択された語彙で学習したモデルと、開発データで決定した語彙で学習したモデルの比較を行いました。

実験設定

日本語文書分類タスクについて

今回はLivedoor ニュースコーパスを利用して、記事からその記事の属するカテゴリを分類するタスク(9クラス分類)で検証しました。 各データの事例数は次の表の通りです。

データ種類 事例数
学習データ 4,421
開発データ 1,473
評価データ 1,473

各データはMeCab(IPADIC)で単語分割を行った後にサブワード分割を行っています。

分類モデルのハイパーパラメーターについて

今回は分類モデルとして簡単なもので試したかったので、単純な1層の単方向LTSMを用いています。 LSTMの出力をmax-poolingし、9クラスのうちどのカテゴリかを推定しています。

VOLTのハイパーパラメーターについて

今回は学習データに対してBPEを用いてサブワード化を行い、VOLTを実行しています4。 その際のサブワード学習のオペレーション数は30Kとしました。 また、VOLTの語彙サイズ候補は\boldsymbol{S}=\{1K, 2K, \ldots, 29K, 30K\}と1K単語刻みにしました。

実験結果

最初に、開発データでもっとも精度が高かった語彙サイズのモデルと、VOLTで選択された語彙で学習したモデルを評価データで比較します。 その後、VOLTを使用せず、サブワード学習のオペレーション数を色々変えた際(\{1K, 2K, \ldots, 10K\}の10種類)の開発データの精度を報告して、開発データでもっとも精度が高い語彙サイズはVOLTが選んだ語彙サイズと同じなのか検証します。

VOLTを使用しなかった場合と使用した場合の比較

VOLTを使用せず、開発データの精度が高くなる語彙サイズ(10K)で学習したモデル(BPE10K)と、VOLTで選択された語彙で学習したモデルを評価データで比較した結果を次の表に示します。

モデル名 語彙サイズ パラメーター数 マクロ平均
BPE10K 10K 1,099,081 0.95
VOLT 3K 667,977 0.95

VOLTが選択した語彙サイズは3Kでした。 この結果の通り、開発データで選ばれた語彙サイズで学習したモデルと、VOLTで選ばれた語彙サイズで学習したモデルは同程度の性能が得られることがわかります。 また、語彙サイズが3Kとなったことで、モデルのパラメーター数もかなり減らすことができました。 論文からもVOLTは語彙サイズとして小さめを選ぶ傾向があると思われるので、結果としてモデルのパラメーターを減らす方法としても有効そうだと感じました。

VOLTを使用せずに最適な語彙サイズを決める

以下のグラフがサブワード学習のオペレーション数を変えた際の開発データの精度です。

f:id:ssskkk420:20210823153723p:plain
図2: サブワード学習のオペレーション数を変えた際の開発データの精度。

グラフ中のBPE sizeがオペレーション数を表していて、このグラフからオペレーション数が8K〜10Kの時がとくに精度が高く、次いで3Kの時が精度が高いことがわかります。 VOLTが語彙サイズとして3Kを選んだことを考えると、VOLTは開発データで探索した場合と比べると精度は少し落ちるかもしれないですが、ある程度良さそうな語彙を選べていると考えられます。

まとめ

今回の記事では、VOLTの簡単な解説と日本語文書分類で試してみた結果について紹介しました。 VOLTを使用することで、これまで開発データを使って地道に調べていた語彙サイズがパッと決められるのは便利に感じました。

VOLTは確かに語彙選択手法としても優れたものだと思いますが、これまで使用してきた語彙サイズを大きく削減できることを示したことが個人的には驚きでした。 私自身、ニューラルネットワークで必要な語彙とは何かを考えたこと5があり、この語彙決定手法の分野についてはすごく興味があるので今後の発展を期待したいです。 具体的には、MUVと実タスクの相関があったりなかったりしたのがちょっと気になったので、その辺りを修正した手法などなど、色々できるのではないかと感じました。


  1. Neural Machine Translation of Rare Words with Subword Units. Rico Sennrich, Barry Haddow, Alexandra Birch. [paper]

  2. BPEを使う場合、一般的にハイパーパラメータとして設定するのはオペレーション数なのですが、ここでは簡単に語彙サイズと記載しています。このオペレーション数はBPEのマージ操作の回数を指すので、語彙サイズはこのオペレーション数と文字種の数の合計になります。なので厳密には語彙サイズとオペレーション数を同一に扱ってはいけないのですが、この記事では同一の表現として使用している点、ご容赦ください。

  3. Vocabulary Learning via Optimal Transport for Neural Machine Translation. Jingjing Xu, Hao Zhou, Chun Gan, Zaixiang Zheng, Lei Li. [paper]

  4. 論文中にはGPUを使用していると思われる記述があるのですが、2021年8月現在、公開されている実装ではCPUのみを使用する実装となっていました。今回のような小規模なコーパスであればCPUだけでも数十分ほどで探索は終了しますが、大規模コーパスで実験をする際には注意が必要そうです。

  5. Graph-based Filtering of Out-of-Vocabulary Words for Encoder-Decoder Models. Satoru Katsumata, Yukio Matsumura, Hayahide Yamagishi, Mamoru Komachi. [paper]