인프런 커뮤니티 질문&답변

David님의 프로필 이미지
David

작성한 질문수

딥러닝을 활용한 자연어 처리 (NLP) 과정 (기초부터 ChatGPT/생성 모델까지)

실습 - Transformer 번역기 code 분석 (Old Code) - Optional

Decoder 전체(10) 부분에서 attn_weight output shape 관련 질문 드립니다.

작성

·

219

0

sample_decoder = Decoder(num_layers=2, d_model=512, num_heads=8,
                         dff=2048, target_vocab_size=8000,
                         maximum_position_encoding=5000)

x = tf.random.uniform((64, 26), dtype=tf.int64, minval=0, maxval=200)

output, attn = sample_decoder(x,
                              enc_output=sample_encoder_output,
                              training=False,
                              look_ahead_mask=None,
                              padding_mask=None)

output.shape, attn['decoder_layer2_block2'].shape

위 코드 결과 output은

(TensorShape([64, 26, 512]), TensorShape([64, 8, 26, 62]))

인데요.

atten output size 64 x 8 x 26 x 62는

batch x head num x seq_len x depth(=len_k) 의 사이즈일것 같은데요.

depth의 경우, d_model(512) / num_head(8) = 64 가 되야하는게 아닌지요? 62인 이유가 궁금합니다.

답변 2

1

YoungJea Oh님의 프로필 이미지
YoungJea Oh
지식공유자

62는 입력 시퀀스의 길이에 입니다.

sample_encoder = Encoder(num_layers=2, d_model=512, num_heads=8, dff=2048, input_vocab_size=8500, maximum_position_encoding=10000)

x = tf.random.uniform((64, 62), dtype=tf.int64, minval=0, maxval=200)

sample_encoder_output = sample_encoder(x, training=False, mask=None)

print (sample_encoder_output.shape) # (batch_size, input_seq_len, d_model)
----> (64, 62, 512) 출력

트랜스포머에서, Self-Attention의 output shape은 일반적으로 (batch_size, num_heads, sequence_length, depth)입니다. 여기서 'depth'는 주로 d_model/num_heads로 계산되는데, 이는 각 attention head가 처리하는 feature의 차원수입니다. (62 라는 숫자는 단순히 예제로 정한 숫자입니다.)

Self-Attention 메커니즘에서, attention score는 Query와 Key 사이의 dot product로 계산되므로, Query와 Key의 길이가 동일해야합니다. 이 경우, Key(즉, 입력 시퀀스)의 길이가 62라면, attention weight 행렬의 마지막 차원도 62가 될 것입니다.

좋은 질문 감사합니다.

0

David님의 프로필 이미지
David
질문자

감사합니다!

David님의 프로필 이미지
David

작성한 질문수

질문하기