##(0)深層学習2(欠席日:12/8/日)のまとめ:
#S1)勾配消失問題:
大きな値では出力の変化が微小のため「勾配」消失問題を引き起こすことがある。これを解決するために「活性化関数の選択(ReLu関数)」や「重みの初期値設定(Xavier、He)」、「バッチの正規化(メリット:(1)計算の高速化、(2)勾配消失が起きにくくなる)」を検討することになる。
#S2)学習率最適化手法について:
「勾配降下法」を利用してパラメータを最適化するが、適切な「学習率」を設定しないと、大域局所最適値に収束しづらくなったり、時間がかかったり、はたまた発散したりする。学習率最適化手法には(1)モメンタム、(2)AdaGrad、(3)RMSProp、(4)Adamがある。
#S3)過学習について:
「過学習」とはテスト誤差と訓練誤差とで学習曲線が乖離すること。原因としては、(1)パラメータ数が多いこと、(2)パラメータの値が適切でないこと、(3)ノードが多いこと等、つまり、「ネットワークの自由度(層数、ノード数、パラメータの値)が高い」ことによる。この対策として「正則化」により、ネットワークの自由度を制約し、過学習を抑制する。
代表的手法に、(1)L1正則化、(2)L2正則化、(3)ドロップアウトがある。
#S4)畳み込みニューラルネットワークについて:
CNNの構造の一例としては、「入力層(入力画像)→畳み込み層→畳み込み層→プーリング層→畳み込み層→畳み込み層→プーリング層→全結合層→出力層(出力画像)」となる。畳み込み層における演算概念として、(1)バイアス、(2)パディング、(3)ストライド、(4)チャンネルがある。プーリング層の演算概念として、対象領域の最大値もしくは平均値をとるものがある。最新のCNNの一例としてAlexNetモデルがあり、5層の畳み込み層およびプーリング層など、それに続く3層の全結合層から構成される。過学習を防ぐセ策として、サイズ4096の全結合層の出力にドロップアウトを使用している。
##(I)深層学習全体像の復習-学習概念
深層学習1(11/24/日、前回)講義の復習。
1.入力層に値を入力。
2.重み、バイアス、活性化関数で計算しながら値が伝わる。
3.出力層から値が伝わる。
4.出力層から出た値と正解値から、誤差関数を使って誤差を求める。
5.「誤差を小さくするため」に重みやバイアスを更新する。
6.上記1-5の操作を繰り返すことにより、出力値を正解値に近づけてゆく。
##(II)深層モデルのための学習テクニック
#Section1)勾配消失問題について
全体像(前回の流れと課題全体像のビジョン)
誤差逆伝播法の復習
計算結果から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる。
#P12(映像番号:DN19)確認テスト
連鎖率の原理を用いて、dz/dxを求める。
Z=t^2
t=x+y
→dz/dx=(dz/dt)×(dt/dx)=2t×1=2(x+y)
#勾配消失問題の復習(DN20)
左図:発散、収束していない
右図:収束している
#活性化関数:シグモイド関数
サンプルコード
def sigmoid(x):
return 1/(1+np.exp(-x))
数式
f(u)=1/(1+exp(-u))
特徴
0-1の間を緩やかに変化する関数
課題
大きな値では出力の変化が微小なため、「勾配消失問題」を引き起こすことがある。
#P20確認テスト(DN20):
シグモイド関数を微分したとき、入力値が0の時に最大値をとる。その値として正しいものはどれか?
f(x)=sigmoid(x)
f'(x)=(1-sigmoid(x))×sigmoid(x)
f'(0)=(1-sigmoid(0))×sigmoid(0)=(1-0.5)×0.5=0.25→(2)
上述の確認テストからdz/duの最大値は0.25。これが乗じられることから勾配はさらに小さくなってゆく。
#勾配消失の解決方法
1.活性化関数の選択
2.重みの初期値設定
3.バッチ正規化
#1-1:活性化関数
ReLU関数
サンプルコード
def relu(x):
return np.maximum(0,x)
数式
・「勾配消失問題の回避」と「スパース化」に貢献。
#1-2:重みの初期値設定
(1)Xavierの初期値を設定する際の活性化関数
・ReLU関数
・シグモイド(ロジステック)関数
・双曲線正接関数
Xavierコード例:
network['W1']=np.random.randn(input_layer_size,hidden_layer_size)/np.sqrt(input_layer_size)
network['w2']=np.random.randn(hidden_layer_size,output_layer_size)/np.sqrt(hidden_layer_size)
・初期値の設定方法:
・重みの要素:前の層のノード数の平方根で除算した値
(2)Heの初期値を設定する際の活性化関数
・ReLU関数
Heのコード例
network['W1']=np.random.randn(input_layer_size,hidden_layer_size)/np.sqrt(input_layer_size)*np.sqrt(2)
network['W2']=np.random.randn(input_layer_size,output_layer_size)/np.sqrt(hidden_layer_size)*np.sqrt(2)
・初期値の設定方法:
・重みの要素:前の層のノード数の平方根で除算した値に対し√2をかけ合わせた値
#確認テスト(P28、DN21)
重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。
→全ての値が同じ値で伝わるため、パラメータのチューニングが行われなくなる。
#1-3:バッチ正規化
・ミニバッチ単位で入力値のデータの偏りを抑制する方法。
・バッチ正規化の使うところ
→活性化関数に値を渡す前後に、バッチ正規化処理を孕んだ層を加える。
→バッチ正規化層への入力値:
(1) U(ℓ)=W(ℓ)z(ℓ-1)+b(ℓ) または、(2)Z
#確認テスト(P32、DN22)
一般に考えられるバッチ正規化の効果とは?(2つ)
→(1)計算の高速化、(2)勾配消失が起きにくくなる。
#バッチ正規化の数学的記述
・数学的記述
・処理及び記号の説明
#Jupyter演習(DN23)
(1)2_2_1_vanishing gradient
・sigmoid-gauss:
Generation: 2000. 正答率(トレーニング) = 0.11
: 2000. 正答率(テスト) = 0.1135
・ReLU-gauss:
Generation: 2000. 正答率(トレーニング) = 0.95
: 2000. 正答率(テスト) = 0.9225
・sigmoid-Xavier:
Generation: 2000. 正答率(トレーニング) = 0.85
: 2000. 正答率(テスト) = 0.7942
・ReLU-He:
Generation: 2000. 正答率(トレーニング) = 0.95
: 2000. 正答率(テスト) = 0.9553
(2)2_4_optimizer:
・SGD:
Generation: 1000. 正答率(トレーニング) = 0.14
: 1000. 正答率(テスト) = 0.1135
・Momentum:
Generation: 1000. 正答率(トレーニング) = 0.05
: 1000. 正答率(テスト) = 0.1135
・MomentumをもとにAdaGrad作成:
if i == 0:
h[key] = np.full_like(network.params[key], 1e-4)
else:
h[key] += np.square(grad[key])
network.params[key] -= learning_rate * grad[key] / (np.sqrt(h[key]))
Generation: 1000. 正答率(トレーニング) = 0.96
: 1000. 正答率(テスト) = 0.9218
←learing_rateを」0.01から0.1にすることでaccuracyが向上。
・RSMProp:
Generation: 1000. 正答率(トレーニング) = 0.99
: 1000. 正答率(テスト) = 0.9414
・Adam
Generation: 1000. 正答率(トレーニング) = 0.94
: 1000. 正答率(テスト) = 0.9465
#例題チャレンジ:
・回答:
(1)data_x[i:i_end],data_t[i:i_end]
バッチサイズだけデータを取り出す処理。
#学習率の復習(P41)
・学習率の値が大きい場合:最適値にいつまでもたどり着かず発散してしまう。
・学習率の値が小さい場合:
・発散することはないが、小さすぎると収束するまでに時間がかかってしまう。
・大域局所最適値に収束しづらくなる。
#学習率の決め方(P42)
・初期学習率設定方法の指針:
・初期の学習率を大きく設定し、徐々に学習率を小さくしてゆく。
・パラメータ毎に学習率を可変させる。
→「学習率最適化手法を利用」して学習率を最適化。
#学習率最適化手法(P43)
・モメンタム
・AdaGrad
・RMSProp
・Adam
#シンギュラリティ(P57、DN27)
・レイ・カールツワイツ博士は「2029年にAIが人間並みの知能を備え、2045年に技術的特異点が来る」と提唱。
・AIには「欲」がない。現時点「欲」の定義もよくわかっていない。
・しかしながら、「脳」の各パーツは「モジュール」としてモデルは作成されており、ある動作はどういうモジュールの組み合わせで実現できるか等は研究段階。
#過学習復習(P59,DN28)
・テスト誤差と訓練誤差とで学習曲線が乖離すること。
→特定の訓練サンプルに対して特化して学習する。
#正則化(P61)
・ネットワークの自由度(層数、ノード数、パラメータの値等)を制約すること。
→「正則化手法」を利用して、過学習を抑制する。
・正則化手法:
・L1正則化、L2正則化
・ドロップアウト
#確認テスト(P63、DN27)
・解答:
(a)ハイパーパラメータを大きな値に設定すると、全ての重みが限りなく0に近づく。
→これが「リッジ回帰」の特徴。
・ほかの選択肢で間違っている点:
(b)非線形でなく「線形回帰」になる。
(c)バイアス項については、正則化されない。
(d)リッジ回帰の場合、「隠れ層」ではなく、「誤差関数」に対して正則化を加える。
#Weight decay(荷重減衰、二重減衰)(P64、DN29)
・過学習の原因:重みが大きい値をとることで、過学習が発生することがある。
→学習させてゆくと重みにばらつきが発生する。重みが大きな値は、学習において重要な値であり、重みが大きいと過学習が起こる。
・過学習の解決策:誤差に対して、正則化項を加算することで重みを抑制する。
→過学習が起こりそうな重みの大きさ以下で重みをコントロールし、かつ、重みの大きさにばらつきを出す必要がある。
#L1、L2正則化
・P=3、P=4…がないわけではないが、計算のリソースを使うことになる。
#正則化の計算
#確認テスト(P68)
L1正則化を表しているグラフはどちらか?
・解答:
右の「Lasso推定量」。
#例題チャレンジ(P69,DN30)
(解答)
(4)param
(解説)
L2ノルムは||param||^2なのでその勾配が誤差の勾配に加えられる。(正則化係数)* 2*param=(1/2)2param=param
#例題チャレンジ(P71)
(解答)
(3)np.sign(param)
(解説)
L1ノルムは|param|なのでその勾配が誤差の勾配に加えられる。sign(param)。
*符号関数sign:
#例題チャレンジ(p73)
(解答)
(4)image[top:bottom,left:right,:]
(解説)
imageの形式が(縦幅、横幅、チャンネル)。
(3)と(4)の違い。(4)はプログラムと同じく起点がtop、leftになっている。
#ドロップアウト(P76,DN31)
・過学習の課題:ノード数が多い。
・ドロップアウト:ランダムにノードを削除して学習させること。
・メリット:データ量を変化させずに、異なるモデルを学習させていると解釈できる。
#演習:
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.7663
過学習の状態。
・Weight Decay:L2正則化
weight_decay += 0.5 * weight_decay_lambda * np.sqrt(np.sum(network.params['W' + str(idx)] ** 2))
・正則化強度設定:
weight_decay_lambda = 0.1
Generation: 1000. 正答率(トレーニング) = 0.9133333333333333
: 1000. 正答率(テスト) = 0.6962
・Weight Decay:L1正則化
weight_decay += weight_decay_lambda * np.sum(np.abs(network.params['W' + str(idx)]))
・正則化強度設定:
weight_decay_lambda = 0.005
Generation: 1000. 正答率(トレーニング) = 0.9833333333333333
: 1000. 正答率(テスト) = 0.709
・weigth_decay_lambdaを変更:
・L2、正則化強度設定を変更
weight_decay_lambda = 0.01
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.7659
weight_decay_lambda=1.0
Generation: 1000. 正答率(トレーニング) = 0.13
: 1000. 正答率(テスト) = 0.1135
・L1、正則化強度設定を変更
weight_decay_lambda = 0.01
Generation: 1000. 正答率(トレーニング) = 0.62
: 1000. 正答率(テスト) = 0.475
weight_decay_lambda = 0.0001
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.794
#jupyther演習(DN32)
・drop out設定:
use_dropout = True
dropout_ratio = 0.15
Generation: 1000. 正答率(トレーニング) = 0.9
: 1000. 正答率(テスト) = 0.7313
use_dropout = True
dropout_ratio=0.5
Generation: 1000. 正答率(トレーニング) = 0.13
: 1000. 正答率(テスト) = 0.1135
・use_dropoutをfalseにしてみる
use_dropout = False
dropout_ratio = 0.15
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.7681
・Dropout+L1
Generation: 1000. 正答率(トレーニング) = 0.9566666666666667
: 1000. 正答率(テスト) = 0.748
#自分で課題設定(DN33)
・論文検索のやり方。
・自分で設定した課題を周囲に伝えるとともに、その課題方策を議論。
・畳み込み層:
画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる。
結論:3次元の空間情報も学習できるような層が畳み込み層。
・畳み込みの演算概念:
・バイアス
・パディング
・ストライド
・チャンネル
#全結合で画像を学習した際の課題(P95)
・全結合層のデメリット:
画像の場合、縦、横、チャンネルの3次元のデータだが、1次元のデータとして処理される。
→RGBの各チャンネル間の関連性が学習に反映されないということ。
・プーリング層の演算概念(P99):
・対象領域のMax値または平均値を取得。
#Jupyther演習(DN35)
・im2col
・メリット:行列計算に落とし込むことで、多くのライブラリを活用できるから。
・col2im処理:
img = col2im(col, input_shape=input_data.shape, filter_h=filter_h, filter_w=filter_w, stride=stride, pad=pad)
print(img)
[[[[ 27. 110. 4. 46.]
[ 88. 76. 12. 84.]
[ 0. 140. 344. 176.]
[ 79. 22. 2. 43.]]]
[[[ 13. 42. 22. 54.]
[ 72. 132. 48. 158.]
[136. 88. 380. 40.]
[ 48. 128. 82. 84.]]]]
#プーリング層(p100、DN36)
#確認テスト(P100)
サイズ6×6の入力画像を、サイズ2×2のフィルタで、畳み込んだ時の出力画像のサイズは?なお、ストライドとパディングは1とする。
OH=(H+2p-FH)/s+1=(6+2×1-2)/1+1=7→OWも同じ。→7×7
・sinple convolution network class
Generation: 1000. 正答率(トレーニング) = 0.9962
: 1000. 正答率(テスト) = 0.955
#9Storry(シラバス、DN38)
・認定プログラムはシラバスの項目を網羅&実装に不足部分を追加。
・全体理解に必須→講義で重点解説
・演習必須→実装演習
・網羅的な細項目→演習問題で解説、キーワード解説
・応用数学:
・講義の内容を理解していれば、シラバス範囲(筆記試験)は問題なし。
・誤差逆伝播法で用いる、偏微分などはシラバスに含まれないが追加。
#クローラー(DN40)
Crawler.ipynbを動作するもエラーが出て、これのバグ取りをトライしましたが、いったん、中止したいと思います。これについては試験までの検討事項としたいと思います。
(Colaboratoryでもトライしましたが違うエラーがでました)
以上