パーティクルフィルタ研究会2016/1/7 / 321
数式からみるWord2Vec
○名渡山 夏子 岡本一志
電気通信大学
パーティクルフィルタ研究会2016/1/7 / 32
(0, …, 0, 1, 0, …, 0)
はじめに
2
• 複数の次元で1つの単語を表す
• 単語数が増えても,次元は固定長のまま
分散表現
局所表現
• 各概念(単語)に1つずつ次元を割り当てる(1-of-k表現など)
• 単語数が増えると次元が大きくなる
(0, 1, 0, …, 0, 0)
350,134番目
パーティクルフィルタ研究会2016/1/7 / 32
2013年、Googleが開発した単語の分散表現の手法
単語の「意味」を表現するベクトルを低次元で作れる
学習には,たくさんの文章(例えばWikipedia)を使用
2層のフィードフォワードニューラルネットワークのモデルで学習
Word2Vec とは
3
入力層 出力層
隠れ層
パーティクルフィルタ研究会2016/1/7 / 32
単語の「意味」を表現するベクトルを低次元で作る
1.ベクトルを使って、単語の「意味」の足し算ができた
vec(Berilin) - vec(German) + vec(France) = vec(Paris)
2.フレーズ(複合語)まで対応できた
New York Times(新聞社), Air Canada(カナダの航空会社)
Word2Vec のすごいところ
4
計算が異常に速い
なぜか精度が良い
パーティクルフィルタ研究会2016/1/7 / 32
学習したい単語:コーヒー
コーヒーと同時に使われる単語から,コーヒーに合う単語を学習
合う単語:砂糖,ミルク,喫茶店,ブラック

合わない単語:コンピュータ,赤ちゃん,ゲーム
Word2Vec の学習概要
5
合う単語には条件付き確率が高く
合わない単語には条件付き確率が低くなるように学習する
p(milk|coffee) > p(baby|coffee)
パーティクルフィルタ研究会2016/1/7 / 32
ネットワークアーキテクチャ
・CBOW(Continuous Bag-of-Words)
・Skip-gram


高速化
・Negative Sampling
・Hierarchical Softmax
今回の説明では
6
こっち
こっち
Skip-gram でモデル化
パーティクルフィルタ研究会2016/1/7 / 32
Skip-gram とは
8
普通のbigram skip-bigram
Skip-gramは隣の単語だけではなく,

周辺の単語までのペア(セット)を考える
文章
etc..
パーティクルフィルタ研究会2016/1/7 / 32
Skip-gram モデル
9
良い感じに I に合う単語を学習
→○
→○
→☓
V = { } の中から に合う単語とは?
に合う単語は, と一緒に使われる
→ が出ると の出現確率が高いと学習して欲しい
パーティクルフィルタ研究会2016/1/7 / 32
Softmax 関数を使ってモデル化
10
結局、 が与えられた時にどんな単語が合うのか?を

考える条件付き確率と一緒!
注目単語

( )
周辺単語

( )
ボキャブラリーの集合

(全単語=105
〜107
)
vp(wO|wI) =
exp(v0T
wO
· vwI
)
P
wv2V exp(v0T
wv
· vwI
)
:入力ベクトル

:出力ベクトル
p(wO|wI) =
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
単語と単語の関係から,コンテキスト(文脈)まで拡張する
例文:
注目単語: / コンテキストサイズ=2
周辺単語:
単語からコンテキスト(文脈)に
11
注目単語
周辺単語

単語ベクトル同士の内積
条件付き確率→同時確率の計算に拡張
p(wO,1, · · · , wO,C|wI) =
CY
c=1
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
前後のコンテキストまで含めた同時確率を考える
が最大となるような単語ベクトル  = 単語の”良い表現”
Skip-gramモデルの目的関数
12
vp(wO,1, · · · , wO,C|wI) =
CY
c=1
exp(v0T
wOc
· vwI
)
P
wv2V exp(v0T
wv
· vwI
)
arg max
W,W 0
p(wO,1, · · · , wO,C|wI)
p(wO,1, · · · , wO,C|wI) =
CY
c=1
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
Word2Vec の
ニューラルネットワーク
パーティクルフィルタ研究会2016/1/7 / 32
2層のニューラルネットワーク
14
入力層 出力層
隠れ層
いいかんじの

WとW’を学習する
W W’
0
B
B
@
x1
x2
x3
x4
1
C
C
A
0
@
h1
h2
h3
1
AWをかけて

圧縮
W’をかけて

