#深層学習day1
##プロローグ
###識別モデル・生成モデル
機械学習・深層学習モデルのそれぞれで識別・生成を行う手法が存在する。
識別モデル…データを目的のクラスに分類する
テータからクラス
p(Ck|x)→条件「あるデータがxが与えられた」という条件のもとでクラスCkである確率
具体的なモデル→決定木、ロジスティック回帰、サポートベクタマシン、ニューラルネットワーク
特徴→高次元から低次元、必要な学習データ:少
応用例→画像認識
生成モデル…特定のクラスのデータを生成する
クラスからデータ
p(x|Ck)→条件「あるクラスxに属する」という条件のもとでデータCkの分布
具体的なモデル→隠れマルコフモデル、ベイジアンネットワーク、VAE、GAN
特徴→低次元から高次元、必要な学習データ:多
応用例→画像の趙解像度、テキスト生成
###識別器の開発アプローチ
識別器の開発には3つのアプローチが存在する。生成も識別に応用できる。
生成モデル…モデル化の対象→各クラスの生起確立、データのクラス条件付密度
特徴→データを人工的に生成できる、確率的な識別
学習コスト→大
識別モデル…モデル化の対象→データがクラスに属する確率
特徴→確率的な識別
学習コスト→中
識別関数…モデル化の対象→データの属するクラスのみ
特徴→学習量が少ない、決定的な識別
学習コスト→小
###識別器における生成モデルと識別モデル
データの分布は分類結果より複雑なことがある。生成モデルはこれを推定する。
データのクラス条件付密度は分類結果より複雑→生成モデルはこの分布を推定する。計算量が多い。
単に分類結果を得るのであれば、直接データがクラスに属する確率を求める→分類モデルのアプローチ
###識別器における識別モデルと識別関数
識別モデルは識別結果の確率が得られる。識別関数では識別結果のみ。
###識別モデルによる識別
1.推論:入力データを基に事後確率を求める
2.決定:事後確率を基に識別結果を得る。
→間違いの程度を測ることが出来る。
→推論結果の取扱を決められる(棄却など)
###識別関数による識別
入力データから識別結果を一気に得る。
→間違いの程度を測ることができない
###ニューラルネットワークでできること
回帰…結果予想(売上予想、株価予想)
ランキング(競馬順位予想、人気順位予想)
分類…猫写真の判別、手書き文字認識、花の種類分類
ニューラルネットワーク:回帰
連続する実数値を取る関数の近似→回帰分析(線形回帰、回帰木、ランダムフォレスト、ニューラルネットワーク)
ニューラルネットワーク:分類
性別や動物の種類など離散的な結果を予想するための分類→分類分析(ベイズ分類、ランダムフォレスト、ニューラルネットワーク)
深層学習の実用例
自動売買、チャットボット、翻訳、音声解釈、囲碁・将棋AI
##入力層~中間層
u=Wx+b
z=f(u)
u、zを求める式が赤線部分
##活性化関数
ニューラルネットワークにおいて、次の層への出力の大きさを決める非線形の関数。
入力値の値によって、次の層への信号のON/OFFや強弱を定める働きをもつ。
中間層の活性化関数
ReLU関数、シグモイド関数、ステップ関数
出力層の活性化関数
ソフトマックス関数、恒等写像、シグモイド関数
##出力層
出力層の誤差関数について
誤差関数を2乗する理由
引き算を行うだけでは、各ラベルの誤差で正負両方の値が発生し、全体の誤差を正しく表すのに都合が悪い。2乗してそれぞれのらべるで誤差を正の値になるようにする。
1/2する理由
実際にネットワークを学習するときに行う誤差逆伝搬の計算で、誤差関数の微分を用いるが、その際の計算式を簡単にするため。本質的な意味は無い。
本来ならば分類問題の場合、誤差関数にクロスエントロピー誤差を用いるが、説明の便宜上、誤差関数に平均2乗誤差を用いているため次のようなコードになる。
出力層の活性化関数
出力層と中間層の違い
【値の強弱】
・中間層:閾値の前後で信号の強弱を調整
・出力層:信号の大きさはそのまま変換
【確率出力】
・分類問題の場合、出力層の出力は0~1の範囲に限定し、総和を1とする必要がある。
出力層と中間層で利用される活性化関数が異なる
出力層の活性化関数について
恒等写像…回帰に使われる。誤差関数は2乗誤差。
シグモイド関数…二値分類に使われる。誤差関数は交差エントロピー。
ソフトマックス関数…多クラス分類に使われる。誤差関数は交差エントロピー。
数式とコード
シグモイド関数
def sigmoid(x):
return 1/(1+np.exp(-x))
ソフトマックス関数
def softmax(x):
if x.ndim==2:
x=x.T
x=x-np.max(x.axis=0)
y=np.exp(x)/np.sum(np.exp(x),axis=0)
return y.T
x=x-np.max(x)
return np.exp(x)/np.sum(np.exp(x))
平均2乗誤差
def mean_squared_error(d,y):
retrun np.mean(np.square(d-y))/2
クロスエントロピー誤差
def cross_entropy_error(d,y):
if y.ndim==1:
d=d.reshape(1,d.size)
y=y.reshape(1,y.size)
if d.size==y.size:
d=d.argmax(axis=1)
batch_size=y.shape[0]
return –np.sum(np.log(y
np.arange(batch_size),d]+1e-7))/batch_size
##勾配降下法
深層学習の目的
学習を通して誤差を最小にするネットワークを作成すること
→誤差E(w)を最小化するパラメータwを発見すること
→勾配降下法を利用してパラメータを最適化
学習率εについて
学習率が大きすぎた場合、最小値にいつまでもたどり着かず発散してしまう
学習率が小さい場合発散することはないが、小さすぎると収束するまでに時間がかかってしまう。
勾配降下法の学習率の決定、収束性向上のアルゴリズムに以下のものがある
・Momentum
・AdaGrad
・Adadelta
・Adam…最も使われる
エポック…誤差関数の値をより小さくする方向に重みW及びバイアスbを更新する1サイクル
勾配降下法…全サンプルの平均誤差
確率的勾配降下法…ランダムに抽出したサンプルの誤差
ミニバッチ勾配降下法…ランダムに分割したデータの集合(ミニバッチ)に属するサンプルの平均誤差
確率的勾配降下法のメリット
・データが冗長な場合の計算コストの軽減
・望まない局所極小解に収束するリスクの軽減
・オンライン学習ができる
バッチ学習…学習に使うすべてのデータを予めすべて用意しておき、すべてのデータを用いて学習する
オンライン学習…モデルに都度、都度データを与え、少しずつ学習していく。最初にすべてのデータを準備する必要が無い。
ミニバッチ勾配降下法のメリット
・確率的勾配降下法のメリットを損なわず、計算機の計算資源を有効利用できる
→CPUを利用したスレッド並列化やGPUを利用したSIMD並列化
##誤差逆伝播法
誤差勾配の計算(数値微分)
プログラムで微少な数値を生成し擬似的に微分を計算する一般的な手法
数値微分のデメリット
・各パラメータwそれぞれについて誤差を計算するために、順伝播の計算を繰り返し行う必要があり負荷が大きい→誤差逆伝播法を利用する
誤差逆伝搬の計算
計算結果(誤差)から微分を逆算することで、不要な再帰計算を避けて微分を算出できる
##モノローグ
ディープラーニングの開発環境
■ローカル
・CPU
・GPU
■クラウド
・AWS
・GCP
過学習
巨大なニューラルネットワークで発生
訓練誤差は少なくなるが、テスト誤差が大きくなる
過学習を防ぐ仕組みにドロップアウトがある
データ集合の拡張
学習データが不足するときに人工的にデータを作り水増しをする手法
分類タスクに効果が高い
密度推定のためのデータは水増しできない
画像でのデータ拡張手法は様々なものが存在…オフセット、ノイズ、ドロップアウト、JPEG圧縮、ぼかし、色温度、ジグソー、拡大・縮小、回転、剪断、クロップ、90度回転
データ拡張の結果、データセット内で混同するデータが発生しないよう注意
中間層へのノイズ注入で様々な抽象化レベルでのデータ拡張が可能
データ拡張の効果とモデル性能かの見極めが重要
・データ拡張の効果と性能評価
データ拡張を行うとしばしば劇的に汎化性能が向上する
ランダムなデータ拡張を行うときは学習データが毎度異なるため再現性に注意
・データ拡張とモデルの捉え方
・一般的に適用可能なデータ拡張はモデルの一部として捉える
・特定の作業に対してのみ適用可能なデータ拡張は入力データの事前加工として捉える。
特徴量の転移
入力層に近い側では、データの基本的な特徴が抽出される。
プリトレーニング:教師なし学習で特徴量抽出器を作る。学習済み重みを作る。
ファインチューニング:ベースモデル重み(学習済み重み)を再学習
転移学習:ベースモデルの重み(学習済み重み)を固定
特徴量抽出:学習コスト高、大量なデータが必要
タスク固有処理:学習コスト低、少量なデータで済む
#深層学習day2
##勾配消失問題
誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる
シグモイド関数では、大きな値では出力の変化が微小なため、勾配消失問題を引き起こすことがある。理由は、微分した(1-sigomoid(x))・sigmoid(x)の最大値が0.25なので、かけ合わせていくと0に近づく。
勾配消失の解決法
・活性化関数の選択
・重みの初期値設定
・バッチ正規化
ReLU関数
今、最も使われている活性化関数
勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている
0より大きい範囲では、微分結果が1なので、いくらかけ合わせても1のまま減らない
0未満の範囲では、微分結果が0になるので、その重みは使われなくなる
Xavierの初期値の設定方法
標準正規分布に属する乱数である重みの要素を、前の層のノード数の平方根で除算した値
標準正規分布に属する値で初期化すると、0か1に偏るため、勾配消失が発生する
Xavierの初期化を行うと、各レイヤーを通った後の値はどれもある程度のばらつきを持ちつつ、0や1に偏ることもない。活性化関数の表現力を保ったまま、勾配消失への対策がとれている。
Xavierの初期化は、シグモイド関数のようにS字カーブの活性化関数で効果を発揮する
Heの初期値を設定する活性化関数:ReLu関数
初期値の設定方法
重みの要素を、前の層のノード数の平方根で除算した値に対し、ルート2をかけ合わせた値
標準正規分布に属する値の場合、0に偏る
He初期化を行うとある程度表現力を保った状態となる
重みの初期値に0を設定すると、正しい学習が行えない→すべての重みの値が均一に更新されるため多数の重みをもつ意味がなくなる
バッチ正規化とは
ミニバッチ単位で、入力値のデータの偏りを抑制する手法
バッチ正規化の使いどころとは?
活性化関数に値を渡す前後に、バッチ正規化の処理を含んだ層を加える
機材の違いによるミニバッチサイズ
GPU:1~64
TPU:1~256
バッチ正規化のメリット
学習が安定化し、学習がスピードアップする
過学習を抑える
ReLu関数の場合。ある点までは、学習が全く進んでいないが、急激に学習が進む。
シグモイド関数Xavierの場合。学習が順調に進む。
Relu-He初期化の場合。かなり高速に学習が進んだ。
バッチ正規化のコード
batch_sizeに分割して正規化している
学習が順調に進んでいる
##学習率最適化手法
初期の学習率設定方法の指針
・初期の学習率を大きく設定し、徐々に学習率を小さくしていく
・パラメータごとに学習率を可変させる
→学習率最適化手法を利用して学習率を最適化
モメンタム
誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値との慣性の積を加算する
モメンタムのメリット
・局所的最適解にはならず、大域的最適解になる。
・谷間についてから最も低い位置(最適値)にいくまでの時間が早い
モメンタムのコード
self.v[key]=self.momentumself[key]-self.learning_ragegrad[key]
慣性μ 学習率ε 微分した値
params[key]+=self[key]
AdaGrad
誤差をパラメータで微分したものと再定義した学習率の積を減算する
AdaGradのメリット
・勾配の緩やかな斜面に対して、最適値に近づける
課題
学習率が徐々に小さくなるので、鞍点問題を引き起こすことがある。
コード
self.h[key]=np.zeros_like(val)
何かしらの値でhを初期化
self.h[key]+=grad[key]grad[key]
計算した勾配の2乗を保持
params[key]-=self.learning_rategrad[key]/(np.sqrt(self.h[key])+1e-7)
現在の重みを適応させた学習率で更新
RMSProp
誤差をパラメータで微分したものと再定義した学習率の積を減算する
RMSPropのメリット
局所的最適解にならず、大域的最適解となる。
ハイパーパラメータの調整が必要な場合が少ない
コード
self.h[key]*=sef.decay_rate
self.h[key]+=(1-self.decay_rate)*grad[key]grad[key]
params[key]-=self.learning_rategradkey
Adam
・モメンタムの過去の勾配の指数関数的減衰平均
・RMSPropの、過去の勾配の2乗の指数関数的減衰平均
上記それぞれを含んだ最適化アルゴリズム
Adamのメリット
モメンタムおよびRMSPropのメリットを含んだアルゴリズム
Adamの例、学習はうまくいっている。RMSpropよりも若干テストケースの値がよくなっている。
##過学習
テスト誤差と訓練誤差の学習曲線がかい離すること
原因
・パラメータの数が多い
・パラメータの値が適切でない
・ノードが多い
正則化
ネットワークの自由度(層数、ノード数、パラメータの値など)を制約すること
→正則化手法を利用して過学習を抑制する
Weight decay(過重減衰)
過学習の原因
重みが大きい値をとることで、過学習が発生する
→学習させていくと、重みにばらつきが発生する
重みが大きい値とは、学習において重要な値であり、
重みが大きいと過学習が起こる
過学習の解決策
誤差に対して、正則化項を加算することで、重みを抑制
→過学習が起こりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにばらつきを出す必要がある。
L1,L2正則化
誤差関数にpノルム(距離)を加える
p=1の場合、L1正則化→Lasso回帰
マンハッタン距離
p=2の場合、L2正則化→Ridge回帰
ユークリッド距離
コード
weigth_decay+=weight_decay_lambda
np.sum(np.abs(network.params['W'+str(idxx)]))
loss=network.loss(x_batch,d_batch)+weight_decay
ドロップアウト
ランダムにノードを削除して学習させること
メリットとして
データ量を変化させずに、異なるモデルを学習させていると解釈できる
2_5_overfittingの実行結果について
過学習、トレーニングセットについて正解率が100%
L2正則化、正解率が100%じゃなくなる
L1正則化、正解率が100%じゃなくなる。学習が不安定
ドロップアウト、学習が未完了と考えられるが、順調に上がっている。上の3つに比べると遅くなっている。
##畳み込みニューラルネットワークの概念
畳み込みニューラルネットワーク(CNN)では次元間でつながりのあるデータを扱える
1次元 2次元 3次元
単一チャンネル 音声(強度) フーリエ変換した音声(強度) CTスキャン画像(強度)
複数チャンネル アニメのスケルトン(腕の値、膝の値、…) カラー画像(R,G,B) 動画(R,G,B)
次元的なつながりがあれば、なんでも学習できる
LesNet
---------------------次元のつながりを保つ----------------- ---人間がほしい結果-----
入力 C1 S2 C3 S4 C5 F6 出力
(32,32) (28,28,6) (14,14,6) (10,10,16) (5,5,16) (120,) (84,) (10,)
1024 4704 1176 1600 400 120 84 10
畳込層では、画像の場合、縦、横、チャンネルの3次元のデータをそのまま、学習し次に伝えることができる。
結論
3次元の空間情報も学習できるような層が畳込層である。
全結合層
人間のほしい情報を得る
畳込層の演算概念
入力画像にフィルター(全結合層の重みに相当)の値をかけ合わせて足しバイアスを加え、出力画像を得る
入力画像にフィルターを適応すると出力画像が入力画像に比べて小さくなる。
出力画像が小さくならないように入力画像を縦横に広げることをバディングトいう。
パティングには、全部0で埋める、一番近い数字で埋めるなどの方法がある。
フィルターをいくつずつ、ずらすかをストライドという。
チャンネルはフィルターの数のこと。
全結合層(普通のニューラルネットワーク)のデメリット
画像の場合、縦、横、チャンネルの3次元データだが、1次元のデータとして処理される。
→RGBの各チャンネル間の関連性が学習に反映されない。
畳込層の実装
高速処理するための仕組み
im2col
4×4入力 3×3のフィルタ
3マスずつ読み込まれてデータを横に並べることで、ドット積で求められる。
プーリング層の演算概念
畳込演算のように、重みをかけるのでなく、対象領域の平均(Avg Pooling)または最(Max Pooling)大をとる。
出力画像の大きさを求める公式
高さ=(画像の高さ+2×パディング高-フィルター高)/ストライド+1
幅=(画像の幅+2×パディング幅-フィルター幅)/ストライド+1
プーリング層の実装
17行目 計算を速くするため列を並べ替える
19行目 元の形に並べ替える
22行目 最大値を求める
##最新のCNN
AlexNet
モデルの構造
5層の畳込層およびプーリング層、それに続く3層の全結合層から構成される。
畳込層から全結合層の作り方
Flattenというやり方は、横にすべて並べる
Global MaxPooling 1層の中の最大値を並べる
Global AvgPooling 1層の中の平均値を並べる
後ろ2者は、情報量を減らす割には非常に良い結果が得られる
過学習を防ぐ施策
サイズ4096の全結合層の出力にドロップアウトを使用している