questionet

Optimization (최적화 기법) 본문

Deep learning/딥러닝 학습기법

Optimization (최적화 기법)

orthanc 2021. 1. 17. 19:59

이 페이지는 다음 강의를 정리한 것이다
www.youtube.com/watch?v=YnQJTfbwBM8&list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r&index=4


Adagrad
(adaptive learning rates)
SGD의 문제점들을 극복하기 위한 알고리즘

SGD의 문제점

1 zigzag pattern
2 local minimum, saddle point
3 noisy

SGD는 파라미터를 갱신하는 방법이
이전 파라미터에서 W에 대해 손실함수를 미분한 값을 뺀 값을
새 파라미터로 쓰는 작업을 반복하는 것이므로
기울어진 방향으로 일정거리만(learning rate만큼) 가겠다는 단순한 방법이다.

이런 SGD
로스값들로 형성된 공간이 기울기의 정도가 서로 다른 면으로 되어 있는 형태, 다시 말해,
면에 따라 어디는 완만하고 어디는 급격한 경사를 갖게 되는 형태)를 갖는 공간에서 사용할 때는
경사면들의 경사진 방향이 global minimum을 가리키고 있지 않는 경우도 있을 수 있기 때문에
지그재그 패턴을 보이게 되는데
러닝레이트 값이 너무 크면 overshoot이 일어나 경로의 비효율이 일어날 수 있고
반대로 러닝레이트 값이 너무 작으면 국소값이나 안장점에 빠졌을 때 벗어나지 못하는 한계가 있다.

Adagrad의 원리
매개변수를 업데이트할 때마다
손실함수의 미분값을 구하고 (dw) 그걸 제곱한 값을 (dw x dw) 별도의 변수 grad_squared에 넣는다
그리고 W를 갱신할 때 손실함수의 미분값에 학습률을 그냥 곱하지 않고 (w = w - a x dw)
학습률을 grad_squared의 제곱근으로 나눈 값을 곱해준다. (w = w - (a / square root grad_squared) x dw)

SGD에선 학습률이 전체 매개변수에 대해 학습이 진행되는 내내 똑같은 반면,
아다그라드 방법으로 하면, 매번 계산되는 학습률 값에 이전의 기울기 값이 계속 반영되고
그 반영되는 방식이 기울기를 제곱한 걸 나눠주기 때문에
이전의 기울기가 컸다면 제곱을 하게 되니까 더 큰 수로 나눠주게 돼서
결과적으로 곱해지는 러닝레이트값은 더 작아져
학습률이 더 넞아지는 식으로 계산이 이뤄지게 된다.

다시 말하면
아다그라드를 쓰면 처음 경사면을 타고 쭉 내려온 다음 파라미터를 갱신해서 다시 내려올 때
학습률에 이전의 기울기의 제곱근을 나눠주므로 학습률이 낮아져서
그 근방에서 경사면을 따라 조금 내려오게 되고 이런식으로 갱신강도가 빠르게 약해져서
지그재그 패턴을 만들지 않고 쭉 내려오게 된다
기울기가 완만한 경사면에서는 러닝레이트에 나눠지는 값도 작아지게 되서
급경사면보다 훨씬 쭉쭉 내려오게 된다

Adagrad의 문제점
오랜 시간동안 아다그라드 알고리즘을 실행시켰을 때
무한히 계속 학습을 시키면
어느 순간 갱신량이 0이 되어 전혀 갱신을 하지 않게 된다
무슨말이냐면
이전의 기울기를 제곱한걸 나눠준 러닝레이트가 곱해지면서 파라미터가 갱신되기 때문에
학습이 진행될수록 분모가 점점 커져서
갱신정도가 0에 가까워진다
그러면 결과적으로 아직 최저 로스에 도착하지 못한 상태에서 옵티마이제이션이 멈출수도 있게 된다

이 문제를 해결하기 위해서
보완한게  RMSProp

RMSProp (아다그라드의 약화된 버전이라고 설명)

RMSProp의 원리
SGD Momentum이 일종의 마찰계수를 가졌던 것처럼
(매 단계마다 벨로시티를 Decaying 하는 rho의 존재처럼)
RMSProp에도 기울기의 제곱 평균을 decaying하는 역할을 하는게 추가된다.

