def forward(self, tgt, tgt_prev, src, tgt_mask):
if tgt_prev == None: # Train
att = self.self_attention_layer(tgt, tgt, tgt, tgt_mask)
out = self.self_attention_norm(att + tgt)
att = self.attention_layer(tgt, src, src) <- 문제가 있어 보이는 부분
out = self.attention_norm(att + out)
ff = self.feedforward_layer(out)
out = self.feedforward_norm(ff + out)
else:
tgt_prev = torch.cat([tgt_prev, tgt], 1)
att = self.self_attention_layer(tgt, tgt_prev, tgt_prev, tgt_mask)
out = self.self_attention_norm(att + tgt)
att = self.attention_layer(tgt, src, src) <- 문제가 있어 보이는 부분
out = self.attention_norm(att + out)
ff = self.feedforward_layer(out)
out = self.feedforward_norm(ff + out)
return out
기존의 Transfomer의 decoder에서는 masked self attention을 한 결과로 얻은 output으로 encoder-decoder attention을 합니다.
근데 여기서는 masked self attention과 encoder-decoder attention을 따로 하고 그 결과들을 더해서 attention_norm을 하고 있습니다.
이렇게 해도 self attention으로 얻은 정보와 encdoer의 input에 대한 정보를 둘 다 사용할 수는 있겠으나 encoder-decoder attention을 할 때 self attention으로 얻은 정보를 활용하지 못하고 있으므로 이를 수정해 주면 더 좋은 성능을 기대할 수 있을 것 같습니다.
아래 그림의 왼쪽이 기존 코드에서의 동작을 나타내고 있고 오른쪽이 수정 후의 동작입니다.
SATRN.py의 TransformerDecoderLayer의 forward()부분에서 https://github.com/bcaitech1/p4-fr-9-googoo/blob/f8ee504c37e57fb29eebb19d441feb18dc79c1df/networks/SATRN.py#L444
이 부분의 tgt를 out으로 바꿔야 할 것 같습니다. 한번 바꿔보고 실험 해보겠습니다.
<전체 코드>
기존의 Transfomer의 decoder에서는 masked self attention을 한 결과로 얻은 output으로 encoder-decoder attention을 합니다. 근데 여기서는 masked self attention과 encoder-decoder attention을 따로 하고 그 결과들을 더해서 attention_norm을 하고 있습니다. 이렇게 해도 self attention으로 얻은 정보와 encdoer의 input에 대한 정보를 둘 다 사용할 수는 있겠으나 encoder-decoder attention을 할 때 self attention으로 얻은 정보를 활용하지 못하고 있으므로 이를 수정해 주면 더 좋은 성능을 기대할 수 있을 것 같습니다. 아래 그림의 왼쪽이 기존 코드에서의 동작을 나타내고 있고 오른쪽이 수정 후의 동작입니다.