これは、メルボルン大学で COMP90042(NLP)を履修したときのノート。本稿では授業のうち、ニューラルネットワークと単語表現を扱う。FFNN、RNN、LSTM、Transformerから、カウントベースの単語ベクトル、Word2Vec、評価方法へと進む。
順伝播型ニューラルネットワーク(Feed-forward NN)
“図1-1 3層の順伝播型ネットワーク:Input layer → Hidden layer → Output layer。各矢印は重みを表す。
図1-1 3層の順伝播型ネットワーク:Input layer → Hidden layer → Output layer。各矢印は重みを表す。
単一のニューロン:次の関数として表す:h = f(x)
h = f(x)
x
h
w
b
h = \tanh\!\left(\sum_j w_j x_j + b\right)
活性化関数
式
特徴
Sigmoid
\sigma(z)=\dfrac{1}{1+e^{-z}}
出力は (0,1) で、確率として扱える。両端で飽和し、勾配消失を引き起こす
Tanh
\tanh(z)=\dfrac{e^z-e^{-z}}{e^z+e^{-z}}
出力は (-1,1) でゼロ中心。sigmoidより学習しやすい
ReLU
\max(0, z)
計算が速く、勾配消失を緩和する。負の領域では「死んだ」状態になり得る
二値分類(binary classification)
P(y=1\mid x)\in(0,1)
多クラス分類(multi-class classification)
\text{softmax}(z_i) = \frac{\exp(z_i)}{\sum_j \exp(z_j)}
(a) 損失関数
L
L = \prod_{i=1}^{m} P(y_i \mid x_i)
-\log L
-\log L = -\sum_{i} \log P(y_i \mid x_i)
“対数を取る理由は、積を和に変え、数値のアンダーフローを減らすため。負号を付ければ損失を最小化する形で学習できる。この変換によってニューラルネットワークの目的関数が凸になるわけではない。
対数を取る理由は、積を和に変え、数値のアンダーフローを減らすため。負号を付ければ損失を最小化する形で学習できる。この変換によってニューラルネットワークの目的関数が凸になるわけではない。
(b) 勾配降下法
\theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L}
(c) 正則化
方法
式/処理
効果
L1-norm
\lambda\sum\vert \theta\vert
重みを疎にする(特徴選択)
L2-norm
\lambda\sum\theta^2
重みの大きさを制約する。通常のSGDでは重み減衰と対応する
Dropout
学習時に一部のニューロンの出力をランダムに0にする
ニューロン間の共適応を減らす。パラメータを共有する多数の部分ネットワークを近似的に組み合わせるものと解釈できる
(d) Dropout
タスク:文書を、あらかじめ定めたトピック集合(economy/politics/sportなど)に分類する。入力:bag-of-words。
学習
W
\vec{x} = [0,2,3,0] \;\rightarrow\; \vec{h} = \tanh(W_2\vec{x} + \vec{b}_1) \;\rightarrow\; \vec{y} = \text{softmax}(W_3\vec{h})
\vec{y} = [0.1, 0.6, 0.3]
C_1, C_2, C_3
C_1
L = -\log(0.1) \approx 2.303
予測
\vec{x} = [1,3,5,0]
\vec{y} = [0.2, 0.1, 0.7]
= C_3
改善方法
W_1
次の確率を予測する:P(w_i = \text{grass} \mid w_{i-3}=\text{a},\, w_{i-2}=\text{cow},\, w_{i-1}=\text{eats})
P(w_i = \text{grass} \mid w_{i-3}=\text{a},\, w_{i-2}=\text{cow},\, w_{i-1}=\text{eats})
処理の流れ:
\vec{h} = \tanh(W_2\vec{x} + \vec{b}_1)
\vec{y} = \text{softmax}(W_3\vec{h})
\vec{y}
パラメータ数の内訳:
= d_1 \times \vert V\vert
W_3
= \vert V\vert \times d_h
d_h
比較項目
カウントベースN-gram
FFNN N-gram
学習コスト
非常に低い(出現回数を数えるだけ)
高い(勾配降下法が必要)
スパース性
深刻(未観測のn-gramの確率は0)
緩和される(似た単語がパラメータを共有し、未観測の組み合わせにも汎化する)
長い文脈
文脈が長くなるとパラメータ数とスパース性の問題が悪化する
比較的なめらかに拡張できるが、固定ウィンドウの制約は残る
単語の性質
単語間の構文的・意味的な類似性を捉えられない(filmとmovieは無関係な記号として扱われる)
単語の性質を自動で捉え、より頑健な推定ができる
s_i = f(s_{i-1}, x_i), \qquad s_{i+1} = f(s_i, x_{i+1})
f
X
x_i
s_i
単純RNNの2つの式
s_i = \tanh(W_s s_{i-1} + W_x x_i + b)
y_i = \text{softmax}(W_y s_i)
W_s
W_x
W_y
“図2-1 RNNの単一ノード:新しい状態 s_i は、直前の状態 s_{i-1} と現在の入力 x_i の両方から決まる。
図2-1 RNNの単一ノード:新しい状態 s_i は、直前の状態 s_{i-1} と現在の入力 x_i の両方から決まる。
s_{i-1}
W_s, W_x, b, W_y
“図2-2 時間方向に展開したRNN:すべての時刻で同じパラメータを共有する:W_s, W_x, W_y, b。
図2-2 時間方向に展開したRNN:すべての時刻で同じパラメータを共有する:W_s, W_x, W_y, b。
W_s, W_x, W_y, b
y
L = L(y_1) + L(y_2) + L(y_3) + \dots = \sum_t L(y_t)
例文:a cow eats grass
y_i
ネットワークを時間方向に展開する:
a cow eats grass ↓ ↓ ↓ ↓ RNN → RNN → RNN → RNN s1 s2 s3 s4 ↓ y3 = P(·|a cow eats) → 正解 grass
数値例(語彙 {a, cow, eats, grass})
位置
入力
状態 s
s
出力分布 y
正解
損失
1
a
s_1
[0.40, 0.30, 0.20, 0.10]
cow
-\log(0.30)
2
s_2
[0.30, 0.20, 0.30, 0.20]
eats
3
s_3
[0.50, 0.10, 0.20, 0.20]
grass
-\log(0.20)
L_{\text{total}} = L_1 + L_2 + L_3
問題
説明
a) 学習時とデコード時のずれ
学習時にはteacher forcingで正解の直前単語を与えるが、推論時には自身の予測を入力するため、分布にずれが生じる(exposure bias)
b) 誤りの伝播と原因特定の難しさ
誤りが時刻をまたいで伝播・蓄積し、どの段階で誤ったかを特定しにくい
c) 空疎でありきたりな表現を生成しやすい
具体性に乏しい、無難で頻度の高い表現を生成しやすい
d) 勾配消失
時間方向に逆伝播する勾配が指数的に減衰し、長距離依存を学習できなくなる
記憶はゲートで制御する:
“ゲートとは:0から1の値を取るベクトル。通常は sigmoidで生成し、制御するベクトルと要素ごとの積を取って、保持する情報量を決める。0は完全に遮断し、1はそのまま通す。
ゲートとは:0から1の値を取るベクトル。通常は sigmoidで生成し、制御するベクトルと要素ごとの積を取って、保持する情報量を決める。0は完全に遮断し、1はそのまま通す。
C_t
“図3-1 通常のRNNの反復モジュールには1つのtanh層しかなく、状態を上書きする形で更新する。
図3-1 通常のRNNの反復モジュールには1つのtanh層しかなく、状態を上書きする形で更新する。
“図3-2 LSTMの反復モジュールには相互作用する4つの層(sigmoidゲート3つとtanh層1つ)があり、セル状態を通す経路も持つ:C_t。
図3-2 LSTMの反復モジュールには相互作用する4つの層(sigmoidゲート3つとtanh層1つ)があり、セル状態を通す経路も持つ:C_t。
記憶の仕組み:C_t は時間方向に加算更新する経路を提供する。忘却ゲートが1に近いほど情報と勾配を保持しやすい。ただし、長期に記憶できるかはゲートの値と学習結果に依存する。
記憶の制御:4つのステップ
ステップ
役割
Forget
以前のセル状態 C_{t-1} から捨てる量を決める
C_{t-1}
Input
書き込む新しい情報の量を決める
Update
忘却ゲートと入力ゲートの結果を使ってセル状態を更新する
Output
セル状態から取り出す量を決め、現在の隠れ状態を作る:h_t
h_t
忘却ゲート(Forget gate)
f_t = \sigma\left(W_f\,[h_{t-1}, x_t] + b_f\right)
f_t
入力ゲート(Input gate)
i_t = \sigma\left(W_i\,[h_{t-1}, x_t] + b_i\right)
\tilde{C}_t = \tanh\left(W_C\,[h_{t-1}, x_t] + b_C\right)
i_t
\tilde{C}_t
セル状態の更新
C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t
出力ゲート(Output gate)
o_t = \sigma\left(W_o\,[h_{t-1}, x_t] + b_o\right)
h_t = o_t \odot \tanh(C_t)
“[h_{t-1}, x_t] は、直前の隠れ状態と現在の入力を1つのベクトルに連結したもの。
[h_{t-1}, x_t] は、直前の隠れ状態と現在の入力を1つのベクトルに連結したもの。
[h_{t-1}, x_t]
“図3-3 記憶セルの内部:3本の矢印は、セル状態の直通経路、直前の隠れ状態 h_{t-1}、現在の入力 x_t に対応する。\sigma と \tanh を並列に組み合わせ、各ゲートを構成する。
図3-3 記憶セルの内部:3本の矢印は、セル状態の直通経路、直前の隠れ状態 h_{t-1}、現在の入力 x_t に対応する。\sigma と \tanh を並列に組み合わせ、各ゲートを構成する。
h_{t-1}
x_t
\sigma
\tanh
次のように置く:
\text{Hidden}_{dim}
\text{Input}_{dim}
\#\text{params} = 4 \times (\text{Hidden}_{dim} + \text{Input}_{dim}) \times \text{Hidden}_{dim} + 4 \times \text{Hidden}_{dim}
W_f, W_i, W_C, W_o
\text{Hidden}_{dim} + \text{Input}_{dim}
4 \times \text{Hidden}_{dim}
例:Hidden = 256, Input = 300
4 \times (256+300)\times 256 + 4\times256 = 569{,}344 + 1{,}024 = 570{,}368
応用
Wikipedia風文章の生成
整った学習コーパスから百科事典風の文章を生成する
コード生成
コードを生成する(構造が明確で、評価しやすい)
音声認識
音響特徴の系列をテキストへ写像する
テキスト分類
最後の隠れ状態やプーリングを文書表現に使う
系列ラベリング
POS、NERなど、各位置で1つのラベルを出力する
派生モデル
要点
Peephole connections
ゲートからセル状態を参照できる(C_{t-1} もゲート計算に使う)
GRU(Gated Recurrent Unit)
簡略版。ゲートは 2つ(リセット/更新)。独立した記憶セルを持たない。パラメータが少なく学習も速く、性能はLSTMと同程度になることが多い
Multi-layer LSTM
複数層を重ね、層ごとに抽象化する。ただし、実際にはあまり深く積み重ねにくい
Bidirectional LSTM
順方向と逆方向の2つのLSTMの隠れ状態を連結する。各位置で左右両方の文脈を使えるが、自己回帰生成には使えない
長所
短所
“図4-1 Transformerの全体構成。左がエンコーダ、右がデコーダで、それぞれ N 層を積む。最下部は入力/出力埋め込みと位置エンコーディング。出典:Vaswani et al., Attention Is All You Need, NeurIPS 2017, Figure 1。
図4-1 Transformerの全体構成。左がエンコーダ、右がデコーダで、それぞれ N 層を積む。最下部は入力/出力埋め込みと位置エンコーディング。出典:Vaswani et al., Attention Is All You Need, NeurIPS 2017, Figure 1。
N
「入力テキスト → 出力テキスト」という形のタスク:
いずれも「ある入力テキストから別の出力テキストを作る」タスクであり、Transformerに適している。
直感的な説明:
“対象語の Query(クエリ)を、すべての単語の Key(キー)と比較して関連度を求める。その関連度に応じて、重みを付けて参照する対象が対応する Value(値)。
対象語の Query(クエリ)を、すべての単語の Key(キー)と比較して関連度を求める。その関連度に応じて、重みを付けて参照する対象が対応する Value(値)。
例:文 I made her duck、対象語 her
内容
Query q
q
対象語 her のクエリベクトル
Key k / Value v
k
v
文脈語(I, made, duck)と対象語自身のキー/値
“図4-2 自己注意の重み付け:対象語 her のQueryと各単語のKeyを比較し、Valueの重み付き和から her の新しい表現を得る。
図4-2 自己注意の重み付け:対象語 her のQueryと各単語のKeyを比較し、Valueの重み付き和から her の新しい表現を得る。
手順
W_Q, W_K, W_V
q_i = x_i W_Q,\qquad k_i = x_i W_K,\qquad v_i = x_i W_V
z
要点:対象語の最終表現 = 自身を含む文脈語のValueベクトルの重み付き和。重みはQueryとKeyの類似度で決まる。
“図4-3 左:Scaled Dot-Product Attention(MatMul → Scale → Mask → Softmax → MatMul)。右:Multi-Head Attention(複数組の線形射影を並列計算し、連結後に線形変換する)。出典:Vaswani et al., 2017, Figure 2。
図4-3 左:Scaled Dot-Product Attention(MatMul → Scale → Mask → Softmax → MatMul)。右:Multi-Head Attention(複数組の線形射影を並列計算し、連結後に線形変換する)。出典:Vaswani et al., 2017, Figure 2。
単一クエリの形
\text{SelfAttention}(q, K, V) = \sum_i \frac{\exp(q \cdot k_i)}{\sum_j \exp(q \cdot k_j)}\, v_i
行列の形(各 q_i、k_i、v_i をそれぞれ行として積み重ねた行列が Q、K、V)
q_i
k_i
v_i
Q
K
V
\text{SelfAttention}(Q, K, V) = \text{softmax}(QK^\top)\,V
Scaled Dot-Product Attention(実際に使う形)
\text{SelfAttention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
\sqrt{d_k}
d_k
“図4-4 単語ごとのQ/K/V計算:各埋め込み x_i にそれぞれ W_Q, W_K, W_V を掛ける。その後、対象語の q とすべての k の内積にsoftmaxを適用して重みを得る。
図4-4 単語ごとのQ/K/V計算:各埋め込み x_i にそれぞれ W_Q, W_K, W_V を掛ける。その後、対象語の q とすべての k の内積にsoftmaxを適用して重みを得る。
動機:文中の単語同士には複数の種類の関係がある:
関係の種類
例
syntactically(構文)
主語と動詞の一致(noun–verb agreement)
semantically(意味)
同義語
discourse(談話)
it が指すのは、前に出た the dog
Multi-head attentionは、異なる表現部分空間で異なる関係に並列に注意を向けられる。そのために:
W_Q^{(i)}, W_K^{(i)}, W_V^{(i)}
z^{(i)}
W_O
d
\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O
\text{head}_i = \text{Attention}(QW_Q^{(i)}, KW_K^{(i)}, VW_V^{(i)})
“多層Transformerではこれらのモジュールを繰り返す。元のTransformerは入力埋め込みに位置エンコーディングを一度加えるが、ほかの位置表現では組み込み方が異なることもある。
多層Transformerではこれらのモジュールを繰り返す。元のTransformerは入力埋め込みに位置エンコーディングを一度加えるが、ほかの位置表現では組み込み方が異なることもある。
元のTransformerの エンコーダブロックを例にすると、自己注意のほかに次の要素を含む:
構成要素
数
フィードフォワード層
1×
各位置に同じ2層MLPを適用する。いったん次元を増やしてから減らし、非線形変換を加える
残差接続(Residual connection)
2×
入力とサブレイヤーの出力を加える(x + f(x))。情報と勾配の直接経路を保ち、深いネットワークを学習しやすくする
x + f(x)
正規化層(LayerNorm)
各位置の隠れ特徴を正規化し、スケールとバイアスも学習することで、学習を安定させる
“注意:ここで使うのは Layer Normalization。各位置自身の特徴次元に沿って正規化し、バッチ内の他サンプルの統計量には依存しない。下図は元のTransformerのPost-LN順序であり、派生モデルではPre-LNを使うこともある。
注意:ここで使うのは Layer Normalization。各位置自身の特徴次元に沿って正規化し、バッチ内の他サンプルの統計量には依存しない。下図は元のTransformerのPost-LN順序であり、派生モデルではPre-LNを使うこともある。
“図4-5 Transformerブロックの内部。自己注意とフィードフォワードの2つのサブレイヤーがあり、それぞれに残差接続とLayerNormを組み合わせる。
図4-5 Transformerブロックの内部。自己注意とフィードフォワードの2つのサブレイヤーがあり、それぞれに残差接続とLayerNormを組み合わせる。
問題:位置情報を加えない自己注意は、それ自体では語順を区別できない。入力を並べ替えると出力も同じように並べ替わるだけで、どの単語が前か後かは分からない。そのため、dog bites man と man bites dogを区別するには追加の位置表現が必要になる。
学習可能な位置埋め込み
固定関数による位置表現:正弦波エンコーディング
PE_{(pos, 2i)} = \sin\!\left(\frac{pos}{10000^{2i/d}}\right), \qquad PE_{(pos, 2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d}}\right)
視点
行/列
意味
文書の視点
各行が1つの文書
文書を、その文書に含まれる単語で表す
単語の視点
各列が1つの単語
単語を、その単語が出現する文書で表す(列ベクトルが単語ベクトルになる)
単語・文書行列の例(行 = 文書id、列 = 単語)
state
fun
heaven
425
0
426
427
“問題:生の出現回数では、高頻度語(the、of)がベクトルを支配する。また、次元数は文書数に等しく、非常に疎で高次元になる。
問題:生の出現回数では、高頻度語(the、of)がベクトルを支配する。また、次元数は文書数に等しく、非常に疎で高次元になる。
単語頻度(Term Frequency)
tf_{t,d}
\log(1+tf)
逆文書頻度(Inverse Document Frequency)
idf_w = \log \frac{\vert D\vert }{df_w}
\vert D\vert
df_w
組み合わせ
\text{TF-IDF} = TF \times IDF
\log\frac{1+\vert D\vert }{1+df_w}+1
例:tf行列からtf-idf行列へ
tf行列(行425/426/427、列the/country/hell):
the
country
hell
43
5
24
37
df
500
14
7
以下はコーパス全体から取り出した3文書の行。総文書数を \vert D\vert=500 とし、底2の対数を使う。country、hell のIDFをそれぞれ5.2、6.2と近似してから、TFに掛ける。
\vert D\vert=500
→ the は500文書すべてに出るため idf=0。一方、hell は7文書にしか出ないため、相対的に重みが大きくなる。
idf=0
26.0
6.2
5.2
18.6
特異値分解(SVD)
A = U \Sigma V^\top
A
\vert V\vert \times \vert D\vert
U
\vert V\vert \times m
\Sigma
m \times m
V^\top
m \times \vert D\vert
m = \text{Rank}(A)
非ゼロの特異値をすべて残した場合は、等価な分解である。実際の次元削減やノイズ除去には、以下の打ち切り版を使うことが多い。
潜在意味解析(LSA)
U_k
U_k\Sigma_k
TF-IDFから単語ベクトルを作る全体の流れ
tf-idf matrix → SVD → U → pick k → 先頭 k 次元のみ残す → word embedding → LSTM(または下流モデル)
“図5-1 TF-IDF行列を特異値分解する:A=U\Sigma V^\top。U の先頭 k 列を取り出すと、k 次元の単語ベクトルが得られる(LSA)。
図5-1 TF-IDF行列を特異値分解する:A=U\Sigma V^\top。U の先頭 k 列を取り出すと、k 次元の単語ベクトルが得られる(LSA)。
A=U\Sigma V^\top
\text{PMI}(x, y) = \log_2 \frac{P(x, y)}{P(x)\,P(y)}
意味:実際の共起確率と、2語が独立なら期待される共起確率との比。
\text{PMI} > 0
\text{PMI} = 0
\text{PMI} < 0
例:PMI(heaven, hell)を求める
共起行列の一部(ウィンドウ内の共起回数)
Σ
1973
10
12786
54
633
55
627
1047519
3817
780
15871304
P(\text{heaven}) = 627 / 15871304
P(\text{hell}) = 780 / 15871304
P(\text{heaven}, \text{hell}) = 3 / 15871304
式に代入する:
\text{PMI}(\text{heaven},\text{hell})=\log_2\frac{3\times15871304}{627\times780}\approx6.61
“ここでは heaven と hell の共起回数は3なのでPMIは正になる。下の表の -inf に当たるのは fun と hell で、共起回数は0。周辺確率が非ゼロなら、P(x,y)=0 \Rightarrow \log 0=-\infty。
ここでは heaven と hell の共起回数は3なのでPMIは正になる。下の表の -inf に当たるのは fun と hell で、共起回数は0。周辺確率が非ゼロなら、P(x,y)=0 \Rightarrow \log 0=-\infty。
P(x,y)=0 \Rightarrow \log 0=-\infty
PMI行列の一部
1.22
1.78
0.63
0.37
3.79
-inf
0.41
2.80
6.61
工夫
理由
-\infty または負の値を0に置き換える
-\infty
\text{PPMI} = \max(\text{PMI}, 0)
独立の場合を上回る共起関係を残し、低頻度の負の関連を不安定に推定する影響を減らす
Normalised PMI(NPMI)
\text{NPMI}(x,y) = \dfrac{\text{PMI}(x,y)}{-\log_2 P(x,y)}
分子と分母の対数の底をそろえる。0<P(x,y)<1 のとき、[-1,1] の範囲へ正規化し、単語対間で比較しやすくする
0<P(x,y)<1
[-1,1]
PMIもSVDで縮約できる
PMI行列にSVDを適用し、先頭 k 次元を使う
次元削減とノイズ除去により、密な低次元単語ベクトルを得る
“補足:低頻度の単語対はPMIが過大になりやすく、スコアだけで関連の強さを判断してはいけない。最小共起回数によるフィルタリングや平滑化を併用してノイズを減らせる。\log\frac{P(x,y)^k}{P(x)P(y)} という PMI^k の方式では、k>1 のときに限り、共起確率の低い単語対を通常のPMIより強く抑える。
補足:低頻度の単語対はPMIが過大になりやすく、スコアだけで関連の強さを判断してはいけない。最小共起回数によるフィルタリングや平滑化を併用してノイズを減らせる。\log\frac{P(x,y)^k}{P(x)P(y)} という PMI^k の方式では、k>1 のときに限り、共起確率の低い単語対を通常のPMIより強く抑える。
\log\frac{P(x,y)^k}{P(x)P(y)}
^k
k>1
モデル
方向
Skip-gram
中心語から周辺語を予測する
実際には低頻度語に強い
CBOW(Continuous Bag of Words)
周辺語から中心語を予測する
高速で、高頻度語に強い
“周辺語の範囲(ウィンドウ L)は設定によって変わる。以下の例では L=2とする。
周辺語の範囲(ウィンドウ L)は設定によって変わる。以下の例では L=2とする。
L=2
“図6-1 Word2Vecの2つの構造。CBOWは文脈から中心語を予測し、Skip-gramは中心語から文脈を予測する。出典:Mikolov et al., 2013, Figure 1。
図6-1 Word2Vecの2つの構造。CBOWは文脈から中心語を予測し、Skip-gramは中心語から文脈を予測する。出典:Mikolov et al., 2013, Figure 1。
目的:対象語が与えられたとき、その文脈に正しい単語が現れる確率を最大化する。
例文:... Bereft of life he rests in peace! If you hadn't nailed him ...、対象語 rests、L=2 のときの文脈は {he, in, life, peace}。
確率モデル:文脈全体の確率は、対象語を条件とした同時確率として表す:
P(\text{context} \mid w_t) = \prod_{i \in [-L, \dots, -1, 1, \dots, L]} P(w_{t+i} \mid w_t)
仮定:中心語が与えられた条件下で、各文脈語を条件付き独立として扱うため、確率を積の形にできる。この基本形では文脈語の順序を区別しない。
P(w_O \mid w_I) = \frac{\exp(v'_{w_O}{}^\top v_{w_I})}{\sum_{w \in V} \exp(v'_{w}{}^\top v_{w_I})}
ここで、v は入力側(中心語)のベクトル、v' は出力側(文脈語)のベクトル。
v'
ニューラルネットワークとして表せる:
one-hot x (1×|V|) → W (|V|×d) → h (1×d) → C (d×|V|) → softmax → P(·|w_t) 入力 embedding 出力 embedding
重要な点:Word2Vecは2組の単語ベクトル行列を持つ:
\vert V\vert \times d
C
d \times \vert V\vert
“学習後は通常、残すのは Wだけであり、これを最終的な単語ベクトルにする。両者のベクトルを平均する場合もある。
学習後は通常、残すのは Wだけであり、これを最終的な単語ベクトルにする。両者のベクトルを平均する場合もある。
次元 dの選び方:次元はハイパーパラメータとし、コーパス規模、下流タスク、計算予算に応じて調整する。100–300次元は一般的な出発点。
学習の目的:入力された単語に対し、各単語が文脈語となる確率を求め、正しい文脈語の確率を最大にする。
問題:計算が遅い。分母では語彙全体(\vert V\vert は百万にもなる)について和を取り、学習例ごとに全単語を走査する必要がある。
\vert V\vert
条件付き確率 P(\text{context} \mid \text{word}) の予測を、単語対の二値分類に置き換える:
P(\text{context} \mid \text{word})
なぜ負例サンプリングが必要か?
最尤推定
\max \ \sum_{(w,c)\in D} \log \sigma(u_c^\top v_w) + \sum_{(w,c)\in D'} \log \sigma(-u_c^\top v_w)
ここで、D、D' はそれぞれ正例と負例の単語対集合、v_w は入力ベクトル、u_c は出力ベクトル。
D
D'
v_w
u_c
P(+\mid \text{word},\text{context})
P(-\mid \text{word},\text{context})
埋め込みの直感:よく共起する入力語と出力側の文脈ベクトルは内積が大きくなりやすい。似た文脈を持つ単語は、似た表現を学ぶ可能性がある。ただし内積はベクトルの長さにも影響されるため、コサイン類似度と同一視できない。
実際には正例1つにつき k 個の負例を使う(一般には k=5\sim20 だが、コーパスに合わせて調整する)。以下では、T は正例の単語対数、c_t は中心語、o_t は観測された文脈語:
k=5\sim20
T
c_t
o_t
J(\theta) = -\frac{1}{T}\sum_{t=1}^{T}\left[\log \sigma(u_{o_t}^\top v_{c_t}) + \sum_{i=1}^{k} \mathbb{E}_{w_i \sim P_n(w)}\log \sigma(-u_{w_i}^\top v_{c_t})\right]
P_n(w)
利点:
問い:単語埋め込みの良し悪しをどう判断するか?
方法:指標として コサイン類似度を用いる。意味の近い2語(例:well & good)のベクトルの類似度と、人手の類似度評価を相関で比較する(Spearmanの順位相関)。
\cos(u, v) = \frac{u \cdot v}{\Vert u\Vert \,\Vert v\Vert }
方法:埋め込み空間でベクトル演算を行い、最近傍の単語が意味関係に合うかを調べる。
\text{king} - \text{man} + \text{woman} \approx \text{queen}
ベクトルの加算で意味の合成を直感的に示すこともできる。ただし、これは標準的な類推評価ではない:
\text{breakfast} + \text{lunch} + \text{dinner} \approx \text{meal に関連する方向} \quad\text{(意味の合成を示す直感的な例であり、恒等式ではない)}
方法:埋め込みを分類、NER、翻訳などの実タスクで使い、タスクの性能から埋め込みの品質を評価する。
“実践上の指針:内的評価は速く低コストで、素早い改善に向く。最終的な結論は下流タスクで確認する必要がある。
実践上の指針:内的評価は速く低コストで、素早い改善に向く。最終的な結論は下流タスクで確認する必要がある。
これは、メルボルン大学で COMP90042(NLP)を履修したときのノート。本稿では授業のうち、ニューラルネットワークと単語表現を扱う。FFNN、RNN、LSTM、Transformerから、カウントベースの単語ベクトル、Word2Vec、評価方法へと進む。
1. 順伝播型ニューラルネットワーク(FFNN)
1.1 深層学習の基礎
順伝播型ニューラルネットワーク(Feed-forward NN)
単一のニューロン:次の関数として表す:
h = f(x)xから、次のスカラーを計算する:hwでスケーリングし、次のバイアスを加える:bwとbはモデルのパラメータ(parameters)h = \tanh\!\left(\sum_j w_j x_j + b\right)活性化関数
式
特徴
Sigmoid
\sigma(z)=\dfrac{1}{1+e^{-z}}出力は (0,1) で、確率として扱える。両端で飽和し、勾配消失を引き起こす
Tanh
\tanh(z)=\dfrac{e^z-e^{-z}}{e^z+e^{-z}}出力は (-1,1) でゼロ中心。sigmoidより学習しやすい
ReLU
\max(0, z)計算が速く、勾配消失を緩和する。負の領域では「死んだ」状態になり得る
1.2 出力層
二値分類(binary classification)
P(y=1\mid x)\in(0,1)。多クラス分類(multi-class classification)
\text{softmax}(z_i) = \frac{\exp(z_i)}{\sum_j \exp(z_j)}1.3 学習方法
(a) 損失関数
L:L = \prod_{i=1}^{m} P(y_i \mid x_i)-\log L(負の対数尤度/交差エントロピー)として、パラメータを最適化する:-\log L = -\sum_{i} \log P(y_i \mid x_i)(b) 勾配降下法
\theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L}(c) 正則化
方法
式/処理
効果
L1-norm
\lambda\sum\vert \theta\vert重みを疎にする(特徴選択)
L2-norm
\lambda\sum\theta^2重みの大きさを制約する。通常のSGDでは重み減衰と対応する
Dropout
学習時に一部のニューロンの出力をランダムに0にする
ニューロン間の共適応を減らす。パラメータを共有する多数の部分ネットワークを近似的に組み合わせるものと解釈できる
(d) Dropout
1.4 応用1:トピック分類
タスク:文書を、あらかじめ定めたトピック集合(economy/politics/sportなど)に分類する。入力:bag-of-words。
学習
Wとb\vec{x} = [0,2,3,0] \;\rightarrow\; \vec{h} = \tanh(W_2\vec{x} + \vec{b}_1) \;\rightarrow\; \vec{y} = \text{softmax}(W_3\vec{h})\vec{y} = [0.1, 0.6, 0.3]。対応するクラスはC_1, C_2, C_3C_1なら:L = -\log(0.1) \approx 2.303予測
\vec{x} = [1,3,5,0]\vec{y} = [0.2, 0.1, 0.7]= C_3(argmaxを取る)改善方法
1.5 応用2:単語埋め込み
W_1の各列が1つの単語のベクトルになる。1.6 応用3:FFNN言語モデル
次の確率を予測する:
P(w_i = \text{grass} \mid w_{i-3}=\text{a},\, w_{i-2}=\text{cow},\, w_{i-1}=\text{eats})処理の流れ:
W_1)を取り出す\vec{h} = \tanh(W_2\vec{x} + \vec{b}_1)、\vec{y} = \text{softmax}(W_3\vec{h})\vec{y}は語彙全体にわたる確率分布を出力するパラメータ数の内訳:
W_1(サイズ= d_1 \times \vert V\vert)W_3(サイズ= \vert V\vert \times d_h。ここでd_hは隠れ層の次元)1.7 FFNN言語モデルとカウントベースN-gram
比較項目
カウントベースN-gram
FFNN N-gram
学習コスト
非常に低い(出現回数を数えるだけ)
高い(勾配降下法が必要)
スパース性
深刻(未観測のn-gramの確率は0)
緩和される(似た単語がパラメータを共有し、未観測の組み合わせにも汎化する)
長い文脈
文脈が長くなるとパラメータ数とスパース性の問題が悪化する
比較的なめらかに拡張できるが、固定ウィンドウの制約は残る
単語の性質
単語間の構文的・意味的な類似性を捉えられない(filmとmovieは無関係な記号として扱われる)
単語の性質を自動で捉え、より頑健な推定ができる
2. 再帰型ニューラルネットワーク(RNN)
2.1 定義
s_i = f(s_{i-1}, x_i), \qquad s_{i+1} = f(s_i, x_{i+1})fをすべての時刻で使い回す。2.2 ノード
Xの長さは可変だが、各入力ベクトルx_iの次元と状態ベクトルs_iの次元はモデルによって固定される。単純RNNの2つの式
s_i = \tanh(W_s s_{i-1} + W_x x_i + b)y_i = \text{softmax}(W_y s_i)W_s:状態から状態への重み(記憶をどう受け渡すか)W_x:入力から状態への重みW_y:状態から出力への重みb:バイアス2.3 ネットワーク
W_s, W_x, b, W_y)。状態を通じて前後の位置をつなぐため、パラメータ数は系列長に比例して増えるわけではない。2.4 学習
x(言語モデルでは1単語)。y(状態が異なるため)。L = L(y_1) + L(y_2) + L(y_3) + \dots = \sum_t L(y_t)2.5 学習例:言語モデル
例文:a cow eats grass
x_iは現在の単語(例:eats)であり、まず埋め込みに写すs_{i-1}は前文脈(a, cow)の情報を含むy_iが予測する次の単語は grass。ネットワークを時間方向に展開する:
数値例(語彙 {a, cow, eats, grass})
位置
入力
状態
s出力分布
y正解
損失
1
a
s_1[0.40, 0.30, 0.20, 0.10]
cow
-\log(0.30)2
cow
s_2[0.30, 0.20, 0.30, 0.20]
eats
-\log(0.30)3
eats
s_3[0.50, 0.10, 0.20, 0.20]
grass
-\log(0.20)L_{\text{total}} = L_1 + L_2 + L_32.6 RNNの問題点
問題
説明
a) 学習時とデコード時のずれ
学習時にはteacher forcingで正解の直前単語を与えるが、推論時には自身の予測を入力するため、分布にずれが生じる(exposure bias)
b) 誤りの伝播と原因特定の難しさ
誤りが時刻をまたいで伝播・蓄積し、どの段階で誤ったかを特定しにくい
c) 空疎でありきたりな表現を生成しやすい
具体性に乏しい、無難で頻度の高い表現を生成しやすい
d) 勾配消失
時間方向に逆伝播する勾配が指数的に減衰し、長距離依存を学習できなくなる
2.7 勾配消失
3. 長・短期記憶(LSTM)
3.1 定義と動機
記憶はゲートで制御する:
3.2 RNNとLSTMの構造
C_t。3.3 記憶の仕組みと制御
記憶の仕組み:
C_tは時間方向に加算更新する経路を提供する。忘却ゲートが1に近いほど情報と勾配を保持しやすい。ただし、長期に記憶できるかはゲートの値と学習結果に依存する。記憶の制御:4つのステップ
ステップ
役割
Forget
以前のセル状態
C_{t-1}から捨てる量を決めるInput
書き込む新しい情報の量を決める
Update
忘却ゲートと入力ゲートの結果を使ってセル状態を更新する
Output
セル状態から取り出す量を決め、現在の隠れ状態を作る:
h_t3.4 3つのゲートと状態更新式
忘却ゲート(Forget gate)
f_t = \sigma\left(W_f\,[h_{t-1}, x_t] + b_f\right)f_tは以前の記憶セルC_{t-1}の情報をどれだけ保持するかを制御する。0に近いと捨て、1に近いと保持する。入力ゲート(Input gate)
i_t = \sigma\left(W_i\,[h_{t-1}, x_t] + b_i\right)\tilde{C}_t = \tanh\left(W_C\,[h_{t-1}, x_t] + b_C\right)i_t:記憶セルに書き込む新しい情報の量を制御する。\tilde{C}_t:新しい候補情報(distilled information)。たとえば boy に関する情報。セル状態の更新
C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_tC_tに沿って直接戻れるため、勾配消失を緩和する。出力ゲート(Output gate)
o_t = \sigma\left(W_o\,[h_{t-1}, x_t] + b_o\right)h_t = o_t \odot \tanh(C_t)h_t。3.5 パラメータ数
次のように置く:
\text{Hidden}_{dim}= 記憶の次元(h_tの次元でもある)\text{Input}_{dim}= 単語埋め込みの次元\#\text{params} = 4 \times (\text{Hidden}_{dim} + \text{Input}_{dim}) \times \text{Hidden}_{dim} + 4 \times \text{Hidden}_{dim}W_f, W_i, W_C, W_o。各行列の形状(行数、列数)は同じ。\text{Hidden}_{dim}。\text{Hidden}_{dim} + \text{Input}_{dim}。4 \times \text{Hidden}_{dim}は4組の bias に対応する定数項。例:Hidden = 256, Input = 300
4 \times (256+300)\times 256 + 4\times256 = 569{,}344 + 1{,}024 = 570{,}3683.6 RNN/LSTMの応用
応用
説明
Wikipedia風文章の生成
整った学習コーパスから百科事典風の文章を生成する
コード生成
コードを生成する(構造が明確で、評価しやすい)
音声認識
音響特徴の系列をテキストへ写像する
テキスト分類
最後の隠れ状態やプーリングを文書表現に使う
系列ラベリング
POS、NERなど、各位置で1つのラベルを出力する
3.7 派生モデル
派生モデル
要点
Peephole connections
ゲートからセル状態を参照できる(
C_{t-1}もゲート計算に使う)GRU(Gated Recurrent Unit)
簡略版。ゲートは 2つ(リセット/更新)。独立した記憶セルを持たない。パラメータが少なく学習も速く、性能はLSTMと同程度になることが多い
Multi-layer LSTM
複数層を重ね、層ごとに抽象化する。ただし、実際にはあまり深く積み重ねにくい
Bidirectional LSTM
順方向と逆方向の2つのLSTMの隠れ状態を連結する。各位置で左右両方の文脈を使えるが、自己回帰生成には使えない
3.8 長所と短所
長所
短所
4. Transformer
4.1 定義
4.2 RNNから注意機構へ
4.3 用途
「入力テキスト → 出力テキスト」という形のタスク:
いずれも「ある入力テキストから別の出力テキストを作る」タスクであり、Transformerに適している。
4.4 自己注意:Query/Key/Value
直感的な説明:
例:文 I made her duck、対象語 her
役割
内容
Query
q対象語 her のクエリベクトル
Key
k/ Valuev文脈語(I, made, duck)と対象語自身のキー/値
手順
x_iを行ベクトルとし、それぞれに3つの射影行列W_Q, W_K, W_Vを掛ける:q_i = x_i W_Q,\qquad k_i = x_i W_K,\qquad v_i = x_i W_Vqと各単語のkの内積(dot product)を取り、関連度スコアを得る。vの重み付き和を取り、対象語の出力ベクトルzを得る。zを位置順に並べたものが、1つの注意ヘッドの出力になる。要点:対象語の最終表現 = 自身を含む文脈語のValueベクトルの重み付き和。重みはQueryとKeyの類似度で決まる。
4.5 数式
単一クエリの形
\text{SelfAttention}(q, K, V) = \sum_i \frac{\exp(q \cdot k_i)}{\sum_j \exp(q \cdot k_j)}\, v_i行列の形(各
q_i、k_i、v_iをそれぞれ行として積み重ねた行列がQ、K、V)\text{SelfAttention}(Q, K, V) = \text{softmax}(QK^\top)\,VScaled Dot-Product Attention(実際に使う形)
\text{SelfAttention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\sqrt{d_k}で割るのか?d_kはKeyベクトルの次元。内積の分散は次元とともに増えるため、高次元ではsoftmaxの入力値が大きくなり、one-hotに近い極端な分布と非常に小さい勾配を生みやすい。そこで\sqrt{d_k}でスケーリングすることで数値を安定させる(過大な値や勾配消失を避ける)。4.6 マルチヘッド注意
動機:文中の単語同士には複数の種類の関係がある:
関係の種類
例
syntactically(構文)
主語と動詞の一致(noun–verb agreement)
semantically(意味)
同義語
discourse(談話)
it が指すのは、前に出た the dog
Multi-head attentionは、異なる表現部分空間で異なる関係に並列に注意を向けられる。そのために:
h回行う。各ヘッドはそれぞれW_Q^{(i)}, W_K^{(i)}, W_V^{(i)}を持つ。z^{(i)}を連結する。W_Oを掛け、連結した結果をモデルの次元dに戻して複数ヘッドの情報を統合する。\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O\text{head}_i = \text{Attention}(QW_Q^{(i)}, KW_K^{(i)}, VW_V^{(i)})4.7 Transformerブロック
元のTransformerの エンコーダブロックを例にすると、自己注意のほかに次の要素を含む:
構成要素
数
役割
フィードフォワード層
1×
各位置に同じ2層MLPを適用する。いったん次元を増やしてから減らし、非線形変換を加える
残差接続(Residual connection)
2×
入力とサブレイヤーの出力を加える(
x + f(x))。情報と勾配の直接経路を保ち、深いネットワークを学習しやすくする正規化層(LayerNorm)
2×
各位置の隠れ特徴を正規化し、スケールとバイアスも学習することで、学習を安定させる
4.8 ブロックを積み重ねる
4.9 位置情報
問題:位置情報を加えない自己注意は、それ自体では語順を区別できない。入力を並べ替えると出力も同じように並べ替わるだけで、どの単語が前か後かは分からない。そのため、dog bites man と man bites dogを区別するには追加の位置表現が必要になる。
学習可能な位置埋め込み
X= word embeddings + position embeddings(両者を加算する)。固定関数による位置表現:正弦波エンコーディング
PE_{(pos, 2i)} = \sin\!\left(\frac{pos}{10000^{2i/d}}\right), \qquad PE_{(pos, 2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d}}\right)4.10 デコーダ専用アーキテクチャ
5. 単語ベクトル:カウントベースの方法
5.1 単語ベクトルの概要
5.2 文書を文脈にする:ベクトル空間モデル(VSM)
視点
行/列
意味
文書の視点
各行が1つの文書
文書を、その文書に含まれる単語で表す
単語の視点
各列が1つの単語
単語を、その単語が出現する文書で表す(列ベクトルが単語ベクトルになる)
単語・文書行列の例(行 = 文書id、列 = 単語)
state
fun
heaven
425
0
1
0
426
3
0
0
427
0
0
0
5.3 TF-IDF
単語頻度(Term Frequency)
tf_{t,d}(代わりに\log(1+tf)を使ったり、正規化したりすることもある)。逆文書頻度(Inverse Document Frequency)
idf_w = \log \frac{\vert D\vert }{df_w}\vert D\vert= 文書の総数df_w= 単語wを含む文書数組み合わせ
\text{TF-IDF} = TF \times IDF\log\frac{1+\vert D\vert }{1+df_w}+1)。例:tf行列からtf-idf行列へ
tf行列(行425/426/427、列the/country/hell):
the
country
hell
425
43
5
1
426
24
1
0
427
37
0
3
df500
14
7
以下はコーパス全体から取り出した3文書の行。総文書数を
\vert D\vert=500とし、底2の対数を使う。country、hell のIDFをそれぞれ5.2、6.2と近似してから、TFに掛ける。→ the は500文書すべてに出るため
idf=0。一方、hell は7文書にしか出ないため、相対的に重みが大きくなる。the
country
hell
425
0
26.0
6.2
426
0
5.2
0
427
0
0
18.6
5.4 次元削減
特異値分解(SVD)
A = U \Sigma V^\topAは\vert V\vert \times \vert D\vertの単語・文書行列U:\vert V\vert \times m、新しい単語行列(各行が1単語の表現)\Sigma:m \times mの特異値の対角行列(重要度の降順)V^\top:m \times \vert D\vertの新しい文書行列m = \text{Rank}(A)非ゼロの特異値をすべて残した場合は、等価な分解である。実際の次元削減やノイズ除去には、以下の打ち切り版を使うことが多い。
潜在意味解析(LSA)
k個の特異値と対応する方向だけを残し、U_kまたはU_k\Sigma_kの各行を単語ベクトルにする。kは100–300程度にすることが多い)。TF-IDFから単語ベクトルを作る全体の流れ
5.5 単語を文脈にする
5.6 自己相互情報量(PMI)
\text{PMI}(x, y) = \log_2 \frac{P(x, y)}{P(x)\,P(y)}意味:実際の共起確率と、2語が独立なら期待される共起確率との比。
\text{PMI} > 0:偶然よりも共起が多い。正の関連を持つ単語対\text{PMI} = 0:この単語対の共起確率は、独立を仮定したときの確率と等しい\text{PMI} < 0:偶然よりも共起が少ない。負の関連(共起しにくい関係)例:PMI(heaven, hell)を求める
共起行列の一部(ウィンドウ内の共起回数)
the
country
hell
Σ
state
1973
10
1
12786
fun
54
2
0
633
heaven
55
1
3
627
Σ
1047519
3817
780
15871304
P(\text{heaven}) = 627 / 15871304P(\text{hell}) = 780 / 15871304P(\text{heaven}, \text{hell}) = 3 / 15871304(このセルの共起回数が3の場合)式に代入する:
\text{PMI}(\text{heaven},\text{hell})=\log_2\frac{3\times15871304}{627\times780}\approx6.61PMI行列の一部
the
country
hell
state
1.22
1.78
0.63
fun
0.37
3.79
-inf
heaven
0.41
2.80
6.61
5.7 PMIの3つの工夫
工夫
方法
理由
-\inftyまたは負の値を0に置き換える\text{PPMI} = \max(\text{PMI}, 0)独立の場合を上回る共起関係を残し、低頻度の負の関連を不安定に推定する影響を減らす
Normalised PMI(NPMI)
\text{NPMI}(x,y) = \dfrac{\text{PMI}(x,y)}{-\log_2 P(x,y)}分子と分母の対数の底をそろえる。
0<P(x,y)<1のとき、[-1,1]の範囲へ正規化し、単語対間で比較しやすくするPMIもSVDで縮約できる
PMI行列にSVDを適用し、先頭
k次元を使う次元削減とノイズ除去により、密な低次元単語ベクトルを得る
6. 単語ベクトル:Word2Vec
6.1 Word2Vecの概要
モデル
方向
説明
Skip-gram
中心語から周辺語を予測する
実際には低頻度語に強い
CBOW(Continuous Bag of Words)
周辺語から中心語を予測する
高速で、高頻度語に強い
6.2 Skip-gramモデル
目的:対象語が与えられたとき、その文脈に正しい単語が現れる確率を最大化する。
例文:... Bereft of life he rests in peace! If you hadn't nailed him ...、対象語 rests、
L=2のときの文脈は {he, in, life, peace}。確率モデル:文脈全体の確率は、対象語を条件とした同時確率として表す:
P(\text{context} \mid w_t) = \prod_{i \in [-L, \dots, -1, 1, \dots, L]} P(w_{t+i} \mid w_t)仮定:中心語が与えられた条件下で、各文脈語を条件付き独立として扱うため、確率を積の形にできる。この基本形では文脈語の順序を区別しない。
6.3 ロジスティック回帰による実装(softmax形式)
P(w_O \mid w_I) = \frac{\exp(v'_{w_O}{}^\top v_{w_I})}{\sum_{w \in V} \exp(v'_{w}{}^\top v_{w_I})}ここで、
vは入力側(中心語)のベクトル、v'は出力側(文脈語)のベクトル。ニューラルネットワークとして表せる:
6.4 2つの埋め込み行列
重要な点:Word2Vecは2組の単語ベクトル行列を持つ:
W(\vert V\vert \times d):target word embedding(中心語/入力側の埋め込み)C(d \times \vert V\vert):context word embedding(文脈/出力側の埋め込み)次元
dの選び方:次元はハイパーパラメータとし、コーパス規模、下流タスク、計算予算に応じて調整する。100–300次元は一般的な出発点。学習の目的:入力された単語に対し、各単語が文脈語となる確率を求め、正しい文脈語の確率を最大にする。
問題:計算が遅い。分母では語彙全体(
\vert V\vertは百万にもなる)について和を取り、学習例ごとに全単語を走査する必要がある。6.5 負例サンプリング
条件付き確率
P(\text{context} \mid \text{word})の予測を、単語対の二値分類に置き換える:なぜ負例サンプリングが必要か?
最尤推定
\max \ \sum_{(w,c)\in D} \log \sigma(u_c^\top v_w) + \sum_{(w,c)\in D'} \log \sigma(-u_c^\top v_w)ここで、
D、D'はそれぞれ正例と負例の単語対集合、v_wは入力ベクトル、u_cは出力ベクトル。P(+\mid \text{word},\text{context})。P(-\mid \text{word},\text{context})。つまり、実際の共起だと判定される確率を下げる。埋め込みの直感:よく共起する入力語と出力側の文脈ベクトルは内積が大きくなりやすい。似た文脈を持つ単語は、似た表現を学ぶ可能性がある。ただし内積はベクトルの長さにも影響されるため、コサイン類似度と同一視できない。
6.6 損失関数
実際には正例1つにつき
k個の負例を使う(一般にはk=5\sim20だが、コーパスに合わせて調整する)。以下では、Tは正例の単語対数、c_tは中心語、o_tは観測された文脈語:J(\theta) = -\frac{1}{T}\sum_{t=1}^{T}\left[\log \sigma(u_{o_t}^\top v_{c_t}) + \sum_{i=1}^{k} \mathbb{E}_{w_i \sim P_n(w)}\log \sigma(-u_{w_i}^\top v_{c_t})\right]P_n(w)(通常は単語頻度の3/4乗に比例)から抽出する。高頻度語に偏りすぎず、まれな語を多く抽出しすぎないようにする。利点:
7. 単語ベクトルの評価
7.1 内的評価1:単語類似度
問い:単語埋め込みの良し悪しをどう判断するか?
方法:指標として コサイン類似度を用いる。意味の近い2語(例:well & good)のベクトルの類似度と、人手の類似度評価を相関で比較する(Spearmanの順位相関)。
\cos(u, v) = \frac{u \cdot v}{\Vert u\Vert \,\Vert v\Vert }7.2 内的評価2:単語類推
方法:埋め込み空間でベクトル演算を行い、最近傍の単語が意味関係に合うかを調べる。
\text{king} - \text{man} + \text{woman} \approx \text{queen}ベクトルの加算で意味の合成を直感的に示すこともできる。ただし、これは標準的な類推評価ではない:
\text{breakfast} + \text{lunch} + \text{dinner} \approx \text{meal に関連する方向} \quad\text{(意味の合成を示す直感的な例であり、恒等式ではない)}7.3 外的評価:下流タスク
方法:埋め込みを分類、NER、翻訳などの実タスクで使い、タスクの性能から埋め込みの品質を評価する。