AI-자연어처리

[Huggingface Tutorial/Ch2] Transformers 라이브러리 사용하기

옆동네애옹이 2024. 3. 26. 22:12
728x90

Transformers 라이브러리 특징

- 사용 용이성

- 유연성: 모든 모델이 pytorch의 nn.Module, tensorflow의 tf.keras.Model 클래스로 표현

- 단순성: 라이브러리의 추상화 거의 없음. All in one file

 

Pipeline 내부 실행 과정 알아보기

1. 전처리(Preprocessing)

Tokenizer 이용 전처리

* Tokenizer

  • 입력을 토큰이라고 부르는 단어나 하위 단어, 또는 심볼(예-구두점)로 분할
  • 각 토큰을 하나의 정수에 매핑
  • 모델에 유용할 수 있는 부가적인 입력 추가

모든 전처리는 모델이 사전학습될 때와 동일한 방식으로 수행되어야 함 -> 사용하고자 하는 모델의 checkpoint 이름을 사용해 연결된 tokenizer를 불러와야 함.

sentiment-analysis pipeline의 default checkpoint가 distilbert

 

 

* Transformer 모델은 tensor만을 입력으로 받음: 따라서 input을 tensor로 변환해주어야 함

 

- 출력 pytorch tensor: key로 input_ids, attention_mask를 갖는 dict

- return tensor 지정 없으면 이중리스트 표시됨                                                                                                            

 

2. 모델로 입력 전달

모델 살펴보기

 

해당 아키텍처는 기본 Transformer 모듈만 포함

입력이 주어지면 features라고도 불리는 hidden states를 출력하게 됨

각 모델의 입력에 대해 Transformer 모델에 의해 수행된 입력의 문맥적 이해로 표현할 수 있는 고차원 벡터(high-dimensional vector)를 가젹오게 됨

이러한 hidden states는 그 자체로 유용할 수 있지만 일반적으로 head라고 알려진 모델의 다른 부분에 입력으로 들어가며

각 task에는 서로 다른 head가 연결되어 있음

 

고차원 벡터

Transformer 모듈의 벡터 출력은 일반적으로 크며 보통 3개의 차원이 있음

  • Batch size: 한 번에 처리되는 시퀀스의 개수
  • Sequence length: 시퀀스의 숫자 표현 길이 
  • Hidden size: 각 모델 입력 벡터 차원 (이가 매우 크기 때문에 '고차원 벡터', 작은 모델은 768이 일반적이며 큰 모델은 3072 이상)

이 모델은 배치 2, 시퀀스 16, 입력차원 768

- 해당 output은 namedtuple, dict처럼 동작함 (요소 접근 방식이 outputs['last_hidden_state'] or outputs[0])

 

Model Heads

 

3. 출력 후처리(Postprocessing)

outputs.logit의 'logits': 모델의 마지막 계층에서 출력된 정규화되지 않은 점수.

이를 확률로 변환하려면 Softmax 계층 통과해야 함

- 모든 transformers model은 logits를 출력하며, 일반적으로 학습을 위한 손실 함수(loss function)는  최종 활성화 함수(activation function, e.g., SoftMax)와 실제 손실 함수(actual loss function, e.g., cross entropy)를 모두 사용하여 구현되기 때문

 

-> torch의 softmax 함수 거친 후, 인간이 이해할 수 있는 확률 점수로 반환

- 해당하는 레이블 속성값 가져오기 위해 model.config.id2label 속성값 확인

 


모델 사용하기

Automodel 

지정된 체크포인트 바탕으로 쉬운 모델 인스턴스화

실제로 라이브러리에서 사용할 수 있는 모델들의 wrapper라고 생각할 수 있음. 

- 사용하려는 모델의 유형을 알고 있다면, 해당 아키텍쳐를 직접 정의하는 클래스를 사용할 수도 있음

Transformer model 생성하기(인스턴스화)

기본 config로 모델을 생성하면, 해당 모델을 무작위로 초기화함

 

loading methods

- 모델 설정을 임의로 하면 출력 개판남 (파라미터들이 정제X)

