遅ればせながら「ゼロから作るDeep Learning」を読んでみた。
以下、私的メモも兼ねて、読後感想を書いてみる。
(もし、記載に間違いがあれば、アドバイスを頂ければ、大変、嬉しい。)
1.総評
一言で言えば、かゆいところに手が届く本。他の本を読んでも、分らなかったことが、この本を読んで良く分った。買って読んで、金銭面でも時間面でも、無駄にはならない、と言える。ハッキリ言って、おすすめ。
2.以下、個人的メモとして、特に勉強になった点を記載する。
2-1.Python入門
ブロードキャスト
⇒NumPyではスカラ値が行列として扱われる。
2-2.パーセプトロン
XORゲート=排他的論理和(入力2つの内、どちらか一方だけが1なら、出力は1になる)
⇒パーセプトロンを2層にすれば実現できる。
2-3.ニューラルネットワーク
活性化関数
⇒ステップ関数(x≦0なら出力が0だが、x>0なら出力は1)
シグモイド関数(ステップ関数に似ているが、滑らかに変化するS字型の関数)
ReLU関数(x≦0なら出力が0だが、x>0なら出力はx、ヒンジ型)
非線形関数
⇒線形関数であれば、多層にする利点が生かせない。
例:y=cxを3層にした場合、y=ax(ただし、$a=c^3$)の1層と同じ。
行列の内積
⇒行列の行と列の隣り合う次元数が等しいことが必要。
A B = C
3x2 2x4 3x4
上の例だと、Aの列とBの行の次元数が共に2なので、内積が計算できる。
計算結果は、Aの行とBの列の次元数になる。
ソフトマックス関数の実装上の注意
⇒指数計算でオーバーフローが発生する。
ソフトマックスの分母分子で指数計算するので、定数を引いたり足したりしても結果は変わらない。
そこで、入力の最大値を引くことで、正しく計算することが出来る。
2-4.ニューラルネットワークの学習
なぜ損失関数を設定するのか
⇒認識精度はパラメータの微小な変化に反応しないから。
例えば、100枚中、32枚が正解の時、認識精度は32%。
パラメータを調整した結果、正解が33枚、または34枚になった時、認識精度は33%、または34%になるわけで、連続的には変化しない。
ところが、2乗和誤差、または交差エントロピー誤差を損失関数として設定すれば、パラメータの微小な変化に反応する。
数値微分
⇒誤差が含まれる。
誤差を減らすため、中心差分、つまり(x+h)と(x-h)での関数fの差分、を計算する。
通常の微分は、(x+h)とxの差分(前方差分)を取って計算している。
2-5.誤差逆伝播法
連鎖律
⇒複雑な計算も、掛けたり、足したり、二乗したり、自然対数計算したり、の合成になっている。その計算の一つ一つを微分すれば、複雑な計算全体の微分になる。
例えば、加算ノード(z=x+y)の逆伝播は以下の通り。
$\frac{\partial z}{\partial x}=1$
$\frac{\partial z}{\partial y}=1$
計算グラフを使いながら、数式を分解してみると良く分る。
Affineレイヤ(全結合層)
⇒入力に重みを掛けて、バイアスを加える。
Softmaxレイヤ
⇒入力された値を正規化(和が1になるように変形)する。
手書き数字の認識なら、入力は10個ある。
2-6.学習に関するテクニック
パラメータの更新手法
SGD(Stochastic Gradient Descent、確率的勾配降下法)の欠点
⇒勾配がy軸方向は大きく、x軸方向は小さいと(つまり、関数の形状が等方的でないと)非効率な経路で探索することになる。
関数の例:
$$f(x,y)=1/20 x^2+y^2$$
Momentum(モーメンタム、運動量)
⇒速度に似た概念を導入することで、物体が勾配方向に力を受け、その力で物体の速度が加算されたり、逆に、摩擦や空気抵抗に似た概念を導入することで、正と負の方向の力を交互に受ける。
結果的に、y軸方向の速度は安定せず、SGDに比べて、x軸方向へ早く近づき、ジグザグの動きを軽減する。
AdaGrad
⇒学習係数は最初、大きく、次第に、小さくする(減衰)。特に、よく動いたパラメータの学習係数を小さくする。
Adam
⇒MomentumとAdaGradを融合したもの。
重みの初期値
⇒活性化関数がReLUなら、Heの初期値
sigmoidやtanhなどのS字カーブなら、Xavierの初期値
過学習対策
⇒Weight decay(荷重減衰)
重みパラメータが大きな値になったらペナルティを課す。
L2ノルム、L1ノルム、L∞ノルム
Dropout
ニューロンをランダムに消去しながら学習する。
2-7.畳み込みニューラルネットワーク
畳み込み層
⇒画像は3次元(タテ・ヨコ・チャンネル)の形状であり、空間的情報を含む。その形状を維持しつつ、次の層にデータを出力する。
プーリング層
⇒タテ・ヨコ方向を小さくする。
学習するパラメータは無い。
チャンネル数は変化しない。
微小な位置変化に対してロバスト(頑健)。
1層目の重みの可視化
⇒エッジ(タテ・ヨコ・斜めなど)に反応する。
LeNet
⇒活性化関数に、ReLUではなく、シグモイド関数を使用。
サイズ縮小に、Maxプーリングではなく、サブサンプリングを使用。
AlexNet
⇒活性化関数はReLU。
局所的正規化を行う層(LRN、Local Response Normalization)がある。
Dropoutを使用。
2-8.ディープラーニング
層を深くする意義
⇒パラメータ数を少なくできる。
例えば、5x5の入力データを1x1の出力データに畳み込む場合、1層ならパラメータ数は25(5x5x1)になる。一方、中間に3x3の層を入れて畳み込めば、パラメータ数は18(3x3x2)で済む。
また、層を深くすることで、前の層では、エッジなどの単純な形状にニューロンが反応し、層が深くなるにつれて、模様や物体の部分などの複雑な形状にニューロンが反応するようになる。
3.最後に
本当に、良書だと思う。