【勉強会資料】 大規模言語モデル入門 第8章 文埋め込み

[大規模言語モデル入門](https://amzn.asia/d/16Wzurj ) の輪読会を開催したので、発表に使った資料を一部修正して公開します。

他の章の資料も公開していくので、よろしければご覧ください。
1. [【勉強会資料】 大規模言語モデル入門 第1章 はじめに](https://qiita.com/maekeso/items/e5a979df839ee766b3cc)
2. [【勉強会資料】 大規模言語モデル入門 第2章 Transformer](https://qiita.com/maekeso/items/5fc89e53429a8cb1ac48)
3. [【勉強会資料】 大規模言語モデル入門 第3章 大規模言語モデルの基礎](https://qiita.com/uminchu987/items/335c401eed06012af51d)
4. [【勉強会資料】 大規模言語モデル入門 第4章 大規模言語モデルの進展](https://qiita.com/maekeso/items/fcb3e623a9814fc4d57b)
5. [【勉強会資料】 大規模言語モデル入門 第5章-1 大規模言語モデルのファインチューニング](https://qiita.com/uminchu987/items/cb68991489ed40540f26)
6. [【勉強会資料】 大規模言語モデル入門 第5章-2 大規模言語モデルのファインチューニング](https://qiita.com/maekeso/items/3fed95ef506fefbb0542)
7. [【勉強会資料】 大規模言語モデル入門 第6章 固有表現認識](https://qiita.com/uminchu987/items/78485ea6d6455b08f5f7)
8. [【勉強会資料】 大規模言語モデル入門 第7章 要約生成](https://qiita.com/maekeso/items/e2f78606ca93c607c913)
9. [【勉強会資料】 大規模言語モデル入門 第8章 文埋め込み](https://qiita.com/uminchu987/items/e1e7dadcfa47955c1ad6)
10. [【勉強会資料】 大規模言語モデル入門 第9章 質問応答](https://qiita.com/maekeso/items/2aec33eacbf1b315f3f4)

# 文埋め込みとは？
簡単に言うと、文の意味をベクトルで表現すること。
文の埋め込みでは、複数の単語からなるテキストに対して一つのベクトルを出力する。

**文埋め込みの目的（２つ）**
+ **文の意味的類似度を計算する**
文の埋め込みで得られたベクトル同士の類似度を計算することで、文の意味の類似度を測ることができる。TF-IDFなどと比べて文章の内容を捉えた検索が可能になる。
文章検索や文章クラスタリングが可能になる。（FAQやチャットボット）

+ **転移学習の特徴量として利用する**
文章分類や感情分析のような下流タスクへの転移学習に利用できる汎用的な文のベクトル表現を得ることができる。

# 文埋め込みの性能評価
性能評価には文ペアの意味的な類似度を予測するタスクと、文章分類などの転移学習タスクが一般的に用いられる。

+ **意味的類似度タスク**
あらかじめ人手で類似度のスコアをつけたデータセットを利用
（sts12-16 / STS Benchmark / SICK-R など）
予測した類似度と人手でつけた類似度の相関を測ることで評価する。

+ **転移学習タスク**
SentEvalと呼ばれる、埋め込みの転移学習の性能評価をするツールキットが存在。
テキストの感情分析や質問タイプ分類などの複数のタスクから構成されている。
複数のタスクを処理させて埋め込みで得られたベクトルがどの程度汎用的か評価する。
[GitHub - facebookresearch/SentEval: A python tool for evaluating the quality of sentence embeddings.](https://github.com/facebookresearch/SentEval)

# 文埋め込みモデルの必要性
結論：計算量を削減できるなどの観点から必要

ユーザが入力する質問に対して、FAQに登録されている1万件の質問の中から意味が最も近いものを計算することを考える。
BERTの場合：ユーザーの入力とFAQを一つずつBERTに投入して計算する必要がある。
埋め込みモデルの場合：各ベクトルの類似度を計算するだけでよい。入力が異なっても同じ
最近傍検索ライブラリを用いてインデックス化することで検索をより高速にできる。

**文埋め込みモデルを使用せずに文ベクトルを取得する**
+ **単純な方法①**
単語埋め込みを足し合わせる
word2vecなどの単語埋め込みを取得して足し合わせる方法
意味的類似度タスクや転移学習タスクで高い性能を示すため、最も単純なベースラインとして用いられる。
しかし、この方法の問題点として、文中の単語の順番や文脈を理解することができない。
ー「会社の音楽を再生する」
ー「音楽の会社を再生する」
どちらも「再生する」を使用しているが、この手法では同じベクトルになってしまう。
類]似した意味を持つ文に対して類似度の高いベクトルを与えるという目的を達成できない。

+ **単純な方法②**
BERTの出力する表現をそのまま利用する
次文予測で訓練されたBERTの出力するベクトルを使う方法、トークンのベクトルをそのまま利用する方法、文を構成するすべてのトークンのベクトル平均、各次元の最大値を利用する方法が考えられるが性能は高くない。意味的類似度タスクでは単純方法①を下回る。

word2vecなどの単語埋め込みや、BERTのようなモデルの出力をそのまま用いる方法では、
意味的類似度や転移学習タスクに有用なベクトル表現を得ることは難しい。


# 文埋め込みモデル（SimCSE）
SimCSE(Simple Contrastive learning of Sentence Embeddings)は対照学習と呼ばれる機械学習の手法を使用している。

**対照学習（contrastive learning）**
似ているもの同士を近づけ、異なるものを遠ざけるように学習する
近づけるというのはベクトル同士の類似度を高くすることで、遠ざけるというのはベクトル同士の類似度を小さくすること。
大量のデータの中から似ている事例（正解ペア）と異なる事例（不正解ペア）を選び出して、モデル訓練を行う。

**SimCLR(Simple framework for Contrastive Learning of visual Representations)**
訓練データにある一つの画像に対して2種類の加工を行い学習させることで、入力画像の汎用的な特徴表現を出力出来るようになる

- **とても参考になる記事**
[2020年超盛り上がり！自己教師あり学習の最前線まとめ！]
(https://qiita.com/omiita/items/a7429ec42e4eef4b6a4d)


**正解ペアの作り方**
対象学習ではデータセットの中から正解ペアを作るのが重要。
既存のデータセットの事例に加工して新たな事例を作成して利用することをデータ拡張。
同一の文章から取り出した２文を正解ペアとする方法や、同一の文に対して単語の置換や削除をしたものを正解ペアとする方法が提案されている。

**負例ペアの作り方**
負例の作り方としてバッチ内負例（in-batch negative）が使用される
ミニバッチ内の各事例に対して２通りの変換を実施する。
自分自身と同じベクトル同士を正解とした場合、正解ペアの類似度は類似度行列の対角成分に現れる。それ以外は負例ペアとなる。
行列の対角成分を最大化するようにモデルを訓練すれば良い。

# 教師なしSimCSE(unsupervised SimCSE)
ラベルが付けられていない大量の文章を訓練データとする。
同じ文を2回言語モデルに投入して正解ペアを作成して対照学習を行う
**文Ａ：私は本を読むのが好きです。**
この文Ａを2回、事前学習済みのモデル（ＢＥＲＴなど）を通して入力するが、各回で異なるドロップアウトを適用する。
これにより、若干異なる埋め込みが作成される
+ 埋め込み１：文Ａのバージョン１
+ 埋め込み２：文Aのバージョン２

この埋め込みを正解ペアとして扱う。
同じミニバッチ内の異なる文の埋め込みを作成し、負例ペアとする。

# 教師ありSimCSE（supervised SimCSE）
ラベル付きのデータセットを利用して埋め込みモデルを訓練する。
前提文と仮説文のペアに対して、「含意」「中立」「矛盾」のいずれかのラベルが付与されている。人間が記述した文から作成されているので品質が高く有用であることが知られている。
前提文に対して、「含意」のラベルがついた文を正解ペアとする。
「矛盾」のラベルがついたペアをハード負例のペアとして対照学習する。

# 最近傍探索ライブラリFaiss
Metaが作ったベクトルの最近傍探索やクラスタリングを行うためのライブラリ。
C++で実装されていて大規模なベクトル集合に対しても高速に動作する。
最近傍探索を近似的に解く近似最近傍探索アルゴリズム（appriximate nearest neighbor search）によるベクトルのインデックス化および検索もある

・より深くまとまっている記事
[近似最近傍探索の最前線](https://speakerdeck.com/matsui_528/jin-si-zui-jin-bang-tan-suo-falsezui-qian-xian)


# 参考文献
- [大規模言語モデル入門](https://amzn.asia/d/3xTMT8o)