ディープラーニング入門 Chainer チュートリアルの学習メモ

# ディープラーニング入門 Chainer チュートリアルの学習メモ
## 概要
**既にディープラーニングやChainerを勉強されている方向けの情報ではありませんので、ご注意下さい。**
私も勉強中ですので、聞かれても困るのですが。
ディープラーニングの勉強を何からやれば良いかとのご相談には、Preferred Networks, Inc.が公開されている[***ディープラーニング入門 Chainer チュートリアル***](https://tutorials.chainer.org/ja/)が非常に良いと思っていますので、ご紹介させて頂いています。

本記事は、Chainer チュートリアルに取り組む際、各章に取組む前に、読んで頂くことを想定して書いています。
その章で扱われている内容のディープラーニングでの役割などを記載しており、Chainer チュートリアル自体の解説ではありませんので、ご注意下さい。
**少しづつ追記していきます。**

## Chainer (チェイナー) とは
ディープラーニングに関する計算および学習を行うためのソフトウェア開発に利用可能なライブラリの名前。
オープンソースソフトウェア（プログラムが公開されており、開発に誰でも参加できるもの）ですが、日本の企業であるPreferred Networksの主導で開発が進められています。

## お勧めする理由
1. 日本語！
2. 入門者が基礎的な内容を理解するための教材であり、解説が丁寧
3. 実際にプログラムを動かして理解できる

## 以降は各パート毎の情報です。
厳密には間違いですが はじめての方にイメージして頂くならこの位かな？と思いながら記載している内容も多々あります、ご容赦下さい。

## 準備編
### 1. はじめに
#### 必要となる知識は数学とプログラミング
ディープラーニングはコンピュータで複雑で膨大な量の計算をすることで結果を得ます。
何を計算すれば結果が出るかの理論が**数学**です。
コンピュータに計算させるための手段が**プログラミング**です。

#### Google Colaboratory
Googleが無償提供するディープラーニングの学習環境。
Jupyter Notebookというソフトウェアが元になっています。
学校/会社/個人でGSuiteを使われている方は、**利用しているアカウントを間違えないようにする**ため、学習用のGoogleアカウントを新規に作成し、Chromeのシークレットタブでチュートリアルを進めることをお勧めします。
クラウド上で動作するサービス(外部のネットワークで処理される)ですので、企業や個人の情報は決して漏洩させないようにご注意下さい。

### 2. Python 入門
#### Python
ディープラーニングのために勉強するなら、Pythonのバージョン3系(バージョン3.?)です。
Python2系のサポート期限は2020年ですので、2系しか動かない環境以外では使う機会はありません。

なぜPythonかという点ですが、ディープラーニングの開発者が多く使っている・Chainerはじめ便利なライブラリが沢山ある・ディープラーニングの参考書や記事が多いため。
他の言語が得意な方も、Pythonを勉強する方が早いと思います。

### 3. 機械学習に使われる数学
用語が色々と出てきますが、今後の内容を理解するために重要なものばかりですので、覚えておいて下さい。
「微分」「線形代数」「確率・統計」をこれから学習される方は、ディープラーニングに関係する数学の分野として、この3つが特に重要な道具である事がイメージできれば良いと思います。

### 4. 微分の基礎
課題を数学で分析しようとしたとき、「変化する割合が最も大きい瞬間」や「最大値や最小値(変化の割合がプラスからマイナス、またはその逆)になる瞬間」がわかると大きな手がかりになります。
微分はそのような場合に、強力な道具になります。

身近な例では、「速度は位置の時間微分」(ある瞬間に位置が変化する量)、「加速度は速度の時間微分」(ある瞬間に速度が変化する量)になっています。

### 5. 線形代数の基礎
線形代数に出てくる**行列**は、そもそも連立方程式(数式)を簡単に書くために生み出された経緯があります。
ディープラーニングでコンピュータに計算をさせるときも、効率的に計算する事がとても重要です。
線形代数はそのような場合に、強力な道具になります。

身近な例では、画像を回転したり拡大する処理で使われています。

### 6. 確率・統計の基礎
イメージとしては。
確率はある出来事が起きる**割合**を、数字で示したり計算することです。
統計はある出来事が起きたデータから、現象の**分析**を行うことです。
統計で出来事の分析を行う場合、その出来事が起きる確率を考慮する事が重要になります。
確率と統計は関連が強い(同時に使う事が非常に多い)ため、まとめて説明されます。

ディープラーニングで確率・統計はとても重要です。
ディープラーニングをコンピュータで実際に計算する過程では、得られたデータがどのようなものか考えるため、実際に計算できる処理(数式)を検討するために、確率・統計を使います。
また、そもそも確率・統計だけで解決できてしまう問題を、認識できず、ディープラーニングで分析してしまうと無駄なコストを発生させてしまいます。

入門の今は理解する必要はありませんが、最尤推定を詳しく掘り下げるだけでも、ディープラーニングで非常に多くのサンプルが必要な理由や、最尤推定のアプローチが適していない問題(テーマ)かの判断ができるようになると思います。

## 機械学習とデータ分析入門
### 7. 単回帰分析と重回帰分析
蓄積したデータを分析する理由は、それで未来を予測できた結果、価値を生むと期待するからです。
たとえば、過去の顧客データを分析し、顧客の未来の購買行動を予測できれば、売上のUPという価値を生みます。
当然、増加する価値・売上に対して、データ分析にかかるコストが安ければ安いほど良いため、シンプルで効果的な分析手法はとても使い勝手が良いです。
その代表的なものが単回帰分析で、その応用（現実世界の出来事に適応し易くしたもの）が重回帰分析です。

### 8. NumPy 入門
どうしてPythonでディープラーニングをプログラミングするか？の理由は、プログラミングが楽だからです。
その1つはPythonがインタプリタ型言語（ざっくりいうと、書いたプログラムが1行づつ、順番に実行される）であり、データサイエンティストにとってもわかりやすい点です。
ただ、インタプリタ型言語は計算が遅くなる仕組みであり、膨大な計算が必要なディープラーニングでは計算が遅いことは致命的です。

NumPyは線形代数の計算を行うPython用のライブラリ（Pythonプログラムが簡単に記載できるようになるもの）で、内部での計算をPythonに比べ非常に高速なC言語というプログラム言語で行ってくれます。
Pythonの処理が遅いという弱点は、ディープラーニングで多用する線形代数の計算を高速に行えるNumPyを使えば解決できます。
別の言い方をすると、NumPyがわからないとPythonでディープラーニングの計算をプログラミングすることはできません。（それくらい大事）

### 9. scikit-learn 入門
SciPyは高度な科学/工学の分析処理を作成するためのPythonプログラム作成用のライブラリで、NumPyをベースに開発されました。
SciPyのToolkit（scikit）のMachine **Learning**用がscikit-learnです。

このチュートリアルではscikit-learnのライブラリを使えば簡単にプログラミングができることを紹介しながら、機械学習における分析作業の流れを解説されています。

### 10. CuPy 入門
NumPyでPythonの計算が早くなったとしても、もっと大量のデータを高速に計算する必要があることが多いです。
たとえば。
- 顧客の購買活動が悪くなることを予測できても、実際に売れなくなってから計算結果が出たら対策が間に合わず、マーケティングの役には立ちません
- 機械の故障を予測できても、計算が間に合わなければ、既に壊れてしまっています
- 自動運転で人が飛び出してくることが予測できても、計算が間に合わなければブレーキをかけるのは交通事故が起きた後です

分析（プログラム）が無駄なく十分考えられたにも関わらず、計算が間に合わないときは、処理が早いコンピュータ（演算装置）を使うしかありません。
CuPyは高速な演算装置であり、PCでは一般的なGPU（グラフィックボード※）をPythonの実行計算で利用し、計算を大幅に高速化するためのライブラリです。
※GPU：
一般的にはPCゲーム用途などPCでの映像処理用に利用される。
広く普及している製品で比較的安価なこと、映像描画が定型的かつ膨大な計算処理で、ディープラーニングの計算処理にも向いている。

### 11. Pandas 入門
PandasはExcelのような表や時系列のデータを行うのが得意なPython用のライブラリ（Pythonプログラムが簡単に記載できるようになるもの）です。
解析対象となる蓄積データはExcelのファイルだったりすることも多いのですが、Pandasを使うとExcelファイルやCSV形式のファイルを簡単にPythonプログラムに読込みし、表として表示、処理することができ大変便利です。

### 12. Matplotlib 入門
解析対象になるデータを入手したとき、分析してみたとき、グラフで表示してみることで、どのようなデータ/結果なのかを知ることが、大きな手がかかりになることがあります。
Matplotlibはデータをグラフなどで可視化することが得意なPython用のライブラリ（Pythonプログラムが簡単に記載できるようになるもの）です。

ColabでPythonプログラムを使って分析する際、ノートブックに処理の解説や結果（グラフなどで可視化）を追加しておくと後でわかりやすいものになります。
ただ、綺麗な思い通りのグラフを描くことに、こだわり過ぎない方が良いと思います。
高度な可視化は、商用のシステムでは、BIツールという種類の製品等で通常は開発し、Matplotlibでは行いません。

## ディープラーニング入門
### 13. ニューラルネットワークの基礎
どのようなものかを理解することは大事なのですが、**こう考えると上手くいくもの**だと思って、まずは試してみるのが良いと思います。
私が勉強をはじめたとき、解説本があまりなく、論文を読んで理論をまず理解しようとしたのですが、なかなか理解は進みませんでした。
その後に、実際にプログラムサンプルを写して実行してみたことで、少し理解できた気がします。

### 14. Chainer の基礎
Chainerは複雑なニューラルネットワークの構築が必要となるディープラーング※用のライブラリ（Pythonプログラムが簡単に記載できるようになるもの）です。
※例
音声認識、被写体の認識（画像に何が写っているか）、画像検索、線画自動着色（塗り絵をする）、自然言語処理（言葉を認識し処理する）

わからない用語は調べながら読み進めてみてください。
以下、難しそうなものだけ解説。

* Iris
  * Irisは花の名前（アヤメ、菖蒲、文目、綾目）ですが、ここでのIrisはディープラーニングの学習に利用できる、公開されているアヤメの花に関するデータ[Iris plants dataset](https://scikit-learn.org/stable/datasets/index.html#iris-dataset)のこと。
  * アヤメの花を1輪づつ計測したデータですが、実際は同じアヤメ科ではあるものの、品種が異なる花のデータとなっています。似ていて品種を見分けるのが難しい花のデータですので、ディープラーニングの題材として最適なことから、色々な説明に出てきます。
  * 英語の意味
    * Attribute：説明
    * sepal length：ガクの長さ
    * sepal width：ガクの幅
    * petal length：花弁の長さ
    * petal width：花弁の幅

* モジュール
  * この説明の中では、プログラム・ライブラリの一部、関数が集まったもの
  * ライブラリにあるプログラムが多いと、機能が似ていたり、特定の用途に使うものをまとめて整理しておくと使いやすくなるのでモジュールという単位にプログラムをまとめる。モジュールXXに属する（プログラムの）関数YY のように使う。

### 15. Chainer の応用
結果は信頼して使える精度（高い確率で正しい答えを出す）になるまで改善する必要があります。
**14. Chainer の基礎**で行ったディープラーニングの精度を上げる方法について代表的なものが解説されています。
これも理論的に理解することは大事ですが、**こうすると上手くいく（結果が変わり場合によっては上手くいかない）**ことがわかれば良いかと思います。

最適化手法を理解し、使えるようになると、解析する手法を何通りかで試せるようになります。
1つの最適化手法しか知らない/使えないより、精度の高い分析ができる可能性が高くなります。

### 16. トレーナとエクステンション
Chainerではニューラルネットワークのトレーニングを行うためのPythonプログラムを簡単に書くために、Trainerというクラス（作成するプログラムの定義）を提供しています。
端的に言ってしまえば、Trainerというクラスを利用できるようになると、プログラミングが簡潔（わかりやすい／間違えたりバグが起きにくい）なのに高性能なPythonプログラミングが作れるようになります。

プログラミングが簡潔（わかりやすい／間違えたり不具合が起きにくい）ことは高度でデータが大量にある分析ではとても重要です。
GPUを搭載した高性能なコンピュータを多数導入したり、同じ規模をレンタルして解析する場合、計算に必要なコスト（お金、時間）は高額です。
プログラミングが簡潔でなければ、不具合でとんでもないコストを使うことになりかねません。
また、学習の最中や、学習後にトレーニングがうまくいっているのかを上手く評価できたら、コストを抑えつつ効率的に分析を進めることができます。

以上