- 따라서 파라미터 잘 조정된 사전학습된 모델들 가져올 수 있음(from_pretrained)

f사전학습된 bert model 가져오기

 

Inference(추론)

- transformer는 input이 tensor기 때문에 -> 인코딩 된 시퀀스를 텐서로 변환해줘야 함

 

Tokenizer 살펴보기

- Tokenizer: 입력된 텍스트를 모델에서 처리할 수 있는 데이터로 변환.

  - 방식: 단어 기반/문자 기반/하위 단어 토큰화 등 ... 

  - 텍스트 자르기 (step 1)

Tokenizer loading (인스턴스 생성)

- 각각 from_pretrained() 및 save_pretrained() 메소드 그대로 사용함.

 

Encoding

- 실질적인 토큰화 및 인코딩 작업 / 자른 텍스트를 숫자로 변환하기 (step 2)

(토크나이저 불러오기) 해당 모델의 토크나이저를 동일하게 하기 위해, 마찬가지로 본인이 사용하고자 하는 모델의 이름 이용해 토크나이저를 인스턴스화 해야 함

(토크나이저 사용) 토큰들을 숫자로 변환해 tensor로 만들고, 이를 모델에 입력할 수 있도록 하기 (마찬가지, 모델 사전학습과 동일한 vocabulary 사용 필수)

trans + ##former 2가지 토큰으로 나뉨, 모두 어휘 사전에 존재함.
각 토큰을 입력 식별자로 변환

 

Decoding

- 입력 식별자 -> 어휘로 문자열 찾기

- token변환 및 병합해, law string까지 도출해줌: seq2seq 문제 다룰 때 유용.

반대 결과값 넣어주니 law string 출력됨

 

 


다중 시퀀스 처리 문제

- transformers 모델은 기본적으로 다중 문장(시퀀스)을 한번에 입력하기를 기대함

- 단일 시퀀스(한 문장만)를 입력했을 때는 IndexError: Dimension out of range 출력 

  - 실제로 시퀀스에 토크나이저를 적용할 때, 입력 식별자 리스트를 텐서로 변환하며 & 한 차원이 더 추가됨.

모델의 입력은 '배치Batch' 형태를 요구함

- 따라서 문장이 하나만 있는 경우에는 단일 시퀀스로 batch를 빌드해야 함

batch_ids = [ids, ids]

- batch 처리를 통해 모델이 여러 문장을 동시에 입력받을 수 있음.

- 하지만, 2개 이상의 문장을 batch 처리할 때 문장의 길이가 다를 수 있음 -> padding(채우기) 기법 이용

 

입력 padding하기

- 직사각형 모양으로 tensor를 만들기

- 길이가 더 짧은 토큰에 padding token 추가해, 모든 문장이 동일한 길이를 갖게 함

- paddding token의 식별자는 tokenizer.pad_token_id에 지정되어 있음

 

batch처리를 직접 한 문장 output logit이 다름

- 다른 결과 이유는, transformer model이 attention layer를 가지고 있기 때문

  - attention layer는 padding token을 고려하기 때문에, 모델에 길이가 다른 개별 문장을 입력할 때나, 동일한 문장으로 구성된 패딩이 적용된 배치를 입력할 때, attention layer가 padding token 무시하도록 해야 함 -> attention mask로 처리

 

attention mask

0과 1로 채워진 입력 식별자(input IDs) 텐서(tensor)와 형태가 정확하게 동일한 텐서(tensor)

-  1은 해당 토큰에 주의를 기울여야 함, 0은 해당 토큰을 무시해야 함 나타냄

attention mask를 1/0으로 줌으로써, batch tensor를 선택할지 무시할지 직접 정해주기

 

시퀀스 길이가 모델 허용보다 더 긴 경우

1) 더 긴 시퀀스를 지원하는 다른 모델 사용하기, 2) 시퀀스 절단하기(truncation)

truncation

- max_sequence_length 매개변수를 지정해 시퀀스를 절단하기

max_sequence_length = 512

sequence = sequence[:max_sequence_length]

 

728x90