jiku log

データサイエンスの核心を掴む : 学びと発見の記録

「データのつながりを活かす技術」を読む ~第5章 ノード埋め込み ①表データを対象とした機械学習の復習~

はじめに

データのつながりに着目した新たなデータ分析の手法を学ぶために,黒木裕鷹・保坂大樹 著 「データのつながりを活かす技術〜ネットワーク/グラフデータの機械学習から得られる新視点」を読むことにした。


本記事は,「第5章 ノード埋め込み」における,表データを対象とした機械学習の復習および単語埋め込みに関する読書メモである。

  • 本書の紹介ページ

gihyo.jp

第5章 ノード埋め込み

本章では,ネットワークデータの構造をより扱いやすくするための技術であるノード埋め込み(node embedding)について説明している。
現実のネットワークデータは高次元かつ疎であるため,そのままデータ分析に扱うことは難しい。そのため,ノードの相対的な位置関係を出来るだけ維持したまま,低次元で密なベクトル空間に変換する(埋め込む)技術が活躍する。埋め込みによって計算処理が容易になるため,ノード分類やリンク予測といった後段のタスクが実行しやすくなる。

5.1 表データを対象とした機械学習の復習

本節では,ネットワークデータではなく一般の表データを対象とした機械学習について復習している。

機械学習のタスクでは,入力 \boldsymbol{x}から予測値 \hat{y}を予測する。表データに対する機械学習には,以下のような特徴がある。

  • 各処理対象が1行の特徴量で記述される。
  • 各処理対象に対する予測は,行間の依存関係を考えない


ネットワークデータでは,各ノードの特徴だけではなく,ノード同士のつながりも重要な特徴になる。
ただしノードのつながりの情報として,隣接行列の該当する行をそのまま特徴として扱おうとすると,処理対象1行分のデータが大きくなり,一般的な機械学習モデルをそのまま適用するのは現実的ではない。

そのためネットワークの構造から,各ノードの「新たな特徴量」を抽出するアプローチが重要になる。

5.2 単語埋め込み

ノード埋め込みについて理解を深めるうえで切り離すことができない概念が単語埋め込み(word embedding)である。これは,テキストデータ内の単語を低次元のベクトル(分散表現)に変換し,その潜在的な意味を数値的に扱えるようにする技術である。

記号としての単語の数値表現

単語を数値として表す最も単純な方法として,one-hot エンコーディングが挙げられる。
one-hot エンコーディングでは,扱いたい語彙数分の次元を持ったベクトルを用意し,ベクトルの各次元に各単語を割り当てる。

one-hot エンコーディングのイメージ

もし10,000種類の単語を扱いたい場合は10,000次元のベクトルを作成する。語彙数は10,000を超えることも珍しくはなく,一般的に大きなベクトルが用いられる。


文書を数値化する際に,最も単純な方法としてBag of Words (BoW)がよく用いられる。BoWでは,各文書に含まれる単語の出現回数を数え,その結果をベクトルで表す表現である。さらにBoWの拡張として,各単語の重要度を数値化たものがtf-idf (term frequency - inverse document frequency)である。
ただし,tf-idfなどによって単語をよりリッチに数値化できたとしても,依然として単語同士の「意味的な類似性」までは扱えないという問題があった。

意味を考慮した単語の数値表現

one-hot エンコーディングやtf-idfが単語をその出現に基づいて表現しているのに対して,単語埋め込みは単語の潜在的な「意味」や「文脈」をベクトルとして表現する,という特徴を持つ。
高次元かつ疎になりやすいone-hot エンコーディングから,単語間の類似性を上手く表現できる低次元の分散表現への転換は,自然言語処理の歴史上大きなブレークスルーとなった。

単語埋め込みの仕組み

本節では,「単語同士の意味的な関係を捉えられるベクトル表現」を学習するための方法について説明している。特に単語埋め込み学習アルゴリズムのうち,word2vecが紹介されている。

分布仮説

word2vecは,「コーパス中において,ある単語はその周辺のt南湖から予測できる」という仮説(分布仮説)に基づいて,単語ベクトルを学習する。
以下に,学習に用いる文の例を示す。

  • 私の家では,犬を[MASK]予定だ
  • 私の家で,猫を[MASK]予定です
  • 私の家では,インターネット回線を[MASK]予定だ

