らんだむな記憶

blogというものを体験してみようか!的なー

DeZero で眺める自動微分 (3)

DeZero で眺める自動微分 (2) - らんだむな記憶 の続き。
結局のところ、出来上がったプログラムを解析するというのは結構難しい。プロジェクトに途中から参加した場合、使われている技術がどれだけ初等的なもので構成されていても、やはり理解にはかなりの時間がかかるのと同じようなものだ。

ということで、少し前から GitHub - oreilly-japan/deep-learning-from-scratch-3: 『ゼロから作る Deep Learning ❸』(O'Reilly Japan, 2020) を書籍の沿う形で “写経” している。通常は “写経” には否定的なスタンスであるが、今回は大いに効果があるように感じる。インクリメンタルにスクラッチで DL フレームワークを作っていく形なのでよく理解できる。❶と❷では仕組みを numpy を使ってなぞっていくような形式であり、ロジックについて追いかけていけた。それはそれで良いのだが、必要なオブジェクトや責任といったものは少し見通しが悪かったかもしれない。❸では要するに「変数」とか加減乗除といった「演算」といった概念がクラスとして抽出され、必要な責任が実装される。これは要するに “$x^2 + x^3$” を数式としてストレートに解釈するというわけではなく、実数とか複素数といった対象と(その対象に対して可能なように定義された)演算の観点から見直すということである。そういったものが持つべき性質や責任がクラスの形で実装される。結果、全体としての数式としての流れは見通しが悪くなるが、微分の連鎖律の各項、つまり $\frac{dy}{dx} = \frac{dy}{da} \cdot \frac{da}{db} \cdot \frac{db}{dx}$ における $\frac{dy}{da} $ や $\frac{da}{db}$ や $\frac{db}{dx}$ に集中することができる。

どちらが優れたアプローチというわけでもないが、両方やっておけば理解は深まるだろう。