YutaroOgawa / pytorch_advanced

書籍「つくりながら学ぶ! PyTorchによる発展ディープラーニング」の実装コードを配置したリポジトリです
MIT License
843 stars 334 forks source link

【第5章】Self-Attentionの実装について #161

Open kawase621 opened 3 years ago

kawase621 commented 3 years ago

お忙しいところ恐れ入りますが、P.268〜P.269のSelf-Attentionの実装について2点、質問させて下さい。

■質問1 P.268の説明の中で、8行目に「行方向にソフトマックス関数を計算」とありますが、βを求める式からすると、Sに対して「列方向にソフトマックス関数を計算」し、それがβの「行方向の」要素になるように読めます。 実装上も、Sに対して「nn.Softmax(dim=-2)」が適用されており、これはSの「列方向」にソフトマックス関数を計算していることになると思うのですが、いかがでしょうか? 結果的にβは、転置されることで行方向にソフトマックス関数が計算されたものになるとの理解です。

■質問2 Attention Mapは以下のように2回転置されていますが、これは何故でしょうか? 1回目の転置がなければ、oを求める際も転置が必要ないように思うのですが。

attention_map = attention_map_T.permute(0,2,1)
o = torch.bmm(x,attention_map.permute(0,2,1))
YutaroOgawa commented 3 years ago

@kawase621 さま

ご質問ありがとうございます。

ここは本書のなかでもややこしく、申し訳ございません。

まず本章で引用しているプログラムと、SAGANの論文の式に記載を合わせている関係で(Beta_Tを明示的に出すために)、 実装コードが■質問2のようになっています。

そして、■質問1に回答するためには、さらに考える必要がありますが、 ご指摘の通り、解説が誤っています。

P.268の説明の中で、8行目に「行方向にソフトマックス関数を計算」とありますが 完全に @kawase621 さまのご指摘の通りであり、

Sについて行方向のソフトマックスではなく、結果的にβに対して行方向にソフトマックスされるように、 Sについては列方向でソフトマックス関数を計算しております。

丁寧に追って、また共有いただき、ありがとうございます。 本Issueに誤植ラベルをはり、他の読者の皆様の参考にさせてください。

重要なご質問を誠にありがとうございます。

修正

P.268の説明の中で、8行目 「行方向にソフトマックス関数を計算し」

P.268の説明の中で、8行目 「列方向にソフトマックス関数を計算し」

および、図5.3.2の「行方向で正規化し転置」 ↓ 「列方向で正規化し転置」

kawase621 commented 3 years ago

本件、納得しました。 お忙しい中、ご回答ありがとうございます。

12138wjj commented 1 year ago

respect author: hello I find a question: in your book, you achieve the SAGAN as: image but at this most stars github file(https://github.com/heykeetae/Self-Attention-GAN/blob/master/sagan_models.py) as: image please notice the red box, i don't sure that do Transpose to the attention map or not?