🐒

Stanford NLP with Deep Learning Lecture1のまとめ

2023/03/08に公開

1.はじめに

これまでの2稿はTransformerによる自然言語処理の学習のアウトプットとして記事を書いてきました。
 GPTモデルに入り出してからもっと理論的な部分の学習した方がいいんじゃない?とふと思ったのでYoutubeにあるStanford大学が公開しているDeep Learningを用いた自然言語処理の講義で学習することにしました。
 本稿はその講義の備忘録というか自分の翻訳および認識が間違えていないかの確認のために講義内容を簡潔にまとめていきたいと思います。
 また、Transformerの記事等講義以外の記事と投稿の順序が混雑するかもしれませんがご了承ください。

2.Word Vector

Lecture1ではIntro部分と単語ベクトルに関する基礎的な部分の説明回でした。
Introに関しては講義に関する内容であったり、言語の本質についての部分だったため割愛します。
 NLPの目的は機械に人間と同様に、言語という記号からその意味を理解させることです。
人と違い機械は、直接的に指し示すものと概念や象徴のような間接的に指し示すものの相互作用によって意味を理解するというプロセスを取ります。 
そのプロセスについて述べていきます。

2-1:古典的なNLP

古典的な手法として辞書を用いて、コンピュータに言語の意味を手法があります。
その中でも最も使われている手法としてWord Netがあります。
これは、各単語に関して類似後や上・下位語のリストを作成することでシソーラス(類語辞典)を作成する手法となっています。

ex)Apple
Apple - {pear(類似語), fruit(上位語), apple juice(下位語)}

この手法はNetとあるように一つに単語に対して複数の単語が複雑に絡み合う構造をとっているため一つの文字に対して、大量のリソースを与えるという特徴を用います。
一見するとメリットのように思えるこの特徴ですが、以下のような問題点もあります。

  1. ニュアンスの欠落
  2. 情報の更新が困難である。

リソースが多い故にある文字の持つ細かいニュアンスが消えてしまったり、人力による更新が必要なため新語が日々増える言語という分野において対応していくのが難しいです。
 これは単語を記号(離散表現)のまま、用いていたことに由来しています。
そのため、単語にベクトル表現を与えようとはじめはOne-hot表現を用いて文章を高次元空間ベクトルとして表すことが考えられました。
 しかし、ただOne-hot表現のまま用いたのでは文中の単語数が増えるにつれて次元数が超高次元になってしまうことに加えて類似語の判別が難しいという問題がありました。

その問題に対して言語の意味合いを高次元空間における分布で機械に認識させようと分散表現によるベクトル化が行われました。
この単語を高次元ベクトルに変換する(= word-embedding)手法の中でもニューラルネットを用いた代表的な言語モデルとして2013年に当時Googleの社員であったMikolovらによって開発されたWord2Vecが発表されました。

2-2:Deep Learningを用いたNLP ~Word2Vec~

中身の詳細部分(CBOWやSkip-gram)については次の講義でやるっぽいので本稿では大枠の話をしていきます。

<Word2Vecの概要>

Word2Vec:
 ニューラル言語モデルの中でも昔からあるモデルで、文脈に依存せず各単語に一意な分散表現を与えるフレームワークです。
以下の考え方をもとにモデルは作成されました。

  • 大量の単語を処理する必要がある。
  • その各単語のにベクトル表現を与えたい。
  • 文章中の各単語に順番をつけて、注目している単語'c'(center word)とそれ以外の文章中の単語'o'(outside word)として考えていく。
  • 単語ベクトル間の類似性を用いてcが与えられた時のoの条件付き確率を計算する。
  • この条件付き確率が尤もらしくなるように単語ベクトルを計算する。

図1はwindow数2の時の条件付き確率の計算過程を表しています。

この図ではc = 'into'としていますがこれを他の単語に置き換えて同様の処理を文の初めから終わりまで行います。

<各単語に対するベクトルの作成方法>

図1で示した条件付き確率を求める過程で必要となる単語ベクトルの調整方法について次は述べていきます。
 ベクトルを調整する際には以下式で表される尤度をもとに損失(負の対数尤度の平均)を考え、その損失が最小になるようにパラメータが調整されます。

\begin{aligned} [尤度J(\theta)]: J(\theta) = \prod_{t = 1}^{T} \prod_{-m\leqq j \geqq m , j \neq 0}{p(w_{t+j}\ |\ w_t,}\theta) \end{aligned}
\begin{aligned} [損失L (\theta)]: L(\theta) &= -\frac{1}{T}logJ(\theta) \\ &= -\frac{1}{T}\sum_{t = 1}^{T} \sum_{-m\leqq j \geqq m , j \neq 0}log p(w_{t+j}\ |\ w_t,\theta) \tag{1} \\ [T:系列長, m:Windowサイズ, \theta:調整可能な実数] \end{aligned}

