5次元のカオス

南の島の学生がつらつらと日々を書き連ねます

word2vecに関する勉強会に参加してきました

概要

2015/4/10にサイバーエージェントのアドテクスタジオ主催で行われた「ディープラーニングチュートリアル 応用編:言葉の『意味』表現〜word2vec〜」に参加してきました.

講師としてDanushka Bollegala教授(英リバプール大准教授)を招いて行われたこの講演会では,近年注目を集めているword2vecについて勉強することができました.

興味本位で遊びに行って大丈夫かな...?と心配していたのですが,講師の方が言葉を噛み砕いて丁寧にお話してくれたこともあってなんとかついていくことができました.

最近、東京に引っ越してきたためこういった勉強会への参加することに緊張していたのですが、楽しく勉強することができてよかったです.

講演資料は以下のサイトで公開されております.

ディープラーニングチュートリアル 応用編

以下,勉強会でのメモです.(間違えているところもあるかもしれません)

word2vec とは?

「Word2Vec」は,米グーグルの研究者であるトマス・ミコロフ氏らが提案した手法であり,いくつかの問題について従来のアルゴリズムよりも飛躍的な精度向上を可能にした自然言語処理の手法.

Word2Vecは,その名前の表す通り,単語をベクトル化して表現するする定量化手法である.例えば日本人が日常的に使う語彙数は数万から数十万といわれるが,Word2Vecでは各単語を200次元くらいの空間内におけるベクトルとして表現する.

mecab - 米googleの研究者が開発したWord2Vecで自然言語処理(独自データ) - Qiita より

単語の意味とは?

この講演中は自然言語処理の最小単位「単語」(特に1単語)にする.

有名な「単語」に関する仮説:単語自身には意味はなく,周辺に現れる言葉によって意味を持つ

問題:Xは持ち歩くことが可能で相手と通信ができてネットも見れて便利だ

X にはどんなワードが入るか? → iPhone

もしXが初めて見る単語だったとしても,Xの周辺を読み取ることで意味を知ることは出来る.

これは X自身には意味は無い = 周りの意味で決まる ということに等しい.

※ X自身に意味があったら,周りをみても予測することができない

それは本当のこと?

辞書は単語の意味を定義している.

  • 辞書も他の単語との関係を述べているに過ぎない?

膨大なコーパスがあれば,周辺単語を集めてくる.

コーパス = 自然言語の文章を構造化し大規模に集積したもの.

意味表現を作るアプローチ

分布的な方法 (古典的)

「林檎」という単語の意味表現を作る

林檎 という成分を考える

  • S1 = 林檎は赤い
  • S2 = 赤いリンゴは美味しい
  • S3 = 青森県は林檎の生産地として有名である

→ 共起の表現で林檎を作ることができる.

林檎とは?:赤い・美味しい・青森で生産される という意味で表現できる

同様に「みかん」の意味表現を作ると,林檎とみかんの意味的な類似度を調べることができる.

Jaccard係数 = 林檎 AND みかん / 林檎 OR みかん

Jaccard係数 = 2要素の共通要素の割合を0~1の間で示す.

ナマの共起頻度を信頼できるかの実験

2つのワードがどれくらい共起しているかを見るためにGoogle検索を使う.

  • Googleのヒット件数
    • (car, automobile) = 200,000,000
    • (car, apple) = 373,000,000

→ 共起が大きすぎると問題が起こるため,なんらかの重み付けが必要となってくる

そこで,共起頻度の重み付けを行う手法が提案されている.

重み付けの手法

以下のように手法がたくさんある(30個以上)ため,どの手法が適しているかはケースバイケース

  • 点情報量(pointwise mutual information)
  • 正点情報量(PPMI)
  • 移動点情報量(SPMI)

ゼロ共起による問題

大きなコーパスを持っていたとしても共起しない単語というものが出てくる.

  • 単語xとyが共起しない原因を考察する
    • そもそも関連性がない
    • たまたまデータがない

→ どちらの理由で共起が置きないのかを判定することができない

共起行列に0が並ぶと相関が0に近づいてしまう.

そこで,共起行列から0を削除するための次元削減 / 低次元射影という手法が提案されている.

次元削減の説明は, 大まかな説明をすると,0じゃない部分を0でない値で埋める とのこと.

林檎,みかんの中で共起が0となっているものを削除する

以下のように手法はたくさんあるが,主にやっていることは0の数を減らすということ.

  • 特異値分解(SVD)
  • 主成分分析(PCA)
  • 非負行列分解(NMF)

共起の幅を決める必要があったり,単語距離によって重みをつけるなど工夫が色々ある.

分散的な意味表現を作るアプローチ

