Help us understand the problem. What is going on with this article?

「ゼロから作るDeep Learning」を読んでみた!

More than 1 year has passed since last update.

遅ればせながら「ゼロから作る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.最後に
本当に、良書だと思う。

ka201504
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away