BERTを用いた教師なし文表現

こんにちは。レトリバの飯田(@meshidenn)です。TSUNADE事業部 研究チームのリーダーをしており、マネジメントや論文調査、受託のPOCを行なっています。今回は、教師なしの文表現作成手法SimCSEを紹介します。

背景・概要

自然言語処理は、昨今様々な領域へ応用することが期待されていますが、特に企業での応用においては、ラベル設計が出来ず、教師あり手法が使えない場面に遭遇することが多々あります。そんな場面で、きっと助けになってくれるのが教師なし手法です。特に、文の類似度については、様々なタスクやデータ作成に際して便利に使える場合があります。

近年、BERTなどの大規模事前学習済み言語モデルが出てきていましたが、教師なしの文類似度タスクの場合、BERTを使って単語をベクトルに変換し、そのベクトルの平均を文のベクトルとするよりも、GloVeなどの単語ベクトルを使用して単語をベクトルに変換した方が良いという状態でした。

しかし、今回ご紹介するSimCSEを使うことで、従来の教師ありによる文ベクトルと同等の性能を発揮することが可能です。また、この論文の優れている点として、BERTを使用した場合に精度が悪化する原因まで明らかにした点があります。それでは、手法及び論文中で指摘されている原因についてみていきたいと思います。なお、以下の図は、コメントがない限り、SimCSE: Simple Contrastive Learning of Sentence Embeddingsより引用しています。

手法

本手法は極めてシンプルです。全く同じ文を2回、BERTでベクトルにし、そのペアを正解とみなします。正解のペアは全く同じ文ですが、dropoutを活用することで、若干異なった文表現となっています。また、BERTに入力する際、通常複数の文を同時にベクトルにしますが、その際、他の文を不正解とみなします。そして、それぞれのペアに対してcos類似度を取り、softmaxを通して対数尤度を損失として学習します。これだけです。概要図は以下の通りです。

f:id:meshitahiro:20210921163151p:plain
SimCSE概要

式にすると以下の通りです。これは対照学習(Contrastive Learning)と言われています。


\begin{gather}
l_i = -\log{\frac{\exp(sim(\mathbf{h}_i^{z}, \mathbf{h}_i^{\acute{z}})/\tau)}{\sum_{j=1}^{N}\exp(sim(\mathbf{h}_i^{z}, \mathbf{h}_j^{\acute{z}})/\tau)}}
\end{gather}

なお、 z,  \acute{z}は、dropout maskを表しています(要は、dropoutする場所が違うということを表しています)。また、 \mathbf{h} _ i ^ zはdropout mask  zの場合にi番目の文をBERTを通して変換したベクトルを表しています。 \tau は温度パラメータと呼ばれ、softmaxの調整を行うハイパーパラメータです。文のベクトルにはCLSが使用されています。simにはcos-simを使用しています。

さて、文類似度の性能ですが、結果は以下の表の通りです。まず、先ほど言及した通り、BERTで単語をベクトルにする(BERTbase (first-last avg.))とGloVeを使った場合(GloVe embeddings (avg.))に負けています。しかし、本手法(表上段のSimCSE-BERTbaseまたはSimCSE-RoBERTabase)の場合、大幅に改善しています。さらに、 SimCSEは、自然言語推論(NLI)タスクを教師として、文表現を学習するSBERT・SRoBERTaと同等の精度になっています。

加えて、SimCSEにNLIタスクを教師としてさらに学習した場合(表下段のSimCSE-BERTbaseまたはSimCSE-RoBERTabase)、より性能が向上しています。

f:id:meshitahiro:20210921163444p:plain
文類似度タスクの結果

要因

それでは、なぜこんなにも簡単な方法で精度が改善したのでしょうか。(Ethayarajh, 2019)などによると、BERTによってencodeされるベクトルは、超楕円となっており、ある方向に集中しています。(Wang and Isola, 2020)によると、それが対照学習を行うことによって是正され、その度合いは、以下の l _ {align} l _ {uniform}2つの指標で測ることができます。


\begin{gather}
l_{align} = \mathbf{E}_{(x, x^+) \sim p_{data}} \|f(x) - f(x^+)\|^2 \\
l_{uniform} = \log \mathbf{E}_{x, y \sim p_{data}} \exp{(-2\|f(x) - f(y)\|^2)}
\end{gather}

