はじめに
人工知能、とりわけ自然言語処理の分野では、 「単語(自然言語)をベクトル化する」 という表現をよく耳にします。今回は、この「単語のベクトル化」について、身近な色(RGB)の事例を用いて説明していきます。
※自然言語処理では「自然言語」全般を扱うものですが、この記事では「単語レベルでのベクトル化」に焦点を当てています。
単語をベクトル化する第一歩
コンピュータが単語を理解するためには、まず、単語を数値情報に変換する必要があります。この最も簡単な方法は、単語のリストに対して、単語の数と同じ次元数のベクトルを作成することです。
具体的には、10万個の単語を持つリストがあるとき、1番目の単語を $ (1,0,0,...,0) $、2番目の単語を $ (0,1,0,...,0) $ と表現することで、すべての単語を数値表現に変換できます。
しかし、このベクトルは単に 単語リストの番号を紐づけただけ であり、「単語の意味」を持っているわけではありません。これでは、コンピュータが単語を理解しているというにはほど遠いでしょう。また、高次元のベクトルを扱うことには計算コストが高いという問題があります。
このようなベクトルを 局所表現(疎なベクトル) といいます。疎なベクトルとは、ベクトルの要素に0を多く持つ = 情報量の少ないベクトル という意味です。
では、「単語の意味」を持っているベクトルとはいったい何なのでしょうか?
「珊瑚色」ってどんな色?
この疑問に答えるために、一つの例としてベクトルから「珊瑚色」がどのような色であるかついて考えてみましょう。
珊瑚色とは、JIS慣用色名で定められている全269色のうちの6番目の色です。これを先ほどの局所表現で表すと、 $(0,0,0,0,0,1,0,...,0)$ のような269次元のベクトルとなります。
うーーーん、これでは珊瑚色がどのような色なのか全くわかりません。
しかし、私たちは色をより低次元のベクトルを用いてどのような色かを理解する方法を知っているはず、そう「RGB」です。
珊瑚色をRGBで表現すると $(255,127,143)$ の3次元ベクトル、Red=255、Green=127、Blue=143となります。このベクトルをみると、光の三原色の特徴から赤が強くて色が薄い、ピンクに近いような色なのではないかと予想できます。
実際の珊瑚色はこのような色です。どうでしょう、皆さんの予想と同じような色だったでしょうか?
このような低次元で意味のあるベクトルを、局所表現に対して 分散表現(密なベクトル) といいます。密なベクトルとは、ベクトルの要素に0をあまり含まない = 情報量の多いベクトル という意味です。
これが自然言語処理の分野で用いられるベクトルの正体です。RGBはたくさんの色をたった3次元の情報で表現することができ、似た色は似た情報を持つ意味のあるベクトルになります。単語もこのような「意味を持つ」ベクトルに変換することで、コンピュータが単語を理解できるようになり、機械翻訳や感情分析、文章生成などのさまざまなタスクに応用されるのです。
おわりに
今回は、自然言語処理の分野でよく耳にする「単語のベクトル化」について、身近な色の事例を用いて説明しました。単語の分散表現を獲得する方法には、Word2Vec、RNN、Transformerなどの様々な方法がありますので、気になった方はぜひ調べてみてください。機会があればこちらについても解説してみたいと思います。