HuggingFace Transformer
갑자기 궁금해서 찾아본 내용임
Transformer 라이브러리를 불러다가 pretrained 모델을 활용할 때, 특수 토큰 임베딩을 어떻게 주나 궁금했음.
Transfertransfo에서 이런 기법을 활용했기 때문에 궁금한 거였고
- 그 모델의 깃헙이랑 아래 링크를 찾아보았음
- https://huggingface.co/transformers/model_doc/gpt2.html
- https://huggingface.co/transformers/model_doc/gpt2.html
입력은 다음과 같이 인자들을 받게 된다.
- input_ids=None, past=None, attention_mask=None, token_type_ids=None, position_ids=None, head_mask=None, inputs_embeds=None, use_cache=None, output_attentions=None, output_hidden_states=None,
- 여기서 input_ids는 자주 쓰는 입력 토큰 ids임
- 보통은 이것만 넣으면 되긴 함
- 때때로 position embedding의 방법을 바꾸고 싶으면 position_ids을 바꾸면 됨.
- default가 다음과 같음.
- if position_ids is None: device = input_ids.device if input_ids is not None else inputs_embeds.device position_ids = torch.arange(past_length, input_shape[-1] + past_length, dtype=torch.long, device=device) position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1])
- 즉, arrange을 쓰는 것인데 arrange는 그냥 step임.
- 그 후 다음과 같이 임베딩을 함
- position_embeds = self.wpe(position_ids)
- 이것이 우리가 생각하는 position embedding이고 wpe는 다음과 같음.
- self.wpe = nn.Embedding(config.n_positions, config.n_embd)
- BERT에서는 sin, cos을 이용한 position embedding이 기본이었지만, gpt 코드를 보면 그냥 nn.Embedding matrix을 사용하는 것을 알 수가 있음.
- 이젠 알아보려고 했던 특수 토큰 임베딩을 하려면 token_type_ids을 건들면 됨
- sentence을 구분하는 embedding 일 때는 0 or 1로 구분을 지으면 됨.
- 물론 두 개이상을 구분지으려면, 0, 1, 2 등등을 넣어주면 됨.
- default는 None으로 수행하지 않음.
- if token_type_ids is not None: token_type_embeds = self.wte(token_type_ids) else: token_type_embeds = 0
- self.wte = nn.Embedding(config.vocab_size, config.n_embd)
- position와 같이 새로운 embedding을 쓰지는 않고, word embedding에 사용하는 것을 같이 쓰는 듯.
- 최종 hidden_states는 다음과 같음
- hidden_states = inputs_embeds + position_embeds + token_type_embeds
- 만약 토큰 중에 attention을 제한하여 일부 token에 대한 attention을 하기 싫다면 attention mask을 건드리면 됨.
- 설명은 다음과 같음.
attention_mask (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`, defaults to :obj:`None`): Mask to avoid performing attention on padding token indices. Mask values selected in ``[0, 1]``: ``1`` for tokens that are NOT MASKED, ``0`` for MASKED tokens.
- 즉, 1을 넣으면 NOT maksed이고 masked token에 해당하는 위치에는 0을 넣어주면 됨.
- 그 이유는 중간에 이런 코드가 있음.
- attention_mask = (1.0 - attention_mask) * -10000.0
- 이 외에도 필요한 거 있을 때마다 찾아서 여기에 정리해놔야겠다...
- huggingface 라이브러리를 완벽히 숙지하는 길은 멀고도 멀었...
댓글
댓글 쓰기