[딥러닝] Optimization 방법 정리 - penny4860/study-note GitHub Wiki

1. SGD

dx = compute_grad(x)
vx = -learning_rate*dx 					
x = x + vx

2. SGD + momentum

dx = compute_grad(x)
vx = -learning_rate*dx + rho*vx			# 이전 step에서 구해놓은 gradinet를 반영하는 부분이 추가
x = x + vx
  • momemtum의 역할은?
    • exponential filter로 gradinet term의 noise를 줄이는 역할
    • local min, saddle point에 머물지 않고 탈출하는 역할

3. Nestrov momentum

dx = compute_grad(x + rho*vx)			# parameter x를 update한 지점에서 gradient를 계산
vx = -learning_rate*dx + rho*vx			
x = x + vx
  • parameter를 update한 지점에서 gradient를 구하는 이유?
    • parameter 가 (rho*vx) 만큼 update 될 것이 확실함으로, 그 지점에서 gradinet를 계산하는 것이 좀 더 정확하다.

4. AdaGrad

grad_squared = 0
while True:
	dx = compute_grad(x)
	grad_squared += dx * dx						
	vx = -learning_rate * dx / np.sqrt(grad_squared)		# historical sum으로 나눈다.
	x = x + vx
  • learning rate에 의해 모든 parameter를 같은 step_size만큼 update하면 문제가 무엇인가?

    • parameter 별로 민감도가 다르다.
    • 따라서, 필요한 update step_size가 다름.
  • Historical Sum으로 나누는 이유?

    • parameter별 step_size를 normalize하기 위해.

5. RmsProp

while True:
	dx = compute_grad(x)
	# grad_squared += dx * dx											# AdaGrad : historical sum을 scaling term으로
	grad_squared = rho*grad_squared + (1-rho)*(dx * dx) 				# grad_squared를 moving average
	
	vx = momentum*vx + -learning_rate * dx / np.sqrt(grad_squared) 			# 
	x = x + vx
  • Parameters

    • learning_rate
    • rho : Discounting factor for the history/coming gradient
      • 보통 논문에서 decay로 표시하는 경우도 있음.
    • momentum
      • velocity의 exponential filtering 계수
  • Note

    • AdaGrad의 문제점

      • grad_squared 의 scale이 지속적으로 커진다.
      • 학습이 진행될 수록 parameter의 update가 작아지는 문제
    • RmsProp의 해결책

      • 이전 step에서의 grad_squared과 현재 step에서의 grad_squared의 평균을 scaling term으로 사용

Adam

while True:
	dx = compute_grad(x)
	
	first_moment = beta1*first_moment + (1-beta1)*dx 		  # gradient를 exponential filtering
	second_moment = beta2*second_moment + (1-beta2)*(dx * dx) # rmsprop 에서의 grad_squared 구하는 식과 동일

	vx = -learning_rate * first_moment / np.sqrt(second_moment) # dx대신 first_moment를 사용
	x = x + vx
  • Parameters

    • learning_rate
    • first_moment
      • gradient 에 대한 exponential fitering 계수
    • second_moment
      • grad_squared 에 대한 exponential fitering 계수
  • Note

    • rmsprop과 adam
      • 같은 점
        • grad_squared를 exponential filtering 해서 사용
        • 모멘텀을 사용
      • 다른 점 : momentum을 어디에 주는가?
        1. adam : momentum을 grad 구할때 준다.
        2. rmsprop : momentum을 velocity 구할떄 준다.

참고자료