まったりAI勉強記

AI(人工知能)について、特にゆかりがあるわけでもない社会人が、まったりとAIについて勉強していく勉強日記です。

【ひとり読書会】ディープラーニングの数学(第19回)

どうも、カタミチです。

さて、今日も「最短コースでわかる ディープラーニングの数学」のひとり読書会、やっていきたいと思います。

さて、引き続き「線形回帰モデル(回帰)」の続きですね。今日はいよいよ、勾配降下法の適用です。

 

7-8. 勾配降下法の適用

f:id:feh_asama:20220328145433j:image

これまでに準備してきた道具を集合させて、いよいよ勾配降下法の完成です。最後に適用するのは、学習率\(\alpha\)です。学習回数\(k\)回目のパラメータ値が分かっている場合の\(k+1\)回目のパラメータ値を求めるための式は…

\( \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} -\frac{\alpha}{M} \sum_{m=0}^{M-1} yd^{(k)(m)} \cdot \boldsymbol{x}^{(m)} \)

になります。

…文字の右肩に付いてる文字が2種類になって混乱しそうですが、\(k\)が学習の繰り返しの回数\(m\)がデータ系列のうちm番目であることを示しているとのことです。なるほど…、とりあえず、学習の繰り返し回数とデータ系列のインデックスはズレるってことですね、ふむふむ。

で、上の式に出てきた\(yd^{(k)(m)}\)は…

\(yd^{(k)(m)} = yp^{(k)(m)}-yt^{(m)}\)

ってことになりますね。\(yt\)は正解値なので、学習の繰り返し回数\(k\)は関係ない…と。さらにココに出てくる\(yp^{(m)}\)は…

\(yp^{(k)(m)} = \boldsymbol{w}^{(k)} \cdot \boldsymbol{x}^{(m)}\)

ですね。学習対象の\(w\)には繰り返し回数\(k\)だけが係り、入力変数\(x\)にはデータ系列の\(k\)だけが係る…と。

これで準備完了。ということで、これらをプログラムで実装して動かしてみるようですね!

 

7-9. プログラム実装

f:id:feh_asama:20220328145444j:image

さて、ひとまず本書で示されているとおりのコードを、今のところの私のPython実行環境であるColaboratoryに突っ込んで実行してみると…

 

実行できました!(そらそうやろ)

 

…まぁ、数学的な説明はすでに前節で終わっているので、この節の目的は「理解を深める」ってことになりますね。ちなみに本書の巻末には「Jupyter Notebook」を実行環境として構築する手順も示されているので、Python実行環境の作成で迷子になるってことは無さそうですね。

ちなみに、Pythonの文法についての深い説明は本書には書かれていないので、Pythonの書き方が全く分からない場合は、少し勉強してから戻ってきたほうが良いかもしれないですねー。

一応私は、上から順にコードをゆっくり読み込んで、ひとつひとつの意味を理解しながら進めました。しかし、本当の意味で理解するためには、しっかり自分で例題を解いてみたほうが良い気がしますね。いずれにしても、私としては初めてマトモに機械学習のモデルをPythonの実装で触れることができたので、色々と学びを得ることができました。

とりあえず、今回の例題で使う「The Boston Housing Dataset」のデータはどこから持ってくるんだろ?というところが最初の疑問だったんですが、これは「scikit-learn」ライブラリに含まれているってことで、それほど色々考えなくても取り込めるというところで、安心しました。

あと、計算の中心となる内積は「@」を使うと便利だよー、ってことや、Numpyのonesを使って、重みの初期値を一気に「1」としてセットするというあたりも興味深かったです。ちなみに、重みの初期値は1にすることが多いんですかねー(ふむ)

勾配降下法の式に出てくる\(\sum\)の部分については、Pythonによる内積計算の表現をうまく使うことで、非常にシンプルに書けることも分かったので、今後ともうまく活用していきたいですねー。

ほかにも、値の成形や中身の確認方法、グラフの描画などもコードで書かれていたので、少なくとも今回出てきたものは頭に入れておこうと思いました。

また、今回、ハイパーパラメータである学習率は\(\alpha=0.01\)で設定されていましたが、せっかくコードを書いてるので、この数値を変えるとどんな感じになるのか?を見てみたいと思いました。

横軸に「繰り返し回数」、縦軸に「損失関数値」をとった学習曲線が示されていたんですが、このグラフが学習率によってどう変わるのか?を見てみたいと思います。ちなみに、この学習曲線ってやつ、G検定の勉強のときにも出てきましたね。さて、どんな感じになるのかなー。

まずは、学習率\(\alpha=0.01\)の曲線。

こんな感じですね。繰り返し回数が20,000回の辺りで、だいたい良い感じになってる…気がしますね。それにしても、今回のような簡単なケースでも万単位の繰り返し回数が必要…ってことなんですねー。

次に、学習率を2倍の\(\alpha=0.02\)にしてみた場合の学習曲線がどんな感じかというと…

どん!

ふむふむ、およそ半分の10,000回あたりで落ち着いてきてますね。なるほどー。

ついでに、最初の学習率の10分の1である、\(\alpha=0.001\)にしてみるとどんな感じになるでしょうか。見てみましょう。

どん!

おー、50,000回繰り返してもまだ不十分…って感じがありますねー。何となく、学習率の違いってやつが肌で体感できました。

 

ということで

実際にデータを使っての初めての演習でしたが、コードを少し変えて再実行する…ってことをやるだけでも結構楽しいですね。まぁ、線形回帰分析は勾配降下法を使わなくても解析解を求めることができる…ってことなので、今回のようなアルゴリズムが実際に使われることはないんでしょうねー。

さて、線形回帰モデルの章も残すところあと1節です。次は「重回帰分析」の実装です!

 

ではまた。