昨日は中国で受講している「PyTorchを使ったディープラーニング」セミナーの第7回がありました。今回のテーマは自然言語処理。単語や文章をどのようにコンピュータで扱うか学びます。
どのように単語を理解するか?
コンピュータで単語を処理する際に現在使用されている主な方法は、下記2種類あります。
- One-hot Representation
- Distributional Representation
One-hot Representation
One-hot Representationとは特定の列の値のみが1、それ以外の値は0で表現するベクトル表現の事です。
[青、赤、フルーツ、野菜、机]という辞書(単語の集合)があった場合に、
赤は
[0,1,0,0,0]
机は
[0,0,0,0,1]
で表します。上記サンプルでは辞書に5単語しか用意していないですが、実際に日常会話で使われる単語では2万語程度は必要になります。
One-hotの欠点
One-hotで単語を扱う場合の欠点は
- ベクトルの次元数が非常に大きく、疎な行列となる
- 単語の意味を扱えない
という問題があります。2万語の辞書を用意して1つの単語を表すと
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,・・・・]
のような形となり1列だけ1、残り全てが0というデータになります。
また、One-hotでは単語間での類似性・相関性を保持できないため「じゃがいも」と「馬鈴薯」という単語が全く別の値として扱われます。
Distributional Representation
Distributional Representationとは単語を少ない次元数のベクトルで表す方法です。
例えばトマトを表すイメージは下記のような形になります。
[青、赤、フルーツ、野菜、机]
[0.2 , 0.9 , 0.1 , 0.8 , 0]
トマトは赤い野菜なので、「赤」、「野菜」列の数値が高く、机とは全く関係ないので0となっています。
この方法であればOne-hotの欠点を解決することが出来ます。
word2vec
word2vecとはその名の通り単語からベクトル(Distributional Representation)に変換する手法の1つで、2013年にgoogleの研究者によって発表されました。
今回の講義ではword2vecの中のSkip-Gramのモデルをpytorchで実装しました。
['he is a man','berlin is germany capital', 'she is a queen']等の単語からSkip-Gramモデルで訓練し最終的にpoland - warsawとgermany - berlinのコサイン類似度が1に近づくか確認します。
- ポーランド(国名)を表すベクトルからワルシャワ(首都)のベクトルを引いた値
- ドイツ(国名)を表すベクトルからベルリン(首都)のベクトルを引いた値
上記は平行になり、2つのベクトルのcos(コサイン)は1になるはずです。