HuggingFace Transformer

갑자기 궁금해서 찾아본 내용임

Transformer 라이브러리를 불러다가 pretrained 모델을 활용할 때, 특수 토큰 임베딩을 어떻게 주나 궁금했음.

Transfertransfo에서 이런 기법을 활용했기 때문에 궁금한 거였고

Transformer 중 GPT 모델 기준으로 살펴보았다.
입력은 다음과 같이 인자들을 받게 된다.
  • 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 라이브러리를 완벽히 숙지하는 길은 멀고도 멀었...

댓글