314 Views
June 23, 24
スライド概要
AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!
前期輪読会 6-1 パラメータの更新 京都大学工学部 木村優汰 0
6-1 パラメータの更新 学習の目的 : 損失関数の値を小さくする つまり損失関数を小さくするような 最適なパラメータを求めたいということ 最適化問題の一種であり、難しい 最適化手法 前章まで:確率的勾配降下法(SGD) 他にも効率的な手法があるので本節ではそれらをみていく 1
6-1-1 冒険家の話 最適化についてのたとえ話 冒険家 = 私たち 深き場所 = 最適なパラメータ 地面の傾斜 = 勾配 SGD : 今いる地点で最も傾斜がきつい方向に進もうとすること 2
6-1-2 SGD SGDを数式で表す。 W:重みパラメータ(更新対象) η:学習係数 L:損失 #最適化を行うクラス Class SGD: def __init__(self, lr = 0.01): self.lr = lr def update(self,params,grads): for key in params.keys(): params[key] -= self.lr * grads[key] W ← W – η(∂L/∂W) 3
6-1-3 SGDの欠点 例として を考えてみる この関数は で最小をとる。つまり たどり着くことが目的である。 に 勾配の向きと最小値への向きは必ずしも一致しない:欠点の要因 4
6-1-4 Momentum import numpy as np v:速度のようなもの :速度の減衰に対応 ボールを転がした ような挙動 class Momentum: def __init__(self,lr=0.01,momentum=0.9): self.lr = lr self.momentum = momentum self.v = None #vを格納するための辞書 def update(self, params, grads): if self.v is None: self.v = {} #初期化 for key, val in params.items(): self.v[key] = np.zeros_like(val) for key in params.keys(): self.v[key]=self.momentum* self.v[key]-self.lr*grads[key] params[key] += self.v[key] 5
6-1-5 AdaGrad 学習係数の減衰を導入 パラメータの要素ごとに 学習係数を調整しながら 学習をする class AdaGrad: def __init__(self,lr=0.01): self.lr = lr self.h = None def update(self,params,grads): if self.h is None: self.h = {} for key, val in params.items(): self.h[key]+=grads[key]*grads[key] params[key]-=self.lr*grads[key]/ (np.sqrt(self.h[key])+1e-7) :勾配の二乗和を保存 6
6-1-6 Adam 勾配の平均分散から各パラメータで個別の学習係数を計算する手法 過去の情報を減衰させる移動平均の概念(RMSProp) MomentumとRMSPropの融合がベース ハイパーパラメータが3個 勾配の移動平均 勾配の2乗の移動平均 詳しくは以下の論文で [1412.6980v8] Adam: A Method for Stochastic Optimization (arxiv.org) 7
6-1-7 どの更新手法を用いるか? 全ての問題について最適な手法は今のところ存在しない 本書ではSGD,Adamを主に使用している 右図について これは での最小点の探索経路 ・それぞれの手法に特徴 ・今回はAdaGradが一番 きれいに収束している 8
6-1-8 MNISTデータセットによる更新手法の比較 MNISTデータセットについて最適化に前の4個の手法を 用いた結果を比較する。 SGD以外の方法のほうが学習が 速い この結果はハイパーパラメータ やネットワークの構造で変わる (5層、各層100個のニューロン) 9
10