100日後にエンジニアになるキミ - 84日目 - プログラミング - 機械学習について9

昨日までのはこちら

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回は機械学習についてのお話の続きです。
ディープラーニングについて触れたいと思います。

## ディープラーニング(深層学習)について

初回で機械学習でできることについて解説していますが、機械学習でできることは
基本的には3つです。

・回帰
・分類
・クラスタリング

大まかに言うと`予測`になりますが何を`予測`するかと言う部分が変わります。

・回帰：数値を予測する
・分類：カテゴリを予測する
・クラスタリング：いい感じにする

機械学習ではこの、何かを予測する学習モデルというのが存在しますが
この学習モデルの1つに`ニューラルネットワーク`と言うものがあります。

### ニューラルネットワーク(NN)について

脳機能に見られるニューロンの特性を表現することを目指した数理モデルのことです。
脳っぽい構造をしています。

<img width="204" alt="スクリーンショット 2020-06-12 18.09.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/780a87a5-d4e4-2f49-d9de-657bd21cfc93.png">

構造としては入力層、中間層(隠れ層)、出力層に分かれています。

例えば、男性か女性か、性別を予測したいとします。
カテゴリ値を分類するモデルになり、入力層には説明変数の数値を与えます。
中間層でいい感じに計算したのち、結果として出力層では
男性0.XX,女性0.YYという感じの数値を吐き出します。

基本的には数値の大きさで判断することになるので
一番数値の大きなカテゴリが予測値になります。

これが`ニューラルネット(NN)`の仕組みで`ディープニューラルネットワーク(DNN)`となると
隠れ層が2層以上になります。

<img width="257" alt="スクリーンショット 2020-06-12 18.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/500c54ad-1b2c-94d9-14bf-15e64d728af8.png">

`ディープニューラルネットワーク`を用いた学習が`ディープラーニング(DL)`であり
`ディープラーニング(深層学習)`とは機械学習の中に含まれる形になります。

### ニューラルネットワークの仕組み

上記にある図のように、脳構造を模した形をしていますが、各ユニットの部分では
`活性化関数`と呼ばれる関数を用いた数値計算をしています。

<img width="220" alt="スクリーンショット 2020-06-12 18.19.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/8a22e23d-caf4-4453-b4c3-073435675d9e.png">

前の層から数値を受け取り次の層へ数値を受け渡します。
その際に用いる関数は次のようなものがあります。

`ステップ関数`:任意の閾値で0か1を返す
`シグモイド関数`:0から1の連続値を返す
`Relu関数`:0以上の時はその値、0未満は0を返す

このな感じの活性化関数を指定して多層の計算を行っていきます。

隠れ層を増やすことで高次元の表現が可能 学習データの加工や
特徴量を細かく指定せずにある程度の精度が達成できると言われています。

### ディープラーニングの欠点

通常のモデルではどの項目が寄与したのかなどを算出することができますが
ディープラーニングではそれが分かりづらいという点があります。

また、他のモデルに比べると計算量が多く、計算リソースを大量に消費します。
そのため、長大なデータを用いる場合に計算資源が多く必要になります。

### ニューラルネットワークの派生モデルについて

**畳み込みニュラルネットワーク(CNN)**

画像などの特徴を捉えるのに適したニューラルネットワークで
従来のネットワークに`畳み込み層`と`プーリング層`を導入しています。

`畳み込み`とはある関数を何らかの方法で別の関数に適用する数学演算で
`プーリング`とは数値データの中から1つの数値を取り出すことです。

この`CNN`は画像解析において高い性能を発揮してきました。

近年ではオブジェクト認識タスクにおいてほぼ人間レベルのパフォーマンスを達成していて
それらのエラー率は年々低下し続けており、現在の画像分類タスクでは
エラー率3％を下回る記録を出しています。

これは、同じタスクに対する人間のパフォーマンスよりもさらに
低い数字となっているので、人間の精度を超えています。

このように人間の精度を超える性能を引き出す可能性があるため
注目されている訳です。


## まとめ

非エンジニアの方がいきなりディープラーニングを理解しようとすると
なかなかハードルが高いと思います。

実装となると尚更です。

まずはざっくりとした仕組みと、言葉の意味を理解し
それができたら先に進めばいいと思います。

とりあえずのディープラーニング関連の言葉は抑えておきましょう。

君がエンジニアになるまであと16日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython