#Level6.深層学習 DAY2
##6-1.誤差逆伝播法の復習
☆確認テスト☆
6-1-1 連鎖律の原理を使い、$dz/dx$を求めよ。
$z = t^2$
$t = x + y$
【自分の回答】
\begin{align}
\frac{dz}{dx} &= \frac{dz}{dt}\frac{dt}{dx}\\
&= \frac{d}{dt}t^2 \frac{d}{dx}(x + y)\\
&= 2t(1)\\
&= 2t\\
&= 2(x + y)
\end{align}
【解答】
自分の回答と同じだった。
●勾配消失問題
誤差逆伝播法が下位層に進んでいく(出力層⇒入力層)
消失問題は、下位層のパラメータはほとんど変化せず、
訓練は最適値に収束しない。
●シグモイド関数(活性化関数)
0~1の間を緩やかに変化する関数。
信号の強弱を伝えられるようになった。
☆確認テスト☆
6-1-2 シグモイド関数を微分した時、入力値が0の時に最大をとる。
その値として正しいものを選択肢から選べ。
(1) 0.15 (2) 0.25 (3) 0.35 (4) 0.45
【自分の回答】
(1-0.5)×0.5=0.25 ・・・(2)
【解答】
$f(u)' = (1 - sigmoid(u))・sigmoid(u)$
より(1-0.5)×0.5=0.25
##6-2.Section1 勾配消失問題について
●勾配消失の解決方
・活性化関数の選択
・重みの初期値設定
・バッチ正規化
###6-2-1 活性化関数の選択
●ReLu関数(活性化関数)
勾配消失問題の回避と、スパースかについて貢献
###6-2-2 重みの初期値設定
●Xavier(ザビエル)の初期値を設定する際の活性化関数
・ReLU関数
・シグモイド(ロジスティック)関数
・双曲線正接関数
⇒重みの要素を、前の層のノード数の平方根で除算した値
●He(エイチイー)の初期値を設定する際の活性化関数
・ReLU関数
⇒重みの要素を、前の層のノード数の平方根で除算した値に対し、
√2をかけ合わせた値
より勾配消失を起こりにくくできるのではないかと考案。
☆確認テスト☆
6-2-2-1 重みの初期値に0を設定すると、どのような問題が発生するか。
簡潔に説明せよ。
【自分の回答】
総入力値がバイアスの値だけになるため、
適切な予測値が算出されず、その後のパラメータ更新に時間がかかる。
【解答】
全ての重みが0で伝播する。
パラメータのチューニングが行われなくなる。
(回答の上部の映像が見切れて確認できず。)
###6-2-3 バッチ正規化
●バッチ正規化とは
ミニバッチ単位で、入力値のデータの偏りを抑制する手法
●バッチ正規化の使い方とは
活性化関数に値を渡す前後に、
バッチ正規化の処理を孕んだ層を加える。
⇒$u^{(l)} = w^{(l)}z^{(l-1)} + b^{(l)}$ または $z$
☆確認テスト☆
6-2-3-1 一般的に考えられるバッチ正規化の効果を2点挙げよ。
【自分の回答】
・汎化性能に性能差が出る。
・入力分布をガウス分布に変換し入力データを制限することで、
入力データが学習の度に大きく変わることを防ぐ効果があり、
中間層の学習が安定化する
【解答】
・計算の高速化(計算がコンパクト化する)
・勾配消失が起きづらくなる
●バッチ正規化の数学的記述
\begin{align}
&1.μ_t = \frac{1}{N_t}\sum^{N_t}_{i=1} x_{ni}\\
&2.σ_t^2 = \frac{1}{N_t}\sum^{N_t}_{i=1}(x_{ni} - μ_t)^2\\
&3.\hat x_{ni} = \frac{x_{ni} - μ_t}{\sqrt{σ_t^2 + \theta}}\\
&4.y_{ni} = γx_{ni} + β
\end{align}
・処理および記号の説明
\begin{align}
μ_t&:ミニバッチt全体の平均\\
σ_t^2&:ミニバッチt全体の標準偏差\\
N_t&:ミニバッチのインデックス\\
\hat x_{ni}&:0に値を近づける計算(0を中心とするセンタリング)\\
& と正規化を施した値\\
γ&:スケーリングパラメータ\\
β&:シフトパラメータ\\
y_{ni}&:ミニバッチのインデックス値とスケーリングの積に\\
& シフトを加算した値(バッチ正規化オペレーションの出力)\\
\end{align}
###6-2-4 勾配消失問題の解決実装
●Sigmoidの実装確認
●ReLUの実装確認
●Sigmoid + Xavierの実装確認
●ReLU + Heの実装確認
●Sigmoid + Xavier、hidden_layer_sizeを変更した実装確認
●ReLU + He、hidden_layer_sizeを変更した実装確認
●Sigmoid + He、hidden_layer_sizeを変更した実装確認
●ReLU + Xavier、hidden_layer_sizeを変更した実装確認
###6-2-5 データについて
●多角的に全体像を把握する。
日本はデータ数が非常に少ない。
データの集め方がポイント(企業ニーズ)。
プロダクトを考慮してのデータ集めが必要。
##6-3.Section2 学習率最適化手法について
●勾配降下法の復習
・学習を通して誤差を最小にするネットワークを作成すること
⇒誤差$E(w)$を最小にするパラメータ$w$を発見すること
●学習率の復習
・学習率の値が大きい場合
最適値にいつまでもたどり着かず発散してしまう
・学習率の値が小さい場合
発散しないが、小さすぎると収束までの時間がかかる
大域局所最適値に収束しづらくなる
●学習率の決め方
初期の学習率設定方法の指針
・初期の学習率を大きく設定し、徐々に学習率を小さくする
・パラメータ毎に学習率を可変させる
⇒学習率最適化手法を利用して学習率を最適化
●学習率最適化手法
・モメンタム
・AdaGrad
・RMSProp
・Adam
###6-3-1.モメンタム
【モメンタム】慣性:$μ$
・誤差をパラメータで微分したものと、学習率の積を減算した後、
現在の重みに前回の重みを減算した値と慣性の積を加算する。
・$μ$はハイパーパラメータ
\begin{align}
&V_t = μV_{t-1} - \epsilon∇E\\
&W^{(t+1)} = W^{(t)} + V_t\\
\end{align}
・self.v[key] = self.momentum* self.v[key] -self.learning_rate* grad[key]
・params[key] += self.v[key]
【勾配降下法】
・誤差をパラメータで微分したものと学習率の積を減算する。
W^{(t+1)} = W^{(t)} + \epsilon∇E\\
●モメンタムのメリット
・局所的最適解にならず、大域的最適解となる。
・谷間についてから最も低い位置(最適解)に到達する時間が早い。
(勾配が緩やかになるので収束に時間かかる)
・前回の重みの影響を受けて、数値的な変化を含んで学習できる。
☆確認テスト☆
・6-3-1 モメンタム・AdaGrad・RMSPropの特徴を
それぞれ簡潔に説明せよ。
【自分の回答】
・モメンタム・・・大域的最適解が得られる。収束が早い。
・AdaGrad・・・分からない。
・RMSProp・・・分からない。
【解答】
・モメンタム・・・収束が早い。
・AdaGrad・・・緩やかな斜面で最適値に近づきやすい。
・RMSProp・・・パラメータの調整が少なくて済む。
###6-3-2.AdaGrad
【AdaGrad】
・誤差をパラメータで微分したものと、
最適着した学習率の積を減算する。
・√後のθは分母が0にならないように加算。
RMSProp等と書き方を統一するために記載している。
・コーディングでは、「1e-7」を加算。
\begin{align}
&h_0 = \theta\\
&h_t = h_{t-1} + (∇E)^2\\
&W^{(t+1)} = W{(t)} - \epsilon\frac{1}{\sqrt{h_t} + \theta}∇E
\end{align}
・self.h[key] = np.zeros_like(val)
・self.h[key] += grad[key] * grad[key]
・params[key] -= self.learning_rate* grad[key] / (np.sqrt(self.h[key]) + 1e-7)
●AdaGradのメリット
・勾配の緩やかな斜面に対して、最適値に近づける。
●AdaGradの課題
・学習率が徐々に小さくなるので、鞍点問題を引き起こすことがある。
(鞍点問題:極小値だと思ったら極大値だった。)
###6-3-3.RMSProp
【RMSProp】
・誤差をパラメータで微分したものと、
再定義した学習率の積を減算する。
\begin{align}
&h_t = αh_{t-1} + (1 - α)(∇E)^2\\
&W^{(t+1)} = W^{(t)} - \epsilon\frac{1}{\sqrt{h_t}+\theta} ∇E\\
\end{align}
・self.h[key] = self.decay_rate
・self.h[key] += (1 -self.decay_rate) * grad[key] * grad[key]
・params[key] -= self.learning_rate grad[key] / (np.sqrt(self.h[key]) + 1e-7)
●RMSPropのメリット
・局所的最適化にならず、大域的最適解となる。
・ハイパーパラメータの調整が必要な場合が少ない。
###6-3-4.Adam
●Adamとは
・モメンタムの過去の勾配の指数関数的減衰平均
・RMSPropの過去の勾配の2乗の指数関数的減衰平均
以上をそれぞれ孕んだ最適化アルゴリズムである。
⇒前の重みに対して、現在の重みが影響を受けている。
●Adamのメリット
・モメンタム及び、RMSPropのメリットを孕んだアルゴリズム。
⇒良いところをとったもの。
●ソースコード
・m[key] += (1 - beta1) * (grad[key] - m[key])
・v[key] += (1 - beta2) * (grad[key] ** 2 - v[key])
・network.params[key] -= learning_rate_t * m[key] / (np.sqrt(v[key]) + 1e-7)
###6-3-5 学習率最適化手法の実装
●SGD
●Momentum
慣性の設定は0.9をデフォルトにする。
●Momentum⇒AdaGrad
●RMSProp
learning_rate = 0.01、decay_rate = 0.99については、
値を変えてみて変化を確認する。
●Adam
●多角的に全体像を把握
・シンギュラリティ
前頭葉、海馬、中脳のようなモジュールはできている。
欲をどう定義するかは検討されている。
ターミネーターのスカイネットのようなAIは時間の問題か。
⇒技術革新の勉強は日々行い、自分が作りたいものを考えてみると良い。
##6-4.Section3 過学習について
●過学習の復習
・テスト誤差と訓練誤差とで学習曲線が乖離すること。
⇒特定の訓練サンプルに対して、特化して学習する。
・原因
パラメータの数が多い
パラメータの値が適切でない
ノードが多い などなど。
⇒ネットワークの自由度(層数、ノード数、パラメータの値等)
が高い。
###6-4-1 正則化
●正則化とは
ネットワークの自由度(層数、ノード数、パラメータの値等)
を制約すること。
⇒正則化手法を利用して過学習を抑制する。
●正則化手法
・L1正則化、L2正則化
・ドロップアウト
【解答】
(a)正解。ハイパーパラメータを大きな値に設定すると、
すべての重みが限りなく0に近づく
(b)線形回帰である。
(c)バイアスについては正規化されない。
(d)隠れ層ではなく誤差関数である。
###6-4-2 Weight decay(荷重減衰)
●過学習の原因
重みが大きい値をとることで、過学習が発生する。
●過学習の解決策
誤差に対して、正則化項を加算することで重みを抑制
###6-4-3 L1、L2正則化
【数式】
誤差関数に$p$ノルムを加える。
\begin{align}
&E_n(W) + \frac{1}{p}λ|| x ||_p\\
&|| x || _p = (|x_1|^p + ・・・ + |x_n|^p)^{\frac{1}{p}}
\end{align}
$p = 1$の場合、L1正則化と呼ぶ。
$p = 2$の場合、L2正則化と呼ぶ。
L3、L4、L5・・・とあるが、すごく小さい値となり、
計算のコストがかかってしまう。
そのため、L1、L2が主流となっている。
・np.sum(np.abs(network.params['W' + str(idx)]))
・weight_decay+= weight_decay_lambda
*np.sum(np.abs(network.params['W' + str(idx)]))
loss = network.loss(x_batch, d_batch) + weight_decay
⇒np.absは絶対値を取る関数。
☆確認テスト☆
・6-4-3-1 下図について、L1正則化を表している
グラフはどちらか答えよ。
【自分の回答】
左の図(Ridge推定量)の方
【解答】
右の図(Lasso推定量)の方
同心円は誤差の等値線を表している。
L1とL2の本質的な違いを理解する。
【参考】
L1正則化(Lasso)の数式の解説とスクラッチ実装
https://qiita.com/torahirod/items/a79e255171709c777c3a
渋谷駅前で働くデータサイエンティストのブログ
https://tjo.hatenablog.com/entry/2015/03/03/190000
☆例題チャレンジ☆
・6-4-3-2
【自分の回答】
(3)param**2
【解答】
(4)param
L2ノルムは||param||^2なので、その勾配が誤差に加えられる。
2*paramであるが、1/2があるのでparamとなる。
☆例題チャレンジ☆
・6-4-3-3
【自分の回答】
(4)np.abs(param)
【解答】
(3)np.sign(param)
L1ノルムは、|param|なので、その勾配が誤差に加えられる。
sign(param)で、signは符号関数である。
符号関数:0より大きいの値は1が返る。
0は0が返る。
マイナスの値は-1が返る。
☆例題チャレンジ☆
・6-4-3-4
【自分の回答】
(4)image[top:bottom,left:right,:]
【解答】
(4)image[top:bottom,left:right,:]
imageの形式が、縦幅、横幅、チャンネルである。
###6-4-4 ドロップアウト
●過学習の課題
ノードの数が多い
●ドロップアウトとは
ランダムにノードを削除して学習させること。
一部のノードを非活性化させて学習を進める。
●ドロップアウトのメリット
データ量を変化させずに、異なるモデルを学習させていると解釈できる。
###6-4-4-1 ソースコード演習
●overfiting
●weight decay(L2)
●L1
●weight decay(L2)-weight_decay_lambdaを変更
###6-4-4-2 ドロップアウト ソースコード演習2
それぞれの特性などを理解したうえで、
どのような組み合わせで実行するのかを検討することが必要である。
●Dropout
●Dropout + L1
##6-5.Section4 畳み込みニューラルネットワークの概念
●CNNの構造図
・色々なCNNの構造がある。
・畳み込みニューラルネットワークは、画像でソリューションを提供
・音声の分野でも提供可能。
・「入力層」「畳み込み層」「プーリング層」「全結合層」「出力層」がある。
●畳み込み層の全体像
・フィルター:全結合でいう重みである。
###6-5-1.畳み込み層「バイアス」
●畳み込み層
畳み込み層では、画像の場合、縦・横・チャンネルの3次元
のデータをそのまま学習し、次に伝えることができる。
結論:3次元の空間情報も学習できるような層が
畳み込み層である。
●畳み込みの演算概念(バイアス)
入力画像とフィルターの値の積の合計を求める。
###6-5-2.畳み込み層「パディング」
●パディング
0パディングが一般的。
入力画像の周りに固定データとして0のデータを埋めていく。
入力データと同じサイズの出力画像を出力できる。
###6-5-3.畳み込み層「ストライド」
●ストライド
フィルターの移動する量をストライドとして定義。
2つ、3つ飛ばしで移動するなど。
###6-5-4.畳み込み層「チャンネル」
●チャンネル
分解した層数をチャンネル数という。
3次元の学習ができる。
縦・横以外に奥行きができる。
###6-5-5.全結合で画像を学習した際の課題
全結合層のデメリット
・画像の場合、縦・横・チャンネルの3次元データだが、
1次元のデータとして処理される。
⇒RGBの各チャンネル間に関連性が、
学習に反映されない。
###6-5-6 ソースコード演習
●im2col(image to column)
画像データを2次元の配列に変換する。
●im2colの処理を確認しよう
●col2im(column to image)
2次元の配列を画像データに変換する。
●convolution class
###6-5-7 プーリング層
●主に2つの種類がある
・マックスプーリング
・アベレージプーリング
●プーリング層の演算概念
入力画像に対して、対象領域のMAX値または、
平均値を取得して出力する。
☆確認テスト☆
・6-5-7-1 サイズ6×6の入力画像を、サイズ2×2のフィルタで
畳み込んだ時の出力画像のサイズを答えよ。
なおストライドとパディングは1とする。
【自分の回答】
7×7の出力画像
【解答】
7×7の出力画像
OH = (H+2P-FH)/S + 1
= (6+2*1-2)/1+1
= 7
OW = (W+2P-FW)/S + 1
= (6+2*1-2)/1+1
= 7
【参考】
"0"からAI~ふらっとどうぞ~
https://www.zerokaraai.com/entry/2018/10/03/210211
###6-5-8 ソースコード演習
●データの畳み込み
【考察】
GPUを使用していなかったからか処理に時間がかかった。
あと、ドライブを指定しないとcommonが見つからず、
>import sys, os
>sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
を追加している。
ただ、画像処理をしているのは面白いなと感じた。
きちんと学習もできている。
●シラバス
キーワードをもとに、自分で進んで学習することが必要。
応用数学は、自分で手を動かして計算してみることが大事。
正則化は特に復習しておこう。
CNNは最重要項目。
RNNは分かりづらい部分を検索する能力が必要。
オートエンコーダなど高度な分野である。
⇒一通り終わったら勉強してみよう。
##6-6.Section5 最新のCNN
●AlexNetのモデル説明
2012年の画像認識コンペティションで、
2位に大差をつけて優勝したモデル。
●過学習を防ぐ施策
サイズ4096の全結合層の出力にドロップアウトを使用している。
論文でもドロップアウト使用有無による差が報告されている。
##6-7.自分で課題設定
●目的と必要になるデータ
手元にデータがない。
⇒「クローラーを作ってみる。」という課題設定。
●クローラー
DBの知識がある、ないによって作り方がある。
サンプルソースは、最終的にCSV化するものである。
取得サイトに影響させないため、time.sleepを入れること。