今やChat GPTについて知らない人はいないんじゃないか?って思えるぐらい有名になりました。しかし、何でこんな物が突然現れたのか不思議に思う方も多いのではないでしょうか?そこで、Chat GPTが登場するまでの様々な技術について、数式は使わずに平易に解説していくシリーズとして「Chat GPT はどうやって生まれてきたのか?」を連載しています。今回はその4回目となります。第3回の終わりに、次回は「RNN,LSTM,GRUとseq2seqについて」と書きましたが、予定を変更して今回は「word2vec」を取り上げます。
1.word2vec
1.1 単語分散表現
word2vecと言えば、図1の式が必ずと言って良いほど登場します。式は「King」から「Man」を引いて「Woman」を足すと「Queen」になると読めます。これは、「King」と「Queen」の関係が「Man」と「Woman」の関係と同じであることを意味しおり、コンピュータが単語の意味を(ある程度)理解したことを示す例として挙げられました。word2vecの論文を以下に示します。
word2vec の衝撃は非常に大きく、日本でもコンピュータ関連だけでなく「日経ビジネス」などにも記事が掲載されていたため、御存知の方も多いのではないかと思います。
word2vecとはその名前のとおり、単語をベクトルにするものです。ベクトルの次元は、300次元がよく使われます。大量の文章を使って学習することによって300次元のベクトル空間内で意味が近い単語どうしは近く、そうでないものは遠くに配置されます。このように単語をベクトルで表すことを単語分散表現といいます。単語分散表現の研究は以前からありましたが、図1のような演算が可能な分散表現が得られたのはword2vecが初めてでした。但し、「各次元が何を表しているのか?」ということを人間が理解するのは不可能でしょう。
1.2 単語分散表現の重要性
単語分散表現の重要性を知るために、以下の2つの文を例にとって、単語分散表現がない場合と、単語分散表現がある場合を比較してみます。
母 と お寿司 を 食べた 。
てんぷら と お寿司 を 食べた 。
コンピュータ内部では単語はIDに置き換えられています。そこで、「母」→A,「てんぷら」→B,「お寿司」→Cに置き換えてみます。
A と C を 食べた 。
B と C を 食べた 。
これだと、2文とも同じに見えてしまいますね。食べたのは、「てんぷら」や「お寿司」であって「母」は食べません。当たり前のことですが、この当たり前をコンピュータに教えないといけません。そうでないと、文の構造を取り違えてしまいます。
単語分散表現がない場合は、情報として「てんぷら」や「お寿司」という単語に「食べ物」という属性を与えるなどしていました。しかし、このような形で情報を増やしていくのは非常に困難な作業でした。
単語分散表現がある場合は、「母」と「お寿司」は意味が遠く、「てんぷら」と「お寿司」は意味が近いということを学習できていれば、それだけで「母」と「お寿司」は並列に扱わないけど、「てんぷら」と「お寿司」は並列に扱って良いということが判断できそうです。もちろん「てんぷら」と「お寿司」は食べ物なので、「食べた」という単語とも関係が深いということも学習できているでしょう。
このように、単語分散表現はコンピュータが文章を扱う上で非常に重要なのです。word2vecを使えば、この単語分散表現を大量の文章を準備して学習させるだけで取得できるのです。
1.3 word2vec が学習するしくみ
一般に word2vec と呼んでいるのは総称で、モデルとしては CBOWモデル と Skip-gramモデル の2種類あります。そして、さらにそれぞれに計算を高速化する手法があります。ここでは、計算の高速化手法は省略しモデルの考え方のみを説明します。
1.3.1 CBOWモデル(Continuous Bag-of-Words Model)
ここでは、CBOWモデルについて説明します。このCBOWモデルを使って学習することにより、単語分散表現を得ることができるのですが、モデルが学習するタスク(目的)は別に設定し、単語分散表現は副産物的に得られます。このことに注意しておいてください。
CBOWモデルには、文章の穴埋め問題を学習させます。大量の文章を準備すれば、機械的に穴埋め問題と正解データをつくることができます(図2)。
モデルには、周辺の単語から正解の単語を予測させます。図2の例ですと、「犬」「は」「を」「追いかける」を入力すると「ボール」を出力するようにします。実際には正解単語の前後何単語分を利用するかを事前に設定しておきます。一般的に、前後4単語ぐらいを使います。
図3は、モデルに図2の問題を入力したときの様子です。
モデルへの入力の際に、周辺の単語をone-hotベクトルにします。
one-hotベクトル:1ヶ所だけが1で他はすべて0のベクトルのことです。集めた大量の文章に2万種類の単語があった場合はone-hotベクトルは2万次元になります。単語にはID番号が振られてますので、その番号に対応する要素だけを1にします。
モデルは、プロジェクション(前半)と、全結合(後半)から成ります。なお、プロジェクションは全結合から活性化関数を除外して簡素化したもので、射影行列を使って次元圧縮をしていると捉えることができます。圧縮後のサイズは取得したい単語分散表現のサイズにします。つまり、ここでは300になります。
前半では、入力された複数のone-hotベクトルを次元圧縮し平均することによって、1つの300次元ベクトルを算出します。
後半では、先程の300次元ベクトルを入力として、正解単語を出力するように、学習します。出力単語は2万種類の単語の中から選択するので分類問題になります。なお、分類問題については、本連載の第1回でも取り扱ったので、そちらも参照してください。
以上の手順で大量の文章を使って学習させます。学習が順調に進めば、穴埋め問題の正解率が上がっていくのでしょうけど、本来の目的は単語分散表現を求めることでしたので、この正解率はあまり気にする必要はありません。では、その単語分散表現はどこにあるのでしょうか?
プロジェクションでは学習により射影行列が調整されます。この射影行列こそが、求めていた単語分散表現なのです。この射影行列は2万次元を300次元に次元圧縮するので、各単語のone-hotベクトルを変換した結果がその単語の分散表現となります。実際にはone-hotベクトルは1ヶ所だけが1で他はすべて0なので変換する必要はなくて、射影行列の係数そのものが各単語の分散表現であると言えます。逆に言うと、各単語の分散表現を2万単語分並べたものが射影行列になっています。
word2vecは分布仮説に基づいて設計されています。次元圧縮された状態で分類問題に正解する必要があるので、次元圧縮では同じような使われ方をする単語はまとめる方向に学習が進むと考えられます。その結果、単語の意味を理解したと言えるような性質が得られるのでしょう。
分布仮説:「単語の意味は、周囲の単語によって形成される。」という仮説
モデル名の CBOW は Continuous Bag-of-Words の略ですが、周辺単語の情報を平均してますので、確かに順序の情報は消えていますね。
Bag-of-Words:単語(Words)を順序に関係なく袋(Bag)に詰める様子から、文中の単語の順番は無視して単語の種類と出現回数のみに注目する方法を指します。自然言語処理では、問題を単純にするためによく使われます。
1.3.2 Skip-gramモデル
もう1つのモデルとしてSkip-gramモデルがあります。CBOWモデルでは、周辺の単語から中央の単語を予測するタスクを学習させましたが、これを逆にして中央の単語から周辺の単語を予測するタスクにしたのがSkip-gramモデルです(図4)。
動作は同じようなものなので、説明は省略します。CBOWモデルとSkip-gramモデルを比較した場合、CBOWモデルの方が学習が早く、Skip-gramモデルの方が性能が良くなるそうです。
2. おわりに
今回は、word2vecを取り上げ、単語分散表現の重要性とword2vecが単語分散表現を獲得するしくみを説明しました。次回は、RNN,LSTM,GRUとseq2seqについてお届けする予定です。