언어 모델의 복잡성

Nov 27 2022
Perplexity는 언어 모델의 품질을 측정하는 평가 메트릭입니다. 이 게시물에서는 Perplexity가 무엇이며 인기 모델인 GPT2에 대해 어떻게 계산되는지에 대해 논의합니다.

Perplexity는 언어 모델의 품질을 측정하는 평가 메트릭입니다. 이 게시물에서는 perplexity가 무엇이며 인기 있는 모델인 GPT2 에 대해 어떻게 계산되는지에 대해 논의합니다 .

언어 모델이란 무엇입니까?

자연어 처리의 면면을 바꾼 BERT, GPT2 등과 같은 대형 언어 모델(LLM)에 대해 이미 들어보셨을 것입니다. 통계 언어 모델 및 신경 언어 모델과 같은 다양한 유형의 언어 모델이 있습니다. SLM은 신경망 아키텍처를 사용하여 신경 언어 모델이 훈련되는 주어진 텍스트의 통계를 기반으로 합니다.

언어 모델(LM)의 핵심은 모델의 어휘라고 하는 단어 집합에 대한 확률 분포일 뿐입니다. 그것은 모든 이전 단어가 주어진 어휘에서 특정 단어의 확률을 알려줍니다. 일반적으로 최대 확률을 가진 단어가 시퀀스의 다음 예측 단어로 선택됩니다.

이 확률은 이 시퀀스의 우도를 제공하는 이전 단어가 주어진 각 단어에 대한 일련의 조건부 확률을 곱하여 계산할 수 있습니다.

예를 들어, 예문 "It is a beautiful day"의 공동우도는 아래와 같이 작성됩니다. 이 확률을 계산하면 시퀀스에서 다음 또는 누락된 단어를 예측하는 데 도움이 되므로 모델이 언어의 뉘앙스를 학습하므로 언어 ​​모델이라는 용어가 사용됩니다.

P(It,is,a,beautiful,day) = P(day|beautiful, a, is, it) * 
                           P(beautiful|a, is, it) * P(a|is, it) * P(is|it)

다음 섹션에서는 Perplexity를 계산하는 데 사용되는 몇 가지 중요한 용어에 대해 설명합니다.

엔트로피

엔트로피는 불확실성을 정량화하는 척도이며 이벤트 발생 확률의 역수로 얻습니다. 확률이 높을수록 불확실성이 적습니다. 따라서 언어 모델의 목표는 훈련 시퀀스와 유사한 일련의 단어를 생성하는 엔트로피를 최소화하는 것입니다. 엔트로피 계산 공식은 다음과 같습니다. 여기서 P(x)는 단어 x의 확률입니다.

확률 분포의 엔트로피 공식

다음은 엔트로피를 더 자세히 이해할 수 있는 훌륭한 비디오입니다.https://youtube.com/watch?v=YtebGVx-Fxw

교차 엔트로피

교차 엔트로피는 두 확률 분포 P(x)와 Q(x)를 비교합니다. 언어 모델의 맥락에서 단어에 대한 예측 확률 분포를 실제 확률 분포와 비교합니다. 여기서 P(x)는 실제 확률 분포이고 Q(x)는 모델 예측 분포입니다. 그런 다음 교차 엔트로피는 아래와 같이 계산되어 언어 모델을 훈련하는 손실 함수로 사용할 수 있습니다.

"맑음", "낮", "아름다운", "풍경", "구름"이라는 5개 단어의 어휘로만 훈련된 언어 모델이 있다고 가정해 보겠습니다. 이제 모델이 "아름다운 풍경"이라는 문구를 보았을 때의 당혹도를 계산하려고 합니다.

PyTorch의 간단한 예제를 사용하여 교차 엔트로피를 계산해 보겠습니다.

# Get the needed libraries
import torch
from torch.nn import functional as F

그런 다음 이러한 로짓은 값을 정규화하고 확률 분포로 변환 하는 softmax 함수로 전달됩니다. 이것이 예측 확률 분포입니다.

tensor([[-0.7891,  1.3421,  0.4929,  0.0715, -0.0910],
        [ 0.9024, -0.8675,  0.8498, -1.0331,  0.5531]])

F.softmax(input, dim = -1)

Predicted:

tensor([[0.0575, 0.4841, 0.2071, 0.1359, 0.1155],
        [0.3369, 0.0574, 0.3196, 0.0486, 0.2375]])

Target/Actual: tensor([2, 3])

tensor([[0, 0, 1, 0, 0],
        [0, 0, 0, 1, 0]])

Loss for First Word:
(((- 0 * log(0.0575)) + (- 0 * log(0.4841)) + (- 1 * log(0.2071)) + 
  (- 0 * log(0.1359)) + (- 0 * log(0.1155))) = 1.5745535105805986

Loss for Second Word:
(((- 0 * log(0.3369)) + (- 0 * log(0.0574)) + (- 0* log(0.3196)) + 
  (- 1* log(0.0486)) + (- 0 * log(0.2375))) = 3.024131748075689

Loss = (1.5745535105805986 + 3.024131748075689)/2 = 2.299

loss = torch.nn.CrossEntropyLoss()

output = loss(input, target)
output

Loss: tensor(2.299)

직관적으로 perplexity는 놀란다는 뜻입니다. 새로운 데이터를 보고 모델이 얼마나 놀랐는지 측정합니다. 당혹감이 낮을수록 훈련이 더 좋습니다.

Perplexity는 모델에서 얻은 손실의 지수로 계산됩니다. 위의 예에서 "아름다운 풍경"이라는 문구에 대한 예제 모델의 당도가 9.97임을 알 수 있습니다. Perplexity 공식은 입력 시퀀스에 있는 모든 단어의 로그 가능도 평균의 지수입니다.

HuggingFace의 당혹감 공식

이제 두 문장의 당혹도를 GPT2와 비교하여 얼마나 당혹스러운지 알아보자. 먼저 HuggingFace에서 GPT2 모델에 대한 토크나이저와 인과관계 헤드를 로드합니다.

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
inputs = tokenizer("ABC is a startup based in New York City and Paris", return_tensors = "pt")
loss = model(input_ids = inputs["input_ids"], labels = inputs["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)

Output: 29.48

inputs_wiki_text = tokenizer("Generative Pretrained Transformer is an opensource artificial intelligence created by OpenAI in February 2019", return_tensors = "pt")
loss = model(input_ids = inputs_wiki_text["input_ids"], labels = inputs_wiki_text["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)

Output: 211.81

Perplexity는 일반적으로 모델이 교육 세트를 얼마나 잘 학습했는지 확인하는 데만 사용됩니다. BLEU , ROUGE 등과 같은 다른 메트릭은 테스트 성능을 측정하기 위해 테스트 세트에서 사용됩니다.

이 게시물에서는 언어 모델의 Perplexity인 Cross Entropy에 대해 논의하고 계산했습니다. 다음 포스트에서는 대중적인 언어 모델의 일반적인 언어 이해 능력을 측정하는 GLUE 벤치마크에 대해 이야기하겠습니다.

참조