0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【講義:深層学習2(欠席日:12/8/日)】

Last updated at Posted at 2019-12-30

##(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/日、前回)講義の復習。
image.png
1.入力層に値を入力。
2.重み、バイアス、活性化関数で計算しながら値が伝わる。
3.出力層から値が伝わる。
4.出力層から出た値と正解値から、誤差関数を使って誤差を求める。
5.「誤差を小さくするため」に重みやバイアスを更新する。
6.上記1-5の操作を繰り返すことにより、出力値を正解値に近づけてゆく。

##(II)深層モデルのための学習テクニック
#Section1)勾配消失問題について
全体像(前回の流れと課題全体像のビジョン)
誤差逆伝播法の復習
image.png

計算結果から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる。

#P12(映像番号:DN19)確認テスト
連鎖率の原理を用いて、dz/dxを求める。
Z=t^2
t=x+y
→dz/dx=(dz/dt)×(dt/dx)=2t×1=2(x+y)

#誤差逆伝播法の復習
image.png

誤差逆伝播法のまとめ
image.png

#勾配消失問題の復習(DN20)
image.png
左図:発散、収束していない
右図:収束している

#勾配消失問題のビジョン
image.png

#活性化関数:シグモイド関数
サンプルコード
def sigmoid(x):
return 1/(1+np.exp(-x))
数式
f(u)=1/(1+exp(-u))
image.png

特徴
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)

#勾配消失問題のビジョン(DN21):
image.png

上述の確認テストからdz/duの最大値は0.25。これが乗じられることから勾配はさらに小さくなってゆく。

#勾配消失の解決方法
1.活性化関数の選択
2.重みの初期値設定
3.バッチ正規化

#1-1:活性化関数
ReLU関数
サンプルコード
def relu(x):
return np.maximum(0,x)
数式
image.png
image.png

・「勾配消失問題の回避」と「スパース化」に貢献。

#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)勾配消失が起きにくくなる。

#バッチ正規化の数学的記述
・数学的記述
image.png
・処理及び記号の説明
image.png

バッチ正規化
image.png

#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
image.png

・sigmoid-Xavier:
Generation: 2000. 正答率(トレーニング) = 0.85
: 2000. 正答率(テスト) = 0.7942
image.png

・ReLU-He:
Generation: 2000. 正答率(トレーニング) = 0.95
: 2000. 正答率(テスト) = 0.9553
image.png

(2)2_4_optimizer:
・SGD:
Generation: 1000. 正答率(トレーニング) = 0.14
: 1000. 正答率(テスト) = 0.1135
・Momentum:
Generation: 1000. 正答率(トレーニング) = 0.05
: 1000. 正答率(テスト) = 0.1135
image.png

・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が向上。
image.png

・RSMProp:
Generation: 1000. 正答率(トレーニング) = 0.99
: 1000. 正答率(テスト) = 0.9414
image.png

・Adam
Generation: 1000. 正答率(トレーニング) = 0.94
: 1000. 正答率(テスト) = 0.9465
image.png

#例題チャレンジ:
image.png
・回答:
(1)data_x[i:i_end],data_t[i:i_end]
バッチサイズだけデータを取り出す処理。

#勾配降下法の復習(P39、40)
image.png
image.png

#学習率の復習(P41)
・学習率の値が大きい場合:最適値にいつまでもたどり着かず発散してしまう。

・学習率の値が小さい場合:
・発散することはないが、小さすぎると収束するまでに時間がかかってしまう。
・大域局所最適値に収束しづらくなる。

#学習率の決め方(P42)
・初期学習率設定方法の指針:
・初期の学習率を大きく設定し、徐々に学習率を小さくしてゆく。
・パラメータ毎に学習率を可変させる。
→「学習率最適化手法を利用」して学習率を最適化。

#学習率最適化手法(P43)
・モメンタム
・AdaGrad
・RMSProp
・Adam

#モメンタム(P45、46)
image.png

image.png

#AdaGrad(P49、50)
image.png

image.png

#RMSProp(P51、53)
image.png

image.png

#シンギュラリティ(P57、DN27)
・レイ・カールツワイツ博士は「2029年にAIが人間並みの知能を備え、2045年に技術的特異点が来る」と提唱。
・AIには「欲」がない。現時点「欲」の定義もよくわかっていない。
・しかしながら、「脳」の各パーツは「モジュール」としてモデルは作成されており、ある動作はどういうモジュールの組み合わせで実現できるか等は研究段階。

#過学習復習(P59,DN28)
・テスト誤差と訓練誤差とで学習曲線が乖離すること。
→特定の訓練サンプルに対して特化して学習する。
image.png

#正則化(P61)
・ネットワークの自由度(層数、ノード数、パラメータの値等)を制約すること。
→「正則化手法」を利用して、過学習を抑制する。

・正則化手法:
・L1正則化、L2正則化
・ドロップアウト

