카테고리 없음

[궁금증]Transformer 에는 뭔 놈의 mask 가 이렇게 많을까

광장의꽃향기 2022. 6. 22. 16:10

Pytorch 기준으로 
EncoderLayer 는 src_mask, src_key_padding_mask 를 요구한다.
DecoderLayer 는 tgt_mask, memory_mask, tgt_key_padding_mask, memory_key_padding_mask 를 요구한다.

def forward(self, src: Tensor, src_mask: Optional[Tensor] = None, src_key_padding_mask: Optional[Tensor] = None) -> Tensor:
Args:
src: the sequence to the encoder layer (required).
src_mask: the mask for the src sequence (optional).
src_key_padding_mask: the mask for the src keys per batch (optional).
 
def forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None, memory_mask: Optional[Tensor] = None,
tgt_key_padding_mask: Optional[Tensor] = None, memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:
Args:
tgt: the sequence to the decoder layer (required).
memory: the sequence from the last layer of the encoder (required).
tgt_mask: the mask for the tgt sequence (optional).
memory_mask: the mask for the memory sequence (optional).
tgt_key_padding_mask: the mask for the tgt keys per batch (optional).
memory_key_padding_mask: the mask for the memory keys per batch (optional).
 
 
 

뭔놈의 마스크가 이렇게 많을까..
내가 기억하는 mask 가 필요한 경우는 cheating 을 방지하기 위해 미래에 들어올 input 단어는 보지 못하도록 masking 하는 것 하나인데 말이다. (이 mask 는 위의 6가지 mask 종류중 어디에 해당할까?)

설명
- padding_mask 들은 자리맞추기용 토큰에 모델이 주목하지 않도록 해준다.
(src_key_padding_mask, tgt_key_padding_mask, memory_key_padding_mask)
문장마다 길이가 다른데, 이걸 같은 길이로 맞추기 위해 padding 을 준다. 이 때 아무 의미없는 토큰을 넣어줘서 길이를 맞춰주는데 이런건 모델이 주목할 필요가 없다.

src_mask 와 tgt_mask
- 이름만 다르지 같은 역할을 하는 mask 다. encoder 에 쓰이면 src_mask 고 decoder 에 쓰이면 tgt_mask 다. forward(x) 에서 x 구성요소 중 주목하지 않아야 하는 부분을 알려주는 역할을 한다. 위에서 얘기한 미래에 들어올 input 단어는 보지 못하도록 하는 mask 는 무엇일까? 에 대한 답은 이거다.

- 구글번역기에서 한글->영어 번역을 할 때 한글 부분에 src_mask 가 씌워진다. 그리고 아직 문장 끝까지 도달하지 않아 중간에 영어로 번역된 결과물들에는 tgt_mask 가 적용된다. 학습 시에는 아예 라벨 데이터의 일부를 input 으로 넣어준다. (근데 이러면 tgt_mask 가 굳이 input 으로 필요한가?? 함수 내부 구현에서 지금 몇번째 단어 처리하는지 기록하면 되지 않나? )

memory_mask
- decoder 는 forward 뿐 아니라 encoder 에서도 input 을 받을 수 있다. encoder 에서 넘어온 input 에 적용되는 tgt_mask 이다.(이걸 사람이 미리 정해놓을 수 있을까?
)

tgt_mask 가 굳이 input 으로 필요한가?
=> 없어도 되지만 transformer 내부에서 처리하는거보다 batch 다룰 때 외부에서 input 으로 주는게 효율적이다.

memory_mask 모양을 사람이 미리 정해둘 수 있을까?
=> 별거 없고 그냥 encoder 에서 쓰던 mask 랑 같은거 쓰면 된다. 


참고 :  https://cpm0722.github.io/pytorch-implementation/transformer

추가로 알게 된 것

decoder 에서 Q, K, V 는 각각 무엇일까?
=> attention layer 가 2개여서 각각 다르다.
 
masked_multi_head_attention_layer : Q, K, V = tgt_input

multi_head_attention_layer :
Q는 input, K 는 encoder_output 이여서 둘이 attention_matrix 만든다.
V 는 encoder_output 이고 attention_matrix 에 matmul 된다.