.. _sec_approx_train: 近似学習 ======== | :numref:`sec_word2vec` での議論を思い出してほしい。 | skip-gram モデルの主な考え方は、softmax 演算を用いて、与えられた中心語 :math:`w_c` に基づいて文脈語 :math:`w_o` を生成する条件付き確率を :eq:`eq_skip-gram-softmax` で計算することである。その対応する対数損失は :eq:`eq_skip-gram-log` の符号を反転したものとして与えられる。 softmax 演算の性質上、文脈語は辞書 :math:`\mathcal{V}` のどれでもあり得るため、:eq:`eq_skip-gram-log` の符号を反転した式には、語彙全体の大きさに等しい数の項の総和が含まれる。したがって、:eq:`eq_skip-gram-grad` における skip-gram モデルの勾配計算と、:eq:`eq_cbow-gradient` における continuous bag-of-words モデルの勾配計算の両方に、この総和が含まれる。残念ながら、このように大きな辞書(しばしば数十万語から数百万語)にわたって和を取る勾配の計算コストは非常に大きいのです! 前述の計算複雑性を削減するために、この節では 2 つの近似学習法、\ *negative sampling* と *hierarchical softmax* を紹介する。skip-gram モデルと continuous bag of words モデルの類似性のため、ここでは skip-gram モデルを例として、これら 2 つの近似学習法を説明する。 .. _subsec_negative-sampling: Negative Sampling ----------------- Negative sampling は元の目的関数を修正する。中心語 :math:`w_c` の文脈ウィンドウが与えられたとき、任意の(文脈)語 :math:`w_o` がこの文脈ウィンドウから来るという事実を、次のようにモデル化される確率をもつ事象として考える。 .. math:: P(D=1\mid w_c, w_o) = \sigma(\mathbf{u}_o^\top \mathbf{v}_c), ここで :math:`\sigma` はシグモイド活性化関数を次のように定義したものである。 .. math:: \sigma(x) = \frac{1}{1+\exp(-x)}. :label: eq_sigma-f まず、単語埋め込みを学習するために、テキスト系列におけるこのような事象すべての同時確率を最大化することから始めよう。具体的には、長さ :math:`T` のテキスト系列が与えられたとき、時刻 :math:`t` における単語を :math:`w^{(t)}` と表し、文脈ウィンドウサイズを :math:`m` とすると、次の同時確率を最大化することを考える。 .. math:: \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(D=1\mid w^{(t)}, w^{(t+j)}). :label: eq-negative-sample-pos しかし、:eq:`eq-negative-sample-pos` は正例に関わる事象しか考慮していない。その結果、:eq:`eq-negative-sample-pos` の同時確率は、すべての単語ベクトルが無限大に等しい場合にのみ 1 に最大化される。もちろん、このような結果には意味がない。目的関数をより意味のあるものにするために、\ *negative sampling* はあらかじめ定めた分布からサンプリングした負例を追加する。 :math:`S` を、文脈語 :math:`w_o` が中心語 :math:`w_c` の文脈ウィンドウから来るという事象とする。この :math:`w_o` を含む事象に対して、あらかじめ定めた分布 :math:`P(w)` から、この文脈ウィンドウに含まれない :math:`K` 個の *noise words* をサンプルする。\ :math:`N_k` を、ノイズ語 :math:`w_k` (:math:`k=1, \ldots, K`) が :math:`w_c` の文脈ウィンドウから来ないという事象とする。正例と負例の両方に関わるこれらの事象 :math:`S, N_1, \ldots, N_K` は互いに独立であると仮定する。Negative sampling は、:eq:`eq-negative-sample-pos` における(正例のみを含む)同時確率を次のように書き換える。 .. math:: \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}), ここで条件付き確率は、事象 :math:`S, N_1, \ldots, N_K` を通じて近似される。 .. math:: P(w^{(t+j)} \mid w^{(t)}) =P(D=1\mid w^{(t)}, w^{(t+j)})\prod_{k=1,\ w_k \sim P(w)}^K P(D=0\mid w^{(t)}, w_k). :label: eq-negative-sample-conditional-prob テキスト系列の時刻 :math:`t` における単語 :math:`w^{(t)}` のインデックスを :math:`i_t`\ 、ノイズ語 :math:`w_k` のインデックスを :math:`h_k` とする。:eq:`eq-negative-sample-conditional-prob` における条件付き確率に関する対数損失は次のようになる。 .. math:: \begin{aligned} -\log P(w^{(t+j)} \mid w^{(t)}) =& -\log P(D=1\mid w^{(t)}, w^{(t+j)}) - \sum_{k=1,\ w_k \sim P(w)}^K \log P(D=0\mid w^{(t)}, w_k)\\ =&- \log\, \sigma\left(\mathbf{u}_{i_{t+j}}^\top \mathbf{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\left(1-\sigma\left(\mathbf{u}_{h_k}^\top \mathbf{v}_{i_t}\right)\right)\\ =&- \log\, \sigma\left(\mathbf{u}_{i_{t+j}}^\top \mathbf{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\sigma\left(-\mathbf{u}_{h_k}^\top \mathbf{v}_{i_t}\right). \end{aligned} これにより、各学習ステップでの勾配計算コストは辞書サイズに依存せず、\ :math:`K` に線形に依存することがわかる。ハイパーパラメータ :math:`K` を小さく設定すれば、negative sampling を用いた各学習ステップでの勾配計算コストはより小さくなる。 Hierarchical Softmax -------------------- 別の近似学習法として、\ *hierarchical softmax* は二分木を用いる。これは :numref:`fig_hi_softmax` に示すデータ構造で、木の各葉ノードが辞書 :math:`\mathcal{V}` の単語を表す。 .. _fig_hi_softmax: .. figure:: ../img/hi-softmax.svg 近似学習のための hierarchical softmax。各葉ノードは辞書中の単語を表す。 :math:`L(w)` を、二分木において根ノードから単語 :math:`w` を表す葉ノードまでの経路上にあるノード数(両端を含む)とする。\ :math:`n(w,j)` をこの経路上の :math:`j^\textrm{th}` ノードとし、その文脈語ベクトルを :math:`\mathbf{u}_{n(w, j)}` とする。たとえば、 :numref:`fig_hi_softmax` では :math:`L(w_3) = 4` である。Hierarchical softmax は、:eq:`eq_skip-gram-softmax` における条件付き確率を次のように近似する。 .. math:: P(w_o \mid w_c) = \prod_{j=1}^{L(w_o)-1} \sigma\left( [\![ n(w_o, j+1) = \textrm{leftChild}(n(w_o, j)) ]\!] \cdot \mathbf{u}_{n(w_o, j)}^\top \mathbf{v}_c\right), ここで関数 :math:`\sigma` は :eq:`eq_sigma-f` で定義され、\ :math:`\textrm{leftChild}(n)` はノード :math:`n` の左の子ノードである。\ :math:`x` が真なら :math:`[\![x]\!] = 1`\ 、そうでなければ :math:`[\![x]\!] = -1` である。 例として、 :numref:`fig_hi_softmax` において、単語 :math:`w_c` が与えられたときに単語 :math:`w_3` を生成する条件付き確率を計算してみよう。これには、\ :math:`w_c` の単語ベクトル :math:`\mathbf{v}_c` と、根から :math:`w_3` までの経路上にある非葉ノードのベクトル(:numref:`fig_hi_softmax` で太字で示された経路)との内積が必要である。この経路は左、右、左の順にたどられる。 .. math:: P(w_3 \mid w_c) = \sigma(\mathbf{u}_{n(w_3, 1)}^\top \mathbf{v}_c) \cdot \sigma(-\mathbf{u}_{n(w_3, 2)}^\top \mathbf{v}_c) \cdot \sigma(\mathbf{u}_{n(w_3, 3)}^\top \mathbf{v}_c). :math:`\sigma(x)+\sigma(-x) = 1` なので、任意の単語 :math:`w_c` に基づいて辞書 :math:`\mathcal{V}` のすべての単語を生成する条件付き確率の総和は 1 になる。 .. math:: \sum_{w \in \mathcal{V}} P(w \mid w_c) = 1. :label: eq_hi-softmax-sum-one 幸いなことに、二分木構造のため :math:`L(w_o)-1` は :math:`\mathcal{O}(\textrm{log}_2|\mathcal{V}|)` のオーダーである。したがって、辞書サイズ :math:`\mathcal{V}` が非常に大きい場合、hierarchical softmax を用いた各学習ステップの計算コストは、近似学習を用いない場合と比べて大幅に削減される。 まとめ ------ - Negative sampling は、正例と負例の両方に関わる互いに独立な事象を考慮して損失関数を構成する。学習時の計算コストは、各ステップでのノイズ語の数に線形に依存する。 - Hierarchical softmax は、二分木における根ノードから葉ノードまでの経路を用いて損失関数を構成する。学習時の計算コストは、各ステップでの辞書サイズの対数に依存する。 演習 ---- 1. Negative sampling では、どのようにノイズ語をサンプリングできるか? 2. :eq:`eq_hi-softmax-sum-one` が成り立つことを確認しなさい。 3. continuous bag of words モデルを、それぞれ negative sampling と hierarchical softmax を用いてどのように学習するか?