More Related Content
More from Deep Learning JP (20)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)
- 2. 書誌情報
SimCSE: Simple Contrastive Learning of Sentence Embeddings
https://arxiv.org/abs/2104.08821
タイトル:
著者: Tianyu Gao†* , Xingcheng Yao‡*, Danqi Chen †
† プリンストン大学 コンピュータサイエンス学科
‡ 清華大学 学際情報科学研究所
• BERTで文章の意味合いをより正しく埋め込み表現する、対照学習手法
• 教師なし、教師ありの2つの手法で両方ともSOTA
概要:
2
選定理由: 手法がシンプルな為、応用範囲の期待による
(Accepted to EMNLP 2021)
公式実装: https://github.com/princeton-nlp/SimCSE
- 4. 1. 導入
4
• 普遍的な文の意味合いのEmbeddingベクトルを学習する事は自然言語処理の基本的な問題
(Kiros et al., 2015; Hill et al., 2016; Conneau et al., 2017; Logeswaran and Lee, 2018; Cer et al., 2018; Reimers
and Gurevych, 2019, inter alia)
• STS(意味合い観点の類似文の評価手法)で評価し、SOTA(教師なしは+4.2%、教師ありは+2.2%)
• 理由は主に埋め込み空間の異方性を等方的に調整できた事による
• 事前学習済BERTやRoBERTaを用い、次のような、シンプルな対照学習手法を提案
• 教師なし:BERTに同じ文章を2回投入し、Dropoutによる2つの類似ベクトルを正例ペアとする
• 教師あり:NLI自然言語推論データセット使用し、”含意”と”矛盾”データを活用する
背景
手法
結果
- 10. 3. 手法 教師なし
教師なし手法の学習手法
11
1
2
1. 左図の各文章をBERTに2回入力し、Dropoutの影響で微
妙に異なる2つのベクトルを正例とする。すなわち下式のxiと
xi+の2つの正例ベクトルのペアがミニバッチ分が出来上がる
2. ミニバッチ内の他の文章のベクトルを負例とする
3. NT-Xent lossで正例を1に近づけ、負例は0に近づける
出典:https://arxiv.org/abs/2104.08821
正例
負例
負例
負例
正例
- 11. 3. 手法 損失関数 (先行研究との比較)
当研究の損失関数(教師なし)
12
参考:温度付きsoftmax
先行研究① SimCLR 損失関数
iとjは元同一画像
iと(i以外のk)は違う画像
当図はN=2
ミニバッチの考え方が異なる
N×2が横に並んでいるイメージ
正例ペア
softmaxの分母
正例・負例の全組合せ
Dropoutマスク
softmax部が1になった時
損失 -log(・)は0になる
N:ミニバッチ組数
:温度パラメータ
sim:コサイン類似度
h:文章ベクトル
温度
- 12. 3. 手法 損失関数の、cos類似度とsoftmax値の関係 温度0.05時
14
出典: 山本作成
正例ペア
負例ペア①
負例ペア②
正例ペア
負例ペア①
負例ペア②
学習の進行時間軸のイメージ
=0.05
softmaxの温度とSTSスコアの関係
1. 温度 を慎重に調整した結果、 =0.05が単なるdot積(下表N/A)
より優れた結果となった為、この設定を用いている
2. この時、cos類似度と、softmax値の関係は左図のようになる
- 13. 3. 手法 損失関数の実装
15
### 損失関数関連のみ行単位で抜粋
### ハードネガティブは省略
class Similarity(nn.Module):
def forward(self, x, y):
return self.cos(x, y) / self.temp
def cl_init(cls, config):
cls.sim = Similarity(temp=cls.model_args.temp)
def cl_forward(cls,~略~)
cos_sim = cls.sim(z1.unsqueeze(1), z2.unsqueeze(0))
labels = torch.arange(cos_sim.size(0)).long().to(cls.device)
loss_fct = nn.CrossEntropyLoss()
loss = loss_fct(cos_sim, labels)
出典: https://github.com/princeton-nlp/SimCSE
温度付きcos類似度
BERTモデルclassのforward部
cos_sim.shape=[BATCH_SIZE, BATCH_SIZE]
pytorchのCrossEntropyLossを
loss関数として使うだけ
1. pytorchのCrossEntropyLoss関数は、softmaxが内包さ
れている
2. その関数に温度付きcos類似度と、を、投入するだけで、本論
分の損失関数が実現
z1,z2がDropoutで少々異なる
ミニバッチデータ群
出典:https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
PyTorch公式リファレンス
引数のlabels部はインデックス箇所が1
のone-hotベクトルが生成される
labels=[0,1,2,...BATCH_SIZE-1]
正例ぺアのsoftmaxを1に他を0に
近づけるようなloss関数となる
labels
温度付きcos_sim
- 14. 3. 手法 教師あり
教師あり手法の学習手法
16
1. NLI自然言語推論データセットを用いる
2. entailment (含意)を正例とする
3. neutral (中立)は使わない
4. バッチ内の他文章は負例
5. さらに、contradiction (矛盾)をハードネガ
ティブ負例として使う事でさらに性能が向上
6. 上記を反映してデータセットを再定義
ハードネガティブ負例をxi-として追加
7. 損失関数を下記とする
contradictionを使った
ハードネガティブ項が追加
contradiction文章の
ハードネガティブ負例追加
出典:https://arxiv.org/abs/2104.08821
- 15. 3. 手法 モデル構造
17
出典: https://arxiv.org/pdf/1810.04805.pdf
MLP
教師なしのテスト時のみ
MLP層は使わず
[CLS]出力を直接使用
文章意味合い
ベクトル
class MLPLayer(nn.Module):
def __init__(self, config):
super().__init__()
self.dense = nn.Linear(config.hidden_size, config.hidden_size)
self.activation = nn.Tanh()
def forward(self, features, **kwargs):
x = self.dense(features)
x = self.activation(x)
return x
1層MLP
出典: https://github.com/princeton-nlp/SimCSE
- 24. 5. まとめ
結論
• シンプルな対照学習フレームワークを提案
• 意味の類似性タスク(STS)でSOTA
• 教師なしは、Dropoutノイズで正例ペアを生成、バッチ内他を負例
• 教師ありは、NLIデータセットを活用。バッチ内他を負例。加えて、NLI”矛盾”をハードネガティブにし精度向上
• ベクトルのアラインメントと、形状ユニフォームの2軸の観点から理由を説明
26
感想
• 非常にシンプルな手法なので、考え方の応用範囲が広そう
• BERTプレトレーニング → SimCSE的な教師なし意味合い学習 → ファインチューニングで、よりタスクの精度が上がる?
• ビジネス応用の際、自然言語処理以外でも使えそう。かつ、
教師なしの、量多め、深さ浅めのデータで表現学習空間を整え → 少量のより深いデータでファインチューニングする事で
ビジネスに関わる様々な事の表現学習に使えないか興味あり