Hugging Face과 Transformer란?

신동혁·2022년 12월 26일
0

1.Transformer(트랜스포머)란?

CNN, RNN과 같이 인공지능 분야에서 많이 사용되는 모델 중 하나가 Transformer다. 트랜스포머 모델은 문장 속 단어와 같은 순차 데이터 내의 관계를 추적해 맥락과 의미를 학습하는 신경망이다.

어텐션(attention) 또는 셀프어텐션(self-attention)이라 불리며 진화를 거듭하는 수학적 기법을 응용해 서로 떨어져 있는 데이터 요소들의 의미가 관계에 따라 미묘하게 달라지는 부분까지 감지한다.

2.Hugging Face(허깅 페이스)란?

다양한 트랜스포머 모델과 학습 스크립트를 제공하는 모듈이다. 허깅 페이스를 이용해서 다양한 트랜스포머 모델을 손쉽게 이용이 가능하다.

사용법

1. transformers 설치

pip install transformers

2. transformers에서 tokenizer, model 불러오기
tokenizer란? : https://velog.io/@agzg/%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%ACNLP-Natural-Language-Processing

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained(토크나이저 주소값)
model = AutoModel.from_pretrained(모델 주소값)

AutoTokenizer.from_pretrained()과 AutoModel.from_pretrained() 매개변수값으로 배포된 토크나이저와 모델의 주소값을 넣어준다. 보통 다음과 같은 형식이다.

ex)
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')

3. 불러온 tokenizer, model 사용하기

위 코드처럼 불러온 tokenizer와 model을 사용해본다.

print(tokenizer(토크나이즈화할 문장))

ex)
print(tokenizer("I love NLP!"))

출력화면 ex)

{'input_ids': [101, 1045, 2293, 17953, 2361, 999, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
  • input_ids
    tokenize된 token의 ID값이다. 즉, 미리 만들어진 단어 사전 리스트에서 해당 단어의 인덱스라고 생각하면 이해하기 쉽다.
  • token_type_ids
    tokenizer에 넣는 문장은 여러개 넣을 수 있다. 그래서 token_type_ids는 매개변수로 넣어진 문장 중 몇 번째 문장에 포함되어 있는지를 나타낸다. 하나의 문장만 넣으면 모두 첫번째 문장이므로 0(첫번째 문장을 의미)으로 표시된다. 문장을 두개 넣는다면 0,0,0,0...1,1,1,1 이런식으로 표현될 것이다.
  • attention_mask
    0은 무시해도 되는 token, 1은 의미있는 token을 의미한다. 이때 무시해도 될 token이란 문장을 여러개 넣어줄 경우 문장들의 길이를 맞춰주기 위해 padding을 사용한다. 즉, 문장1이 3글자, 문장2이 5글자라면 문장1에 의미없는 padding을 2개 넣어준다는 것이다. 이런 padding이 attention_mask 0이다.

해당 input_ids를 단어로 다시 바꿀 수도 있다.

print(tokenizer.convert_ids_to_tokens([101, 1045, 2293, 17953, 2361, 999, 102]))
print(tokenizer.decode(tokenizer("단어1 단어2 단어3 단어4 단어5 단어6"))

출력화면

['[CLS]', 'i', 'love', 'nl', '##p', '!', '[SEP]']
I love NLP!

여기서 [CLS], [SEP]는 무엇일까? 또한 nlp는 왜 nl과 ##p로 나뉘어졌을까?

  • [CLS], [SEP] ?
    이런 것들은 tokenizer에서 사용하는 special token이다. tokenizer.all_special_ids, tokenizer.all_special_tokens 를 이용해 special token을 알아볼 수 있다.
    - padding token : PAD
    - unknown token : UNK
    - classifier token : CLS
    - seperator token : SEP
    - mask token : MASK
  • nlp = nl + ##p ?
    tokenizer는 문장을 tokenize하는데 여러 방법이 존재한다. 이런 방식 중 하나가 nlp를 nl + ##p 로 나누는 것이다. 예를 들어서 의사, 변호사, 약사는 모두 의+사, 변호+사, 약+사 로 나누는 방법이라고 생각하면 이해하기 쉽다.

토큰화 방식 : BPE, WordPiece ...

4. transformers에서 trainer 불러오기

from transformers import Trainer

#initialize Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset
    eval_dataset=eval_dataset
    compute_metrics,
    tokenizer=tokenizer
)

#train
trainer.train()

#save
trainer.save_model()

#eval
metrics = trainer.evaluate(eval_dataset=eval_dataset)
profile
개발취준생

0개의 댓글