Reflection 〜とあるIT研究者の内省録〜

AIを始めとするIT技術は、人間の思考を投影し具現化する。台頭するAIの時代に、どう生きるか?とあるIT研究者が綴る、リアルな生存戦略レポート。

自然言語処理概論(5)高次元データを扱う難しさ

どうも、Makです。気がつけば3連休も最終日、夜11時。休みの日の時間の流れはなぜこうも早いのでしょうか・・・!

さて、先日は以下の記事で、分散表現とは何か?について、説明を試みました。

mak-japan.hatenablog.com

 

この記事では、近年、自然言語処理や画像処理の研究に共通する重要なテーマとして、「高次元のデータをいかに効率的に表現するか」という問題があり、さらには人間の脳内でも同じような情報処理が行われている可能性について推察してみました。

今日は「高次元データ」について、説明してみます。

高次元のデータを扱う難しさ

f:id:mtstorm2:20190212003823p:plain

私たちの世界でもっとも馴染みが深いのは、2次元または3次元の空間ではないでしょうか?例えば3次元の空間なら(x, y, z)のようなベクトルで、空間内の特定の場所を示すことができますね。

では、人間の扱う「言葉」をある空間上で表してみることを考えてみましょう。
例えば、「いちご、みかん、りんご」の3種類をベクトルで表現する際には、
いちご = (1, 0, 0)
みかん = (0, 1, 0)
りんご = (0, 0, 1)
というように表現することができます。

ここで、「どうして一つだけ1で他が0のベクトルだけを使うの?」と感じられるかもしれません。例えば、いちご=1, みかん=2, りんご=3としたら1次元で済みそうな気がします。しかし、このようにベクトルを設計すると、いちごとりんごを足して2で割ったらみかんになった、といったナンセンスな解釈となってしまいます。いちご、みかん、りんごの間に本来順序関係はなく、独立した用語として扱いたいので、設計段階ではこのように一つだけ1であとは全て0である冗長なベクトル(One Hot Vectorと呼ばれます)で表現してやる必要が出てくるのです。

しかし、この方式では、扱う語彙の数が増えれば増えるほど、次元が増えていきます。
日本語では辞書に記載されている用語だけで数十万語存在しますから、ざっくり数十万~100万次元くらいの高次元空間が必要となります。 

高次元のデータを扱う難しさ

さて、このような高次元のデータを扱うに当たって大きな問題が幾つか考えられますが、代表的なものは「次元の呪い」というものです。

次元の呪いとは、データの次元数が大きくなり過ぎると、そのデータで表現できる組み合わせが飛躍的に多くなってしまい、その結果、手元にある有限なサンプルデータでは十分な学習結果が得られなくなることを指しています。

さらに、自然言語処理の場合、実際には「類義語」や「対義語」に代表されるように、語と語の間にはなんらかの関連性があるはずです。しかし全ての用語を独立して扱っているOne Hot Vectorのままでは、こうした語と語の関連性を捉えることができません。

さらには、単純に数百万次元のベクトルを使って計算する場合、多大なメモリを消費する問題もあります。これは直感的にも分かりやすいかと思います。100万次元のデータを計算するのと、数百次元のデータを計算するのとでは、その違いは明らかです。

まとめ

今日は少し専門に寄った話になりましたが、高次元データとは何か、なぜ高次元データを扱うのが厄介なのか?について考えてみました。