なお、関数 f xをベクトル表現に変換する関数です。

 l _ {align}は、同一とみなしたい2つの表現がどの程度同一であるかを表しており、値が小さいほど同一です。 l _ {uniform}は、データ全体がどの程度一様であるかを表しており、超球面上で一様であるほど、小さい値となります。(Wang and Isola, 2020)では、対照学習とこの2つの指標の関係も述べられており、興味があるかたは参照してみてください。

さて、上記表中の手法について、この l _ {align} l _ {uniform}をプロットすると以下のようになります。

f:id:meshitahiro:20210922183929p:plain
各手法における l _ {align} l _ {uniform}の値(()内はSTSタスクの結果)

図からわかるように、BERTの単語ベクトルによる平均は、 l _ {align}は良い値ですが、 l _ {uniform}が常に高い値を取っています。一方、SimCSEは、 l _ {align}がやや悪化するものの、 l _ {uniform}が大幅に改善しており、結果として、文類似度タスクで良い性能を発揮できています。

実験

せっかくなので、日本語でも試してみたいということで、以下、NLIタスクとクラスタリングタスクで実験をしました。なお、SimCSEのコードは、sentence-transformersを使用しており、文表現は各単語の最終層のベクトルの平均を使用します。比較として、各単語をBERTの最終層のベクトルで平均をとった場合を使用します。BERTのモデルとしては、どちらも cl-tohoku/bert-base-japaneseを使用しています。

NLIタスクによる実験

上記の通り、NLIタスクは文類似度タスクと関連があると言われており、文類似度タスクのためのチューニングデータとして使用されています。残念ながら、日本語には文類似度評価タスクがないため、NLIタスクを用いて文類似度を評価します。具体的には、文類似度の閾値を適当な値で区切り、その値以上をentailmentとします*1。SimCSEトレーニングはlivedoorコーパスを用いて実施しました。*2

結果は以下の通りです。SimCSEを使うと改善が見られました。*3

文表現 F1 threshold
SimCSE 0.598 0.422
BERT 0.536 0.0

クラスタリングによる実験

SimCSEをlivedoorコーパスクラスタリングしてみました。testデータとして、全体から2割ほど除いたデータを対象としました。1文書をベクトルに変換しており、すべてL2ノルムで正規化しています。クラスタリングには、scikit-learnに付属している、k-means, spectral clustering, dbscanを使用しています。k-meansとspectral clusteringの距離関数はl2ノルムです。dbscanの距離関数はcos-simです。評価指標には、Clustering Accuracy(ACC)Adjusted Rand IndexV-measureを使用しました。

結果は以下の通りです。 何と、クラスタリングで使用すると、BERTによるベクトルの平均の方が良い値になっていました。SimCSEは、文表現としては良いようですが、クラスタリングには異なる要素があるようです。ただし、SimCSEはdbscanでは大幅に改善しており、局所的な類似性自体は改善しているようです。

文表現 クラスタリング方法 ACC ACI V-measure
SimCSE kmeans 0.5 0.26 0.36
SimCSE spectral clustering 0.41 0.19 0.28
SimCSE dbscan 0.27 0.015 0.21
BERT kmeans 0.60 0.39 0.49
BERT spectral clustering 0.60 0.40 0.49
BERT dbscan 0.03 0.03 0

終わりに

教師なしの文類似度手法である、SimCSEをご紹介し、日本語で簡単な実験を行いました。 BERTを用いた文類似度手法は、教師データを必要としていたため、教師による知識と学習の都合で起きる不都合な性質の分離がなされておらす、モデルの転移可能性について、未知な部分がありました。今回紹介した、SimCSEは教師なしですので、少なくとも教師による知識とは関係なく、使用できる点で、安心感があると思いました。しかし、上記の実験のように、万事解決というわけではなく、文表現が様々なシーンで安定的に適用可能になるためには、壁があると思いました。

*1:なお、この場合2値分類しかできませんが、NLIタスクは、entailment, neutral, contradictionの3値分類です。そのため、今回はneutralとcontradictionを一つにしています

*2:クラスタリング時に使用するtestデータ以外のデータを、spacy(ginza)で文分割し、トレーニングデータとしました。

*3:なお、BERTは閾値が0なので、entailmentかどうかをうまく分離できておらず、すべて同じラベルをつけている状態です。