どうも、カタミチです。
さて、今日も「最短コースでわかる PyTorch&深層学習プログラミング」のひとり読書会、やっていきますかねー。
今日は…
1章の3節ですね。行ってみよう〜
1-3. 「合成関数」とPythonでの実装
まず「関数」とはなんぞや、という話がありました。何かを入れると何かが出てくるものだよー、ってやつですね。
\(f(x)=2x^2+2\)
こんなやつ。
で、Pythonでも同じように書けるよー、という話です。えい。
def行とインデントされた行が関数です。returnのところに式がそのまま書かれていますね。ちなみに「**」は「べき乗」を表してます。
で、「x=」以下の行が、実際に値を与えてみた結果になります。ここで使っているNumPyのarange関数は、それぞれの要素が等差数列になるような数値の配列を作ってくれるやつで、引数に(開始値, 終了値, 公差)を取ります。上の例だと終了値が「2.1」になっていますが、数列で取れた最後の数値は「2」になってますね。じゃあ終了値を「2」にすればいいじゃん、と思いきや、そうすると、結果に「2」が含まれないんですよね。どうやら、ちょうどその値になるやつは入ってこないようです。つまり、「2.1」は「2.0000001」とかでも良いって事になりますかね。
xを横軸に、yを縦軸に取ったグラフを書いてみると…
しっかり書けましたね。多少カクカクしてるのは、プロットしたのが17点だけだからですね。点の数を増やしていけば、もっと滑らかなグラフになります。
さて、関数がPythonで書けるようになったところで「合成関数」ですね。「合成関数」って言えばコイツ。
\( h(x)=g \circ f(x) \)
まぁ、今回は数式があんまり出てこない方針のようなので、こんな式は出てきてません。合成関数の考え方は「ディープラーニングの数学」にも出てきたので、個人的には半分復習って感じですね。(参考記事:【ひとり読書会】ディープラーニングの数学(第4回) - まったりAI勉強記)
さて、例題としてさっきも出てきた関数が使われています。
\(f(x)=2x^2+2\)
コイツを、無理やり分解して合成関数風味にしてみると…
\(f_1(x)=x^2 \)
\(f_2(x)=2x \)
\(f_3(x)=x+2 \)
「\(x\)を入力とした\(f_1(x)\)の出力を\(f_2(x)\)の入力とし、その\(f_2(x)\)の出力を\(f_3(x)\)の入力とすることで得られる\(f_3(x)\)の出力」と表すことができます。
ひとまずこの\(f_1(x)\)〜\(f_3(x)\)をPythonの関数で書いてみると…
こんな感じ。で、それぞれの関数をつなげた…
こいつが合成関数表現になりますね。
試しに、\(x=0\)を入れてみることにします。検算のために一番最初の式(\(y=2x^2+2\))に代入して手計算してみると\(y=2\)になるはずですが…
はい、なりましたね。
ついでに\(x=1\)なら\(y=4\)のはずですが…
はい、大丈夫そうです。
とりあえず、今後はこんな書き方の合成関数がよく出てくるらしいので、押さえておくことにしますかねー。
ということで
うん、この節は特に難しいことはないですね。合成関数をよく使うから、書き方に馴染んどいてねー、という感じですかね。
あと、グラフ書く時はNumPyのarange関数使うとプロットしやすいよー、というのも押さえておきますかねー。
ではまた。