この損失の式中にある条件付き確率を求める際に以下の2種類の単語ベクトルを用います。

  • v_w :ある単語wがcenter wordの時における単語ベクトル
  • u_w: ある単語wがoutside wordの時における単語ベクトル

これらを用いて以下式のようにして条件付き確率を求めていきます。

\begin{aligned} p(o\ |\ c) = \frac{\exp(u_o^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)} \\ [o:outside\ word, c:center\ word, V:単語数] \end{aligned} \tag{2}
  • この式はソフトマックス関数の一例となっています。
    また、分母はp(o\ |\ c)が確率を表すことを保証するための正規化項です。

(1), (2)式を用いて勾配を計算し、損失が最小となるようなパラメータ図2のように更新して見つけることで、各単語のベクトルが決定する。(勾配計算についてはまとめの後に書いています。)
(図2 勾配の更新

https://web.stanford.edu/class/cs224n/slides/cs224n-2023-lecture01-wordvecs1.pdf より引用)

この勾配の更新には系列長がかなり大きい時の計算コストが高いことが問題として挙げられます。
そのため、実際にはwindowサイズで更新を行っていきます。

3.まとめ

今回はWord2Vecの概要をメインに記事を書きました。
このStanford大学の講義を担当している教授が個人的に大好きなタイプのおじいちゃんなので見たことない人は是非見てみてください。
英語もところどころ通信障害で聴きにくいこと以外は発音も速度も聞きやすいので英語がそこまで得意でない人でも比較的理解しやすいと思います。
あと、Zennの有識者の方々に聞きたいのですがZennのMarkdownで数式を書くとレイアウトがすっきりせず綺麗に中央揃えできる方法をご教授していただけたら喜びます。(alignedは使用しています。)

4. 勾配の計算(おまけ)

損失の勾配を求めるためにはp(w_{t+j}\ |\ w_t)のcenter wordに関する微分を考える必要があります。
条件付き確率の微分の計算を(2)式を用いて考えていきます。

\begin{aligned} \frac{\partial}{\partial V_c}\log p(o\ |\ c) &= \frac{\partial}{\partial V_c}log \frac{\exp(u_o^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)} \\ &= \frac{\partial}{\partial V_c}log \big\lbrace \exp(u_o^Tv_c) - \sum_{w = 1}^{V}\exp(u_w^Tv_c) \big\rbrace \tag{3} \end{aligned}

この最終式の右辺についてそれぞれ考えていく。
第一成分について考える。

\begin{aligned} \frac{\partial}{\partial V_c}log \exp(u_o^Tv_c) &= \frac{\partial}{\partial V_c}(u_o^Tv_c) \\ &= \frac{\partial}{\partial V_c}\sum_{i = 1}^d(u_o)_i(v_c)_i \\ &= u_o \tag{4} \end{aligned}

第二成分について考える。(合成微分の考え方を用いる。)

\begin{aligned} \frac{\partial}{\partial V_c}log \sum_{w = 1}^{V}\exp(u_w^Tv_c) &= \frac{1}{\sum_{w = 1}^{V}\exp(u_w^Tv_c)}\frac{\partial}{\partial V_c}\sum_{x = 1}^{V}\exp(u_x^Tv_c) \\ &= \frac{1}{\sum_{w = 1}^{V}\exp(u_w^Tv_c)}\sum_{x = 1}^{V}\frac{\partial}{\partial V_c}\exp(u_x^Tv_c) \\ &= \frac{1}{\sum_{w = 1}^{V}\exp(u_w^Tv_c)}\sum_{x = 1}^{V}\exp(u_x^Tv_c)u_x \tag{5} \end{aligned}

これらを(3)式に代入することにより条件付き確率のcenter wordの一回微分は以下のように表される。

\begin{aligned} \frac{\partial}{\partial V_c}\log p(o\ |\ c) &= u_o - \frac{\sum_{x = 1}^{V}\exp(u_x^Tv_c)u_x}{\sum_{w = 1}^{V}\exp(u_w^Tv_c)} \\ &= u_o - \sum_{x = 1}^{V}p(x\ |\ c)u_x \end{aligned}

これは観測値から期待値をとったような形になる。
これを勾配の計算に用いる。

5.参考文献

[1]Stanford NLP CS224N: NLP with Deep Learning |Winter2021| Lecture1 - Intro & Word Vectors
[2]Tomos Mikolov, et.al, "Efficient Estimation of Word Representations in Vector Space", ICLR, 2013.
[3]BERTによる自然言語入門

Discussion