良書「ゼロから作るDeep Learning -- Pythonで学ぶディープラーニングの理論と実装」を読む

#目的

「ゼロから作るDeep Learning -- Pythonで学ぶディープラーニングの理論と実装」
（2017年7月28日　初版第10刷発行, 発行所　株式会社オライリー・ジャパン）

この書籍は、かなりいい書籍だと思います。
しばらく、手元においておきたい書籍です。

パラパラと何度か眺めていて、気づいたことなどをここに記します。

以下の項目は、少し、参考になるかも。
  
- 勾配法が最小値にならない件:candy::candy: 
- ドット積とかの説明:candy:
- ReLU関数
- 階層構造による情報抽出:candy:
 
#ReLU関数
いまは、SigmoidよりReLU関数を用いるほうが良いみたいです。
p53引用
>シグモイド関数は、ニューラルネットワークの歴史において、古くから利用されてきましたが、最近ではReLU(Rectified Linear Unit)という関数が主に用いられます

[ニューラルネットワーク活性化関数SigmoidとReLUの関係](https://qiita.com/enoughspacefor/items/f9a64c18d2bd16226355)

#ドット積とかの説明

※こちら↓の記事のほうがわかり易いと思います、すみません、腕を上げました。
　[（深層学習で大切な内積。）内積、外積、ドット積、numpyのdot関数の関係について。スカラー積とかも。。](https://qiita.com/enoughspacefor/items/acf12541795f5a5b81a3)　
　　
ドット積は、内積とも呼ばれます。
だから、内積とかを調べていると、外積※の説明があり、https://qiita.com/enoughspacefor/items/f9a64c18d2bd16226355
この外積がかなりあさっての世界なので、混乱すると思います。
本書で必要なのは、乗算とドット積（内積）の２つです。

numpyの演算例を示します。

<pre>
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])

>>> a*b
array([ 4, 10, 18])

>>> np.multiply(a,b)
array([ 4, 10, 18])

>>> np.cross(a,b)
array([-3,  6, -3])

>>> np.outer(a,b)
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])
</pre>


引用：https://ja.wikipedia.org/wiki/クロス積
>ベクトル積（英語: vector product）とは、ベクトル解析において、3次元の向き付けられた内積空間において定義される、2つのベクトルから新たなベクトルを与える二項演算である。2つのベクトル a、b のベクトル積は a×b や [a,b] で表される。演算の記号からクロス積（cross product）と呼ばれることもある。2つのベクトルからスカラーを与える二項演算である内積に対して外積（がいせき）とも呼ばれるが、英語でouter productは直積を意味するので注意を要する。

#誤差逆伝搬法の説明の仕方

5章の誤差逆伝搬法の最初のページ（P123)に以下の記載があります。

>　誤差伝搬法を正しく理解するためには、２つの方法があると、筆者は（個人的に）考えています。ひとつは「数式」によって、もうひとつは「計算グラフ(computational grapf)」によって理解するものです。

この書籍では、後者を選択しています。
後者の方法で、順序よく説明されていますが、読み手が全体をうまく把握するのが、意外と難しいです。
部分、部分は、納得できますが、全体がうまく把握できない面があります。

前者の手段での説明で、かなーりわかりやすいページ（qiita)として、以下などがあります。
ご参考まで。

