密ベクトル・疎ベクトルについてざっくり解説
こんにちは、システムゼウスの鈴木です。
自然言語処理において、非構造化データをコンピューターに理解させるための方法としてベクトル表現が利用されています。本記事では、ベクトル表現の方法として疎ベクトルと密ベクトルそれぞれの特徴と用途について簡単に解説します。生成AIがどのように言葉を理解しているのか、概要を把握する助けになれば幸いです。
埋め込み(Embeddings)
埋め込みは、文書や画像などの入力をコンピュータが処理するために考案された、非構造化データを数値形式で表現する方法のことです。
最大の特徴は、元データの意味的及び構文的情報を維持したまま数値表現することができるという点です。具体例でいうと、「犬」と「狼」の埋め込みベクトルは類似していますが、「犬」と「車」の埋め込みベクトルは類似していません。この特徴により、埋め込みを行ったデータ同士の意味的な関連性を、数値によって理解することが可能になります。
また、同一の方法によって埋め込まれたデータは元の形式に関係なく比較が可能になるため、例えば「赤い車」という文章で車の画像を検索するということが可能になります。
埋め込みの結果は数値の配列として表現されるため、これをベクトルとみなすことができます。
元データの意味的情報を理解してベクトル化を行う必要があるため、データ埋め込み専用のAIモデルを利用して埋め込みを行います。埋め込みを行うモデルとして、OpenAIのtext-embeddingや、AmazonのTitan Text Embeddings、CohereのEmbedなどがあります。[1]
構造化データと非構造化データ
構造化データとは、あらかじめ決められたルールに基づいて整理されたデータであり、データ分析ツール、機械学習及び人間のユーザによって簡単に解読することができます。構造化データの代表例はリレーショナルデータベースです。
一方、メール・テキストメッセージ・PowerPointファイル、画像、音声などを非構造化データといい、これらには事前に定義されたデータモデルがないため、従来のデータツールでは保存・処理・分析をすることができません。しかしながら、企業が生成するデータの90%は非構造化データで占められているため、これらを人間の言語からコンピュータ用語に変換して処理・分析を行うことが求められていました。
埋め込みは、このような非構造化データを機械学習に活用するために考案されました。[2]
疎密ベクトル
データを数値配列(ベクトル)で表現するにあたって、密・疎の2種類のベクトルに分けることができます。各ベクトルの特徴・用途について紹介します。
疎密ベクトルの数値表現イメージ
疎ベクトルはほとんどの次元がゼロであるのに対し、密ベクトルはほとんどの次元が非ゼロです
引用元
密ベクトル (dense vector)
特徴
ほとんどの次元が非ゼロの値を持つ高次元ベクトル[3]について、その特徴からこれを密ベクトルといいます。機械学習や自然言語処理において、データの意味や関係性などの特徴を数値として表現するために広く使用されます。密ベクトルは様々な方法で生成されますが、埋め込みもその方法の一つです。モデルや用途にもよりますが、生成されるベクトルは一般的に数百~数千次元程度です。
代表的な埋め込みモデルと、生成する密ベクトルの次元数がこちらです。
モデル | 次元数 |
---|---|
text-embedding-3-large | 3072 |
Titan Embeddings G1 - Text | 1536 |
Embed English | 1024 |
利用方法
密ベクトルは元データの意味的情報を保持した"数値データ"のため、ベクトル同士を計算によって比較することができます。[4]ここで、2つの密ベクトルの距離は、そのベクトルが示すデータの意味的類似性と等しくなります。つまり、似ているデータからは似ているベクトルが生成され、逆も同様であるということです。
この特徴を生かし、密ベクトル同士の距離を計算することで以下のような利用ができます。
- 類似性検索(セマンティック検索)
- 画像検索
- オーディオ検索
これらはいずれも、検索の意味を理解し、最も関連度の高いと判定された結果を回答として出力します。例えば類似性検索では、「頭痛 吐き気」と検索すると、検索内容の意味を理解し、それらの症状に関連する可能性のある病名、治療法、市販薬などを関連する検索結果として表示することができます。
まとめ
- 密ベクトルはほとんどの次元が非ゼロの値を持つ高次元ベクトルで、文書や画像の意味や特徴を表現するのに用いられるベクトル
- ベクトル同士の類似性は、それが表現するデータの意味的な類似性を反映するため、意味的に類似しているデータを検索する際に利用されている
疎ベクトル (sparse vector)
特徴
ベクトルの要素の大部分がゼロ値である高次元ベクトルを疎ベクトルといいます。自然言語処理の分野では、文書を単語の出現頻度に基づいてベクトル表現する際にしばしば疎ベクトルが生成されます。
このベクトルの特徴は以下の通りです。
-
非常に高い次元数
大量の文書を疎ベクトルにするときには、文書に出現する単語の総数に相当する次元数が必要になります。例えば一般的な英語の大規模文書集合では、登場する単語数が数万から数十万に達することも珍しくありません。しかし、個々の文書に登場する単語は、通常は全単語の一部に過ぎません。そのため、ベクトルの大半の要素はほとんどがゼロとなり、非ゼロの値を持つ要素はまばらにしか存在しません。この特性から疎ベクトルと呼ばれています。 -
効率的な計算
ベクトルは、ゼロ要素を省略して保存や計算をすることができます。例えば、10万次元のベクトルであっても、非ゼロの値を持つ要素が100個程度であれば、それらの位置と値のペアのみを記録するのみで大丈夫です。疎ベクトルはゼロ値を持つ次元がメモリの使用量や計算時間を大幅に削減することができます。
# 配列内のほとんどの値が0なので,,,
sparse_vector = [0, 2, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
# 0を排除して管理することができます
# (ここでは "n":"sparse_vector[n]" のJSONとしました)
sparse_vector = {"2": "2", "5": "3", "10": "1"}
文字一致検索との比較
文字一致検索と比較してみましょう。
a-kまでのアルファベットで構成された文章が以下のようにあったとします。また、各文字の登場回数を右に併記しています。
No | 文章 | a | b | c | d | e | f | g | h | i | j | k |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | f k f e c h f g g e h k c c c | 0 | 0 | 4 | 0 | 2 | 3 | 2 | 2 | 0 | 0 | 2 |
2 | a a f c a c f c k c a k a k f | 5 | 0 | 4 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 3 |
3 | c e i e j b h b b b e i h a c | 1 | 4 | 2 | 0 | 3 | 0 | 0 | 2 | 2 | 1 | 0 |
4 | a g c d g i c a g c d i k c k | 2 | 0 | 4 | 2 | 0 | 0 | 3 | 0 | 2 | 0 | 2 |
5 | b c a c b c a c a d c k k c d | 3 | 2 | 6 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
この時に、検索クエリとして"a"が入力されたとすると、どの文章が最適な検索結果でしょうか?この場合は、検索クエリが単純なので文書中にaがより多く出てくる、No.2を回答とするのが適切なように感じます。
ところが、検索クエリが"a"と"b"になった場合にはどうでしょうか?aが最も多く登場するのはNo.2ですが、bは登場しません。この場合でも、No.2を回答とするのが正解でしょうか?おそらく、両方の検索クエリが登場するNo.3,No.5のどちらかが最適なような気がします。
ではどちらがより適切な検索結果でしょうか?a,bの登場回数はどちらも5回ですが...
このように文字によるキーワード検索では、複数のクエリが入力された際に最適な結果を素早く回答することが難しいです。疎ベクトルを利用することで、最適な結果の選択を数値計算に基づいて高速に実行することができるようになります。
利用方法
単語の出現頻度を元に作成されたベクトルで、キーワード検索や文書の分類など多くの自然言語処理に活用されており、特に大規模なデータセットを扱うときに効率性が発揮されます。
ただし、単語の意味的な類似性を捉えるのが難しいという欠点があります。先述のように、近年では意味的類似性を捉えることのできる密ベクトル表現も広く使用されており、利用目的に応じて適切に選択することが大切です。
まとめ
- 疎ベクトルは非常に高次元なベクトルだが、非ゼロ値を持つ要素はまばらにしか存在しない
- ゼロ値の計算を無視することができるというベクトルのメリットと相性がよく、大規模データの処理に適している
おわりに
機械学習・自然言語処理において重要な要素である、密ベクトルと疎ベクトルについて紹介しました。
疎ベクトルのより詳しい説明や密ベクトルの類似性の比較方法については別の記事にて紹介しているので、気になった方はそちらもご確認ください。
また、ご意見・ご指摘等ございましたらコメントしていただけると幸いです。
-
機械学習における埋め込みについて詳しく知りたい方は、Pinecone公式ブログや、cohere公式ブログをご覧ください ↩︎
-
構造化データと非構造化データについては、IBM公式のこちらのトピックもご覧ください ↩︎
-
簡単に解説すると、ベクトルを構成する値の数を次元と言います。例えば平面上でベクトルを考えたとき、
は、横軸( 軸)と縦軸( 軸)の2つの値で構成されているため2次元ベクトルです。高次元とは、一般的に空間の3次元、または時間を含めた4次元よりも高い次元であることを指します。また、特に機械学習における高次元とは数百から数千の次元を扱うことがあります。 ↩︎ -
計算によるベクトル同士の比較の方法については別の記事で紹介する予定なので、興味のある方はそちらもご覧ください。 ↩︎
Discussion