先月、KaggleのLLMコンペ(Detect AI Generated Text)で新しい埋め込み(embedding)手法を学びました。(私にとっては新しい発見ですが、技術自体はそれほど新しものではないです)embeddingに対しての理解度が深めたと思いますので、共有したいと思います。
まず埋め込み(embedding)とは何かというと、自然言語処理のタスクでは、コンピュータが人間の言語を直接理解することとはできません。そのため、言語を数字リスト(ベクトル)に変換し、それをコンピュータに伝える必要があります。この変換プロセスは「埋め込み」と呼ばれます。
そこで最も一般的な埋め込み手法は、「Word2Vec」に基づいたembeddingモデルのトレーニングです。
Word2Vecには、CBOW(Continuous Bag of Words)とSkip-Gramの2つのアーキテクチャが存在します。CBOWは周囲の単語を基にして目的の単語を予測する手法で、Skip-Gramはその逆で、ある単語から周囲の単語を予測します。
どちらでもモデルが単語間の意味関係を学習し(意味解析)、意味的に類似した単語がベクトル空間内で近い位置に配置されるようにすることができます、一般的には両方とも試して、精度の高い方を採用します。(ちなみに、近い意味を持つ単語をベクトル空間内で近接させるため、embedding後コサイン類似度などを計算することで、RAGのようなベクトル検索を実現することができます。)
今回のコンペ学んだもう一つの埋め込み手法は、TF-IDFです。TF-IDFは数年前からあって、自然言語処理において単語の重要性を定量化するための指標です。この指標は各単語ごとに計算し、得られた数値のリストをベクトルとして表現します。
TF-IDFは、TF(Term Frequency)とIDF(Inverse Document Frequency)の二つの要素の積で算出されます。
TFは「1つの文書に対して、1つの単語がどれだけの割合で出現したか」を定量化した指標です。単語が文書中に現れる回数が多ければ多いほど、その単語は重要だと考えられます。
例えば、「私のiPhone」という文書を「私」「の」「iPhone」という単語に分けた場合、「iPhone」のTFは1/3となります。
一方、IDFは「ある単語が出現した文書が全体の文書集合中でどれだけの割合を占めているか」を定量化した指標です。一般的な単語(例えば「私」「の」「だから」など)は多くの文書で出現するため、重要度が低いとみなされます。
例えば、「私のスマホ」「彼のスマホ」「私のスマホはiPhone」という3つの文書において、「iPhone」という単語が現れる文書は1つだけなので、IDFはlog3≒1.09と計算されます。
最終的に、TFとIDFを乗算することで、「iPhone」のTF-IDF値を1/3×1.0986≒0.36として算出します。同様に、「私」と「の」のTF-IDF値も計算し、これらの値を組み合わせて数字リストにすることで、「私のiPhone」という文書のベクトルを作成することができます。
興味ある方:
Word2vec:
tf-idf: