トランスフォーマーからのBERT文の埋め込み

Aug 17 2020

BERTモデルの非表示状態から文ベクトルを取得しようとしています。ここでhuggingfaceBertModelの説明を見ると、次のようになっています。

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')
model = BertModel.from_pretrained("bert-base-multilingual-cased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt') 
output = model(**encoded_input)

したがって、最初に注意してください。Webサイトにあるように、これは/ not /実行されます。あなたが得る:

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'BertTokenizer' object is not callable

ただし、トークナイザーを直接呼び出さずに、入力をエンコードするように依頼するという点で、マイナーな変更で修正されたように見えます。

encoded_input = tokenizer.encode(text, return_tensors="pt")
output = model(encoded_input)

OK、それはさておき、私が得るテンソルは、しかし、私が予想したものとは異なる形をしています:

>>> output[0].shape
torch.Size([1,11,768])

これはたくさんのレイヤーです。文の埋め込みに使用する正しいレイヤーはどれですか?[0][-1]?いくつかを平均しますか?これらとコサイン類似性を実現できるようにすることを目標としているため、NxKテンソルではなく適切な1xNベクトルが必要です。

人気のあるbert-as-a-serviceプロジェクトが使用しているように見える[0]

これは正しいです?各レイヤーが何であるかについてのドキュメントはありますか?

回答

5 Jindřich Aug 18 2020 at 08:37

何をいつ使用するかについての信頼できるドキュメントは1つもないと思います。あなたはあなたの仕事に最適なものを実験して測定する必要があります。BERTに関する最近の観察結果は、このペーパーにうまくまとめられています。https://arxiv.org/pdf/2002.12327.pdf。

経験則は次のとおりです。

  • 特定のタスクに合わせてモデルを微調整する場合は、最後のレイヤーを使用します。そして、可能な限り微調整して、数百または数十のトレーニング例で十分です。

  • モデルを微調整できない場合は、いくつかの中間レイヤー(7番目または8番目)を使用します。その背後にある直感は、レイヤーが最初に入力のますます抽象的な一般的な表現を開発するということです。ある時点で、表現は事前トレーニングタスクの対象になり始めます。

Bert-as-servicesはデフォルトで最後のレイヤーを使用します(ただし、構成可能です)。ここでは、になります[:, -1]。ただし、常にすべての入力トークンのベクトルのリストを返します。最初の特別な(いわゆる[CLS])トークンに対応するベクトルは、文の埋め込みと見なされます。これは[0]あなたが参照するスニッパーから来るところです。

2 cronoik Oct 07 2020 at 04:50

Jindrichの既存の答えは一般的に正しいですが、それは質問に完全に対処しているわけではありません。OPは、文の埋め込み間のコサイン類似度を計算するためにどのレイヤーを使用する必要があるかを尋ねました。この質問に対する簡単な答えはありません。コサイン類似度のようなメトリックでは、ベクトルの次元が等しく有意義に寄与する必要がありますが、BERTの場合はそうではありません。Jacob Devlin(BERT論文の著者の1人)は次のように書いています。

BERTは意味のある文ベクトルを生成しないため、これらのベクトルが何であるかはわかりません。これは、文のベクトルを取得するために単語トークンに対して平均的なプーリングを行っているようですが、これが意味のある文の表現を生成することを示唆したことはありません。また、ダウンストリームタスク用にトレーニングされたDNNに入力された場合、それらが適切な表現であっても、コサイン距離の観点から意味があるとは限りません。(コサイン距離はすべての次元が等しく重み付けされる線形空間であるため)。

ただし、そのようなタスクにBERTを使用できないという意味ではありません。これは、事前にトレーニングされたウェイトをそのまま使用できないことを意味します。([CLS]トークンを使用して)どの文が類似しているかを学習するBERTの上に分類器をトレーニングするか、意味のある文表現を生成するようにトレーニングされているため、教師なしシナリオで使用できるセンテンストランスフォーマーを使用できます。