🐒

Stanford NLP with Deep Learning Lecture2のまとめ

2023/03/22に公開

1.はじめに

数日前にGPT-4モデルが発表され、NLPの分野が新しいステージに登ったと言われておりますが私は変わらずDLモデルの学習を続けていきたいと思います。
 お金に余裕さえあれえばGPT-4で色々いじって開発やりたいのにっっっ!って思っております。
 あと、シンプルに知識を固めないと単なるコーディング屋さんのままではChatGPTに淘汰される未来しか見えないので理論とコーディング両方の質を向上していかないとなと改めて感じております。
 前置きが長くなってすみません。
 今回は前稿に引き続きStanford大学の講義を聞いて自分が見返せるようまとめていきたい思います。
 Lecture2の内容としては、初めにWord2Vecの中身について少し触れた後、ワードベクトルに関するアルゴリズム部分、そして作成したワードベクトルの評価方法という流れになっていました。
 それ以外にも多義語への挑戦であったり、各種アルゴリズムの実戦模様の解説等もあったのですがそこは省いています。

2.Word2Vec

前稿ではざっくりとword2Vecの概要を説明したので今回は少し踏みいった中身について述べていきます。

2-1: Word2Vecにおけるパラメータと計算過程

Word2Vecにおけるパラメータは以下の2種類であり、

  • center wordベクトル
    :ある単語がWindowの中心となったときのベクトルをまとめた行列
  • outside wordベクトル
    :各単語がcenter wordでないときのベクトルをまとめた行列

ここからある単語がcenter wordとなった時のcenter wordベクトルとoutsideベクトルの内積を計算し、softmax関数に入れることで各単語の条件付き確率を計算することができます。
その様子を表したのが下図です。
図1:4個の単語を3次元ベクトルで表した時の計算の様子

ここにおける値はランダムに振ったものなので単語に関連させるのは気持ち悪いですが、この結果からわかることは4番目の単語と関連性が高い単語は2番目の単語であるということです。
これを繰り返していき、最も損失のないベクトルが得る手法がWord2Vecです。
 またWord2Vecのように文脈を考慮せず、
各単語ごとの値に意味を付与するNLPモデルをBag-Of-Wordsモデルといいます。

2-2: 勾配計算

先述したように、Word2Vecは損失が最小となるベクトルを見つける手法であり損失の最小化を行うにあたって勾配降下アルゴリズムを用いてます(前稿にて更新式は記述済み)。
 ただ、2-1の例のように4単語ぐらいのサイズだと計算は容易ですが実際の問題解決時には膨大なサイズの単語を扱う必要がありそのまま勾配を計算することは現実的ではありません。
 そこで、各種ニューラルネットワークモデルでもよく用いられている
Stochastic gradient descent(確率的勾配降下法) をWord2Vecにも適用します。
<Stochastic gradient descent(確率的勾配降下法)>

  • 全データの中から小さいデータをランダムに選択して、勾配を計算する手法。
  • シンプルな勾配降下法と違い、計算コストが削減できることに加えて局所最適解を回避できるためパフォーマンスの向上にもつながるという利点がある。
     一見完璧に思える確率的勾配降下法だが、高次元空間を扱う言語モデルにおいて
    「ウィンドウサイズ外の見ていない単語の更新が行われず0となり、更新情報がスパースになる」
    という問題が生じます。
    この解決策としては以下の二点のいずれかを用いることで解決できます。
  • 各単語のHash値を保存する
  • 全埋め込み行列(U, V)のうち、特定の列のみ更新する

<Word2Vecで2種類のベクトルが用いられる理由>

  • center wordと同じ単語がoutsideにある時に勾配の計算が効率的に行えるため

2-3: 各種アルゴリズムについて

Word2Vec内では2つのモデルで構成されています。

  1. CBOWモデル
  2. Skip-Gram(SG)モデル
    <CBOWモデル>
    :Continuous Bag-Of-Wordsモデルの略称で与えらた文章におけるOutside wordベクトルの値からある単語がcenter wordとなる出現確率を計算するモデル。
p(V_{ij}\ |\ U) = softmax(U\cdot V_{ij})

<Skip-Gramモデル>
:CBOWモデルとは因果関係が逆転しており、文章中におけるある単語のcenter wordベクトルが与えられた時のoutside wordの出現確率を予測するモデル。

p(U_{ij}\ |\ V_{ij}) = softmax(U_{ij}\cdot V_{ij})

これらのモデルにおいてこのまま扱ってしまうと、多クラス問題であるが故に単語数の増加に伴って損失関数の計算コストが大きくなってしまうというデメリットがあります。
それに対しては以下の二つの手法を用いることで解決できます。

  • 階層ソフトマックス関数の利用
  • Negative Sampling

原論文では後者のNegative Samplingを用いた手法が推奨されています。
<SG NegativeSamplingとは>
 この手法とシンプルなSGモデルで異なる点は、損失関数がSoftmax関数からLogistic関数へと変わったことにあります。
 先述した通り、計算コストの増加は多クラス問題であることが原因でした。
そこで問題をoutside wordそれぞれを予測するのではなく、outside wordか否かの二値分類問題とすることで計算量の問題を解決しました。
損失関数L(\theta)は以下のように定義されます。

\begin{align} L(\theta) &= \frac{1}{T}\sum_{t= 1}^T L_t(\theta) \\ L_t(\theta)&= -log\sigma({{u_o}^T}v_c) - \sum_{k \in sample\ indices}log\sigma(-{{u_k}^T}v_c) \end{align}