よく見られているようです。。。。
[誤差伝搬法をはじめからていねいに](https://qiita.com/43x2/items/50b55623c890564f1893)

#勾配法が最小値にならない件

4.4.1 勾配法(P106)において、以下の記載があります。

> 勾配の方向が必ず最小値を示すとはかぎらないにせよ、その方向に進むことで関数の値を最も減らすことができます。そのため、最小値の場所を探す問題--もしくは、できるだけ小さな値となる関数の場所を探す問題--においては、勾配の情報を手がかりに、進む方向を決めるべきでしょう。

ニューラルネットの学習において、一般的に、こんな感じで、最小値を探すことはあっさりあきらめる感じですが、
気になる方もいるかなと思い、メモしました。大体、いつもこんな感じだと思います。
⇒:exclamation:(自分なりの答えは、）**一つのパラメータに関して、それが、極所最小のようなところにつかまったとしても、かなり、多くの別のパラメータがあるので、そちら側でがんばるでしょう**と、理解しました。
参考：
https://qiita.com/enoughspacefor/items/eb659c62ecce9e5e1150
のYouTube1（第1回数理脳科学セミナー 「深層学習の源流と最近の理論の展望」 甘利俊一
https://www.youtube.com/watch?v=AVCjutAjtGs）
⇒⇒【著者の方へ】そんな感じであれば、そんな感じの説明を書かれたら、わかりやすと思います。

#誤記かな（チャンネルの件）

P241の末尾から次ページにかけて

>(畳み込み層のチャンネル数は、前層から順に、16、16、32、32、64

チャンネル数は、R、G、Bの3とかグレーの1とかじゃないんでしょうか？上記の値は、深さとか？

#階層構造による情報抽出

「より複雑で抽象化された情報が抽出される」との説明のところで、
以下が引用されています。

http://vision03.csail.mit.edu/cnn_art/index.html#v_single

<img width="717" alt="sample1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/0e4e82cd-0b84-24ec-e128-3664773d38e1.png">

Conv1のEdge+Blobまではイメージできますが、それ以降は、よくわからない、
言われるままという感じです。
**Conv3:Textureという説明は、相当、違和感がある**
（そもそも、この表示が何をどう見える形で見える状態にしているかにもよるが。。。）

p236の図7-26の説明として記載されている『何にニューロンが反応するか』についての説明を表にすると、

|層|説明|
|:---:|:---|
|1層目|エッジやブロブ|
|3層目|テクスチャ|
|5層目|物体のパーツ|
|(最後の）全結合層|物体のクラス(犬や車など）|
となっています。





理解しようとした場合、
以下のページの内容が充実しています。
[ディープラーニングの判断根拠を理解する手法](https://qiita.com/icoxfog417/items/8689f943fd1225e24358)

また、以下のサイトの説明が、なんとなく、納得感がある。
https://hazm.at/mox/machine-learning/computer-vision/keras/intermediate-layers-visualization/index.html

（出典：上記のサイト）
<img width="489" alt="tori.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/2bf3ec48-5545-ef0c-4c3e-a1f95a23c277.png">

特に、答えはないですが、以下の記事にもう少し、何か書きました。
[畳み込みニューラルネットワーク（CNN)の説明が煽りすぎでは？（1層目ぐらいしか成功していないのでは？）](https://qiita.com/enoughspacefor/items/02dc8d556b9db65d4ee6)

→上記のサイトで取り上げているGrad-CAMという技術。
　端的には、実際に動かしみると、なんとなく、だんだんいい気がしています。:candy:
 以下の記事を別途書きました。単に、結果を貼っただけですが。
 **見る価値があるかも。。。。**
　[Grad-CAMで、湖畔と谷とマッシュドポテト、構成と質感認識、VGG16の。](https://qiita.com/enoughspacefor/items/16cd85911017fb994138)

#うまく理解できない部分

8.1.3 層を深くすることのモチベーション　の項のP247において、
5x5の畳み込み演算と、3x3の畳み込み層を2回繰り返した場合とを比較し、パラメータ数が25(5x5)と18(2x3x3)で
少なくなっているとの説明があります。
この表題の中でかたるほど、大きな差でない気もしました。


#用語について（畳み込み）

畳み込みという用語は、よく耳にする用語ですが、
個人的には、どういうものか、正確に意識したことがありませんでした。
「畳みこむ」なので、本当に「畳む」様子をイメージしていました。

引用
https://ja.wikipedia.org/wiki/紙飛行機


<img width="288" alt="tatamu222.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/2ba7b43f-f580-0b7d-34ff-159e85a0617a.png">


正しくは、
Wikiなど参照するといいでしょう。
下記をみていて、重畳という言葉がありますが、畳むには、重ねる的な意味がありますね、
そういえば。

引用
https://ja.wikipedia.org/wiki/畳み込み

>畳み込み（たたみこみ、英: convolution）とは関数 g を平行移動しながら関数 f に重ね足し合わせる二項演算である。畳み込み積分、合成積、重畳積分、あるいは英語に倣いコンボリューションとも呼ばれる。 

![shiki_conv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/5de877a8-e9b3-ca1a-a1b3-bf05b39f25c3.png)

#用語について（inception）
inceptionは、このAI以外では、馴染みのない用語でした。
意味を調べましたが、特別な意味は、見つかりませんでした。以下の説明のように、「発端」とかの意味で、わりと、大人用の言葉という程度でした。

引用
https://www.eigowithluke.com/inception/
>「inception」とは、どういう意味なのでしょうか？　ネイティブにとっては、「inception」は相当難しい言葉です。「inception」という言葉の意味を知らないネイティブの高校生や中学生が多くいます。日本語では「始まり」、「開始」、「発端」という意味になります。英語では「beginning」、「start」、「genesis」という言葉が意味的に「inception」に近いですが、「inception」は日常英語ではそれほど使われていません。



#まとめ
この書籍は、気に入っています。

#関連（本人）
[ニューラルネットワーク活性化関数SigmoidとReLUの関係](https://qiita.com/enoughspacefor/items/f9a64c18d2bd16226355)
[畳み込みニューラルネットワーク（CNN)の説明が煽りすぎでは？（1層目ぐらいしか成功していないのでは？）](https://qiita.com/enoughspacefor/items/02dc8d556b9db65d4ee6)
[Google Lensはどんな技術でできているのか？GoogleだからTensorflow？GoogLeNet?](https://qiita.com/enoughspacefor/items/872c3c6f6ad25b6180bb)
:smile:[Grad-CAMで、湖畔と谷とマッシュドポテト、構成と質感認識、VGG16の。](https://qiita.com/enoughspacefor/items/16cd85911017fb994138)

#今後
また、何か関連する検討ができれば。
コメントなどあれば、お願いします。:candy: