web-dev-qa-db-ja.com

HuggingFace Transformersライブラリで事前トレーニング済みのBERTモデルの中間層の出力を取得するにはどうすればよいですか?

(私はBERTワードの埋め込みに関する this pytorchチュートリアルに従っています。このチュートリアルでは、著者はBERTモデルの中間層にアクセスしています。)

私が欲しいのは、HuggingFaceのTransformersライブラリを使用して、TensorFlow2のBERTモデルの単一の入力トークンの最後の4つのレイヤーにアクセスすることです。各レイヤーは長さ768のベクトルを出力するため、最後の4つのレイヤーの形状は4*768=3072(各トークン用)。

これをTF/keras/TF2に実装して、入力トークンの事前トレーニング済みモデルの中間層を取得するにはどうすればよいですか? (後で私は文の各トークンのトークンを取得しようとしますが、今のところ1つのトークンで十分です)。

私はHuggingFaceのBERTモデルを使用しています:

!pip install transformers
from transformers import (TFBertModel, BertTokenizer)

bert_model = TFBertModel.from_pretrained("bert-base-uncased")  # Automatically loads the config
bert_tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
sentence_marked = "hello"
tokenized_text = bert_tokenizer.tokenize(sentence_marked)
indexed_tokens = bert_tokenizer.convert_tokens_to_ids(tokenized_text)

print (indexed_tokens)
>> prints [7592]

出力はトークン([7592])、これはBERTモデルのの入力である必要があります。

1
Yagel

BERTモデルの出力の3番目の要素は、埋め込み層と中間層の非表示状態の出力で構成されるタプルです。 ドキュメント から:

hidden_​​states(Tuple(tf.Tensor)、オプション、config.output_hidden_states=True)の場合に返されます:tf.Tensorのタプル(埋め込みの出力+各レイヤーの出力用に1つ)形状(batch_size, sequence_length, hidden_size)

各レイヤーの出力と初期の埋め込み出力でのモデルの非表示状態。

bert-base-uncasedモデルの場合、config.output_hidden_statesはデフォルトでTrueです。したがって、12の中間層の非表示状態にアクセスするには、次の操作を実行できます。

outputs = bert_model(input_ids, attention_mask)
hidden_states = outputs[2][1:]

hidden_statesタプルには、最初から最後までのすべてのレイヤーに対応する12の要素があり、それぞれが形状(batch_size, sequence_length, hidden_size)の配列です。したがって、たとえば、バッチ内のすべてのサンプルの5番目のトークンの3番目のレイヤーの非表示状態にアクセスするには、次のようにします:hidden_states[2][:,4]


ロードするモデルがデフォルトで非表示の状態を返さない場合、BertConfigクラスを使用して設定をロードし、次のようにoutput_hidden_state=True引数を渡すことができます。

config = BertConfig.from_pretrained("name_or_path_of_model",
                                    output_hidden_states=True)

bert_model = TFBertModel.from_pretrained("name_or_path_of_model",
                                         config=config)
3
today