質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

2183閲覧

【自然言語処理】word2vec実装時のEmbeddingレイヤの逆伝播に関して

bigbabysan

総合スコア3

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

1クリップ

投稿2020/07/31 10:59

編集2020/07/31 11:01

前提・実現したいこと

今「ゼロから作る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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/07/31 11:34

p138に書いてあるのでは……?
bigbabysan

2020/07/31 12:23

迅速なご対応誠にありがとうございます! P139の4行目に:この重複問題に対応するには「代入」でなく「加算」を行う必要があります。(なぜ行う必要があるかは、各自で考えてみましょう) とありP138を読み直しても分かりませんでした...。 自分でも考えるのを進めこちらの記事を参考に考え直したところ MatMuの逆伝播をしてるので順番に上流から下流にデータが流れてきて該当の箇所に何度もデータが流れてきた際に加算しないとデータの不一致が起きると解釈できたのですがこちらの考えはいかがでしょうか? https://qiita.com/MENDY/items/ce4c5c921253588de6c9
quickquip

2020/07/31 12:34

「代入では駄目な理由」はp138〜p139に書いてあって、その「各自で考えてみましょう」は「なぜ『加算』なのか?」かと。本よりうまく説明できるわけではないので回答はできません。悪しからず……
bigbabysan

2020/07/31 12:39

ご丁寧にありがとうございます! そして質問の仕方が分かりづらくて申し訳ございません...。 m(_ _)m 代入がだめな理由は上書きされるためとP139の1-3行目に記述されてるのですが 「平均」など他の方法がある中で「加算」するのかが分からなかった形です。 質問後も色々調べたりする中で逆伝搬でデータが流れてくので同じ箇所に流れてきたものは必然的に加算して処理するのではないかという仮説に至った流れです。
guest

回答1

0

ベストアンサー

Embeddingレイヤを使う目的は、3章の入力層から中間層への変換で使用したMatMulレイヤを高速化することなので、3章のMatMulレイヤと結果が変わってはいけません。順伝播だけでなく逆伝播の結果も、MatMulレイヤの時と同じになる必要があります。

そのため、Embeddingレイヤの逆伝播の計算を、一度3章のMatMulレイヤのやり方に戻してみると、「加算」の理由がわかるかと思います。

P.138の図4-5はEmbeddingレイヤの図ですが、このidxを3章のMatMulレイヤにおける入力xに戻すとこんな感じになります。
イメージ説明

これを、MatMulレイヤの逆伝播の式(P.33で解説されています)に当てはめます。dhは図4-5のままにしたかったのですが、手元の環境では●が塗り分けられないので、●、◆、a、bにしています。

イメージ説明

この式の左辺のdWが図4-5のdWに対応します。右辺を計算すれば、dhの2行目と4行目は、図4-5と同じようにdWの3行目と5行目にそのままハマることがわかるかと思います。また、今問題になっているdWの最初の行の「?」も、右辺を計算すればOKです。

イメージ説明

そうするとdWの1行目は、dhの1行目と3行目を「加算」して求めていることがわかります。これが図4-5の逆伝播をMatMulレイヤで計算した結果です。

Embeddingレイヤでも、逆伝播の結果がこれと同じにならないといけません。そのためidxに重複した値がある場合は、対応するdhの行の「加算」が必要なのです。

投稿2020/08/21 15:38

編集2020/08/22 00:44
segavvy

総合スコア958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bigbabysan

2020/08/25 21:58

せっかく教えてくださったのに気づくのが大変遅くなり誠に申し訳ございません。 m(_ _)m 凄く丁寧かつ分かりやすい解説誠にありがとうございます。加算する理由が理解できました。図まで用意して頂き本当に心から感謝しております。 そして今後学習を進めていき分からなくなった際も参考書をそのまま見て理解しようとせず紙に状況を整理して考えたいと学ばせて頂きました。 またteratailにてフォローもさせて頂きました。この度は誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問