前提・実現したいこと
今「ゼロから作るDeep Learning❷」の学習を進めています。
その中でword2vecの実装で行列から行を抜き出す
Embeddingレイヤを実装しているのですが
抜き出すidxが重複する際に
逆伝播時にdW[self.idx] = dout
と「代入」するのではなく
for i, word_id in enumerate(self.idx): dW[word_id] += dout[i]
上記のコードで要素を「加算」する理由がどうしても分かりませんでした...。
教えて頂ければ幸いです。よろしくお願い致します。
m(_ _)m
該当のソースコード
Python3
1class Embedding: 2 def __init__(self, W): 3 self.params = [W] 4 self.grads = [np.zeros_like(W)] 5 self.idx = None 6 7 def forward(self,idx): 8 W, = self.params 9 self.idx = idx 10 out = W[idx] 11 return out 12 13 def backward(self, dout): 14 dW, = self.grads 15 dw[...] = 0 16 for i, word_id in enumerate(self.idx): 17 dW[word_id] += dout[i] 18 return None
試したこと
手書きでレイヤの流れを整理したのですが代入でダメな理由が分かりませんでした...。
補足情報(FW/ツールのバージョンなど)
「ゼロから作るDeep Learning❷」 P139
回答1件
あなたの回答
tips
プレビュー