輪読会「ゼロから作るDeep Learning」第4回

はじめに

てくますプロジェクトでは、てくますゼミと呼ばれる輪読会を隔週で開催しています。

少人数であーだこーだ議論しながら、考える楽しさを分かち合う、ゼミのようなコミュニティです。主に、AIなどの「IT × 数学」領域について学習しています。

てくますゼミ(Connpass)

てくますゼミの風景

現在は「ゼロから作るDeep Learning」というディープラーニングの有名な本を読み進めています。

今回は本書第4回の輪読会ということで、5章を読み進めました!

本記事では、今回の勉強会で学んだことをざっくりと紹介していきます。

学習内容(5章)

前章のおさらい

ニューラルネットワークの学習では、勾配法を用いて、損失関数の値が最も小さくなる重みパラメータを探すのでした。

勾配法とは、グラフの今いる点の勾配(各重みパラメータによる偏微分係数を並べて出来るベクトル)に沿って下っていくことで、最小値を探す手法です。

前の章では、数値微分を用いて勾配を計算しました。しかし数値微分には、計算に時間がかかるという難点があります。そこで本章では微分の計算の工夫として、誤差逆伝播法を学びました。

誤差逆伝播法のこころ

例として、\(z=(x+y)^2\) を考えます。

この式は次のように分解できます。

\(z=t^2\)
\(t=x+y\)

求めたいものは、各パラメータ \(t, x, y\) を微小に変化させたときのzの変化率、
すなわち、\(\displaystyle\frac{\partial z}{\partial t}, \frac{\partial z}{\partial x}, \frac{\partial z}{\partial y}\) です。

\(z=t^2\) なので、 \(\displaystyle\frac{\partial z}{\partial t}=2t\) です。

\(\displaystyle\frac{\partial z}{\partial x}, \frac{\partial z}{\partial y}\) は連鎖律(合成関数の微分法)によって求めることができます。

\(\displaystyle\frac{\partial z}{\partial x} = \frac{\partial z}{\partial t} \cdot \frac{\partial t}{\partial x} = 2t \cdot 1 = 2t\)

\(\displaystyle\frac{\partial z}{\partial y} = \frac{\partial z}{\partial t} \cdot \frac{\partial t}{\partial y} = 2t \cdot 1 = 2t\)

\(\displaystyle\frac{\partial z}{\partial x}, \frac{\partial z}{\partial y}\) を求めるのに、一つ前で求めた \(\displaystyle\frac{\partial z}{\partial t}\) を用いています。

このように、後ろの層から微分の計算を行い、その計算を前の層で再利用します。これが後ろから計算する理由であり、逆伝播の名前の由来です。

逆伝播では、右から左へと信号を伝播させます。その際に、そのノードでの局所的な微分をかけ算して、次のノードに移動します。

前章では、\(\displaystyle\frac{\partial z}{\partial x}\) を直接、数値微分で計算しようとしていたのに対し、今章の誤差逆伝播法では、連鎖律を用いて後ろのノードから逐次的に計算しています。これによって微分の計算が効率的に行えるというわけです。

テキストではこの考え方を用いて、ニューラルネットワークを構成するレイヤ(ReLUレイヤ、Sigmoidレイヤ、Affineレイヤ、Softmaxレイヤ)の実装を行っています。それらについては頑張って計算していくのみですので、ここでは割愛します。

最後に

何となくでしか知らなかった「誤差逆伝播法」を今回学ぶことができて嬉しかったです。輪読会では、何のための「逆」なのかなどの話題で盛り上がりました。

本書の輪読会も残すはあと2回。少しゴールが見えてきましたね。

では、また!

本シリーズの記事はこちら

各ゼミの第1回記事はこちら