単語xをコーパス中でその周辺に現れる全ての単語の共起頻度分布を持って表す.

ディープラーニング/表現学習 ブームで最近人気になってきた

ディープラーニング = 学習アルゴリズムがデータの中から有効な特徴量を探してくる

分散表現な方法(近代的)

クラスタ分割などの局所的な表現:ある点のデータを示すとき,周辺の近傍を調べる

分散表現の表現:ある点のデータを示す時,その点を分割するように線を引くイメージ

f:id:pxp_ss:20150418213337p:plain

→ いくつかの線(次元)を引くだけで分割するので,少ない次元数で表現が可能

→ 分割する線(次元)によって全ての単語を同じ次元で対比できる

分散表現を学習する

分散表現では,各単語xの意味表現がD次元のベクトルで表されると仮定する.

そのベクトルの要素の値をコーパスから学習する.

xの意味表現ベクトルv(x)を使って,コーパス中でxの周辺に出現する単語cを予測できるか学習する.

word2vec

  • Word2vecは単語の分散意味表現を学習するためのツールアルゴリズムではない)
    • skip-gram
    • continuous bag of words

→ 2つのアルゴリズムでなりたっている.今回はskip-gramだけ説明.

skip-gramモデル

1つの単語に対して2個のベクトルが割り当てられていると仮定

「私は味噌汁とご飯を頂いた」 → 「私 / は / 味噌汁 / と / ご飯 / を / 頂いた」(意味解析をする前準備として形態素解析を行う)

味噌汁の周辺でご飯が出現するかどうかを予測する問題を考える.

日本人は味噌汁という単語が出たら,ご飯を連想したりする.

→ これをコンピュータでやりたいというもの.

では,このスコアをどうやって計算するか.

1. 味噌汁のベクトルとご飯のベクトルを内積で定義する:score(x, c) = v(x)T u(c)

内積は+∞⇔-∞の範囲を取られるため,正規化する必要がある

2. 全ての文脈単語c'に関するスコアで割ることで計算できる:(log-bilinear model:LBL)

このようなモデルを対数双線型という

双線型とは?:f(ax + b, y) = af(x, y) + f(b, y) パラメータ1つを変動,ソレ以外は固定すること

連続単語集合モデル(CBOW)

周辺の単語を全てを使って,対象単語を予測する.

分膜の前後いくつかの単語に限定して対象単語を予測する.

(順序は無視,)

表現能力は高いがskip-gramよりも若干精度が悪い.

高速化のための工夫が必要?

負例サンプリング(アンダーサンプリング?)

コーパス中のいくつかの単語だけ正規化する方法

負例 = 元々の単語に存在していなかったもの

階層的ソフトマックス

単語の出現の代わりに意味クラスの出現を使うことで語彙の大きさを減らす.

単語を階層的に表現することで比較する単語の数を減らす.

(関係ない(近似しない)意味クラスの階層は無視すれば良い)

ツリーの作り方自体は手法は色々ある:ハフマン木などが有名(それぞれの単語にバイナリの値を振る)

※ よく出現する奴は短いバイナリになる

学習した意味表現の評価

意味表現はベクトルなので「目で見ても分からない」

→ なんらかのタスクに応用してその性能向上度合いで評価する必要がある

こういうふうに評価することを間接的評価という.

関節的評価の手法

  • 意味的類似性による評価:人間がつけたスコアとアルゴリズムが出したスコア間の相関を計測する
  • アナロジー問題:cos類似度などを使って最大の類似度を持つ単語を答えとして返す

Global Vector Prediction(GloVe)

  • skip-gram と CBOWは一文単位でコーパスを処理し意味表現を学習していく

CBOWやskip-gramは1文単位での共起を調べていたが,コーパス全体で共起を探索する?

※ 負の共起を使っていないのが問題?(ご飯と味噌汁というような「正」の共起しか利用していない)

質疑応答

Q.d次元のベクトルはどうやって求まるのか?

dを横軸,性能を縦軸で評価する論文などがある

→ ある次元からは飽和するみたいなものが分かったりする

Q.スキップグラムの飛ばし方はタスク依存なのか?

タスク依存.文を超えるものはできない.

ストップワード:よく出る単語(が/は/と:助詞など)は除外する.

離れた距離の単語には重み付けとして離れた距離の逆数で割ったりする.

Q.今回の勉強会はディープラーニングの領域?

今回の目的は予測問題を解くこと.

今回は2つの問題の内積で説明したが,これをNN法みたいなものに入れ替えても構わない.

問題はデータ量が多くなるときにどうするのか?というところだった.

ディープラーニングとの関係は特徴を学習できれば良い.今回の講演は単語の特徴を意味学習した.

参考資料