.. _sec_word2vec: 単語埋め込み(word2vec) ======================== 自然言語は、意味を表現するために用いられる複雑なシステムである。 このシステムでは、単語が意味の基本単位である。 その名のとおり、 *単語ベクトル* は単語を表現するためのベクトルであり、 単語の特徴ベクトル、あるいは表現とみなすこともできる。 単語を実数ベクトルに写像する技術は *単語埋め込み* と呼ばれる。 近年、 単語埋め込みは徐々に 自然言語処理の基礎知識となってきた。 ワンホットベクトルは悪い選択 ---------------------------- :numref:`sec_rnn-scratch` では、単語(文字は単語)を表現するためにワンホットベクトルを用いた。 辞書中の異なる単語の数(辞書サイズ)を :math:`N` とし、 各単語に :math:`0` から :math:`N-1` までの 異なる整数(インデックス)を対応させるとする。 インデックスが :math:`i` の任意の単語に対して ワンホットベクトル表現を得るには、 長さ :math:`N` の全要素 0 のベクトルを作成し、 位置 :math:`i` の要素を 1 に設定する。 このようにして、各単語は長さ :math:`N` のベクトルで表現され、 ニューラルネットワークで直接利用できる。 ワンホット単語ベクトルは簡単に構成できるが、 通常は良い選択ではない。 主な理由の1つは、ワンホット単語ベクトルでは、私たちがよく用いる *コサイン類似度* のように、異なる単語間の類似性を正確に表現できないことである。 ベクトル :math:`\mathbf{x}, \mathbf{y} \in \mathbb{R}^d` に対して、そのコサイン類似度は両者のなす角の余弦である。 .. math:: \frac{\mathbf{x}^\top \mathbf{y}}{\|\mathbf{x}\| \|\mathbf{y}\|} \in [-1, 1]. 任意の異なる2つの単語のワンホットベクトル間のコサイン類似度は 0 なので、 ワンホットベクトルは単語間の類似性を符号化できない。 自己教師あり word2vec --------------------- 上記の問題に対処するために `word2vec `__ ツールが提案された。 これは各単語を固定長ベクトルに写像し、これらのベクトルは異なる単語間の類似性や類推関係をよりよく表現できる。 word2vec ツールには2つのモデル、すなわち *skip-gram* :cite:`Mikolov.Sutskever.Chen.ea.2013` と *continuous bag of words*\ (CBOW) :cite:`Mikolov.Chen.Corrado.ea.2013` がある。 意味的に有意味な表現を得るために、 その学習は 条件付き確率に依存しており、 コーパス中の 周囲のいくつかの単語を使って いくつかの単語を予測するものとみなせる。 教師信号がラベルなしデータから得られるため、 skip-gram と continuous bag of words の両方は 自己教師ありモデルである。 以下では、これら2つのモデルとその学習方法を紹介する。 .. _subsec_skip-gram: Skip-Gram モデル ---------------- *skip-gram* モデルは、ある単語からテキスト系列中の周囲の単語を生成できると仮定する。 テキスト系列 “the”, “man”, “loves”, “his”, “son” を例に取りよう。 “loves” を *中心単語* とし、コンテキストウィンドウサイズを 2 に設定する。 :numref:`fig_skip_gram` に示すように、 中心単語 “loves” が与えられたとき、 skip-gram モデルは、中心単語から 2 語以内にある *文脈単語* “the”, “man”, “his”, “son” を生成する条件付き確率を考える。 .. math:: P(\textrm{"the"},\textrm{"man"},\textrm{"his"},\textrm{"son"}\mid\textrm{"loves"}). 中心単語が与えられたときに 文脈単語が独立に生成される (すなわち条件付き独立)と仮定する。 この場合、上の条件付き確率は 次のように書き換えられる。 .. math:: P(\textrm{"the"}\mid\textrm{"loves"})\cdot P(\textrm{"man"}\mid\textrm{"loves"})\cdot P(\textrm{"his"}\mid\textrm{"loves"})\cdot P(\textrm{"son"}\mid\textrm{"loves"}). .. _fig_skip_gram: .. figure:: ../img/skip-gram.svg The skip-gram model considers the conditional probability of generating the surrounding context words given a center word. skip-gram モデルでは、各単語は条件付き確率を計算するために2つの :math:`d` 次元ベクトル表現を持つ。 より具体的には、 辞書中のインデックスが :math:`i` の任意の単語について、 :math:`\mathbf{v}_i\in\mathbb{R}^d` および :math:`\mathbf{u}_i\in\mathbb{R}^d` を、それぞれ *中心* 単語および *文脈* 単語として用いるときの2つのベクトルとする。 辞書中のインデックスが :math:`o` の任意の文脈単語 :math:`w_o` を、辞書中のインデックスが :math:`c` の中心単語 :math:`w_c` から生成する条件付き確率は、ベクトルの内積に対する softmax 演算でモデル化できる。 .. math:: P(w_o \mid w_c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{ \sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}, :label: eq_skip-gram-softmax ここで、語彙インデックス集合 :math:`\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}` である。 長さ :math:`T` のテキスト系列があり、時刻 :math:`t` の単語を :math:`w^{(t)}` と表す。 任意の中心単語が与えられたときに 文脈単語が独立に生成されると仮定する。 コンテキストウィンドウサイズを :math:`m` とすると、 skip-gram モデルの尤度関数は、 任意の中心単語が与えられたときに すべての文脈単語を生成する確率である。 .. math:: \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}), ここで、1 未満または :math:`T` を超える時刻は省略できる。 学習 ~~~~ skip-gram モデルのパラメータは、語彙中の各単語に対する中心単語ベクトルと文脈単語ベクトルである。 学習では、尤度関数を最大化する(すなわち最尤推定を行う)ことでモデルパラメータを学習する。これは次の損失関数を最小化することと等価である。 .. math:: - \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \textrm{log}\, P(w^{(t+j)} \mid w^{(t)}). 確率的勾配降下法を用いて損失を最小化するとき、 各反復で より短い部分系列をランダムにサンプリングし、その部分系列に対する(確率的)勾配を計算してモデルパラメータを更新できる。 この(確率的)勾配を計算するには、 中心単語ベクトルと文脈単語ベクトルに関する 対数条件付き確率の勾配を求める必要がある。 一般に、:eq:`eq_skip-gram-softmax` に従うと、 中心単語 :math:`w_c` と 文脈単語 :math:`w_o` の任意の組に関わる対数条件付き確率は .. math:: \log P(w_o \mid w_c) =\mathbf{u}_o^\top \mathbf{v}_c - \log\left(\sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)\right). :label: eq_skip-gram-log 微分により、その中心単語ベクトル :math:`\mathbf{v}_c` に関する勾配は次のように得られる。 .. math:: \begin{aligned}\frac{\partial \textrm{log}\, P(w_o \mid w_c)}{\partial \mathbf{v}_c}&= \mathbf{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\mathbf{u}_j^\top \mathbf{v}_c)\mathbf{u}_j}{\sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}\\&= \mathbf{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\exp(\mathbf{u}_j^\top \mathbf{v}_c)}{ \sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}\right) \mathbf{u}_j\\&= \mathbf{u}_o - \sum_{j \in \mathcal{V}} P(w_j \mid w_c) \mathbf{u}_j.\end{aligned} :label: eq_skip-gram-grad :eq:`eq_skip-gram-grad` の計算には、中心単語として :math:`w_c` を用いたときの辞書中のすべての単語の条件付き確率が必要であることに注意してほしい。 他の単語ベクトルに対する勾配も同様に求められる。 学習後、辞書中のインデックスが :math:`i` の任意の単語について、2つの単語ベクトル :math:`\mathbf{v}_i`\ (中心単語として)と :math:`\mathbf{u}_i`\ (文脈単語として)を得る。 自然言語処理の応用では、skip-gram モデルの中心単語ベクトルが通常 単語表現として用いられる。 Continuous Bag of Words(CBOW)モデル ------------------------------------- *continuous bag of words*\ (CBOW)モデルは skip-gram モデルに似ている。 skip-gram モデルとの主な違いは、 continuous bag of words モデルが テキスト系列中の周囲の文脈単語に基づいて 中心単語が生成されると仮定する点である。 たとえば、 同じテキスト系列 “the”, “man”, “loves”, “his”, “son” で、“loves” を中心単語とし、コンテキストウィンドウサイズを 2 とすると、 continuous bag of words モデルは 文脈単語 “the”, “man”, “his”, “son” に基づいて中心単語 “loves” を生成する条件付き確率を考えます(:numref:`fig_cbow` を参照)。これは .. math:: P(\textrm{"loves"}\mid\textrm{"the"},\textrm{"man"},\textrm{"his"},\textrm{"son"}). .. _fig_cbow: .. _学習-1: .. figure:: ../img/cbow.svg The continuous bag of words model considers the conditional probability of generating the center word given its surrounding context words. continuous bag of words モデルでは 複数の文脈単語があるため、 条件付き確率の計算ではこれらの文脈単語ベクトルを平均する。 具体的には、 辞書中のインデックスが :math:`i` の任意の単語について、 :math:`\mathbf{v}_i\in\mathbb{R}^d` および :math:`\mathbf{u}_i\in\mathbb{R}^d` を、それぞれ *文脈* 単語および *中心* 単語として用いるときの2つのベクトルとする (意味は skip-gram モデルと入れ替わっている)。 周囲の文脈単語 :math:`w_{o_1}, \ldots, w_{o_{2m}}`\ (辞書中のインデックスが :math:`o_1, \ldots, o_{2m}`\ )が与えられたときに、任意の中心単語 :math:`w_c`\ (辞書中のインデックスが :math:`c`\ )を生成する条件付き確率は、次のようにモデル化できる。 .. math:: P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\exp\left(\frac{1}{2m}\mathbf{u}_c^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \exp\left(\frac{1}{2m}\mathbf{u}_i^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) \right)}. :label: fig_cbow-full 簡潔のために、\ :math:`\mathcal{W}_o= \{w_{o_1}, \ldots, w_{o_{2m}}\}` および :math:`\bar{\mathbf{v}}_o = \left(\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}} \right)/(2m)` とおきる。すると :eq:`fig_cbow-full` は次のように簡略化できる。 .. math:: P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\mathbf{u}_c^\top \bar{\mathbf{v}}_o\right)}{\sum_{i \in \mathcal{V}} \exp\left(\mathbf{u}_i^\top \bar{\mathbf{v}}_o\right)}. 長さ :math:`T` のテキスト系列があり、時刻 :math:`t` の単語を :math:`w^{(t)}` と表す。 コンテキストウィンドウサイズを :math:`m` とすると、 continuous bag of words モデルの尤度関数は、 それぞれの文脈単語が与えられたときに すべての中心単語を生成する確率である。 .. math:: \prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}). 学習 ~~~~ continuous bag of words モデルの学習は、 skip-gram モデルの学習とほぼ同じである。 continuous bag of words モデルの 最尤推定は、次の損失関数を最小化することと等価である。 .. math:: -\sum_{t=1}^T \textrm{log}\, P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}). 次に注意しよ。 .. math:: \log\,P(w_c \mid \mathcal{W}_o) = \mathbf{u}_c^\top \bar{\mathbf{v}}_o - \log\,\left(\sum_{i \in \mathcal{V}} \exp\left(\mathbf{u}_i^\top \bar{\mathbf{v}}_o\right)\right). 微分により、任意の文脈単語ベクトル :math:`\mathbf{v}_{o_i}`\ (\ :math:`i = 1, \ldots, 2m`\ )に関する勾配は次のように得られる。 .. math:: \frac{\partial \log\, P(w_c \mid \mathcal{W}_o)}{\partial \mathbf{v}_{o_i}} = \frac{1}{2m} \left(\mathbf{u}_c - \sum_{j \in \mathcal{V}} \frac{\exp(\mathbf{u}_j^\top \bar{\mathbf{v}}_o)\mathbf{u}_j}{ \sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \bar{\mathbf{v}}_o)} \right) = \frac{1}{2m}\left(\mathbf{u}_c - \sum_{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \mathbf{u}_j \right). :label: eq_cbow-gradient 他の単語ベクトルに対する勾配も同様に求められる。 skip-gram モデルとは異なり、 continuous bag of words モデルでは通常 文脈単語ベクトルを単語表現として用いる。 まとめ ------ - 単語ベクトルは単語を表現するためのベクトルであり、単語の特徴ベクトル、あるいは表現とみなすこともできる。単語を実数ベクトルに写像する技術は単語埋め込みと呼ばれる。 - word2vec ツールには skip-gram モデルと continuous bag of words モデルの両方が含まれる。 - skip-gram モデルは、ある単語からテキスト系列中の周囲の単語を生成できると仮定する。一方、continuous bag of words モデルは、周囲の文脈単語に基づいて中心単語が生成されると仮定する。 演習 ---- 1. 各勾配を計算する計算量はどれくらいですか? 辞書サイズが非常に大きい場合、どのような問題が生じますか? 2. 英語のいくつかの定型句は “new york” のように複数の単語から構成される。これらの単語ベクトルをどのように学習するか? ヒント:word2vec 論文の Section 4 を参照されたい :cite:`Mikolov.Sutskever.Chen.ea.2013`\ 。 3. skip-gram モデルを例に、word2vec の設計について考えてみよう。skip-gram モデルにおける2つの単語ベクトルの内積とコサイン類似度の関係は何だろうか? 意味的に似た単語の組に対して、なぜ skip-gram モデルで学習した単語ベクトルのコサイン類似度が高くなりうるのだろうか?