展開
0
B
B
@
u1
u2
u3
u4
1
C
C
A
106
106
200→ →dim:
パーティクルフィルタ研究会2016/1/7 / 32
入力層のベクトル はV次元
ある要素だけ1、それ以外は0の 1-of-k ベクトル
例: V= { }   =
入力層( )
15
x =
0
B
B
B
B
B
B
@
x1
x2
x3
x4
x5
x6
1
C
C
C
C
C
C
A
=
0
B
B
B
B
B
B
@
0 · · · I
1 · · · like
0 · · · black
0 · · · coffee
0 · · · am
0 · · · cat
1
C
C
C
C
C
C
A
x
x
wI
パーティクルフィルタ研究会2016/1/7 / 32
W はボキャブラリの全単語の単語ベクトルを横に並べた行列
隠れ層への重み( )
16
隠
れ
層
の
次
元
W
=
0
B
B
B
@
v11 v21 v31 v41 v51 v61
v12 v22 v32 v42 v52 v62
...
...
...
...
...
...
v1N v2N v3N v4N v5N v6N
1
C
C
C
A
W = v1 v2 v3 v4 v5 v6
, の場合,W は 200 x 106
の大きさh 2 R200
x 2 R106
パーティクルフィルタ研究会2016/1/7 / 32
隠れ層の計算 h = Wx

(活性化関数なし)
隠れ層( )
17
隠れ層の出力は、複雑な計算をせずに になる
ここで 1-of-k が生きてくる
( :N次元ベクトル)
各 v が単語の「意味」を表す
W x = v1 v2 v3 v4 v5 v6
0
B
B
B
B
B
B
@
0
1
0
0
0
0
1
C
C
C
C
C
C
A
= v2W x = v1 v2 v3 v4
h
h = W xwI
= vwI
vwI v
パーティクルフィルタ研究会2016/1/7 / 32
隠れ層から出力層への重みW′も同様に単語ベクトル v′ を並べた
出力層への重み( )
18
W'
W 0
=
0
B
B
B
B
B
B
B
@
v0T
1
v0T
2
v0T
3
v0T
4
v0T
5
v0T
6
1
C
C
C
C
C
C
C
A
=
0
B
B
B
B
B
B
@
v0
11 v0
12 · · · v0
1N
v0
21 v0
22 · · · v0
2N
v0
31 v0
32 · · · v0
3N
v0
41 v0
42 · · · v0
4N
v0
51 v0
52 · · · v0
5N
v0
61 v0
62 · · · v0
6N
1
C
C
C
C
C
C
A
, の場合,W' は 106
x 200 の大きさh 2 R200
x 2 R106
パーティクルフィルタ研究会2016/1/7 / 32
出力層( )
19
の各要素は,周辺単語出力ベクトルと注目単語入力ベクトルの内積
uc.i =
0
B
B
B
B
B
B
@
v0
11 v0
12 · · · v0
1N
v0
21 v0
22 · · · v0
2N
v0
31 v0
32 · · · v0
3N
v0
41 v0
42 · · · v0
4N
v0
51 v0
52 · · · v0
5N
v0
61 v0
62 · · · v0
6N
1
C
C
C
C
C
C
A
vwI
出力層のユニットは出力層への重み x 隠れ層
0
B
B
B
B
B
B
@
uc,1
uc,2
uc,3
uc,4
uc,5
uc,6
1
C
C
C
C
C
C
A
0
B
B
B
B
B
B
@
vwI 1
vwI 2
vwI 3
vwI 4
vwI 5
vwI 6
1
C
C
C
C
C
C
A
uc = W 0
vwI
uc,i = v0T
i · vwI
uc = W 0
vwI
uc = W 0
vwI
パーティクルフィルタ研究会2016/1/7 / 32
出力層( )
19
の各要素は,周辺単語出力ベクトルと注目単語入力ベクトルの内積
uc.i =
0
B
B
B
B
B
B
@
v0
11 v0
12 · · · v0
1N
v0
21 v0
22 · · · v0
2N
v0
31 v0
32 · · · v0
3N
v0
41 v0
42 · · · v0
4N
v0
51 v0
52 · · · v0
5N
v0
61 v0
62 · · · v0
6N
1
C
C
C
C
C
C
A
vwI
出力層のユニットは出力層への重み x 隠れ層
0
B
B
B
B
B
B
@
uc,1
uc,2
uc,3
uc,4
uc,5
uc,6
1
C
C
C
C
C
C
A
0
B
B
B
B
B
B
@
vwI 1
vwI 2
vwI 3
vwI 4
vwI 5
vwI 6
1
C
C
C
C
C
C
A
uc = W 0
vwI
uc,i = v0T
i · vwI
uc = W 0
vwI
uc = W 0
vwI
パーティクルフィルタ研究会2016/1/7 / 32
出力層( )
19
の各要素は,周辺単語出力ベクトルと注目単語入力ベクトルの内積
uc.i =
0
B
B
B
B
B
B
@
v0
11 v0
12 · · · v0
1N
v0
21 v0
22 · · · v0
2N
v0
31 v0
32 · · · v0
3N
v0
41 v0
42 · · · v0
4N
v0
51 v0
52 · · · v0
5N
v0
61 v0
62 · · · v0
6N
1
C
C
C
C
C
C
A
vwI
出力層のユニットは出力層への重み x 隠れ層
0
B
B
B
B
B
B
@
uc,1
uc,2
uc,3
uc,4
uc,5
uc,6
1
C
C
C
C
C
C
A
0
B
B
B
B
B
B
@
vwI 1
vwI 2
vwI 3
vwI 4
vwI 5
vwI 6
1
C
C
C
C
C
C
A
uc = W 0
vwI
uc,i = v0T
i · vwI
uc = W 0
vwI
uc = W 0
vwI
パーティクルフィルタ研究会2016/1/7 / 32
はSkip-gramでモデル化したときの確率になる
最終的な出力値(softmax関数使用)
20
ニューラルネットワークの計算 skip-gram でモデル化したときの確率
x ucvwI
yc,i
softmax

