前提・実現したいこと
書籍「ゼロから作るDeeplearning❷」のP149の下から5行目の
EmbeddingDotクラス内の「np.sum(target_W * h, axis=1)」
という箇所が計算式の計算方法は分かるのですが
計算結果であるout
が2値分類のsigmoid関数に渡す前の結果となる
理由がよく分からないので説明して頂きたいです。axis=1
も計算方法は
分かるのですがなぜここで横方向に圧縮するのかピンときません。。
よろしくお願い致します。
m(_ _)m
▼周りの変数内容は理解しているつもりです。
W = 重み
idx = 抜き出す行
target_W = 重み一覧からidxの行を抽出したもの
h = 中間ニューロン
target_W * h = target_Wとhの内積
該当のソースコード
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 19 20 21 22 23class EmbeddingDot: 24 def __init__(self,W): 25 self.embed = Embedding(W) 26 self.params = self.embed.params 27 self.grads = self.embed.grads 28 self.cache = None 29 30 def forward(self, h, idx): 31 target_W = self.embed.forward(idx) 32 out = np.sum(target_W * h, axis=1) #←※※ここの箇所です 33 34 self.cache = (h, target_W) 35 return out 36 37 def backward(self, dout): 38 h, target_W = self.chace 39 dout = dout.reshape(dout.shape[0], 1) 40 41 dtarget_W = dout * h 42 self.embed.backward(dtarget_W) 43 dh = dout * target_W 44 return dh
補足情報(FW/ツールのバージョンなど)
「ゼロから作るDeep Learning ❷ ―自然言語処理編」P149
回答1件
あなたの回答
tips
プレビュー