Adagrad : grad_squared =  += dw * dw

RMSProp : grad_squared = decay_rate * grad_squared + (1 - decay_rate) * dw * dw

이 둘을 비교하면
grad_squared 를 갱신할 때 이전 grad_squared dw**2를 그냥 더해주는 게 아니라
0에서 1사이의 decay_rate 를 먼저 이전 grad_squared에 곱해준 다음 여기에다가
1 - decay_rate 한 값을 dw**2  곱해준 걸 더해준다.
이 식에 따르면 decay_rate를 크게 할 수록 이전 기울기 정보는 약해지고
새로 반영되는 기울기 정보를 큰 비율로 반영하게 된다
이렇게 하면 갱신정도가 학습을 거듭할수록 팍팍 줄지 않고 적당히 줄게 되어서
최저 로스에 도달할 때까지 학습이 이뤄지게 할 수 있다

Adam
SGD + momentum overshoot되는 경향이 있어 비효율이 생기는 단점이 있고
Rmsprop은 크게 튀지 않고 경사면을 따라 잘 내려가는데
학습률 감소 메커니즘 때문에 팍팍 나가지 않는다는 비효율이 있다
SGD + momentum Rmsprop을 서로 합치면 각자의 단점을 상쇄할 수 있지 않을까? 라는 아이디어
adam RMSProp에 모멘텀을 합친 것이다.

Adam의 원리
두개의 변수를 집어 넣는데
하나는 momentum에서 velocity 역할을 하는 moment1
다른 하나는 adagrad에서 학습률 감소 메커니즘 역할을 하는 moment2
갱신될 파라미터는 이전 파라미터에서
러닝메이트에 moment1을 곱한 걸
moment2의 제곱근으로 나눠준 값을 빼준다

아담은 매우 잘 작동하고 하이퍼 파라미터 튜닝이 어렵지 않아 SGD momentum과 더불어 많이 쓰인다고 한다
SGD momentum은 하이퍼 파라미터 튜닝이 아담보다 많이 필요하다

Adam의 문제점
아담을 쓸때 beta2를 큰 값을 쓰면 옵티마이제이션 과정의 초반부에 문제가 생길 수 있다.
moment2 0에 매우 가까워지게 됨에 따라
0에 가까운 매우 작은 수로 러닝 레이트를 나누게 되어
결과적으로 러닝레이트가 매우 커지게 된다.

해결책
그래서 bias correction을 하는데
최적화과정 초반부에 러닝레이트가 너무 커지지 않도록
베타2를 그냥 1에서 빼지 않고
제곱을 해준 다음 빼서
나누는 값이 너무 작지 않게 해준다.

second optimization algorithm
지금까지 다룬 알고리즘들은 전부 퍼스트 오더 옵티마이제이션 알고리즘이라 부른다
함수를 한번 미분하여 얻은 도함수인 접선의 기울기를 이용해 파라미터를 갱신하는 방식
즉 로스값들로 이루어진 공간의 한 면에 직선을 근사시키는 (선형근사) 이다.

세컨드 오더 옵티마이제이션 알고리즘도 있다. 이것은 이차함수를 근사시키는 것이다. 

second optimization algorithm의 장점
second optimization algorithm은 스텝사이즈를 선택하기 좀 더 쉽다는 장점이 있다
경사가 큰 경우엔 스텝사이즈를 작게 할 수 있고
경사가 작은 경우엔 스텝사이즈를 크게 할 수 있어서
바꿔 말하면
아다그라드의 학습률 감소 메커니즘과
모멘텀의 효과를 얻을 수 있다

second optimization algorithm의 한계
하지만 실제로 많이 쓰이진 않는다
파라미터가 굉장히 많을 때
세컨드 오더 옵티마이제이션은
헤시안 매트릭스를 쓰는데 헤시안 매트릭스의 원소들은 제곱형태다
즉 빅오가 커진다
따라서
low dimensional problem이거나
미니배치를 뽑아서 쓰는 게 아닌 풀 배치가 가능할 땐
세컨드 오더 옵티마이저를 써도 괜찮다

Comments