関数
yc,i tc,i
教師信号
uc,i
xwI
yc,i =
exp (uc,i)
PV
v=1 exp (uc,v)
=
exp (v0T
i · vwI
)
PV
v=1 exp (v0T
v · vwI
)
= p(wi|wI)
パーティクルフィルタ研究会2016/1/7 / 32
Word2Vecの面白いところ
21
入力層 出力層
隠れ層
入力層には注目単語の単語ベクトルをいれて,

出力層には周辺単語の単語ベクトルを出力させる学習を行う
理想的な解
0
B
B
@
0
1
0
0
1
C
C
A
0
B
B
@
0
0
0
1
1
C
C
A
入力の1-of-kベクトル
W’W
x ucvwI
パーティクルフィルタ研究会2016/1/7 / 32
良い v と v’ が欲しい → 良い W と W’ が欲しい!!!
良いパラメータ(重み)を得る
22
同時確率はアンダーフローしやすいので,log をつけたものを

目的関数とおき,SGD(確率的勾配降下法)で最適化を行う
E = log p(w1, w2, · · · , wC|wI )
p(wO,1, · · · , wO,C|wI) =
CY
c=1
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
目的関数を微分して更新式を得る
23
{
E = log p(w1, w2, · · · , wC|wI )
E を W,W’ の各要素で偏微分する
vij := vwI i ⌘
CX
c=1
VX
v=1
(yc,v tc,v)v0
vi
v0
ij := v0
ij ⌘
CX
c=1
(yc,i tc,i)vwI j
tc,i =
⇢
1 (i = wc)
0 (otherwise)
Wの更新式
W’の更新式
p(wO,1, · · · , wO,C|wI) =
CY
c=1
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
圧倒的な高速化を行う
パーティクルフィルタ研究会2016/1/7 / 32
実装できそうだけど…
25
V :ボキャブラリーの集合(105
〜107
)
計算量が爆発して学習が終わらない

良いパラメータを得られない
p(wO|wI) =
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
実際に共起した単語と、共起しなかった単語の確率を考える
高速化:Negative Sampling
26
共起した(True)
共起しなかった(False)
p(T|wI, wO) = (v
0T
wo · vwI
)
p(F|wI, wO) = 1 (v
0T
wo · vwI
)
E = log p(T|wI , wO)
Y
v2VNeg
p(F|wI , v)
パーティクルフィルタ研究会2016/1/7 / 32
実際に共起した単語と、共起しなかった単語の確率を考える
高速化:Negative Sampling
26
共起した(True)
共起しなかった(False)
p(T|wI, wO) = (v
0T
wo · vwI
)
p(F|wI, wO) = 1 (v
0T
wo · vwI
)
E = log p(T|wI , wO)
Y
v2VNeg
p(F|wI , v)
:シグモイド関数(x)
= 1 (v0T
wO
· vwI
)
= (v0T
wO
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
実際に共起した単語と、共起しなかった単語の確率を考える
高速化:Negative Sampling
26
共起した(True)
共起しなかった(False)
p(T|wI, wO) = (v
0T
wo · vwI
)
p(F|wI, wO) = 1 (v
0T
wo · vwI
)
さっきの式の分母の役割

Vnegからランダムにk個取る
(k=5〜20)
E = log p(T|wI , wO)
Y
v2VNeg
p(F|wI , v)
:シグモイド関数(x)
= 1 (v0T
wO
· vwI
)
= (v0T
wO
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
実際に共起した単語と、共起しなかった単語の確率を考える
高速化:Negative Sampling
26
共起した(True)
共起しなかった(False)
p(T|wI, wO) = (v
0T
wo · vwI
)
p(F|wI, wO) = 1 (v
0T
wo · vwI
)
さっきの式の分母の役割

Vnegからランダムにk個取る
(k=5〜20)
E = log p(T|wI , wO)
Y
v2VNeg
p(F|wI , v)
:シグモイド関数(x)
= 1 (v0T
wO
· vwI
)
= (v0T
wO
· vwI
)
E = log p(T|wI, wO)
Y
v2VNeg
p(F|wI, v)p(T|)p(T|)
p(F| p(T|)
p(F| p(T|)
p(F| p(T|)
p(F| p(T|)
p(F| p(T|)
E = log p(T|wI, wO)
Y
v2VNeg
p(F|wI, v)
パーティクルフィルタ研究会2016/1/7 / 32
Vneg からランダムに k 個取る
27
U(w):単語の頻度
ノイズ分布Pn(w)
8 4 3 1
0.44 0.258 0.21 0.092
普通の割合 0.5 0.25 0.1875 0.0625
頻度が少ない単語も選択されやすいように補正
U(w)
Pn(w)
パーティクルフィルタ研究会2016/1/7 / 32
高速化前後の目的関数の比較
28
ボキャブラリー数+1回の計算 VNeg(5〜15)数+1回の計算
まじめに計算しなくても問題がなかった
計算回数が圧倒的に減ったので学習ができる!!
E = log p(T|wI, wO)
Y
v2VNeg
p(F|wI, v)I) =
exp(v0T
wOc
· vwI
)
X
wv2V
exp(v0T
wv
· vwI
)
パーティクルフィルタ研究会2016/1/7 / 32
高速化したあとの目的関数
29
Wの更新式
W’の更新式
E を W,W’ の各要素で偏微分する ti =
⇢
1 (i = wO)
0 (otherwise)
E = log (v0T
wO
· vwI
)
X
v2VNeg
( v0T
v · vwI
)
v0
ij := v0
ij ⌘( (v0T
i · v0
wI
) ti)vwI j
vij := vwI i ⌘
X
v2wO[VNeg
( (v0T
v · vwI
) tv)v0
vi
パーティクルフィルタ研究会2016/1/7 / 32
類似する単語は,ベクトル間のコサイン類似度で得る
獲得したベクトルの利用方法
30
※学習パラメータ・データはオフィシャルサイトのチュートリアルを利用
science
scientific 0.572214
sciences 0.569874
astrobiology 0.487089
pseudoscience 0.486106
physics 0.477239
pay
paid 0.730617
paying 0.690467
repay 0.577326
payment 0.569318
debts 0.561721
パーティクルフィルタ研究会2016/1/7 / 32
2層のニューラルネットワークで、良い感じに学習したら単語の
「意味」ベクトル作れた
ベクトル同士の足し算で,単語の「意味」の足し算ができた
この単語と単語が共起しないだろうと考えたら高速化できた
まじめに計算しなくても,意外に問題がないこともある
おわりに
31
パーティクルフィルタ研究会2016/1/7 / 32
Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, Jeffrey Dean: Distributed
Representations of Words and Phrases and their Compositionality, Neural
Information Processing Systems 2013, 3111–3119, 2013.
西尾泰和: 『word2vec による自然言語処理』 株式会社オライリー・ジャパン, 2014
Yoav Goldberg and Omer Levy: word2vec Explained: Deriving Mikolov et
al.’sNegative-Sampling Word-Embedding Method < https://arxiv.org/pdf/
1402.3722v1.pdf > 2016/1/2アクセス
@tkengo: 「Word2Vec のニューラルネットワーク学習過程を理解する」,

< http://tkengo.github.io/blog/2016/05/09/understand-how-to-learn-word2vec/
> 2016/1/2アクセス
岡崎直観:「単語・句の分散表現の学習」< http://www.slideshare.net/naoakiokazaki/
ss-55494101 > 2016/1/4アクセス
参考文献
32

数式からみるWord2Vec