分散表現の理解メモ２

分散表現の基礎部分について、書きたくなったので。

# はじめに
分散表現に限らず自然言語処理の要素技術は解決したいタスクに依存しています。
タスクの例として、とても大きいところでいうと

* 自動翻訳
* 音声合成
* 音声認識
* 自動要約
* 質疑応答

などがあり、もっと基礎的なところでいうと、

* 類義語判別
* 品詞抽出
* 文構造・依存関係抽出
* 固有表現認識

などがあります。
分散表現はこの中で、類義語判別のためにもともと開発されたらしいです。Mikolovの[論文](https://arxiv.org/abs/1310.4546)では冒頭で、
 
> Distributed representations of words in a vector space help learning algorithms to achieve better performance in natural language processing tasks by grouping similar words.

とあります。それ以外にも、単語（フレーズ）同士の semantical / syntactical な関係タスク、つまり
AのBに対する関係は、CのDに対する関係と同じだ。という状況で、４つのうち３つが与えられ、残りの１つを推定するタスク(例, man: woman = king: ? -> ? = queen, good: better = safe: ? -> ? = safer)にも、驚くべきことに("Somewhat surprisingly,")使えることが多いことが知られています。
また、これ以外のタスクにもニューラルネットワークの入力として使用され、今や自然言語処理における基礎技術の1つとなっています。

しかし、そもそも（単語 / フレーズの）分散表現とは何なのでしょうか？

# 分散表現とは？
さて分散表現の表現(representation)とは、何のことでしょうか？表現を辞書で調べると
>内面的・精神的・主体的な思想や感情などを，外面的・客観的な形あるものとして表すこと。また，その表れた形である表情・身振り・記号・言語など。(weblio)

とあります。言ってしまえば、（誰かにとって）何だかわからないものを、理解しやすい形に変換することです。単語やフレーズは意味を内包していると考えられますが、これを人間にわかりやすい記号（文字）に変換したものが、現在あなたの見ている「単語」になります（文字表現　（造語））。あるいは、「単語」と読み上げた時、あなたの近くにいる人は、その声によって、その意味を理解するかもしれません（音響表現(造語)）。
単語やフレーズの分散表現とは、文字表現をベクトルを用いて表現し直したもの（ベクトル表現）の一種です[^1]。分散表現はベクトル表現の中でも、分布仮説に基づいて構成された変換のことを指します。分布仮説とは、Firthの言葉
> You shall know a word by the company it keeps.

通り、周りに出てくる単語が近ければ、だいたい同じ意味を持っているだろう。という仮説です。
さて、分散表現とは文字表現をベクトル表現したものの一種と言いましたが、これは一通りに決まる訳ではありません。ベクトルの要素となる数に何を使うか（通常は実数）だとか何次元のベクトルにしようだとか、変換の仕方は無数にあります。つまり、良い分散表現と悪い分散表現が存在しうるのです[^2]。良い悪いという話をする時、常に何に対して良し悪しがあるのかを考えることが重要ですが、この場合は前述したタスクになります。
さて、世の中で良いとされている分散表現の構成法はいくつかあります。例を挙げると次のようになります。

* Skip-gram and Negative Sampling(SGNS) ([gensim](https://radimrehurek.com/gensim/))
* [Glove](https://nlp.stanford.edu/projects/glove/)
* [FastText](https://research.fb.com/projects/fasttext/)(SGNSに単語のmorphologyを反映できるようにしたもの)

他にも主成分分析を利用したものなど、色々な方法があります。

# 分散表現における距離
注）ここでの考察はSkip Gram modelに関してのもので、よく使われるSkip Gram and Negative Sampling (SGNS)については考察中です[^3]。
## Skip Gram model の数学的な設定
以前の[記事](http://qiita.com/takuyakubo/items/311126d67f9287cbbd48)で書いた通りなのですが、Skip Gramでは、ある単語$w$が得られた時に、その周りにどのような単語$c$が現れるかということを条件付き分布$p(c|w)$を用いて表すことを基礎にしています。この分布$p(c|w)$をsoftmax関数を用いて近似表現したものに用いるためvectorがSkip Gramにおけるword vector $\mathinner{|{w}\rangle}$とcontext vector $\mathinner{|{c}\rangle}$になります[^4]。もう少し正確にかくと、

```math
p(c|w) = \frac{
e^{
\mathinner{\langle{c}|{w}\rangle}
}
}{\sum_{c' \in V}e^{
\mathinner{\langle{c'}|{w}\rangle}
}}
```

で集合$V$は考えている単語全ての集合(Vocabulary Set)です。
与えられた、文章の集まり(corpus)からこの分布やベクトルをなんらかの方法を用いて獲得するのが分散表現の学習となります。

## word vectorにおける距離
さて、なんらかの方法でword vectorが学習されたとしましょう。この時、類義語問題等を解くために、vector同士の距離が必要になります。よく知られている距離には次のものがあります。

* cos insimilarity(コサイン距離)
* Euclid distance(ユークリッド距離)

前者の定義は、二つの単語$w, w'$が与えられた時に、

```math
 1 - cos(w, w') = 1 - \frac{\mathinner{\langle{w'}|{w}\rangle}}{\sqrt{\mathinner{\langle{w}|{w}\rangle}\mathinner{\langle{w'}|{w'}\rangle}}}
```
というもので二つのword vectorのなす角$\theta$の余弦を１から引いたものを距離としたものです[^5]。
この場合、vectorが同じ方向を向いていれば、0であり、完全に反対方向を向いていれば2。余弦の性質上、同方向や逆方向を向いたvectorへの感度は低く、直行しているvectorへの感度が高くなります。また、この距離をうまく定義するためには原点の存在が必要です。

後者の定義は、二つの単語$w, w'$が与えられた時に、

```math
 d(w, w') = \sqrt{( \mathinner{\langle{w}|} - \mathinner{\langle{w'}|)( \mathinner{|{w}\rangle} - \mathinner{|{w'}\rangle})}}
```
というもので、中学高校の時にやる距離というと、これになります。こちらには原点の存在が必要ありません。

しかし、実はこれらの距離には欠点があります。

## Skip Gram modelにおける解の多重性

Skip Gram　modelでは単語の条件付き分布$p(c|w)$をベクトルで表すことを目指しました。今、あるcorpus内での分布$\\{p(c|w)\\}$とその表現の一つ$\\{\mathinner{|{w}\rangle}\\}, \\{\mathinner{|{c}\rangle}\\}$ が与えられているとしましょう。この時、


```math
p(c|w) = \frac{
e^{
\mathinner{\langle{c}|{w}\rangle}
}
}{\sum_{c' \in V}e^{
\mathinner{\langle{c'}|{w}\rangle}
}}
```
とかけるのでした。ここで、分子分母が同じ形の指数関数を持っていることに注目すると、任意の定vector$\mathinner{|{const.}\rangle})$に対して、

```math
p(c|w) = \frac{
e^{
(\mathinner{\langle{c}|} + \mathinner{\langle{const.}|})\mathinner{|{w}\rangle}
}
}{\sum_{c' \in V}e^{
(\mathinner{\langle{c'}|} + \mathinner{\langle{const.}|})\mathinner{|{w}\rangle}
}}
```
とかけます。ここで、 $(\mathinner{|{c}\rangle} + \mathinner{|{const.}\rangle})$を$\tilde{\mathinner{|{c}\rangle}}$と書き直すと、$\\{\mathinner{|{w}\rangle}\\}, \\{\tilde{\mathinner{|{c}\rangle}}\\}$も分布$\\{p(c|w)\\}$のvector表現になります。一般には次が成り立ちます。

[命題]
任意の分布$\\{p(c|w)\\}$とそのsoftmax表現の一つ$\\{\mathinner{|{w}\rangle}\\}, \\{\mathinner{|{c}\rangle}\\}$ が与えられているとする。この時、affine関数のpair　$f,g$が次の条件を満たすのであれば、$\\{f(\mathinner{|{w}\rangle})\\}, \\{g(\mathinner{|{c}\rangle})\\}$も$\\{p(c|w)\\}$のsoftmax表現の一つである。

```math
\begin{align}
f(\mathinner{|{w}\rangle}) &= A\mathinner{|{w}\rangle} + \mathinner{|{a}\rangle},\\
g(\mathinner{|{c}\rangle}) &= B\mathinner{|{c}\rangle} + \mathinner{|{b}\rangle},
\end{align}
```
where,


```math
\begin{align}
B^*A &= I,\\
\mathinner{|{a}\rangle} &\in Span\{B\mathinner{|{c}\rangle}\}^\perp.
\end{align}
```
ここで$B^*$は$B$の共役（実行列の場合は転置)、$I$は単位行列、$Span$はその内部のベクトルが張る線形空間、$V^\perp$は$V$の直交補空間である。
[命題終]
この命題の証明は簡単なので、ここではしません[^6]。しかし、これによれば、word vectorのみを考えると、任意の逆行列をもつ行列$A$による変換が$\\{p(c|w)\\}$のsoftmax表現として許されてしまいます。この結果、ある単語に対しての近さの順位は容易に変わり得ます。つまり、word vectorだけでは、単語の近さを捉えているとは言い難いのではないでしょうか？

## Skip Gram modelにおける距離の候補

この状況を回避するためには元の分布$\\{p(c|w)\\}$まで遡る必要があると思われます。一つの解は、Kullback-Leibler Information　$D_{KL}(p(\cdot|w)||p(\cdot|w'))$をそのまま使用することですが、これは、非常に計算コストがかかります。それゆえ、距離として

```math
\begin{align}
D(w, w') &:= D_{KL}(p(\cdot|w)||p(\cdot|w')) + D_{KL}(p(\cdot|w')||p(\cdot|w))\\
&=(E_w[\mathinner{\langle{c}|}] - E_{w'}[\mathinner{\langle{c}|}])(\mathinner{|{w}\rangle} - \mathinner{|{w'}\rangle})
\end{align}
```
ここで、

```math
E_w[\mathinner{\langle{c}|}] := \sum_{c}p(c|w)\mathinner{\langle{c}|}

```
を使ってみてはいかがでしょうか[^7]？

この時、記憶しておかなければならないvectorは$\\{\mathinner{|{w}\rangle}\\},\\{E_w[\mathinner{\langle{c}|}]\\} $　と２倍に増えますが、解の多重性問題からは解放されます[^8]。

[^1]: 基本的に単語のベクトル空間（ノルム空間・内積空間）への写像の一種(局所的でないベクトルへの写像、もしくは分布仮説に基づいて構成された写像)を分散表現とすることが多いです。しかし、類義語タスクで必要なのは距離の概念であり、その表現は(それらのタスクのみを考えるならば)距離空間への写像で十分なはずです。実際、Nickelらの[この論文](https://arxiv.org/abs/1705.08039)では双曲空間への写像を試しています。（Whitneyの埋め込み定理があるのでユークリッド空間への埋め込みと言えなくはないですが）。関係性タスクでは、ベクトル同士がどのように異なるかという概念（接続）が必要です。
[^2]: 極端な話、表現は単射性を要求している訳ではないので、1点写像を考えれば、悪い表現を得ることができます。
[^3]: とはいえ、基本的にはSGNSはSGの確率モデルを発展させる形で作られているので、ほとんど大丈夫だと思います。
[^4]: 筆者はもともと量子情報の専門だったため、何かの実態(state)$s$のvector表現をket vector　$\mathinner{|{s}\rangle} $その共役(conjugate; 実ベクトルの場合は転置)をbra vector $\mathinner{\langle{s}|}$　で表し、内積を $\mathinner{\langle{s}|{s}\rangle}$ で表現するbraket 記法に慣れており、それを使用します。
[^5]: ここまでやるのであれば、vectorを単位球に射影し、その球面上での距離（つまりなす角$\theta$そのもの）を考えても良いと思うが、あまりそういう話は聞かない。
[^6]: 要望があればやります。
[^7]: 野良研究者なので、実証実験用の計算機と実証実験の時間がないです。
[^8]: かなり簡単な話なので、誰かやっていてもおかしくないのですが、何かこれについてご存知の方は教えていただけるとありがたいです。