機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

(論文)BERTによる日本語構文解析

今日は以下の論文についてまとめます。

BERTによる日本語構文解析の精度向上(柴田ら 2019)

昨年の「言語処理学会」で発表されたものです。

日本語で分かりやすいのですが、整理もかねてまとめます。

BERT自体の解説はググれば分かりやすい説明があります。
また、以前にまとめましたので、詳細は割愛します。
kento1109.hatenablog.com

なにがスゴい?

BERTを使って既存の構文解析器の精度を大幅に上回った」という点です。
ここでは、既存の構文解析器として「KNP, Cabocha, J.depP」と比較しています。

従来Shift-Reduce 法やチャンキング段階適用により、係り受け関係を特定する手法が知られています。
SVMを用いた 統計的日本語係り受け解析」の手法では「係り元(A)」と「係り先(B)」の素性を利用して、
(A)が(B)に係るか」という二値分類としてSVMを使って問題を解いています。

これらの場合「文そのもの」を入力とするのではなく、文から候補の文節を取り出して、その分類問題としています。
この研究において、BERTではそのような中間状態を必要とせず、End-to-Endで構文解析を行っています。
「End-to-Endがスゴい」という訳ではないのですが、どのようなタスクで解いているのか気になりました。

どうやって実現した?

研究では「構文解析を head selection問題と捉える」とあります。
これは、各入力トークンに対して、主辞のトークンを推測するようなタスクです。
図を見るのが早いです。

f:id:kento1109:20200312105121p:plain
論文より引用

例えば、「スタッフ」というトークンであれば、「一同」が主辞(Head)のトークンになります。
こう考えると、トークン毎の何らかの出力を予測する「token classification」の1つと理解できます。

入力のトークン列(t_0, t_1, ..., t_N)で表される時、t_iの主辞がt_jである確率は以下の式で計算されます。


\begin{eqnarray}
P_{head}(t_j|t_i,S)=\frac{\exp (s(t_j,t_i))}{\sum_k \exp (s(t_k,t_i))}
\end{eqnarray}

t_iを全体のトークンについてsoftmax関数を取ったものです。
重要なのはスコアs(t_j,t_i)ですが、以下のように計算しています。


\begin{eqnarray}
s(t_j,t_i)=v_h^T {\rm tanh}(U_ht_j+W_ht_i)
\end{eqnarray}

t_i,t_jはTransfomerの最終層のembeddingです。
一般的には768次元のベクトルになるでしょうか。
(この次元数をdと書いておきます。)
t_iU_hの重みを掛けています。

パラメータについては論文では詳しい記載はありませんが、
head selectionに関する参考文献を見ると詳しく書いてあります。

その論文通りにスコア設計されているとすると、
 v_h \in \mathbb{R}^d, U_h=W_h \in \mathbb{R}^{d\times d}
のパラメータになります。

これを計算すると、スカラー値のスコアが計算できます。

実験結果は以下の通りです。

f:id:kento1109:20200312113343p:plain

※既存の構文解析器は「基本句単位の係り受けを自立語 head の単語単位に変換」して評価したそうです。

最後に

構文解析を「token classification」として解くことに違和感があったのですが、
それは「クラス数をどのように決めるのか」が自明ではないのではという疑問からでした。
しかし、BERTでは事前に入力の系列長を指定するので、長さが可変になることはありません。
なので、系列長を128とすれば、128クラスの分類問題となります。
そう考えると「token classification」として解くことに問題はないように思いました。

BERTなどを利用したEnd-to-Endモデルでは「関係抽出」にも応用されてたりもするので、
そこら辺もキャッチアップしていきたいです。