Open mizukihiraishi opened 2 years ago
01_深層学習全体像の復習
ニューラルネットワークは中間層を増やしていくと上手く行かなくなることがある AlexNetは7層程度だが、150〜200程度の規模のニューラルネットワークも出てきている 中間層を増やすと複雑な情報を表すことができる 中間層を増やしたときに出てくる問題・・・勾配消失問題 誤差逆伝播法のときに上手く学習ができてないとき 逆伝播のとき、微分の連鎖律を用いて各所を微分しながら、重みの更新量を求めていた 講義資料11ページの図は中間層が1層で、左に行けば行くほど入力層に近づく 誤差逆伝播法は入力層に近づくに連れて、微分の回数が増えていく → 中間層が増えるにつれて、膨大な数微分しなければならなくなる 確認テスト 連鎖律の原理を使い、dz/dxを求める z = t^2 t = x + y 2層のネットワークのコード https://github.com/mizukihiraishi/Study-AI/blob/ccb4b6a2cbef4db27d7db064e0d38b98b44cd93a/2_1_network_modified.ipynb
02_誤差逆伝播法
wのji成分だけ変数扱いになるため、それに掛けられているziだけ最終的に残る SGD(確率的勾配降下法)のソースコードを参照して、誤差逆伝播法のコードを見ていく https://github.com/mizukihiraishi/Study-AI/blob/ccb4b6a2cbef4db27d7db064e0d38b98b44cd93a/1_3_stochastic_gradient_descent.ipynb 誤差逆伝播法を行っているのは49行目のbackward関数 functions.d_mean_squared_error(d, y)の部分がEをyについて微分している部分 今回のコードはy=uの恒等関数を使っている部分がシグモイド関数を用いている functions.d_sigmoid(z1)
03_勾配消失問題-全体像
勾配消失問題・・・学習が上手くいかなくなる原因 学習が進むにつれて逆伝播で伝播する情報が少なくなり、重みの更新がされなくなる 講義資料P17 右図は学習回数が増えるにつれて、正解率が上がっている状態 左図は学習回数を重ねても正解率が上がっていない状態(学習がうまくいっていない) 逆伝播の際、出力層(誤差関数)から入力層へ情報が深くなっていくと、微分の式が増えていく 微分値は0〜1の範囲の値が多い、すなわち何度も掛けていくと値が小さくなっていくため、中間層が増えるにつれて勾配が消失していく 勾配消失問題が発生する代表的な活性化関数・・・シグモイド関数 シグモイド関数の微分結果は最大値が0.25(入力値が0のとき)のため、入力層に近づくに連れて活性化関数の数だけ最大値0.25の微分結果を掛けるため、勾配が小さくなっていく 確認テスト シグモイド関数を微分した時、入力値が0のときに最大値をとる。その値はいくつか? 解答:0.25 勾配消失問題の解決法・・・活性化関数を別のものにする、重み(w)の初期値を工夫する、バッチ正規化
04_勾配消失問題-活性化関数
活性化関数 ReLU関数・・・入力値が0より大きい場合はそのまま出力、0より小さい場合は0を出力 → 微分結果は1か0になる 微分結果が1のときその重みは使われ、0のときその重みは使われなくなる ReLU関数のメリット・・・微分結果が1か0になり勾配消失問題を回避できる、不要な重みは微分結果が0になり必要な重みのみが選択的に残る。(モデルのスパース化)すなわちモデルの効果的な動きを自力で見つけられるようになる 重みの初期値の設定 重みは色々な見方ができるようにしておきたい → 初期値に乱数を用いる 通常の乱数は平均が0で分散が1の正規分布(標準正規分布:自然界に一番多い正規分布)に従っている・・・この場合、うまく行かないことがある Xavier(ザビエル、ゼイビアー)の初期値設定 正規分布の値を前のノードの平方根で割る 前のノードの数・・・最初の重み(入力層に繋がっている中間層)であれば入力層の数、出力層であればその前の中間層の数、など
05_勾配消失問題-初期値の設定方法
5層のニューラルネットワークで考える 重みを標準正規分布で初期化した場合 各レイヤの出力は0もしくは1が多い → 微分結果はほとんど0になる 重みを標準正規分布を100で割った値で初期化した場合(初期値の分散が非常に小さくなる) 各レイヤの出力は0.5に極端に寄る → どのレイヤを通っても同じような値を出力する Xavierの初期値設定で重みを初期化した場合 各レイヤの出力は0、1の値ではなくなり、極端に値が偏ることもなくなる Xavierの初期値はシグモイド関数やtanh関数など、グラフに表すとS字カーブになるような活性化関数に対して効果的 ReLU関数などにはHeの初期化・・・標準正規分布に√2/nを掛けたもの(nは前のレイヤのノード数) 標準正規分布で初期化した値をReLU関数に通した場合 各レイヤの出力は極端に0に偏る 重みを標準正規分布を100で割った値で(初期値の分散が非常に小さくなる)をReLU関数に通した場合 2層目以降の出力は極端に0に偏る 重みを標準正規分布をHeの初期値設定で初期化したした値をReLU関数に通した場合 ある程度の表現力を保った状態で出力される 確認テスト 重みの初期値に0を設定するとどのような問題が出るか 解答・・・すべての重みが均一に更新されるため、表現力が小さくなり、多数の重みを持つ意味がなくなる 初期値を比較したコード https://github.com/mizukihiraishi/Study-AI/blob/583456c51c389a1adc61d4d604fe32caadae922f/1_4_1_mnist_sample.ipynb
06_勾配消失問題-バッチ正則化
バッチ正規化・・・ミニバッチ単位で入力値のデータの偏りを抑制する手法 ミニバッチ・・・小さなデータの塊 多くの場合、入力データは学習用と検証用に分割する 画像データの場合、GPUのミニバッチ・・・1~64枚、TPUのミニバッチ・・・1~256枚 コンピュータが学習する範囲・・・一つのミニバッチ バッチ正規化のメリット・・・中間層の重みの更新(学習)が安定し学習が速くなる、過学習を抑制する(学習データの極端なばらつきを抑えられるため) ミニバッチが8枚の画像の例xniは画像1枚、Ntは全体の枚数(8枚) ミニバッチの数式4・・・正規化した値をニューラルネットワークで扱うために調整している
07_勾配消失問題-実装演習
活性化関数、初期化の手法のコード 2_2_2_vanishing_gradient_modified.ipynb https://github.com/mizukihiraishi/Study-AI/blob/8322955849683b58d30b8af4de5dba04b416c6e4/2_2_1_vanishing_gradient.ipynb https://github.com/mizukihiraishi/Study-AI/blob/8322955849683b58d30b8af4de5dba04b416c6e4/2_2_2_vanishing_gradient_modified.ipynb vanishing sample・・・正規分布で初期化した場合(学習が失敗するパターン) 青いライン・・・学習用データに対する正解率 オレンジのライン・・・検証用データに対する正解率 バッチ正規化のコード 2_3_batch_normalization.ipynb https://github.com/mizukihiraishi/Study-AI/blob/f020162494b7964a792f43cccce4615358a40be4/2_3_batch_normalization.ipynb バッチ正規化はクラス化されている センタリング・・・変数の値から平均値を引いて,平均を0にする変数変換 例題チャレンジ batch_x, batch_t = data_x[i:i_end], data_t[i:i_end] N・・・全データの数 range(0, N, batch_size)・・・N飛ばしで数が入る batch_size・・・2の倍数、特に8の倍数が多い(コンピュータは2進数を扱うため)
08_学習率最適化手法-全体像
学習率最適化手法(Optimizer) 更新する重み=現在の重みから誤差に基づいた修正量に学習率をかけて引く 今日ではAdamが良く用いられる 誤差関数の最小化(グラフの底)が勾配降下法の目的 学習率が大きすぎる場合・・・発散して学習する値から外れてしまう 学習率が小さすぎる場合・・・更新量が少なく学習に時間がかかる、局所的最適解に収束し、大域的最適解に収束しづらくなる 学習率の決め方・・・初期の学習率を大きく設定し、徐々に学習率を小さくしていく
09_学習率最適化手法-モメンタム
Vt = μV-1 - ε∇E w^(t+1) = w^(t) + Vt Vt・・・wと同じようなデータが入っている Vt-1・・・前回の学習の重み μ・・・ハイパーパラメータ ε∇E・・・誤差を重みで微分したもの optimizer-visualization モメンタムの動き・・・最初は進みが遅く、段々と学習が進む速さが速くなる。大域的最適解にたどり着きやすい、収束が遅い 株価の移動平均のような動き プログラムの書き方(P46) μ・・・self.momentum
10_学習率最適化手法-Adagrad
ht・・・重みの勾配量の二乗を保持している(どういった重みの更新をしたかを覚えさせる) h0 = Θ・・・好きな値で初期化 坂道が緩い場合に得意 問題・・・大域的最適解にたどり着きづらい(鞍点問題)
11_学習率最適化手法-RMSProp
Adagradを基に、鞍点問題を解消したもの αどのぐらい前回・今回の勾配情報を保持するかを調整する メリット・・・大域的最適解にたどり着きやすい ハイパーパラメータの調整がそこまで必要とならない コード α・・・decay_rate
12_学習率最適化手法-Adam
Adam・・・モメンタムとRMSPropの特徴・メリットを持つ手法 Adamの場合は学習(Error rate)が滑らかに下がっていく
13_学習率最適化手法-実装演習
2_4_optimizer.ipynb https://github.com/mizukihiraishi/Study-AI/blob/dc0233eb02ef508222aa22e013d69bd53f9f9028/2_4_optimizer.ipynb SGD、Momentum、Adagradは学習がうまくいっていない RMSprop、Adamは学習がうまくいっている lossは下がっていくグラフ、プログラムでは正答率のグラフなので、上に上がっていく Momentumの記述があるセクションの40行目が重みを更新しているコード i・・・学習のステップ(全体でiters_num回) RMSpropのセクション41行目が重みの更新 decay_rate、learning_rate・・・ハイパーパラメータ Adam・・・2変数分経験を保持する行がある
14_過学習-全体像
過学習・・・極端に学習用データに適合してしまい、検証用データに対する誤差が悪くなる よくあるパターン・・・ある程度までは検証誤差が下がっていくがある時点から検証誤差が悪くなる → 過学習が始まる前のポイントで学習を終了して、その時点でのモデルを利用する 入力データが少なく、ニューラルネットワークが大きい・ノード数が多い場合(自由度が高い)に過学習が起こりやすい
15_過学習-正則化手法1
過学習を抑制する方法として正則化を導入する ニューラルネットワークの自由度が高すぎるため過学習が起きている → 自由度を制約する 過学習が起きているとき・・・ニューラルネットワークの内部では重みが極端に大きくなっていることがある 重みが大きすぎる → 入ってきた情報を過大評価している → 一部の入力データに極端に反応してしまう 極端な重みにならないように制約を設ける 誤差関数に対して正則化項を加算する L1正則化・・・Lasso回帰、p1ノルム L2正則化・・・Ridge回帰、p2ノルム それぞれベクトルの大きさを用いた正則化手法 L1、L2正則化・・・pノルムを加える ノルム・・・距離を表す
16_過学習-正則化手法2
p1ノルム・・・x + y マンハッタン距離 → 加算のみで計算できる p2ノルム・・・√x^2+y^2 ピタゴラス(三平方)の定理で求める距離(ユークリッド距離)→ 正確だが、計算が複雑になる pノルム・・・各々の項をp乗して全体を1/p乗する
17_過学習-正則化手法3
重みが2つの場合のニューラルネットワーク 誤差関数が一番小さい重みの時に過学習状態になる L2正則化ではすり鉢状の正則化項 L1正則化は4つの平面の組み合わせの正則化項 角の状態・・・w0=0 角の場所を目指して重みを更新していく → 最終的にw0 = 0、w1 = *になる → スパース化する
18_過学習-正則化手法4
正則化のグラフの意味 3Dグラフ・・・ある部分を切り取った誤差関数の等高線 楕円形で中心に黒丸(一番低い場所)がある図・・・誤差関数の等高線 L2正則化では円、L1正則化では正方形で描かれている線・・・正則化項の等高線 誤差関数の等高線と正則化項の等高線が交わった場所・・・誤差関数に正則化項を加算したときに一番低くなる場所(重みを更新する際に目指す場所) L2正則化後に目指す場所・・・ L1正則化後に目指す場所・・・軸上になる(どちらかの軸は0になる)→ 一つの重みは0になるポイントを探索する 確認テスト L1正則化のグラフはP67右図
19_過学習-例題
L2ノルムの微分を示すコードを示す L2ノルムは||param||^2なので、4のparamとなる L1ノルムの微分を示すコードを示す +xの時は1、-xの時は-1、0(底)の時は0となるので、3のnp.signとなる
20_過学習-ドロップアウト
学習のたびにランダムにニューラルネットワークの接続を部分的に切断して学習する データのつながりにバリエーションが生まれる → 過学習の抑制につながる データ量を変化させずに異なるモデルを学習させていると解釈できる 2_5_overfiting.ipynb https://github.com/mizukihiraishi/Study-AI/blob/31925fc146f27fe9e5e3499c25d62d48b6cf5b59/2_5_overfiting.ipynb weight decay ・・・正則化のコード overfitingの例・・・学習用とテスト用で結果に乖離が発生している L2正則化・・・学習用データに対しての結果は100%にはならなくなる L1正則化・・・一部の重みが消されるため、学習用データセットに対しての結果が100%にはならなくなる ドロップアウト・・・ニューラルネットワークの中で学習対象のデータが増えたような状態になっているため、学習速度は遅くなっている ドロップアウトとL1正則化を掛け合わせると学習がスムーズになる
21_CNN-構造1
CNN・・・画像の識別や画像の処理によく用いられるが、適用できるデータには画像にとどまらない → データの次元間で繋がりがあれば扱える 複数チャンネルのデータ・・・カラー画像・動画のRGBなど、一つの個所に複数のデータがある場合 次元間につながりがある・・・画像の場合、あるピクセルの隣(横・縦方向)には同じような色が続くことが多い 動画の場合、次の時刻は同じような映像が続くことが多いなど
22_CNN-構造2
画像のニューラルネットワークについて深堀りする P80CNNの構造図では下から上へ進んでいく LeNet:代表的なCNN 入力画像は32×32(1024個の数値)、出力は10種類(10個の数字)の分類結果 (32, 32):1024 → (28, 28, 6):4704 → (14, 14, 6):1176 → (10, 10, 16):1600 → (5, 5, 16):400 → (120, ):120 → (84, ):84 → (10, ):10 3232の画像に対して6人の人が2828の感想を述べている→1414に感想を要約する→要約した感想を16人の人に読んでもらって1010の感想を述べてもらう→感想を5*5に要約する→感想を120の一冊の本にまとめる→84に要約する→10に要約する
23_CNN-全体像
畳み込み層 入力3チャンネル(カラー画像)の場合を考える 入力値に対してフィルターを1マスずつずらしながら出力値を演算する 1マスずつずらすことによって次元間の繋がりが保持されている 音声データは時間方向に対してフィルターをずらしていって出力を得る 全結合層 今までのニューラルネットワークは全結合をしている CNNの後半部分は全結合をしている 全結合より前の層では次元の繋がりを保って特徴量の抽出を行う 全結合層では抽出された特徴量に基づいて人間が欲しい出力に変換する
24_CNN-畳み込み層(バイアス)
畳み込み層には重みとバイアスが含まれる 44の入力に対して33のフィルターを通すと2*2の出力が得られる フィルターの数だけ出力が得られる パディング 畳み込み画像に対してフィルターを通すと出力はサイズが小さくなる 普通に何度も畳み込み演算をした場合、出力が小さくなりすぎる また、出力の画像サイズが中途半端なサイズになる
25_CNN-畳み込み層(パディング・ストライド)
パディングは全方向に対して1マス広げる パディングの効果・・・畳み込み演算をした出力のサイズが小さくならない パディングの埋め方・・・0を入れる、近くの数字を入れる ストライド ストライド・・・フィルターの動く量、ストライド1の場合は隣にずらす、ストライド2の場合は1マス飛ばしでずらす ストライドを大きくした場合、出力サイズがより小さくなる チャンネル チャンネル・・・フィルターの数 なぜ畳み込み演算をするのか 全結合で画像を学習した場合、縦横チャンネルが1次元のデータとして処理されるため、次元間の繋がりが学習に反映できない
26_CNN-畳み込み層-実装演習
2_6_simple_convolution_network_after.ipynb https://github.com/mizukihiraishi/Study-AI/blob/6789302001f7055f3678aa117a2d08866c243aaa/2_6_simple_convolution_network_after.ipynb 畳み込み演算が使われている場所 simple convolution network class 23~29行目 convolution classの中に畳み込み演算が記述されている im2col・・・image to column im2colの変換 https://medium.com/@_init_/an-illustrated-explanation-of-performing-2d-convolutions-using-matrix-multiplications-1e8de8cd2544 2*2のフィルターで読み込む場合 読み込んだものを横か縦に並べる URLの参考資料では縦(1列)に、プログラムでは横(1行)に読み込んだものを並べている 読み込んだ値を並べることによって重みの行列演算がそのままできる(.dotで計算できる)
27_CNN-プーリング層
プーリング層のバリエーション・・・Max値(MaxPooling)、平均値(AveragePooling) MaxPooling・・・プーリングの対象領域の最大値を出力する AvgPooling・・・プーリングの対象領域の平均値を出力する 確認テスト 66の入力画像に対して22のフィルタで畳み込み演算をした時の出力画像のサイズをもとめる。ただしストライドとパディングは1とする 解答:高さ幅ともに (6 + 2 1 -2 ) / 1 + 1 = 7 よって77 畳み込み演算の出力サイズの公式 OH(出力の高さ) =( 画像の高さ + 2 パディングの高さ - フィルタの高さ) / ストライド +1 OW(出力の幅) = (画像の幅 + 2 パディングの幅 - フィルタの幅 )/ ストライド + 1 プーリング層の実装 2_6_simple_convolution_network_after.ipynb Pooling class プログラムではMaxプーリング 22~24行目 畳み込み層2層のCNNのコード https://github.com/mizukihiraishi/Study-AI/blob/3e0b41f9364c06207a23057411fbea591f53e348/2_7_double_comvolution_network_after.ipynb 畳み込み層を深くしたCNNのコード https://github.com/mizukihiraishi/Study-AI/blob/3e0b41f9364c06207a23057411fbea591f53e348/2_8_deep_convolution_net.ipynb
28_CNN-AlexNet
AlexNet・・・初期のころのCNNの手法 入力は224 224 3 畳み込み層を全て通すと13 13 256の出力になる 畳み込み層から全結合層への変換 Fratten処理・・・畳み込み層から出力されたものを全て1行のベクトルとして出力 13 13 256をFratten処理すると43264 1となる Global MaxPooling、GlobalAvgPooling・・・各レイヤー(チャンネル)ごとに最大もしくは平均を出力する 13 13 256をGlobal MaxPoolingもしくはGlobal AvgPooling処理すると256 1の出力になる FlattenよりもGlobal MaxPooling、GlobalAvgPoolingのほうがうまく特徴を掴むことができる AlexNetでは1313256から40961の出力に変換されているように図では描かれているが、実際はFlattenの処理が間にある(1313*256 → 43264 → 4096に変換されている) 全結合層では通常のニューラルネットワークの処理が行われてサイズが1000の出力になる サイズ4096の全結合層の出力にドロップアウトの処理を加えて過学習を抑制している
深層学習 day1
00_プロローグ1_識別モデルと生成モデル
00_プロローグ2_識別器の開発アプローチ
00_プロローグ3_識別器における生成モデル/識別モデル/識別関数
00_プロローグ4_万能近似定理と深さ
01_ニューラルネットワークの全体像
以下のセクションは1_1_forward_propagation内のコードで説明されている
https://github.com/mizukihiraishi/Study-AI/blob/af52b00d16b274721b263020bb33bb41442d5f8f/1_1_forward_propagation.ipynb https://github.com/mizukihiraishi/Study-AI/blob/51e61cc55e31813ce4e0134cc139fe1364b90a6b/1_1_forward_propagation_after.ipynb
02_入力層〜中間層
03_活性化関数
04_出力層_誤差関数
05_出力層_活性化関数
以下のセクションは1_3_stochastic_gradient_descent.ipynb内のコードで説明されている
https://github.com/mizukihiraishi/Study-AI/blob/50597991f8f209bce75e36f4a04500af4d683575/1_3_stochastic_gradient_descent.ipynb
06_勾配降下法
07_確率的勾配降下法
08_ミニバッチ勾配降下法
09_誤差勾配の計算
10_誤差逆伝播法_誤差勾配の計算
11_ディープラーニングの開発環境
12_入力層の設計
13_過学習
14_データ集合の拡張
15_CNNで扱えるデータの種類
16_特徴量の転移
17_問題解説