曲突徙薪(きょくとつししん)第8号
ベクトル化
ChatGPTをはじめとするLLMの多くは、英語はもちろんのこと、日本語や中国語など、あらゆる言語を扱うことができます。言語を機械学習の対象とするためには、言語の情報をコンピューターが扱えるような形で電子化する必要があります。これは単に紙の文書をWord形式のファイル、あるいはテキストデータに置き換える、というだけの話ではありません。たとえば次のような英語の文章があったとします。
I have a pen.
たとえこれが電子データに置き換えられていたとしても、コンピューターにとってはI、have、a、penというそれぞれの単語データを、そのままの形で計算処理に持ち込むことはできません。そこでコンピューターは計算処理ができるように、単語のデータを便宜的に数値データに置き換えます。
I → 1 have → 2 a → 3 pen → 4 …
このようにしてすべての単語を、それと1対1に対応する数値に置き換えていくと、単語の集まりからなる文書のデータはすべて、膨大な数値の並びに置き換えることができます。このように書くと、果てしない数の単語を用意して数値を割り振る必要があるように思えるのですが、実は現代のコンピューターの計算能力からすると単語の種類は「果てしない」というほどのものではありません。英語の包括的な辞典として知られるオックスフォード現代英英辞典(第10版、旺文社、2020年3月)でさえ、収録している見出し語、派生語、成句等は228,000語ほどに過ぎません。たとえばこの辞典に出てくる単語にあらかじめコードを振っておけば、たいがいの文書データは数値の並びに変換できることでしょう。また最近のLLMの開発に際しては、単語をひとくくりにするのではなく、接頭辞や接尾辞で単語を分けて数値化したり、逆に複数の単語を一つの単語とみなしたり、数値化に際してさまざまな工夫がなされています。なお、単語データ等が数値に置き換えられた、コンピューターにとって文章を構成する最小単位を「トークン」などといいます。
“mission impossible” を数値化(トークン化)する例
まとめて数値化: mission_impossible → 1
単語ごとに数値化: mission → 1 impossible → 2
接頭辞を分けて数値化: mission → 1 im- → 2 possible → 3
ここまでの例では、単語を1対1に対応する1種類の数値に置き換えました。これを図に置き換えると、すべての単語を一本の直線上に並べるのと同じことです。このとき、それぞれの単語の意味をもとに、意味の近い単語同士に近い数値を振りたい、言い換えると単語と単語の「距離」によって単語の意味の違いを表現したいとすると、どのような方法が考えられるでしょうか。
結論から言うと、単語同士の関係は非常に複雑なため、一本の直線上の距離だけで表現するには無理があります。最初の例ではI have a penという文を構成する単語を1から4までの数値に置き換えましたが、Iが1でhaveが2、penが4であらわされるからといって、たとえばIとhaveは距離が短いから意味が似ているが、Iとpenは距離が遠いから意味が似ていない、などという関係は成り立ちそうにもありません。つまり、言語をコンピューターで取り扱うにあたって、単語を他の単語との関係まで含めて数値化するためには、単純に単語を一直線上の数値に置き換えるだけでは不十分で、より多くの情報を表現できる「空間」の上で数値に置き換える必要があります。
単語を1つの数値ではなく、複数の数値の組み合わせに置き換える処理を「ベクトル化」といいます。先ほどの図の下段では、単語を1つの数値ではなく、xとyの2つの数値の組み合わせ(二次元ベクトル)に置き換えた例を示しています。この場合はたとえば、I=(1,1)、have=(2,4)、a=(3,2)、pen=(4,3)のように各単語が数値に置き換えられています。
言語データの機械学習では、より高次元でのベクトル化を行うのが通常です。もっともオーソドックスな方法がOne-Hot Encoding(ワンホットエンコーディング)とよばれる手法で、これは学習に使用する言語データに登場するすべての単語の数(n)に応じて、n次元のベクトルを用意して単語を表現する方法です。たとえばI have a penを学習用データとする場合は、n=4となり、4次元のベクトルを用いて各単語は次のように置き換えられます。
I = (1,0,0,0)
have = (0,1,0,0)
a = (0,0,1,0)
pen = (0,0,0,1)
単純な数値化のケースでは、I=1、have=2などとなっていましたが、One-Hot encodingでは、その数値に対応する要素を1、それ以外の要素を0とするベクトルに置き換えているのがわかります。
LLMのように大規模な学習用データを用いる場合も、最初の段階でのベクトル化処理は基本的に同様です。したがって、たとえば学習用データに20万種類の単語(トークン)が含まれる場合、各トークンはおそらく次のようなベクトルで表現されることでしょう。
(0,0,0,……,0,1,0,…………,0,0,0)
要素が1となるのは1個だけで、残る199,999個はすべてゼロ、というベクトルになります。このように、ゼロばかりが大半を占めるベクトルのことを疎行列などということがあります。言語データの機械学習で用いる学習データの多くは、巨大な疎行列から成り立っています。
ディスカッション
コメント一覧
まだ、コメントがありません