第8章 文埋め込み
本章では,文埋め込みのタスクにおける,概要や学習方法について紹介していた。
8.1 文埋め込みとは
前章までは「単語」をベクトル化して後段のタスクに利用する方法について紹介していたが,本章で紹介するのは複数の単語から構成される「文」をベクトル化するための手法である。
文埋め込みの目的と必要性
文埋め込みあるいは文表現(Sentence Representation)の目的は,文をベクトル化することにより,文と文との類似度(距離)を測ることである。このタスクは,検索などで用いられるタスクである。
主な目的は,以下の2つである。
- 文ペアの意味的類似度を計算する。応用例としては,FAQ検索やコミュニティ型質問応答が挙げられる。
- 転移学習の特徴量として利用する。
文章同士の距離を測る方法として,前章までではBERTを用いた方法が紹介されていた。BERTでは,つなげた2つの文章を入力として,それらの文章間に関連があるかどうかを学習する。
ただこの手法では,たとえばFAQとして登録されている1万件の過去事例の中からユーザの質問と類似している事例を検索する場合,1万回のBERTの推論を行なう必要があり,計算量が多くなるという問題がある。
一方で文埋め込みによって文をベクトル化しておけば,単純にベクトルの類似度を計算すればよいだけなので,計算量が減り,高速にFAQ検索を実行できるようになる。
文埋め込みの性能評価
意味的類似度タスクでは,文のペアに対して類似度のスコアがアノテーションされたデータセットを使用する(STS12-16やSTS Benchmark,SICK-Rといったデータセットが存在する)。
転移学習タスクでは,SentEvalと呼ばれる,文埋め込みの転移学習の性能評価用ツールキットが用いられる。
文埋め込みを使わずに文ベクトルを得る手段とその問題点
文ベクトルを得る最も単純な方法として,文に含まれる単語の単語ベクトルを足し合わせる(または平均を取る)という方法が考えられる。ただしこの方法では,単語の順序を考慮できない,といった問題点がある。
また,BERTなどのモデルが出力する表現をそのまま用いることも考えられるが,この方法はあまり性能が良くないことが知られている。
8.2 文埋め込みモデルSimCSE
文埋め込みモデルの学習法として,SimCSE(Simple Contrastive learning of Sentence Embeddings)が挙げられる。SimCSEは,対照学習と呼ばれる手法を用いて文埋め込みモデルを学習する。
対照学習
対照学習 (Contrastive Learning)は,ラベル付けがなされていない大量のデータの中から,類似した事例のペア(正例ペア)と異なる事例のペア(負例ペア)を取出して比較する学習方法である。
正例ペアはベクトルの類似度が近くなるように,負例ペアは遠くなるように学習を行なう。
正例ペアの作り方として,既存のデータセットに加工を施して新たなデータセットを作るデータ拡張(Data Augmentation)が挙げられる。
負例ペアの作り方とししては,バッチ内負例(In-batch Negative)が用いられる。バッチ内負例とは,訓練セットから作られるミニバッチ内の各事例について,当該事例とそれ以外の事例を組合わせて負例ペアとして利用する方法である。
8.3 文埋め込みモデルの実装
本節では,Transformerを利用してSimCSEを実装する方法が紹介されていた。
8.4 最近傍探索ライブラリFaissを使った検索
Faissは,Meta Researchによって開発された,ベクトルの最近傍探索やクラスタリングを行なうためのライブラリである。インデックス化を用いることで,ベクトルを高速に検索することが出来る。
github.com
まとめと感想
感想 : 文埋め込みの意義について学べた
文と文の類似度を比べるというタスクは,検索などでよく出てくるが,当初は「単語ベクトルの足し合わせで文ベクトルにすればよいのでは」と考えていた。
一方で,このやり方では語順が考慮されず,意味が異なる文章の類似度が大きくなるおそれがあることが理解できた。