#背景:損失関数をコードを通して理解したい
先日は「$y=x^2$」を使って簡単な勾配降下法の可視化を行いました(勾配降下法を可視化したい件)。1変数の勾配降下法についての可視化は出来たので、2変数や多変数についての勾配降下法についても同じように実装したいと思います。
#目的:勾配降下法を一般化していきながら理解したい
2変数や多変数についての勾配降下法の実装を通して、誤差逆伝播の流れを実感します。
#方法:2変数関数で勾配降下法を行う
$z=x^2+y^2$ を使って可視化します。前回は微分した時の傾きが0の所で勾配降下法を終えましたが、今回は任意の回数行う事にします。
#結果:3次元空間の勾配降下法の変化を描写
前回アニメーションが出来たので今回も作ろうと思いましたが、エラーが出て出来ませんでした。結局、出力の変位をプロットするだけで終わってしまいました。というか、参考にしたコードそのままです。これはこれで初めの方が学習による変化の大きさが見れました。それが以下の図になります。
コードはこちらです。
勾配降下法.ipynb
リンク先の目次「勾配降下法($z=x^2+y^2$)」にあります。
#課題:一般化した勾配降下法の実装
- 損失関数や評価関数、重みの更新についての理解をコードを通して深めたい。
- 3次元のアニメーションを動画に残す方法が分かりませんでした。先日、やった方法は視点を変える動画で保存できましたが、今回は、点が動くものです。位置情報はリストに入れているのですが、3次元でプロットする際にイテレーション出来ないと怒られた気がします。出来る方がいらっしゃったらアドバイスして頂ければ嬉しいです!
#あとがき:改めて気付いた事やこれからしたい事などを書きます。非難はやめて頂けると幸いです。建設的な意見は大歓迎です。
- 損失関数を使う意味を改めて考えました。簡単には正解が有って、予測との差を明確にするためにあると考えました。では、今回やっているのはどんな意味があるのか考えます。今回は損失関数を使いません。基になる関数があって、初期値が決められています。初期値での傾きと学習率を掛けて重みを更新しています。どのように更新するかというと傾きが0になるように更新します。傾きが0ということは微小の変化率が0ということです。
ここからは僕の考えです。つまりこの微小の変化率0という状態は安定という事になるんじゃないかと思います。モデルもこの状態を目指して学習します。つまり、学習とはモデルの出力を安定させるための処理を言うと考えます。そして、これは正解を出すのとは別の話です。たしかに正解を教師データとして学習するのですが、それが学習したことのないデータに対して有効かは分からないんじゃないかと考えます。それは学習したことのない未知のデータがそれまでに学習したデータとどの程度似ているのかに拠るんだと考えます。その辺は前処理なんかの領域かなと思います。例えば、正規化や対数変換なんかがその良い例の様な気がします。
脱線しました。つまり、誤差逆伝播法はモデルが学習するための過程で、学習はモデルの出力が安定するための処理で具体的には勾配降下法を使っているんだと考えます。一般的には学習の過程に、活性化関数、損失関数、最適化アルゴリズムなどが使われますが、今後、実装していきながら理解していければと考えています。もちろん、社会実装に応用出来れば更に良しです。
#関連
勾配降下法を可視化したい件
#試したいこと
確率的勾配降下法のメリットについて考えてみた@koshian2
確率的勾配降下法を図示して実装してくださっています。