#学習記録(28日目)
勉強開始: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』
p.239 第7章 畳み込みニューラルネットワーク まで読み終わり。
##6章 学習に関するテクニック
・最適化(Optimization):損失関数の値をできるだけ小さくできる最適なパラメータを見つけること。
パラメータ空間は複雑であり、非常に難しい問題。
いくつか手法(optimizer)が存在する。
・確率的勾配降下法(stochastic gradient descent):5章までで学んだ手法。
パラメータの勾配を使い、勾配方向に向けて何度も更新、徐々に近づけていく。
W ← W - η\frac{\partial L}{\partial W}
ηは学習率(learning rate)。右辺の値で左辺を更新していく。
SGDの欠点は関数が伸びた形であったりする場合、つまり等方的な形状でない場合は、探索経路が非効率になりがちな点。
・モーメンタム(Momentum):運動量のような概念を用いる。
新たにvという変数を導入、摩擦力や空気抵抗のような役目を果たすことで、何も力を受けない時に減速する仕組み。
v ← αv - η\frac{\partial L}{\partial L}
W ← W + v
・AdaGrad:学習率(learning rate)の値を、学習の度合いに応じて変化させる手法。
最初は大きくし、次第に小さくさせる。
h ← h + \frac{\partial L}{\partial W} ⊙ \frac{\partial L}{\partial W}
W ← W - η\frac{1}{\sqrt{h}}\frac{\partial L}{\partial W}
⊙はアダマール演算子。行列の要素毎の掛け算を意味する。
hが大きいほど(よく動くほど)、学習係数が小さくなる。
つまりパラメータ更新の際に、学習のスケールを調整している。
・Adam:モーメンタムとAdaGradを融合させた手法。
・optimizerは上記のとおり様々な手法が存在するが、それぞれ得手不得手があるので、一概にどれが優れているかということは言えない。
(ただ、多くの研究ではSGDが好んで使われているとのこと。)
・荷重減衰(Weight decay):重みパラメータが小さくなるように学習を行うことを目的とした手法
重みを小さくすることで過学習が起きづらくなり、汎化性能を高めることに近く。
(ただし、「0」は重みの対照的な構造を崩し、全てが同じような値を持ってしまう。)
・Xavierの初期値:n個のノードに対し、(1 / √n)の標準偏差を持つガウス分布を初期値として用いる。
ディープラーニングのフレームワークで標準的に用いられている。
sigmoidやtanhに適している。
・Heの初期値:n個のノードに対し、(2 / √n)の標準偏差を持つガウス分布を初期値として用いる。
ReLUに適している。ReLUの場合は負の領域が0になるため、より広い広がりを持たせるために倍の係数をかけているとも解釈できる。
・Batch Normalization:2015年に考案された手法、コンペ等でも多く用いられている。
学習を早く進行させることができる、初期値にそれほど依存しない、過学習を抑制する、といった利点がある。
Batch Normレイヤと呼ばれるものをAffineやReLUの間に挿入することで、データ分布の正規化を行う。
学習を行う際のミニバッチを単位として、ミニバッチ毎に正規化を行う。
・Dropout:Weight decayと同様に、過学習を抑制する手法として用いられる。
訓練時に隠れ層のニューロンをランダムに選び出し、選び出したニューロンを消去する。
テスト時にはすべてのニューロン信号を伝達するが、訓練時に消去した割合を乗算して出力する。
学習時にニューロンを毎回ランダム消去する、つまり、毎回異なるモデルを学習させていると解釈することもできるため、一種のアンサンブル手法に近いものがある。
・ハイパーパラメータ:各層のニューロンの数やバッチサイズ、学習率やWeight decayが該当する。
テストデータを使ってハイパーパラメータを調整することは過学習に繋がるため、検証データ(validation data)と呼ばれる専用のデータを用いる。
これは自分で作る。(npのshuffleやsclearnのtrain_data_splitなど。Kaggleで使った。)
・最適化は、最初はおおまかに設定、認識精度の結果を観察し、良い値が存在する範囲に向けて徐々に絞り込んでいく。
ニューラルネットワークの場合は、グリッドサーチといった規則的な探索よりも、ランダムにサンプリングして探索するほうがよい結果が出るとの報告がある。
おおまかに、とは、10のべき乗スケール、10^(-3) ~ 10^(3)、くらいが目安。
筋が悪そうなものは早い段階で見切りをつける必要があるため、学習のためのエポックは小さくするのが有効。
エポックとは、データを全て使いきった時の単位。10000データを100個のミニバッチで学習するなら、100回 = 1エポック、学習記録その22のとおり。
・ベイズ最適化(Bayesian optimization)も有効。Kaggleで見る機会が多かった。
##7章 畳み込みニューラルネットワーク
・畳み込みニューラルネットワーク(convoluntional neural network: CNN)
通常のニューラルネットワークに加え、「Convoluntionレイヤ(畳み込み層)」と「Poolingレイヤ(プーリング層)」という概念を加える。
代表例としてはLeNetとAlexNetという2つが挙げられる。
・「Affine - ReLU(sigmoid)」というレイヤの繋がりを、「Convoluntion - ReLU(sigmoid) - (Pooling)」という繋がりに置き換える。
(ただし出力層に近い部分は通常通り。)
・Affineレイヤは全てのニューロンを結合する全結合層を用いていた。
これの問題点は、全ての入力データを同等のニューロン(同次元)として扱うことにより、形状に関する情報を活かせないこと。
一方でConvoluntionレイヤは、入力データを同じ次元で次の層に出力するため、よりデータを正しく理解できる(可能性がある)。
・畳み込み演算:入力データに対し、フィルターのウィンドウを一定間隔でスライドさせながら適用する。
フィルターの適応間隔を調整する変数をストライドという。(どれだけずらしながら適応していくかという話)
・パディング:入力データの周囲を固定データ(0など)で埋める。
・プーリング:縦・横の空間を小さくする演算。4×4の行列を2×2の領域ずつ見ていき、たとえばMaxプーリングであれば、領域ごとの最大値を抽出して出力するなどの演算を実施する。
・これら畳み込み演算を適応する関数としてim2colというものが存在する。
im2colは、フィルターにとって都合の良いように入力データを展開する関数であり、フィルターの適応領域を先頭から順番に1列ずつ展開していく。
展開後は元のブロックの要素数より大きくなり、多くのメモリを消費するという欠点があるものの、行列計算自体が高度に最適化されているため、この行列の形に帰着させることで非常に多くの恩恵が得られる。
・畳み込み層のフィルターは、ブロブ(blob: 局所的に塊にある領域)や、エッジ(edge: 色が変化する境目)といったプリミティブな情報を抽出し、次の領域に出力していくことができる。