【データサイエンス】ディープラーニング

# ０．はじめに																					
大学でデータサイエンスの講義を受講している者です。
あまりにも広範囲な分野であるため"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。
（齟齬がある場合はご指摘いただけると助かります。）

#### データサイエンス学習全体像
[【データサイエンス】概要](https://qiita.com/AkihideKato/items/9dbce22bd87a9c8a3989)
[【データサイエンス】人工知能](https://qiita.com/AkihideKato/items/6381dd320ead9f893577)
[【データサイエンス】機械学習](https://qiita.com/AkihideKato/items/1db3312e8038bd75e89b)
[【データサイエンス】ディープラーニング](https://qiita.com/AkihideKato/items/92b0fb83b35ec08c4e02)
[【データサイエンス】分析の分類・確率分布](https://qiita.com/AkihideKato/items/6fdca6e22f03f0b9f17c)
[【データサイエンス】探索的データ分析](https://qiita.com/AkihideKato/items/9485e3f9803b1e8fe785)
[【データサイエンス】統計的検定](https://qiita.com/AkihideKato/items/8ff1b9bada50491b017c)
[【データサイエンス】予測モデリング](https://qiita.com/AkihideKato/items/ce8e697546d0424bea46)
[【データサイエンス】自然言語処理](https://qiita.com/AkihideKato/items/e545f36e268605fce9a6)
[【アルゴリズム】パーセプトロン](https://qiita.com/AkihideKato/items/fc9a8205154fe9b3090f)
[【データサイエンス】機械学習における関数](https://qiita.com/AkihideKato/items/6ec3b59ff581e7e3c4ad)
[【データサイエンス】確率](https://qiita.com/AkihideKato/items/c099772dfca7546a6802)

# １．ディープラーニング歴史
1950年代ローゼンブラッドによる神経回路網モデルを提唱
1980年代入力層と出力層の間の隠れ層を作ったことにより学習能力が向上し再び脚光を浴びる
2012年Hintonらのチームによる``ImageNet``競技課題でトップを取った

# ２．ディープラーニングの概要
**深層学習のこと**
ニューラルネットワークを用いた学習手法であり、階層を深めたアルゴリズムのこと
**人間を上回る精度を達成し凌駕するところまで発展している**
非常に優れた性能を持ち様々なタスクで発揮する
入力層と出力層の間に多くの中間層が存在

### 2-1.中間層とは
中間層は畳み込み層であり``CNN``と呼ばれる
主に画像の処理が行われる

### 2-2.単一パーセプトロンについて
アルゴリズムのパーセプトロンについては別記事に記載

https://qiita.com/AkihideKato/items/fc9a8205154fe9b3090f

# ３．メリット・デメリット
**機械学習は準備が必要だがディープラーニングは
必要な情報（特徴量）を自らデータから抽出することが可能**	
人手を使い特徴を設計する必要が無い	
>例：画像のカテゴリーを判断する場合ラベル付けを行った画像を用意し
　　モデルに挿入するだけで判断が可能

その分データを用意するのが大変	
大規模のデータ・クラスターを扱うためコスト面に負担がかかる

# ４．関連知識
### 4-1.ニューラルネットワークとは
神経回路網モデルを数学を用いて表現したもの
教師あり学習のアルゴリズムのひとつ
入力層、中間層、出力層から構成されている
|名称 |用途 |
|---|---| 
|入力層 |外部から外部から入力されるデータを受け取る場所 |
|中間層 |情報伝達の処理を行う<br>ディープラーニングにでは畳み込みや次元圧縮など様々な用途を重ねる層 |
|出力層 |ニューラルネットワークが予測または分類するタスクの結果 |

#### 出力層について
**ニューラルネットワークは分類問題と回帰問題に大別できる**
- 分類問題：どのクラスに属するか分類する問題、恒等関数を用いる
- 回帰問題：ある入力データから連続的な数値の予測を行う問題、softmax関数をもちいる

#### 非線形関数を用いるのが基本
線形関数を用いた場合の特徴をここで挙げると
- **``関数を掛け合わせた場合、線形状に結局戻ってしまう``**										
- **``また線形関数だと多層にした意味がなくなってしまう``**										
- **``隠れ層のないネットワークとなってしまう``**
よって多様な表現は非線形関数でなければならない														

### 4-2.神経回路網モデルとは
脳の神経回路をモデルとしている
ニューロン特有の連結強化の特性を利用している
（単一/多層）パーセプトロンというモデルがある

### 4-3.神経細胞とは
ニューロンとも呼ばれる
「ニューロン同士が同時に発火するとその間の連結は強化される」byヘッブ学習規則

- ##### 特徴
神経細胞の構造は「細胞体」「樹状突起」「軸索」からできている

- ##### シナプス
軸索の先端と神経細胞の接続部分の名称

- ##### 発火
細胞膜の内外は膜電位という電位差（電圧）があり通常一定に保たれている
外部がらの刺激により膜電位が上昇し正常値に戻る
この現象の事、興奮とも呼ばれる

- ##### 閾値
発火する臨界（物体が変化し異なる状態になる境界）の電位の値

### 4-4.単一パーセプトロンとは
- ##### 特徴
ヘッブの学習規則の考え方を取り入れた学習モデル
人工的神経回路網モデルと呼ばれる

- ##### 一連の流れ
入力～出力が同時に発火した場合その間の重みを上げる
（これは「入力～出力が予期したものであったならば・・」と捉えてばよいと思う..）
「予期したものであれば別の学習方法を試す」るようなイメージ

- ##### 結果
全て入力層×重みを加算し結果を出す
最終的な結果は定義による
別記事「単一パーセプトロン」においては0か1を出力としている

- ##### 閾値を使用
利用することで発火した有無を判断する
学習の材料となる、有のケースが多い場合は精度が高くなる

- ##### 重み
学習した知識は重みの中に蓄えられる
重み単体を見ても簡単に理解することはできない

### 4-5.多層パーセプトロンとは
単一パーセプトロンにさらに複数の階層を加えたもの
複数層を組み合わせることにより多くのパターンを実現をすることが可能
バックプロパケーションを用いる場合がある

### 4-6.畳み込みとは
一次元の配列２つを用いてそれぞれ重なった配列同士の計算をし一本化すること
イメージとしては一次元の配列は固定、もう一方は1マスずつズラしながら重ねていき計算をしていく
##### 処理イメージ
Fを固定しGをひっくり返し左側からスライドをし計算をする、その計算結果をCとする

##### スキャンのような処理が可能
二次元の配列に置き換えて畳み込みを行う
スキャンをするような処理が可能、エッジの取り出しともいう
イメージとしては3×3=9マスあるうちの1マスを使用し畳み込みを行う
そうすることでエッジに相当する部分の情報を取り出すことができる

##### 畳み込みニューラルネットワーク
2次元のまま入力することができるニューラルネットワーク	
画像の認識は縦横の2次元と色彩情報を入れると3次元となる	
通常のニューラルネットワークは2次元の情報を1次元に変換する必要がある	
2次元のまま入力し出力できないか考えられたのがCNN	

### 4-7.バックプロパケーションとは
入力～出力の直接の関係を求めることはできない
入力～中間層の「重み」をかけたことにより出力が算出される
誤差を足したものが許容範囲かどうか判断する、満足いかない場合は
出力～中間内の重みの調整、中間～入力の重みの調整を行う
このように後方へ伝搬し調節していること
応用例としてRNNがある

### 4-8.RNNとは
ひとつ前の層に新たにコネクション（図で言う矢印、連結）を作り
時間の流れをシュミレートし時系列のデータを扱うことができる
音声処理やテキスト処理などに用いられる
過去の情報が新しい情報にどれくらいの影響があるのか重みを学習する

### 4-9オートエンコーダ											
ニューラルネットワークの一つ										
教師なし学習の手法として広く利用されている										
勾配消失を避けることができる										
入力データをエンコード（圧縮）してからデコード（再構築）することで、入力データの表現を学習することを目的としている										
講義資料内では可視化層に4つデータがあり隠れ層には3つのパラメータがある							
**この4つを3つに次元圧縮しているのがオートエンコーダ**									

# ５．応用例
- ### 5-1.応用例1
簡単な例題
性質上天候を予測するのは極めて難しい
そこで4名の体験談をもとに予測をしてみる
||予想値|
|---|---|
|**A**|個人の感情で予報をする|
|**B**|論理的な予報をする|
|**C**|ランダム性のある予報をする|
|**D**|観測理論で予報をする|


ここでのポイントは
**「みんなの予測を合わせると良い結果が得られるかもしれない」という点**

- ### 5-2.応用例2
#### Cifar-10プロジェクト
Python内のデータセット
10個のカテゴリーごとの画像とそれについての答えがある
訓練用(trany)、テスト用(testy)それぞれ50000枚、10000枚学習させる様子を見ていく

- ##### ライブラリ
**Tensorflow**
中間層を含むニューラルネットワークを構築することができる

- ##### 手順
```mermaid
flowchart  LR
  データ読み込み-->データ確認;
  データ確認-->モデル設定;
  モデル設定-->学習と評価;
```
##### データ確認
9枚の画像を取り出しtranyの配列から番号を照らし合わせ確認する

##### モデル設定
中間層で以下の工程を行う
- ``畳み込み``
- ``次元圧縮``
- ``一次元の配列にする``
- ``全結合``

##### 学習結果
||用途 |上図（損失の割合） |下図（精度の割合） |
|---|---|---|---| 
|**青色** |訓練用データ|下降している|上昇している|
|**黄色** |テストデータ|上昇している|**0.6まで上昇したが上がらない**|

##### 学習評価
上図40付近で過学習が発生する
訓練用（青色）は全て学習してしまいテスト用（黄色）が学習の知識として蓄積されない状態
試験学習の学生が過去問の問題を覚えてしまって既存の問題に慣れてしまっている様子
つまり**新しい課題のテストデータの結果・精度が低い状態となっている**

##### 改良
conv2d（畳み込み）×２、MaxPooling（次元圧縮）をそれぞれ2セット追加する		
精度向上は見られない		
訓練データを丸ごと暗記しているような状態の為、量を減らしてあげている		
関数dropout()を使用、過学習を減らす目的と考えられる
対策のため間引きをする		

##### 間引きとは	
解像度を下げる、ここでは打ち止めさせるような意味合い

##### 再評価
精度が向上する
画像を準備して読み込ませて検証させる

##### 検証後
課題として、改良をすることでさらに精度の高いものにすることができる			
- **重みを抑制する**	
大きくなり過ぎないように管理する	
			
- **データの補強をする**		
訓練データをcopyしランダムな修正を加える	
例として画像を縦横に10%シフトするといった操作を行う