토요일, 7월 27, 2024
HomeDL신경망의 파라미터 최적화 방법, SGD와 AdaGrad, Adam - 6장

[밑시딥1]신경망의 파라미터 최적화 방법, SGD와 AdaGrad, Adam – 6장

SGD

신경망 파라미터를 갱신하여 최적의 값을 찾아내는 것이 optimization입니다. 이렇게 최적화는 기울기를 업데이트 하는 것인데, 가장유명한 방법중 하나가 SGD입니다.

SGD의 구현

class SGD:
    def __init__(self, lr=0.01):
         self.lr = lr
    def update(self, params: dict, grads):
        for key in params.keys():
            params[key] -= self.lr * grads[key]

SGD의 단점

비등방성함수(anisotropy)에서 탐색경로가 비효율적이라는 것. 무작정 기울어진 방향으로 진행하는 SGD보다 나은 최적화 기법이 필요합니다.

SGD의 모멘텀

신경망의 파라미터를 갱신할 때, 이전 단계의 Gradient와 현재 Gradient의 방향이 같으면 값이 계속 누적되어서 Gradient가 커지는 효과가 방향이 자꾸 변하면 천천히(조금씩) 갱신되는 효과가 생깁니다.

class Momentum:
	def __init__(self, lr=0.01, momentum=0.9):
		self.lr = lr
		self.momentum = momentum
		self.v = None
	def update(self, params, grads):
		if self.v is None:
			self.v = {}
			for key, val in params.item():
				self.v[key] = np.zeros_like(val)
		for key in params.key():
			self.v[key] = self.v[key] * self.momentum - self.lr * grads[key] 
                         # 이전 업데이트와 방향 같을 시 값이 커지고, 방향 달라지면 값 작아짐.
			params[key] += self.v[key]

AdaGrad

학습률감소(lr decay) 기법

학습을 진행하면서 Learning rate를 점점 감소시키는 기법. 파라미터 전체에서 학습이 진행될 수록 학습률을 낮추는 방법이 대표적인 Decay방법이다. 하지만 파라미터별로 맞춤형으로 Decay해주는 것이 AdaGrad 최적화 방법이다.

개별 파라미터에 상황에 따라(adaptive) 다르게 조정하면서 학습하기 때문에 AdaGrad입니다.

과거의 Gradient를 h라는 변수에 누적합니다. Gradient의 제곱의 합으로 누적합니다. 그래서 학습을 할 수록 h값은 작아져 갑니다. 그래서 계속 하다보면 값이 0이되어 학습하지 않게 되는 단점도 있습니다. 이러한 단점을 개선한 것이 RMSProp입니다. RMSProp는 먼과거의 기울기는 잊고 가까운 과거의 기울기를 반영하는 방식으로 값이 0이되지 않게 합니다. 이것을 지수이동평균(EMA)이라고 합니다.

AdaGrad의 수식

h = h + Grad*Grad

이렇게 h값을 누적하고, w를 갱신할 때 h의 제곱근을 Gradient에 곱해줍니다.

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, value in params.items():
				self.h[key] = np.zeros_like(val)
		for key in params.keys():
			self.h[key] += grads[key] * grads[key] #과거 Grad 제곱의 합으로 누적
			params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key] + 1e-7) 
                         #h제곱근을 나눠서 갱신

크게 변한 파라미터는 갱신값이 작아집니다.

Adam

모멘텀과 AdaGrad의 기법을 합친 것이 Adam입니다.

RELATED ARTICLES

Leave a reply

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments