ゼロから作るDeep Learning 自然言語処理編を理解する Chap1

# 概要
本記事では，[ゼロから作るDeep Learning 自然言語処理編](https://www.oreilly.co.jp/books/9784873118369/)を理解することを目指し，その箇所の引用・自分なりに大事だなと思ったこと・感想などをまとめていきます．(知識不足な所も多々ありますが，温かい目で見守って頂ければと思います)

「ゼロから作る」というだけあって，プログラムを組みながら学んでいきたいと思いますが，公開されていないプログラムまで引用するのは避け，本記事では割愛させて頂きます．

一方で，Githubに公開されているプログラムもある為，こちら[deep-learning-from-scratch-2](https://github.com/oreilly-japan/deep-learning-from-scratch-2)は参考になるかと思います！

今後の記事はこちらから
[２章：自然言語処理と単語の分散表現](https://qiita.com/peartrees/items/ce08ccf355f910bf000a)
[３章：word2vec](https://qiita.com/peartrees/items/c75e67d19e5507005f07)




本記事では，書籍における1章を扱います．


# Chap1 - ニューラルネットワークの復習(pp.1-55)
## 1.1 数学とPythonの復習
基本的な数学の知識確認とNumpy, Pandas等のPythonライブラリの復習を行います．特に気になった点をまとめていきます

### ・テンソルとは？

> ベクトルや行列を拡張してN次元の数の集まりと考えることができます．これは一般的に**テンソル**と呼ばれます (from p2)

ここで本書で初めて**テンソル**という概念を扱うわけですが，NNのみならず，機械学習全般で頻出の概念になる為，この際にしっかりと理解してみたいと思います．

テンソルと合わせて考えたいものが，**スカラー**，**ベクトル**，**行列**になります．
スカラーとは，**0次元の配列**，ベクトルとは，**１次元の配列**，行列とは，**2次元の配列**で次元が上がっていきますが，これらは全てテンソルの一部になります．
どういうことかと言いますと，スカラーは**０階のテンソル**，ベクトルは**1階のテンソル**，行列は**2階のテンソル**・・・のように表されます．

まとめると，テンソルとはスカラー，ベクトル，行列といった考えを包括する概念になります．


### ・Numpyにおけるブロードキャストとは?
> 10というスカラ値が２×2の行列に拡張されて，そのあとで要素ごとの演算が行われます．この賢い機能は**ブロードキャスト**と呼ばれます (from p5)

実際には行列に変換されて演算が行われているという点に注目ですね

### ・行列の積
> 行列の積などの計算では，行列の形状に注目し，その推移を見ていくことが重要です （from p8）

これはその通りですね．ニューラルネットでは，各層で次元が推移していくので，今いる層において次元がどうなっているのかは確実に抑えておきたいところです．

<br>

## 1.2 ニューラルネット（NN）の推論
入力からどういった計算を経て出力に至るのかがまとめられています．
NNの推論の流れを抑えること，それをどうやって実装するのかを理解することがゴールになります．


### ・ミニバッチとは?
> NNの分野では，複数のサンプルデータ ー これを「ミニバッチ」と呼びます ー に対して一斉に推論や学習を行います （from p11）

全体のデータ数をNとした時に，k個(1<k<N)のサンプルデータを入力すること
ミニバッチを用いて学習を行うことを**ミニバッチ学習**と呼び，ミニバッチ学習以外の学習法として，**バッチ学習**, **オンライン学習**などがあります．

### ・活性化関数について
> 全結合層による変換は「線形」な変換です．これに「非線形」な効果を与えるのが活性化関数です （from p12）

NNがなぜ注目されるかというと，他の線形モデル（回帰など）とは異なり，非線形な活性化関数を用いることで表現できるパターンが無数にある為です．活性化関数の中には，入力として実数を受け取り，**0~1**の実数を返すという特徴がある，**Sigmoid関数**や，**-1~-1**の実数を返しその結果を確率として解釈できる，**Softmax関数**などがあります．

### ・順伝播と逆伝播について
> NNの推論で行う処理はNNの順伝播に相当します．
（中略）
後ほど，NNの学習を行いますが，そこでは順伝播とは逆方向にデータ（勾配）を伝播します．それを**逆伝播**と呼びます （from p14）

順伝播は，各層における重みとバイアスを元に出力の計算をします．そのため，順伝播は結果の推論時に行うものです．
一方，逆伝播は，各層の重みとバイアスを決める為に，結果側から入力側へと勾配を伝播させます．そのため，順伝播はNNの学習時に行うものです．
この2つの考えはNNを扱う上で当たり前の知識ですが，違いと目的をはっきりとさせておくことが重要になります．

<br>

## 1.3 NNの学習
NNにおける学習が如何にして行われるのかを理解することがゴールになります．誤差逆伝播法から重みの更新の流れまで扱います．
この章で最も重みが大きい単元になります．

### ・損失関数
> NNの学習には，学習がどれだけうまくいっているかを知るための「指標」が必要になります．それは一般的に損失と呼ばれます．
(中略)
NNでは，損失を求めるために損失関数を使用します (from p.p 18-19)

一般的に，推論時の誤差が小さいモデルが良いモデルとされます．そういったモデルを構築する際に目指すものの1つが，学習時の**損失の最小化**になります．損失を求める為に損失関数が使用されます．他クラス分類では損失関数として，**交差エントロピー誤差**がしばしば用いられ，NNの出力ラベルと教師ラベルから求めます．

### ・計算グラフ
> 計算グラフを使えば，計算を視覚的に把握することができます (from p24)

計算グラフを構築している演算ノードには加算ノードや，乗算ノード，Repeatノードなどがあり，隠れ層ではこれらのノードを組み合わせた演算を行なっています．

### ・確率的勾配降下法(SGD)
> 重みの更新法の1つ． 
(中略)
ランダムに選ばれたデータ（ミニバッチ）に対する勾配を用いる　（from p40）

全体のデータからランダムに(確率的に)選ばれたデータに対する勾配を使って，重みを更新する手法です．
誤差逆伝播法で得られる勾配は，ある時点での重みパラメータにおいて，損失を増やす方向を指します．それとは逆方向の勾配を設定することで，損失を減らす向きのパラメータが得られるというアイデアになっています．
SGD以外にも，**AdaGrad**や**Momentum**といった勾配降下手法があります．

<br>

## 1.4 NNで問題を解く
簡単なデータセットを使って，NNの学習を行います．
~~損失が実際に減っているのを可視化，実感し，感動することがGoalになります~~
ここでは，NNにおける各種パラメータをまとめてみたいと思います．

### ・Epoch
> epochは，学習の単位を表します．１epochは，学習データを全て見た時（データセットを１周した時）に相当します （from p.p 46）

1epochで全てのデータが学習に使われるんですね．

### ・Batch Size
batch sizeは全体のデータを分割して得られたサブセットに含まれるデータ数です．

### ・Iterations
データが少なくとも1回は参照されるのに必要な学習回数です．
batch sizeが決まれば，こちらの値も自動的に決まります．
e.g.) data size = 1000, batch size = 250 → iterations = 4

### ・Learning Rate
learning rateは，1epochで進む学習スピードを表します．大きければ，損失の減少は早いですが，最適解が必ずしも得られるとは限りません．一方で小さければ最適解が得られる可能性は高まりますが，収束に時間がかかります．

本節では，[こちらの記事](https://towardsdatascience.com/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9)を参考にしました．

<br>

## 1.5 計算の高速化
NNの学習や推論では，多くの計算がなされ，いかにして計算を効率的に行うか，高速に行うかは永遠のテーマになっています．本節では，NNの計算時にできる工夫を理解することがGoalになります．

### ビット精度
> Numpyでは標準で64bitの浮動小数点数が使われます．しかし，NNの推論及び学習は，32bitの浮動小数点数で問題なく（認識精度をほとんど落とすことなく）行えることが知られています (from p.p 51)

NNでは，64bitほどの精度が必要とされないんですね．

### GPU
書籍では，NumPyと共通の機能を持ったCuPyが紹介されています．

<br>

## 1.6 本章のまとめ
書籍では，本章で扱ったことのまとめを行っています．

---

# Chap1のまとめと所感
自然言語処理を扱いたいと思っても，NNの知識がなければ何も始まりません．
そうした中で，本書ではNNの概要，プログラムから抑えてくれたので，これまでの知識に不安があっても，復習した上でNLPの世界に入ることができるなあと思いました．
(早速，名著の匂いがしています)

次節では，Chap2を扱いたいと思います!
それでは，次章でお会いしましょう👋