また周辺単語以外の単語に関しては、単語の個数の3/4乗した重みでユニグラム言語モデルの式を用いて計算しています。
<式>

p(w_i) = \frac{|w_i|^{\frac{3}{4}}}{\sum_{w_j}|w_j|^\frac{3}{4}}

3.CountベースとGloVeアルゴリズム

3-1:Countベース

これまでは単語をベクトルで表すことに注目してきました。
 これは間接的に単語間の類似性を見ていますが、直接的に単語の共起数を統計的に用いる手法のついて述べていきます。
例として以下の三つの文章(corpus)における共起行列を見ていきます。

  • I like deep learning.
  • I like NLP.
  • I enjoy flying.
I like enjoy deep learning NLP flying .
I 0 2 1 0 0 0 0 0
like 2 0 0 1 0 1 0 0
enjoy 1 0 0 0 0 0 1 0
deep 0 1 0 0 1 0 0 0
learning 0 0 0 1 0 0 0 1
NLP 0 1 0 0 0 0 0 1
flying 0 0 1 0 0 0 0 1
. 0 0 0 0 1 1 1 1

この行列を見てわかる通り、この行列は疎な行列と言えます。
 疎な行列の問題点としてロバスト性に欠けることが挙げられ、これを解決するために低次元で表現することで0の要素を減らすことが考えられました。
 数ある手法のうち、伝統的な手法としては特異値分解による次元削減を講義では紹介していました。
 これは以下のようにある行列を3種類のベクトルに分解し、次元削減を行うことで情報量をある程度保ったまま次元削減できるという手法です。

X = U \Sigma V^T \\

[X:n\times mの対象の行列, U: n\times nの行列, \Sigma: m\times nで特異値を一部対角成分としてもつ行列, V: m\times mの行列]

次元削減の様子は下図に示します
図2)特異値分解を用いた次元削減[2]より引用

ただ、この特異値分解による次元削減をそのまま用いるのでは出現頻度の低いものばかりの行列に対してうまく働かないことが知られています。
 その対策として以下のものが挙げられます。

  • function wordと呼ばれる代名詞や冠詞に対して以下のようなスケーリングを行う。
    • 出現頻度対して対数変換を行う
    • 頻度の最大値を決める
    • function wordを無視する
  • 類似性の低い単語より類似性の高い単語をカウントするWindowを用いる
  • countの代わりにピアソンの相関係数を用いることで負の値をなくす
     ただ、これでも文章のサイズが大きすぎると計算量が大きくなったり、類似性のタスク以外に用いづらいという弱点があります
     講義では次に紹介するCountベースとベクトルを直接求めるモデルを合体させたGloVeがアルゴリズムが良いとされています。

3-2:GloVeアルゴリズム

GloVeアルゴリズムの前に二つのモデルの比較を行っていきます。
<countベースとベクトルモデルの比較>
図3) それぞれの代表的な手法とメリット、デメリット

どちらにもメリットデメリットありますが、Countベースにおける出現頻度をもとにした比重は機械に意味を理解させる上で役に立ちます。
 そこでGloVeアルゴリズムでは以下式で表されるようなA log-bilinear modelを用いることで言語ベクトル空間に比重を対応させました。

w_x \cdot (w_a - w_b) = \log \frac{P(x\ |\ a)}{P(x\ |\ b)}

またGloVeアルゴリズムでは損失Lを、共起行列上で調整することで両モデルのデメリットを解決しました。

L = \sum_{i, j = 1}^V f(\mathbf{X}_{ij})({w_i}^T\hat{w}_j + b_i + \hat{b}_j - \log{\mathbf{X}_{ij}})^2 \\ f(\cdot):出現頻度が高い単語が頭打ちになるようにするための関数

[V:語彙のサイズ, \mathbf{X}_{ij}:共起行列の要素, w, \hat{w}:重み, b, \hat{b}:バイアス]

このアルゴリズムを用いることで各種Countベース,ベクトルモデルよりも高い精度を出すことが結果として出ています。

4.ベクトルの評価方法

最後に算出し、得たベクトルの評価方法について述べていきます。
自然言語処理の分野におけるベクトルの評価方法については大きく以下の2種類に分けることができます。

  • Intrinsic(内省的評価)
  • Extrinsic(外省的評価)

<Intrinsic(内省的評価)>

  • 真の目的とは異なるタスクをもとにスコアを出す手法
    ex)単語間類似度
    メリット)
  • 計算が速い
  • システム自体を理解するのに有用
    デメリット)
  • 真のタスクとの関係を見るには不透明であるという点

<Extrinsic(外省的評価)>

  • 実際に解きたいタスクを用いて評価する手法
    ex)機械翻訳の精度、類自分用の検索精度
    メリット)
  • 直接的に良いモデルかどうかの判断ができる
    デメリット)
  • 計算コストが高い
  • モデルないで問題が起きてもよく分からない

どちらを採用するかは評価段階やリソースによって分けるのが良さそうですね、、。

5.おわりに

今回はWord2Vecの中身の詳細部分に加えて知らなかったGloVeアルゴリズムについて学びました。
 この調子で続けていきたいところですが欲を言えば自分の英語力と理解力を強化してもっとペースを上げていきたいところですね
 そして、NLPは転換期を迎えていると初学者なりに感じているのでその波に乗り遅れないように来たる時までに力をつけたいものですね。

6.参考資料

[1]Stanford NLP CS224N: NLP with Deep Learning |Winter2021| Lecture2 - Intro & Word Vectors
[2]Technical Note - 特異値分解(SVD)

Discussion