최근들어 Huggingface에서 제공하는 Transformers 라이브러리를 많이 사용하는데, 구체적인 동작 방식을 이해하고 사용하면 좋은 것 같아서 기초부터 차근차근 정리해본다. 간단하게 정히한거라, 공식 문서와 코드를 참고하면 더 도움이 될 듯!
PreTrainedModel
공식 문서 : https://huggingface.co/transformers/main_classes/model.html
코드 : https://huggingface.co/transformers/_modules/transformers/modeling_utils.html
모델의 configuration을 저장하고, 모델을 불러오고 저장하는 역할을 수행한다. 추가적으로, 임베딩의 크기를 바꿔주는 역할, self-attention head를 pruning하는 역할을 수행한다.
- from_pretrained()
Pretrained model을 intantiate 한다. 기본적으로 model.eval() 로 설정되어있기 때문에 학습을 하기 위해서는 model.train()으로 모드를 변경해줘야 한다.
pretrained_model_name_or_path : model id (bert-base-cased 등 과 같이 우리가 자주 사용하는!), save_pretrained() 를 통해서 지정한 모델을 저장한 디렉토리의 경로, None (config, state_dict를 모두 제공하는 경우) 등
config : PreTrainedConfig를 상속받은 클래스
state_dict : Dict[str, torch.Tensor)
- save_pretrained()
모델과 해당 모델의 configuration을 특정한 디렉토리에 저장한다. save_directory 로 해당 값들을 저장할 위치를 지정할 수 있다.
load config → load model → instantiate model (load weights) → model.eval() (gradient 계산하지 않도록)
- get_input_embeddings() , get_output_embeddings()
Input embedding은 vocabulary 에서 hidden state로 mapping하고, output embedding은 hidden state에서 vocabulary로 mapping하는 역할을 수행한다.
- set_input_embeddings()
모델의 input embedding을 새로 지정한다.
- resize_token_embeddings()
new_num_tokens 로 지정한 크기만큼의 임베딩을 생성한다. 기존의 임베딩 크기보다 new_num_tokens가 더 크다면 임베딩 제일 뒤에 새로운 임베딩들을 추가하고, 더 작다면 뒤에서부터 임베딩을 삭제해서 임베딩의 크기를 줄인다. new_num_tokens를 지정하지 않는 경우는 그냥 임베딩의 포인터를 리턴한다.
- tie_weights()
input embedding과 output embedding을 묶는다. (input weight를 가지고와서 output weight으로 지정해준다.) (output.weight = input.weight) torchscript flag가 config 파일에 지정되어 있다면, input weight을 clone해서 output weight으로 지정해준다.
'필기 노트 > Huggingface Transformers' 카테고리의 다른 글
[Huggingface] Datasets / Preprocessing / Training / Evaluating (0) | 2021.07.18 |
---|---|
[Huggingface] PreTrainedTokenizer class (1) | 2021.07.18 |
[Huggingface] PretrainedConfig class (1) | 2021.07.16 |
[Huggingface] Huggingface Tokenizer (1) | 2021.07.09 |
댓글