0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

数値微分を使う方法は1つのパラメータ(レイヤ0のbiasの0番目など)を少し小さくして、順伝播し、少し大きくして、順伝播する、そしてこれをすべてのパラメータに対して行うというとても遅い方法です。
これを改善したのがBackpropagationで、とても速い効率的なアルゴリズムです。
ここでは、シンプルにするために、各層のニューロンが1つの、以下のNN(ニューラルネットワーク)で解説します。
また、Loss fn(損失関数)はMean Squared Error (MSE)を使います。

Weight
Bias
ReLU
Weight
Bias
ReLU

目標は「Lossを小さくする」ことなので、シンプルにするためにLoss fnもネットワークに入れてしまいます。
損失関数は答えも知っています。

Weight
Bias
ReLU
Weight
Bias
ReLU
Loss fn (MSE)

こうすると、「出力を小さくしたい」ということにできます。
では、どうすれば高速に小さくできるでしょうか?

一つ一つのレイヤが数学の関数だと考えてください。いくつかの関数はパラメータを持っています。
一度forward(順伝播)します。このときにいろいろ保存します。
そして、Loss fnにどのような値を入力すればいいかを考えます。そのために、Loss fnを微分します。
これで、Loss fnへの入力をどのように変えればいいかわかりました。
でも、次はReLUであり、パラメータではありません。なので、ReLUも同様に微分します。ですが、ReLUは最後のレイヤではないので、最後のレイヤの微分も考えないと、ReLUを微分してReLUの出力を小さくしても意味がありません。なので、最後のレイヤの微分の結果にReLUの微分の結果を付け足すということをします。
つまり、最後のレイヤの微分の結果にReLUの微分の結果を掛けるということです。
「Back」してますね!
ReLUは入力によって微分の結果が変わります。これにはforward時に保存しておいたデータを使います。

そして、これをすべてのレイヤに適用します。
すると、あるレイヤの出力を1変えるとどれだけネットワークの出力(Loss)が変わるかがわかります。
Biasは1大きくすればどれだけLossが変わるかわかるので、簡単ですね。微分できました!
Weightは入力によって変わります。例えば入力が0なら、いくら変更しても何も変わりません。入力が保存してあるのでこれも簡単にできます。ReLUと似ていますね。

Backpropagationは、とても速いアルゴリズムです。
私は昔、自分でアルゴリズムを考えて遊んでいました。その頃は初期値などを知らなかったのもあり、うまくいくものはありませんでしたが楽しかったです。
少し変えてみたり、新しいアルゴリズムを考えて作って、遊ぶのはとても楽しいのでぜひやってみてください!

最後まで読んでいただきありがとうございました!🧶

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?