변환기의 BERT 문장 임베딩

Aug 17 2020

BERT 모델의 숨겨진 상태에서 문장 벡터를 얻으려고합니다. huggingface의 BertModel 지침을 보면 여기 말한다 :

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)

따라서 첫 번째 참고 사항은 웹 사이트에있는 것처럼 / 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)

하지만 제가 얻은 텐서는 예상과 다른 모양을 가지고 있습니다.

>>> 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

무엇을 언제 사용해야하는지에 대한 권위있는 문서가 하나도 없다고 생각합니다. 작업에 가장 적합한 것이 무엇인지 실험하고 측정해야합니다. 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 논문의 저자 중 한 명) 은 다음과 같이 썼습니다 .

BERT는 의미있는 문장 벡터를 생성하지 않기 때문에 이러한 벡터가 무엇인지 잘 모르겠습니다. 이것은 문장 벡터를 얻기 위해 단어 토큰에 대한 평균 풀링을 수행하는 것처럼 보이지만 이것이 의미있는 문장 표현을 생성 할 것이라고 제안한 적이 없습니다. 그리고 다운 스트림 작업을 위해 훈련 된 DNN에 공급 될 때 괜찮은 표현이라고하더라도 코사인 거리 측면에서 의미가 있다는 의미는 아닙니다. (코사인 거리는 모든 차원에 동일한 가중치가 적용되는 선형 공간이기 때문에).

그러나 이것이 그러한 작업에 BERT를 사용할 수 없다는 것을 의미하지는 않습니다. 이는 사전 훈련 된 가중치를 즉시 사용할 수 없음을 의미합니다. 어떤 문장이 유사한 지 ( [CLS]토큰을 사용하여 ) 학습하는 BERT 위에 분류기를 훈련 시키거나 의미있는 문장 표현을 생성하도록 훈련 되었기 때문에 감독되지 않은 시나리오에서 사용할 수있는 문장 변환기 를 사용할 수 있습니다.