티스토리 뷰

2020/10/24 - [Study/인공지능] - Optimizer : AdaGrad, RMSprop ( 인공지능 기초 # 15 )

 

Momentum과 RMSProp 두가지 방식을 합쳐 놓은 옵티마이저 입니다.

따라서 복잡하지만, 현재 가장 많이 쓰이는 옵티마이저 입니다.

 

 

가중치 B1으로 Momentum을 변형하여 점화식 [직전의 속도값 고려 (관성고려)]

 

모멘텀의 반대방향 + 그레디언트의 반대방향

을 생각하고 가중치 B2로 AdaGrad를 변형하여 점화식

그레디언트의 제곱과 내분

을 생각합니다.

 

베타1과 베타2는 일반적으로 0.9나 0.99와 같은 1에 굉장히 가까운 숫자로 둡니다.

 

 

이때문에 초기값이 0인것에 영향을 받아 0에 편향된다. 그래서 이를 보정작업을 실시합니다.

 

m은 관성과 그레디언트를 내분한 것 

보정작업

 

점의 이동

 

매우 복잡하다..

 

복잡하긴 한데, ./././ 각 장점을 섞어놓은 것이다..

 

class Adam:

    """Adam (http://arxiv.org/abs/1412.6980v8)"""

    def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):
        self.lr = lr
        self.beta1 = beta1
        self.beta2 = beta2
        self.iter = 0
        self.m = None
        self.v = None
        
    def update(self, params, grads):
        if self.m is None:
            self.m, self.v = {}, {}
            for key, val in params.items():
                self.m[key] = np.zeros_like(val)
                self.v[key] = np.zeros_like(val)
        
        self.iter += 1
        lr_t  = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter)         
        
        for key in params.keys():
            #self.m[key] = self.beta1*self.m[key] + (1-self.beta1)*grads[key]
            #self.v[key] = self.beta2*self.v[key] + (1-self.beta2)*(grads[key]**2)
            self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key])
            self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key])
            
            params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7)
            
            #unbias_m += (1 - self.beta1) * (grads[key] - self.m[key]) # correct bias
            #unbisa_b += (1 - self.beta2) * (grads[key]*grads[key] - self.v[key]) # correct bias
            #params[key] += self.lr * unbias_m / (np.sqrt(unbisa_b) + 1e-7)
댓글
최근에 올라온 글
최근에 달린 댓글
250x250