#確認テスト(P63、DN27)
image.png
・解答:
(a)ハイパーパラメータを大きな値に設定すると、全ての重みが限りなく0に近づく。
→これが「リッジ回帰」の特徴。

・ほかの選択肢で間違っている点:
(b)非線形でなく「線形回帰」になる。
(c)バイアス項については、正則化されない。
(d)リッジ回帰の場合、「隠れ層」ではなく、「誤差関数」に対して正則化を加える。

#Weight decay(荷重減衰、二重減衰)(P64、DN29)
・過学習の原因:重みが大きい値をとることで、過学習が発生することがある。
→学習させてゆくと重みにばらつきが発生する。重みが大きな値は、学習において重要な値であり、重みが大きいと過学習が起こる。
・過学習の解決策:誤差に対して、正則化項を加算することで重みを抑制する。
→過学習が起こりそうな重みの大きさ以下で重みをコントロールし、かつ、重みの大きさにばらつきを出す必要がある。

#L1、L2正則化
image.png
・P=3、P=4…がないわけではないが、計算のリソースを使うことになる。
#正則化の計算
image.png

#数式とコード(P67)
image.png

#確認テスト(P68)
L1正則化を表しているグラフはどちらか?
image.png
・解答:
右の「Lasso推定量」。

#例題チャレンジ(P69,DN30)
image.png
(解答)
(4)param
(解説)
L2ノルムは||param||^2なのでその勾配が誤差の勾配に加えられる。(正則化係数)* 2*param=(1/2)2param=param

#例題チャレンジ(P71)
image.png
(解答)
(3)np.sign(param)
(解説)
L1ノルムは|param|なのでその勾配が誤差の勾配に加えられる。sign(param)。
*符号関数sign:
image.png

#例題チャレンジ(p73)
image.png
(解答)
(4)image[top:bottom,left:right,:]
(解説)
imageの形式が(縦幅、横幅、チャンネル)。
(3)と(4)の違い。(4)はプログラムと同じく起点がtop、leftになっている。

#ドロップアウト(P76,DN31)
・過学習の課題:ノード数が多い。
・ドロップアウト:ランダムにノードを削除して学習させること。
・メリット:データ量を変化させずに、異なるモデルを学習させていると解釈できる。
image.png

#演習:
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
image.png

・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
image.png

・weigth_decay_lambdaを変更:
・L2、正則化強度設定を変更
weight_decay_lambda = 0.01
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.7659
image.png

weight_decay_lambda=1.0
Generation: 1000. 正答率(トレーニング) = 0.13
: 1000. 正答率(テスト) = 0.1135
image.png

・L1、正則化強度設定を変更
weight_decay_lambda = 0.01
Generation: 1000. 正答率(トレーニング) = 0.62
: 1000. 正答率(テスト) = 0.475
image.png

weight_decay_lambda = 0.0001
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.794
image.png

#jupyther演習(DN32)
・drop out設定:
use_dropout = True
dropout_ratio = 0.15
Generation: 1000. 正答率(トレーニング) = 0.9
: 1000. 正答率(テスト) = 0.7313
image.png

use_dropout = True
dropout_ratio=0.5
Generation: 1000. 正答率(トレーニング) = 0.13
: 1000. 正答率(テスト) = 0.1135
image.png

・use_dropoutをfalseにしてみる
use_dropout = False
dropout_ratio = 0.15
Generation: 1000. 正答率(トレーニング) = 1.0
: 1000. 正答率(テスト) = 0.7681
image.png

・Dropout+L1
Generation: 1000. 正答率(トレーニング) = 0.9566666666666667
: 1000. 正答率(テスト) = 0.748
image.png

#自分で課題設定(DN33)
・論文検索のやり方。
・自分で設定した課題を周囲に伝えるとともに、その課題方策を議論。

#CNNの構造図(P80、DN34)
image.png

・代表的CNN:LeNetの構造図(P81)
image.png

・畳み込み層:
画像の場合、縦、横、チャンネルの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

image.png

#9Storry(シラバス、DN38)
・認定プログラムはシラバスの項目を網羅&実装に不足部分を追加。
・全体理解に必須→講義で重点解説
・演習必須→実装演習
・網羅的な細項目→演習問題で解説、キーワード解説

・応用数学:
・講義の内容を理解していれば、シラバス範囲(筆記試験)は問題なし。
・誤差逆伝播法で用いる、偏微分などはシラバスに含まれないが追加。

・機械学習:
image.png

・NN:
image.png

・正則化:
image.png

・最適化;
image.png

・CNN:
★最重要★
image.png

・RNN:
image.png

・高度な内容:
image.png

#AlexNetモデル(P116、DN39)
image.png

#クローラー(DN40)
Crawler.ipynbを動作するもエラーが出て、これのバグ取りをトライしましたが、いったん、中止したいと思います。これについては試験までの検討事項としたいと思います。
(Colaboratoryでもトライしましたが違うエラーがでました)
image.png

以上

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?