質問内容
AttentionIsAllYouNeedのTransformerを実装しようと思い、Harvard-nlpの実装を見ていたのですが、以下の操作の違いについて疑問に思ったため質問させていただきました。
Python
1# MultiHeadedAttentionクラスのforward内にて 2query, key, value = \ 3 [l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2) 4 for l, x in zip(self.linears, (query, key, value))]
このようなコードがあったのですがここの
Python
1 l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2)
というコードは
Python
1l(x).view(nbatches, self.h, -1, self.d_k)
に置き換えられるかと思ったのですが、実行してみると処理結果が変わりました。
Lossがかなり異なっていて、後者の方が10倍くらいLossが小さくなりました。
この二つの操作はなにが違うのでしょうか?
処理結果の違い
このコードでテストします。Harvard-nlpの実装内に関数等があるのでそのコードは割愛します。
modelは訓練されていて、入力されたものに近くなるようにKLDivLossをLossとして学習させています。
torch.arange(1, 11)を入力したので、1~10までの数字が返ってくれば良いため、前者の処理結果が求めていた出力です。
Python
1# 1~10までの数字を入力とする 2inp = torch.arange(1, 11).unsqueeze(0).to(device) 3# max_len = 10に対して10の入力があるためマスクは不要、よって1で埋める。 4inp_mask = torch.ones(1, 1, 10).to(device) 5# デコーダのテスト、modelは訓練済みモデルである。 6print(decode(model, inp, inp_mask, max_len=10, start_symbol=1)) 7### 前者の処理結果 8# tensor([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], device='cuda:0') 9### 後者の処理結果 10# tensor([[ 1, 10, 6, 8, 6, 10, 10, 4, 6, 10]], device='cuda:0')
実行環境
Python 3.7.3
PyTorch 1.1.0
Windows 10
cuda 10.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。