Sentense-similarity-learning-by-lexical-decomposition-and-composition
- publish: arXiv
- author: Zhiguo Wang, Haitao Mi, Abraham Ittycheriah
概要
QAでCNNな研究.現在のWikiQAとQASentのstate-of-the-art (ACL Anthology wiki調べ, 2016/03/16).
アブストで「今までの文章類似度を計算する手法は似ている部分だけ着目していて,似ていない部分は無視しているが,似ていない部分の情報も重要だよ」みたいなことを言っていてなるほど確かにと思った.
まず,著者は既存の文章類似度の計算の3つの問題点の指摘から始める.
意味的に類似しているが,異なる語彙が用いられている場合に正確に類似度を計算できない
- Milkov+ (2013)の研究を例としてあげている.論文中でembeddingの手法についての詳しい言及がない(気がする)ので,word2vecを単語ベクトルを獲得するために使っているのかなと思った.
単語レベルではなく,フレーズレベル,構文レベルでも類似度を計算しなければいけない
- "not related"は単語に分割すべきではなく,フレーズとしてみれば"irrelevant"と似た表現とみなすことができる.
「類似している」という情報ではなく,「類似していない」という情報も活用しなければならない
これらを踏まえ (これらの問題に対処して) モデルを設計する.
手法
- 単語を低次元のベクトルで表現する
- すべての単語について,semantic matching vectorを計算する(よく分からない)
- semantic matching vectorを用いて,単語ベクトルをsimilar componentsとdissimilar componentの2つに分解する(Decompose)
- CNNを使って1つの特徴空間に射影する(Compose)
- 類似度はsumをとってsigmoid関数を適用するだけ
何回か読んだけどsemantic matching vectorがなんなのかよく分からない(代表ベクトルみたいなもの?).
semantic matching
we need to check whether each semantic unit in one sentence is covered by the other sentence, or vice versa.
包含関係を調べる必要がある."irrelevant"という1つの単語が"not related"というフレーズでカバーされていることを知る必要がある.どうするかというと,
\begin{align} \hat{s_i} &=& f_{match} (s_i, T) & \forall s_i \in S \\ \hat{t_i} &=& f_{match} (t_j, S) & \forall t_j \in T \end{align}
とするらしい(よくわかりません).
第3章で $$ f_{match} (s_i, T) $$についてはより詳細な定義が述べられている. 文書Sのサイズ x 文書Tのサイズの行列 $$ A $$ の $$i, j$$要素を
\begin{align} a_{i,j} = \frac{s_iT t_j}{|| s_i || \cdot || t_j ||} &&& \forall s_i \in S ,\forall t_j \in T \end{align}
として,
\begin{align} f_{match} (s_i, T) = \begin{cases} \frac{\sum_{j=0}^{n} a_{i,j} t_j}{\sum_{j=0}^{n} a_{i,j}} & global \\ \frac{\sum_{j=k-w}^{k+w} a_{i,j} t_j}{\sum_{j=k-w}^{k+w} a_{i,j}} & local-w \\ t_k & max \end{cases} \end{align}
誰かこれがなんなのか教えて下さい...
decomposition
$$ \hat{s_i} $$ と $$ \hat{t_j} $$は文章 $$ T $$ と $$ S $$に対する"意味的な適用範囲"(semantic coverage)と解釈できる.
\begin{align} \left[ s_i^{+}; s_i^{-} \right] = f_{decomp} (s_i, \hat{s_i}) \\ \left[ t_j^{+}; t_j^{-} \right] = f_{decomp} (t_j, \hat{t_j}) \end{align}
によって,単語ベクトルを類似部分と非類似部分の2つに分解する.
分解を行う関数はRigitな関数(なんて訳せば良いのかわからない,全か無をとる関数)か線形な関数,あと直行ベクトルを使う関数の三種類が挙げられている.
composition
\begin{align} \vec{S} = f_{comp} (S^{+}, S^{-}) \\ \vec{T} = f_{comp} (T^{+}, T^{-}) \end{align}
がっちゃんこ.
CNNによって,2種類のベクトルを1つのベクトル空間に射影する.
畳み込みのフィルターを $$ {w_o} (d × h)$$ とする( $$d$$ は単語ベクトルの次元, $$ h $$ はwindow size).
\begin{align} c_{o,i} = f( w_o * S_{\left[ i:i+h \right]}^{+} + w_o * S_{\left[ i:i+h \right]}^{-} + b_o) \end{align}
最適化にはAdam (Kingma+, 2014)を使っている.
評価実験
MAP (mean average precision) とMRR (mean reciprocal rank) を使って評価する.評価タスクは質問応答ではQASentとWikiQA.QASentはTREC QA trackで作られたデータで,QASentはWikipediaとBingに実際に入力されたクエリによって構成されている.言い換えではMSRP corpus (MSRP) で実験する(こちらはあまり追っていない).$$ d = 300 $$ (d = 単語次元)でembeddingを行う(ここでword2vecを使ったと書かれていた).
すごい (小学生並の感想).