学習記録(26日目)
勉強開始:12/7(土)〜
教材等:
・大重美幸『詳細! Python3 入門ノート』(ソーテック社、2017年):12/7(土)〜12/19(木)読了
・Progate Python講座(全5コース):12/19(木)〜12/21(土)終了
・Andreas C. Müller、Sarah Guido『(邦題)Pythonではじめる機械学習』(オライリージャパン、2017年):12/21(土)〜12月23日(土)読了
・Kaggle : Real or Not? NLP with Disaster Tweets :12月28日(土)投稿〜1月3日(金)まで調整
・Wes Mckinney『(邦題)Pythonによるデータ分析入門』(オライリージャパン、2018年):1/4(水)〜1/13(月)読了
・斎藤康毅『ゼロから作るDeep Learning』(オライリージャパン、2016年):1/15(水)〜
『ゼロから作るDeep Learning』
ニューラルネット、そしてAI研究のブレークスルーとなったディープラーニングについて理解を深めておきたかったため、昨日から読み始めました。
p.122 第4章 ニューラルネットの学習 まで読み終わり。
1章 python入門
・基本的に今までやってたことのおさらい(Python概要、環境構築、算術平均 etc)
本書を読み進めていくための必要な知識概要を記した章
ちょっと理解が足りてなかった部分のみ記載
・ブーリアン(bool):True or False のどちらかを取る型
and, or, notといった演算子を用いることができる。
class クラス名:
def __init__(self, 引数, …): #コンストラクタ
...
def メソッド名1(self, 引数, …): #メソッド1
...
def メソッド名2(self, 引数, …): #メソッド2
...
#コンストラクタは初期化用メソッドとも言う。
2章 パーセプトロン
・パーセプトロンとは、60年程前からあるアルゴリズム(1957年に考案)
ニューラルネットワーク(ディープラーニング)の起源である。
・パーセプトロンは複数の信号を入力として受け取り、一つの信号を出力する。
パーセプトロンの信号は「流すか流さないか」(1か0か)の2値の値
複数ある入力信号のそれぞれに固有の重みを持ち、大きいほど対応する信号の重要性が高くなる。入力信号の重要度をコントロールする値。
・「入力」「重み」「出力」の他に、「バイアス」という要素がある。
バイアスは出力信号が1を出力する度合い(ニューロン発火)を調整するパラメータのこと。
・パーセプトロンは線形であるがゆえに排他的論理和(XOR)のような分類は実現できない。(パーセプトロンの限界)
ただし、パーセプトロンは"層を重ねる"ことができるため、重ねることで非線形も表現ができるようになる。(なので上記を正確に言うと"単層"パーセプトロンの限界)
3章 ニューラルネットワーク
・理論上パーセプトロンはコンピュータも表現できるほど可能性を秘めているものの、期待する入力と出力を満たすように適切な重みを決める作業は人の手で行わなければならない。
ただし、ニューラルネットワークはこの問題を解決するための手段の一つで、適切な重みパラメータをデータから自動学習できる性質がある。
・ニューラルネットワーク(パーセプトロン)では、入力に重みをつけ、バイアスをかけて、これら入力信号の総和を活性化関数(activation function)にかけて変換し出力している。
・活性化関数とは閾値を境にして出力が切り替わる関数で、ステップ関数や階段関数と呼ばれている。パーセプトロンではステップ関数を用いている。
・ニューラルネットワークでは、活性化関数にシグモイド関数(sigmoid function)を用いている。
シグモイド関数はステップ関数と比較すると滑らかな曲線であり、入力に対して連続的に出力が変化する。
この滑らかさこそがニューラルネットワークの学習の元となっている。
重要であれば大きい値を、そうでなければ小さい値を、どんなに大きい値でも出力を0〜1の間に押し込めるという特性は共通している。
・最近はシグモイド関数のほかにReLU(Rectified LinearUnit)というものも多く用いられている。
・一番最後の出力層で用いる活性化関数はタスクによって使い分ける必要がある。
一般的に、分類問題(どのクラスに属するか当てる)ではソフトマックス関数を、回帰問題(数字を当てる)では恒等関数を用いる。
・恒等関数は出てきた値をそのまま流す。
ソフトマックス関数は問題に対して確率的(統計的)な対応ができるようになるのが特徴で、出力の総和は1になる。(つまり、a=0.2, b=0.5, c=0.3であれば、aの確率が20%、bの確率が50%、cの確率が30% という形でとらえることができる。)
・クラス分類における出力層のニューロンの数は、分類したいクラスの数に設定するのが一般的。(0~9の数字のどの数字に属するか当てる問題であれば10に設定)
・まとまりのある入力データをバッチ(batch)と呼ぶ。束という意味がある。
バッチ単位で推論処理を行うことで、計算を高速化できる。
4章 ニューラルネットワークの学習
・「学習」とは、訓練データから最適な重みパラメータの値を自動で獲得することを指す。
この学習を行えるようにするために、**「損失関数(loss function)」という指標を導入する。
損失関数を基準として、この値が最も小さくなる重みパラメータを探し出すことが学習の目的となる。
・ニューラルネットワーク(ディープラーニング)は与えられたデータをただひたすらに学習し、パターンを発見することを試みる。
対象とする問題に関係なく、データをそのままの生データとして"end-to-end"で学習することができる。
・2乗和誤差(mean squared error):最も有名な損失関数。
出力と正解となる教師データの各要素の差の2乗を計算し、その総和を求める。
・交差エントロピー誤差(cross entropy error):上記に次いでよく用いられる損失関数。
出力と正解ラベルを乗じたものの総和を計算する。ただし正解ラベルはone-hot表現(0か1か)で表されているため、実質的には正解ラベルが1に対応する出力の自然対数を計算するのみとなっている。
・すべてのデータを対象として損失関数を求めるのは時間がかかるため、ミニバッチと呼ばれる小さなかたまりを取り出し、このミニバッチごとに学習を行うのが基本。(統計の勉強中に似たような話を見た気がする。)
・重みパラメータを少し変化させたときに、損失関数がどのように変化するかを計算し、より小さな損失となる場所を探すのが学習の目的。
ここで微分(勾配)という考えが出てくる。
シグモイド関数の微分はどの場所であっても0にならないことが、この学習において重要な性質となる。
・微分とはある瞬間の変化の量を示したもの。
微小な差分によって微分を求めることを数値微分(numerical differentiation)と呼び、こちらを主に用いる。
微小な差hは 1e-4(10の-4乗,0.0001) がよいと言われている。
一方、数式展開によって求めることは解析的(analystic)微分と呼ばれている。
・すべての変数の偏微分をベクトルとしてまとめたものを勾配(gradient)と呼ぶ。
この勾配が示す方向こそが、各場所において関数の値を最も減らす方向であり、これをうまく利用して関数の最小値を探そうというのが勾配法と呼ばれている。
・勾配法を数式で表す際、1回の学習でどれだけ学習するか、どれだけパラメータを更新するか、という量ηを定める。これを学習率(learning rate)という。
・学習率のようなパラメータをハイパーパラメータという。これはニューラルネットワークが自己学習できる重みやバイアスといったものと異なり、人の手によって設定する必要がある。
・ニューラルネットの学習4手順
1 ミニバッチを選び出し、損失関数を得る。
2 勾配を求め、損失関数を減らす方向を探る。
3 重みパラメータを勾配方向に更新する。
4 1~3を繰り返す。
上記は確率的勾配降下法(SVD:stochastic gradient descent)と呼ばれる。
・損失関数とiteration(繰り返し回数)を図示することで、損失関数の推移(学習の経過)を可視化することができる。
・エポック(epoch):1エポックとは単位のことで、データを全て使い切った時の回数に対応する。10,000個のデータに対して100個のミニバッチで学習する場合、100回繰り返した時点で全ての訓練データを見たことになる。
つまり、100回 = 1エポックとなる。