「ゼロから作る Deep Learning 2」3章 まとめ
作成日時: | 2019年7月21日 |
更新日時: | 2019年7月29日 |
勉強動機
今作っているAIが決まった言葉(「おはよう」とか「おやすみ」とか)しか話せないので、もっと色々なことを話せるように自然言語処理を勉強しようと思ったのがきっかけ。今回は3章「word2vec」を読んでいこうと思います。
※「ゼロから作る」の1冊目は読破済みです。
単語の分散表現
単語を適切に表すベクトルのこと。色のRGB表現みたいなものと思えばいい、色はRGBの3次元ベクトルでうまく表すことができる。
これと同じように単語も任意の次元数で意味を圧縮した密ベクトル(成分のほとんどが0でないベクトル)で表せると良いよね、という話。
3章のテーマも、この分散表現(単語の意味を表すベクトル)をどう獲得するかという話。
カウントベースの手法 vs 推論ベースの手法
分散表現を得るための手法は大きく分けてこの2つ。カウントベースの手法の問題点と推論ベースの手法のメリット
カウントベースの手法はコーパス(学習するための大量のテキストデータ)を一気に処理しないといけないので、必要な計算時間・資源が膨大。逆に推論ベースだとミニバッチ学習(一度に全てのデータを使うのではなく一部を取り出すことを繰り返して学習すること)できるので、計算が可能になる。
3章では推論ベースの手法を学ぶ。
推論ベースの手法
例えばyou ? goodbye and i say hello .
みたいな文章で?の前後2単語(youとgoodbye)を入力とし、?を推測するようなモデルを作り学習する。
この場合のような前後2単語(場合によっては前後4単語のようにもっと広く取る場合もある)をコンテキスト(文脈)という。
CBOW(continuous bag-of-words)
コンテキストからターゲット(上の例で?の単語)を推測することを目的としたニューラルネットワーク。疑問とその答え
疑問
コンテキストの単語をone-hot-encodingしてモデルへの入力とするが、コンテキストが2単語以上だった場合どう入力するのだろう。答え
コンテキストが2単語以上だった場合、各単語をone-hot-encodingして、それぞれのone-hot-encoding後のベクトルに同じ重み行列を掛けてコンテキストの単語数分のベクトルを計算する。その後、単語数分のベクトルの平均を取って中間層の出力とするらしい。
ポイントは各単語に同じ重み行列を掛けることと、平均を取るので単語の順番が無視される(これがbag-of-wordsと呼ばれる所以。カバンに入れたら順番がごっちゃになる)。
詳しくは本を参照してください。
スコアと確率
ソフトマックスレイヤーに通す前のレイヤの出力値をスコアと呼んで区別している。ただスコアが一番高いものが確率が一番高いことに変わりはない。
疑問とその答え
疑問
コンテキストの単語数分だけ入力がありそれぞれに同じ重み行列を掛けているが、学習はこのような共有された重みに対してどのように行えばよいのだろう。本には実装を見てくださいと書いてあるので実際に実装を見てみる。
答え
訓練時に同じ重みが使われていた場合、勾配を合算して重複している片方を削除する処理が行われている。事後確率(条件付き確率)
P(A|B)は事後確率(条件付き確率)だが、自分はこれをBが起こったという条件のもとでAが起こる確率と解釈していた。しかし、本にも書いてあるとおり、「B(という情報)が与えられたときに、Aが起こる確率」と考えると、今まで見てきた別の本の数式の意味も分かった気がする。