それぞれの文章において[MASK]に入る単語を考えると,前後の文脈から,1つ目・2つ目の文では「飼う」が入ることが想定される。
word2vecでは,こうした「周辺単語から中心単語を推測する」あるいは「中心単語から周辺単語を推測する」という仕組みを大規模に実行し,単語の意味を捉えたベクトルを獲得する。

このような,データセットの変換によって学習データ(マスクした文章)と教師データ(元のコーパス中の文章)を生成する方法は,自己教師あり学習(self-supervised learning)と呼ばれる。自己教師あり学習は,手動で教師データを作成する必要がないため,非常に大規模なデータセットにも容易に適用できることが特徴である。

Skip-gramモデル

word2vecにおいて学習を行なうために,代表的な設定としてSkip-gramモデルが挙げられる。

コーパス中の単語の系列を \omega_1, \omega_2, \cdots, \omega_Nとして,ある単語 \omega_n (1 \leq n \leq N)(中心単語)を入力として,その周辺(文脈)の単語 \omega_{n+w} (-W \leq n \leq W, w \neq 0)を予測する仕組みがSkip-gramである。

中心単語 \omegaとその周辺単語 \omega'に対し,単語ベクトル \boldsymbol{r}_{\omega}, \boldsymbol{r}_{\omega'}と文脈ベクトル \boldsymbol{r'}_{\omega}, \boldsymbol{r'}_{\omega'}の2種類が割り当てられ,Skip-gramモデルでは以下の条件知己確立を高めるように \boldsymbol{r}_{\omega}, \boldsymbol{r'}_{\omega}を学習する。


 \begin{align}
P(\omega' \lvert \omega) = \frac{ \exp (\boldsymbol{r}_{\omega}^{\top}  \boldsymbol{r'}_{\omega'} )  }{ \sum_{\omega'' \in \Omega} \exp (\boldsymbol{r}_{\omega}^{\top}  \boldsymbol{r'}_{\omega''} )} \\
\end{align}

ここで, \Omegaコーパスの語彙集合である。内積 \boldsymbol{r}_{\omega}^{\top}  \boldsymbol{r'}_{\omega'} が大きいほど, \omega \omega'が一緒に出現しやすいとみなす。そして,上式に関する負の対数尤度


 \begin{align}
L(\omega' \lvert \omega) = -\log P(\omega' \lvert \omega) \\
\end{align}

を損失関数として最小化するのが基本的な方針である。


ただしこの問題設定では \lvert \Omega \rvertクラス分類問題を解くことになり,語彙数 \lvert \Omega \rvertが大きいと計算量が大きくなるので,計算量を削減するためにネガティブサンプリング(negative sampling)が用いられる。
ネガティブサンプリングでは,

  • 学習データ上で周辺に出現している単語ペア
  • 学習データ全体からサンプリングした単語ペア

のいずれであるかを予測する2値分類問題として近似する。具体的な損失関数として,


 \begin{align}
L(\omega' \lvert \omega) = -\log \sigma( \boldsymbol{r}_{\omega}^{\top}  \boldsymbol{r'}_{\omega'} ) - \sum_{\omega'' \in \Omega_{\mathrm{neg}}} \log \sigma(-\boldsymbol{r}_{\omega}^{\top}  \boldsymbol{r'}_{\omega''} )  \\
\end{align}

を最小化する。ただし \sigma(\cdot)シグモイド関数 \sigma (x) = 1/(1 + \exp(-x))である。

ネガティブサンプリングを用いることで, \lvert \Omega \rvertの部分が \lvert \Omega_{\mathrm{neg}} \rvertに置き換えられて計算量を減らすことができるようになる。また \lvert \Omega_{\mathrm{neg}} \rvertの大きさは数個程度でも十分であるということが実験的に分かっている。

まとめと感想

今回は,「第5章 ノード埋め込み」における,表データを対象とした機械学習の復習および単語埋め込みについてまとめた。

自然言語処理における単語埋め込みは,2010年代において自然言語処理にブレークスルーを起こした手法であったが,モチベーションは「スパースなone-hot エンコーディングを,扱いやすい低次元ベクトルに置き換えたい」ということだった。データが疎になることは,自然言語処理だけでなく隣接行列で表現されるネットワークデータでも同様なので,次章以降で単語埋め込みと類似した手法が紹介されると考えられる。

単語埋め込みについては,分布仮説のモデリングだけでなく,ネガティブサンプリングも大きな工夫の1つであった。ノード埋め込みの手法についても,単語埋め込みのアナロジーを考えながら理解を進めていきたい。


本記事を最後まで読んでくださり,どうもありがとうございました。