① 어텐션은 입력을 디코더로 변환합니다. 즉, 어텐션은 입력 시퀀스와 길이가 같은 인코딩된 시퀀스로 변환하는 역할을 합니다. 따라서 'self.max_length'는 모든 입력 시퀀스의 최대 길이여야 합니다.
② torch.bmm 함수는 배치 행렬 곱(Batch Matrix Multiplication, BMM)을 수행하는 함수로, 다음 그림과 같이 두 개 이상의 차원을 지닌 텐서가 주어졌을 때 뒤의 두 개 차원에 대해 행렬 곱을 수행하는 함수입니다. 예를 들어 (BN, A, B)와 (BN, B, C)라는 행렬이 두 개 주어졌을 때 각 행렬에서 뒤 두 개의 차원((A, B), (B, C))에 대해 행렬 곱을 수행하면 (BN, A, C)라는 결과를 얻을 수 있습니다.
▲ 그림 10-22 torch.bmm
따라서 torch.bmm(attn_weights.unsqueeze(0), encoder_outputs.unsqueeze(0))은 가중치와 인코더의 출력 벡터를 곱하겠다는 의미이며, 그 결과(attn_applied)는 입력 시퀀스의 특정 부분에 관한 정보를 포함하고 있기 때문에 디코더가 적절한 출력 단어를 선택하도록 도와줍니다.