Transformers 라이브러리 특징
- 사용 용이성
- 유연성: 모든 모델이 pytorch의 nn.Module, tensorflow의 tf.keras.Model 클래스로 표현
- 단순성: 라이브러리의 추상화 거의 없음. All in one file
Pipeline 내부 실행 과정 알아보기
1. 전처리(Preprocessing)
Tokenizer 이용 전처리
* Tokenizer
- 입력을 토큰이라고 부르는 단어나 하위 단어, 또는 심볼(예-구두점)로 분할
- 각 토큰을 하나의 정수에 매핑
- 모델에 유용할 수 있는 부가적인 입력 추가
모든 전처리는 모델이 사전학습될 때와 동일한 방식으로 수행되어야 함 -> 사용하고자 하는 모델의 checkpoint 이름을 사용해 연결된 tokenizer를 불러와야 함.
* 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 이상)
- 해당 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 생성하기(인스턴스화)
loading methods
- 모델 설정을 임의로 하면 출력 개판남 (파라미터들이 정제X)
- 따라서 파라미터 잘 조정된 사전학습된 모델들 가져올 수 있음(from_pretrained)
Inference(추론)
- transformer는 input이 tensor기 때문에 -> 인코딩 된 시퀀스를 텐서로 변환해줘야 함
Tokenizer 살펴보기
- Tokenizer: 입력된 텍스트를 모델에서 처리할 수 있는 데이터로 변환.
- 방식: 단어 기반/문자 기반/하위 단어 토큰화 등 ...
- 텍스트 자르기 (step 1)
Tokenizer loading (인스턴스 생성)
- 각각 from_pretrained() 및 save_pretrained() 메소드 그대로 사용함.
Encoding
- 실질적인 토큰화 및 인코딩 작업 / 자른 텍스트를 숫자로 변환하기 (step 2)
(토크나이저 불러오기) 해당 모델의 토크나이저를 동일하게 하기 위해, 마찬가지로 본인이 사용하고자 하는 모델의 이름 이용해 토크나이저를 인스턴스화 해야 함
(토크나이저 사용) 토큰들을 숫자로 변환해 tensor로 만들고, 이를 모델에 입력할 수 있도록 하기 (마찬가지, 모델 사전학습과 동일한 vocabulary 사용 필수)
Decoding
- 입력 식별자 -> 어휘로 문자열 찾기
- token변환 및 병합해, law string까지 도출해줌: seq2seq 문제 다룰 때 유용.
다중 시퀀스 처리 문제
- 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에 지정되어 있음
- 다른 결과 이유는, transformer model이 attention layer를 가지고 있기 때문
- attention layer는 padding token을 고려하기 때문에, 모델에 길이가 다른 개별 문장을 입력할 때나, 동일한 문장으로 구성된 패딩이 적용된 배치를 입력할 때, attention layer가 padding token 무시하도록 해야 함 -> attention mask로 처리
attention mask
0과 1로 채워진 입력 식별자(input IDs) 텐서(tensor)와 형태가 정확하게 동일한 텐서(tensor)
- 1은 해당 토큰에 주의를 기울여야 함, 0은 해당 토큰을 무시해야 함 나타냄
시퀀스 길이가 모델 허용보다 더 긴 경우
1) 더 긴 시퀀스를 지원하는 다른 모델 사용하기, 2) 시퀀스 절단하기(truncation)
truncation
- max_sequence_length 매개변수를 지정해 시퀀스를 절단하기
max_sequence_length = 512
sequence = sequence[:max_sequence_length]
'AI-자연어처리' 카테고리의 다른 글
[LlamaIndex] 튜토리얼 (0) | 2024.05.31 |
---|---|
[Langchain] 써보기 (0) | 2024.05.17 |
[Huggingface Tutorial/Ch5] Dataset Library로 huggingface에 데이터셋 다루기 1 (1) | 2024.03.29 |
[Huggingface Tutorial/Ch3] 사전학습 모델 파인튜닝하기 (0) | 2024.03.29 |
[Huggingface Tutorial/Ch1] Transformer 모델 (0) | 2024.03.26 |