본문 바로가기
Study/CS231n

CS231n - Lecture 7 (Optimizer)

by 세이(Sayer) 2021. 6. 6.
728x90

CS231n Lecture7 - Training Neural NetworksⅡ의 전반부를 듣고 직접 제작한 PPT 자료입니다. 오류를 발견하시면 댓글로 말씀해주세요! (제가 발표를 담당한 주의 필기는 발표 대본으로 작성하기 때문에 다른 정리 포스트와 말투가 조금 다를 수 있습니다.)

CS231n Convolutional Neural Networks for Visual Recognition

Table of Contents: Learning In the previous sections we’ve discussed the static parts of a Neural Networks: how we can set up the network connectivity, the data, and the loss function. This section is devoted to the dynamics, or in other words, the proce

cs231n.github.io



지난 시간 리뷰입니다. 다양한 activation functions에 대해서 배웠는데요. sigmoid에서 gradient가 0이 되거나, saturation과 같은 문제점이 발생했고, 그에 대한 해결 방법으로 어떤 함수들을 사용하게 되었는지에 대해서 쭉 배웠습니다. 그리고 웬만한 케이스에는 ReLU를 사용하는 게 좋다는 것을 알 수 있었고요.


가중치 초기화를 어떻게 하는 것이 좋은가?에 대해서도 배웠어요. 가중치 초기화를 할 때 너무 작은 수로 초기화를 하면, network가 깊어지면서 곱할수록 0에 가까워지기 때문에 업데이트가 진행되지 않는다는 걸 확인했고, 너무 큰 수로 초기화를 해도 마찬가지로 gradient가 0이 되면서 학습을 진행할 수 없다는 걸 확인할 수 있었습니다. 이 점을 해결하기 위에 xavier initialization이 나왔는데, 이렇게 초기화된 값을 활용했더니 activation이 적절하게 모든 layer에서 scaled 되는 것을 확인할 수 있었습니다. 하지만 xavier init은 zero-centered를 가정한 원리이기 때문에 ReLU에 적용이 안 돼서, He 초기화가 나왔습니다.


모든 특징들이 동일한 범위에 있도록 데이터를 정규화해서, 그 특징들이 결과에 동등하게 기여할 수 있도록 하기 위해 데이터 전처리 과정이 필요하다는 것도 배웠습니다. 이미지의 경우에는 zero-centered처리만 주로 하고, 평균차감, 정규화, PCA와 Whitening 등의 방법이 있었어요.

그런데, 각 레이어의 입력의 분산을 평균 0, 표준편차 1인 입력값으로 정규화시키는 화이트닝 방법을 적용할 경우 굉장히 계산량이 많을뿐더러 일부 파라미터의 영향이 무시될 수 있다는 문제가 있습니다. 이렇듯 단순하게 Whitening만을 시킨다면 이 과정과 파라미터를 계산하기 위한 최적화(Backpropagation)과 무관하게 진행되기 때문에 특정 파라미터가 계속 커지는 상태로 Whitening 이 진행될 수 있다는 거죠.

이러한 문제점들을 해결하기 위해 batch norm을 사용합니다. 신경망 안에 각 layer마다 정규화하는 layer를 두어서, 변형된 분포가 나오지 않도록 조절하는 batch normalization도 있었습니다. 미니배치의 평균과 분산을 이용해서 정규화한 뒤에, scale 및 shift를 각각 감마 값과 베타 값을 통해 실행하는데요. 이 감마와 베타는 backpropagation을 통해서 학습이 됩니다. 이 과정을 거쳐 정규화된 값을 activation function의 입력으로 사용하고, 그 최종 출력 값을 다음 layer의 입력으로 사용하게 됩니다. 기존 output 식이 왼쪽이랑 같다면, Batch Norm을 사용하면, 오른쪽처럼 해당 레이어를 통과한 값을 함수에 넣는 형식이 되는 거죠!





이번 시간에는 최적화와 정규화에 대해서 조금 더 자세히 살펴보도록 하겠습니다. 기존 뉴럴 넷이 가중치들을 최적화하는 방법이 gradient decent인데요. 우리가 3주차에서 배웠듯이, Loss function은 해당 가중치로 문제를 해결했을 때 얼만큼 나쁜가?에 대해서 알려주는 역할을 합니다. 그리고 우리는 loss function의 현 가중치에서 기울기를 구해서 loss를 줄이는 방향으로 업데이트를 해 나가면서 적절한 가중치를 찾아가야 합니다. 이 과정을 최적화라고 하는데요. 최적화는 backpropagation 과정 중에 가중치를 업데이트하면서 진행되는데, 이때, 한 스텝마다 이동하는 발자국의 크기(보폭)을 학습률(learning rate)로 정의할 수 있고, 앞으로 이동할 방향을 현 지점의 기울기(gradient)라고 정의할 수 있습니다.

이 최적화 과정은 기본적으로 손실함수를 차근차근 줄이는 방향으로 내려가는 Gradient Descent 알고리즘으로 정의됩니다. 현재 가진 weight 세팅(내 자리)에서 내가 가진 데이터를 다 넣으면 전체 에러가 계산이 되고, 거기서 미분하면 에러를 줄이는 방향을 알 수 있다는 거죠. 그래서 에러를 낮추는 방향으로 가중치를 변경해야 되기 때문에 negative한, 즉 음수 방향으로 정해진 learning rate를 곱해서 weight를 이동시키게 됩니다.

그런데, 내가 가진 데이터를 모두 넣는 것이 데이터가 많을수록 굉장히 힘들거예요. 한 발자국 내려가자고 training data를 몇억건씩 넣어서 계산하기엔 너무 비효율적입니다. 그래서 Gradient Descent보다 빠른 옵티마이저가 없을까?라는 생각에서 출발한 것이 바로 SGD입니다.

Stochastic Gradient Decent의 약자인데요. 완벽한 대신 느린 것보다, 조금 훑어보고 일단 빨리 가자는 목적을 가지고 있습니다. GD가 한 번 학습할 때 모든 data에 대해 계산을 한 후 가장 최적화된 한 스텝을 걷는다면, SGD는 일부, 즉 mini-batch 단위로 검토를 한 후 일단 발을 내딛어보는 거라고 할 수 있어요.

SGD는 전체 학습데이터에서 하나씩 랜덤으로 뽑아 학습을 진행하는데요, batch_size만큼의 데이터를 랜덤으로 뽑아 한 회 학습에 이용하는 Mini-batch Gradient Descent도 있습니다. 어쨌거나 이렇게 적은 양의 데이터를 추출해 학습하게 되면 GD보다 훨씬 빠르게 업데이트가 진행된다는 장점이 있어요. 그런데 이 방법은 실제 학습에서는 문제가 많이 발생합니다.

먼저 2차원에서 loss가 한 방향으로는 빠르게, 다른 한 방향으로는 천천히 변화한다고 생각해봅시다. 그럼 이렇게 loss function 그래프가 그려지겠죠. 그러면 학습이 진행될 때 경사가 완만한 가로축 방향으로는 작게, 경사가 급한 세로축 방향으로는 크게 움직이기 때문에 지그재그로 움직이게 되는 것을 볼 수 있을 거예요. 이 문제는 고차원으로 갈수록 더 많이 발생하고, Neural networks는 parameter의 개수가 매우 많기 때문에 이 모든 parameter들이 위의 그림에서와 같이 서로 다른 방향으로 움직이며 얽히게 되면 학습 속도가 매우 느려질 수밖에 없습니다.

다음으로, 이러한 골짜기가 있는 loss function에서 SGD는 local minima와 saddle point에 빠질 수 있다는 치명적인 단점이 있습니다. Local minima의 경우 기울기가 0이 되어버리기 때문에 찾았다고 착각하고 멈춰버리게 됩니다. Saddle point 근처에서도 gradient가 0에 가까워지는 상황이 발생하고, gradient가 매우 작은 값이라 정말 학습이 느리게 진행되는 문제가 발생할 수 있습니다. 고차원에서는 local minima보다 saddle points가 더 자주 발생하게 됩니다. 왜냐하면 parameter가 1억개가 된다고 해보면, 현재 포인트에서 일부 방향은 손실이 증가하고 일부 방향은 손실이 감소하는 상황이 거의 모든 곳에서 발생할테니까요.

마지막으로, mini-batch를 사용하기 때문에 step마다 정확한 gradient를 담을 수 없습니다. 일부 data를 추출해서 학습을 진행하는 것이기 때문에, gradient를 측정할 때 noise가 있으면 SGD가 최소값에 도달하는데 더 오래 걸릴 수도 있겠죠. 오른쪽 그림을 보시면 일부러 noise를 준 상황입니다. 열심히 헤매고 있는 것을 볼 수 있어요.

즉, 기울기가 0인 지점이 나와도, 멈추지 않도록 하는 것이 필요합니다. 이 문제를 해결하기 위해 다양한 옵티마이저들이 고안되었는데요. 지금부터 하나씩 알아보도록 하겠습니다.

첫 번째로 소개할 방법은 SGD + Momentum입니다. 말 그대로 관성을 추가해서 local minima나 saddle point에서 벗어날 수 있도록 하는 방법이에요. 이 방법은 최적화 문제(optimization problem)를 물리학적 관점에서 바라보는 데서 유래했습니다. 물리학적 관점에서 관성을 사용해 최적화를 진행한다고 이해하시면 될 것 같아요.

SGD는 위치값(현재 파라미터 값)에 그라디언트가 직접 합쳐진다면, 모멘텀 업데이트는 물리학적 관점에서 그라디언트가 오직 속도(velocity)에만 직접적으로 영향을 주고, 그 속도가 위치값(position)에 영향을 주게 됩니다. 모멘텀 업데이트를 쓰면, (파라미터 벡터가 업데이트 되는) 속도의 방향은 그라디언트들이 많이 향하는 방향으로 축적되겠죠. 기존 SGD에서 velocity term이 추가된 버전이라고 이해하시면 됩니다. Velocity term은 속도를 조절하는 역할을 맡아 이러한 관성 효과를 내게 됩니다.

오른쪽 코드를 보겠습니다. vx가 velocity라고 보면 되고, rho는 마찰계수라고 보면 됩니다. 즉, 너무 빠르게 가지 않도록 일종의 마찰을 주는 거예요. Rho는 보통 0.9~0.99를 준다고 합니다. 이를 통해 gradient vector 방향 그대로 가는 것이 아니라, velocity vector의 방향으로 나아가게 됩니다. 모멘텀을 추가함으로써 속도가 생기면 노이즈가 평균화된다는 것을 이용한 방법입니다.

왜 관성을 추가했느냐? 만약에 매 스텝마다 gradient가 동일한 부호를 가지면 v의 절댓값은 계속 증가할 수밖에 없겠죠. 같은 방향으로 계속 이동하고 있으니까요. V가 증가함에 따라 x의 변화폭이 커지고, 이는 같은 방향으로 이동할수록 더 많이 이동하도록 가속화한다는 말과 같습니다.

이러한 특징 덕분에 위에서 SGD의 한계점으로 언급되었던 local minima나 saddle point에서 gradient가 0에 수렴하는 값을 가진다 하더라도 이전 step들에서 축적되어온 v값이 더해지며 멈추지 않고 그 지점을 통과할 수 있게 되는 것이죠. local minima에서 gradient가 0이 되더라도, 그 지점에서 속도를 여전히 갖고 있을테니까요. Saddle point에서도 그 주변 기울기는 매우 작을 수 있으나, 그 지점까지 가는데 발생한 속도 벡터가 존재하면 그 지점을 계속해서 통과해서 아래로 나아갈 수 있게 되는 것이죠.

그 다음 등장한 Nesterov Momentum은 momentum과 비슷하지만 살짝 다릅니다. 그림은 붉은색 원에서 모멘텀에 의해 연두색 화살표의 끝점으로 이동할 상황입니다. Nesterov 모멘텀은 현재 위치에서 그라디언트를 계산하는 것이 아니라 이 "예견된" 위치(화살표 끝점)에서 그라디언트를 계산하게 됩니다. 이렇게 되면 gradient를 계산하는 지점과 실제로 이동하는 지점이 다르게 되는데요, 왜 그렇게 계산을 하는지 변형된 식을 보면 이해할 수 있습니다.

화살표를 따라 변형된 식을 정리해보면 아래와 같이 나오는데, 이빨간 부분을 error-correcting term이라고 합니다. 이는 이전 이전 velocity와 현재 velocity의 차이를 반영하여 급격한 슈팅을 방지한다는 측면에서 효과가 있고, 더 빠른 학습을 가능하게 한다고 합니다. 이 수식을 코드로 옮겨놓은 것이 오른쪽입니다. 하나씩 대조해서 보시면 쉽게 이해가 되실 거예요.

지금까지 논의된 방법들은 모두 모든 파라미터에 똑같은 learning rate를 적용했는데요. 다음은 업데이트 횟수에 따라 learning rate를 조절하는 방식에 대해서 알아보겠습니다. Learning rate를 조절하는 건 굉장히 계산이 많은 작업이라 데이터에 맞춰서, 적응적으로 학습 속도를 정하는 방법을 찾고자 많이 노력했어요. 지금부터 살펴볼 AdaGrad도 데이터에 맞게 학습 속도를 조정하는 방법 중 하나입니다.

AdaGrad는 각각의 매개변수에 맞게 맞춤형으로 매개변수를 갱신하는 알고리즘입니다. 적응적으로 학습률을 조정하는 건데요. 기울기 제곱에 반비례하도록 학습률을 조정하는데, 이는 기울기가 가파를수록 조금만 이동하고, 완만할 수록 더 이동하게 함으로써 변동을 줄이는 효과가 있습니다. 무엇보다 가중치마다 다른 학습률을 적용한다는 점에서 더욱 정교한 최적화가 가능해집니다. 코드를 보시면 각 차원의 과거의 제곱 합을 기반으로 해서 각 파라미터들을 고려해 gradient의 scale을 조정한 값을 더해가는 방법이라는 걸 알 수 있어요.

그런데 여기서도 문제가 발생합니다. 아무리 좋은 값이라고 하더라도 결국 학습이 진행될수록 이 h는 축적될 수밖에 없구요. 이 분모값이 커질수록 이와 반비례하여 이동하는 보폭이 step을 진행할수록 작아지게 됩니다. 그만큼 처음에 올바른 지점으로 접근할 때 속도가 빨랐다가 점차적으로 속도가 느려져요. 이렇게 되면 결국 기울기가 0인 부근에서 학습이 급격하게 느려져서 local minima와 saddle point에서 업데이트가 되지 않는 문제가 발생할 위험이 커집니다. 이렇기 때문에 convex한 경우에는 매우 좋지만, convex하지 않을 때는 도중에 멈출 수도 있다고 하는 것입니다.

이 문제를 해결하고자 RMSProp이 등장했습니다. AdaGrad의 gradient 제곱항을 그대로 사용하는데요. 핵심은 보폭을 갈수록 줄이되 이전 기울기 변화의 맥락을 살피자는 것입니다. Adagrad식의 h와 squared gradient에 각각 p, (1p)의 decay rate가 붙습니다. 보통 p=0.9 정도로 설정되는데, 이렇게 되면 이전 스텝의 기울기를 더 크게 반영하여 h 값이 단순 누적되는 것을 방지할 수 있습니다. 이 과정을 "지수 가중 이동 평균"이라고 합니다. 쉽게 말해서 무작정 보폭을 줄이지 않도록 옆에서 말리는 역할이라고 이해하셔도 좋을 것 같습니다. 이는 adagrade와 매우 비슷하기 때문에 step의 속도를 가속/감속할 수 있습니다. 하지만 momentum과 비슷하게 앞에서 온 값을 적용시켜주기에 속도가 줄어드는 문제를 해결할 수 있습니다.

방금 나왔던 decay rate 대해서 조금 살펴보도록 하겠습니다. Learning rate decay learning rate 값을 크게 후에 일정 epoch마다 값을 감소시켜 최적의 학습까지 빠르게 도달할 있도록 하는 방법입니다. 실제로는 학습이 수행될수록 loss값의 감소가 더뎌지기 때문에 learning rate 줄여나가는 것이 필요하다고 해요. 이걸 수행하는 방법은 여러 개가 있는데요, 수업에서 소개되었던 exponential decay 있고, 오른쪽 그림처럼 감소가 더뎌질 때마다 learning rate 줄여주는 step decay 방법도 있습니다. Learning rate decay 처음부터 쓰는 것이 아니고, 학습 과정을 모니터링 후에 학습이 더딘 지점 필요하다고 판단되는 지점에 사용하게 됩니다. 다양한 decay 방법이 궁금하신 분은 아래 링크를 참조해보셔도 좋을 같아요.

지금까지 우리가 살펴본 optimizer들을 정리해보도록 하겠습니다.

모든 자료를 검토하는 GD, 그리고 그 느린 속도를 보완하기 위해 나온 SGD. 거기서 local minima와 saddle point에 대한 문제를 해결하기 위해 관성을 사용한 것이 momentum, 그리고 더 빠르게 계산하기 위해 관성 방향으로 먼저 움직이고 움직인 자리에서 스텝을 계산하는 NAG(Nesterov Momentum)가 있었습니다. 이 방법들은 모두 스텝 방향, 즉 momentum을 사용하는 방법들이었죠.

그 다음으로는 learning rate, 즉 스텝 사이즈를 조절하는 방법들이 있었습니다. Adagrad 같은 경우에는 변화가 많이 일어났을 수록 learning rate를 줄이고 변화가 적게 일어났다면 learning rate를 키우는 방식으로 탐색을 했고, 여기서 이 제곱합들이 계속해서 축적되는 바람에 분모가 커져서 gradient가 0에 가까워지는 문제가 발생하자, 이전 기울기를 더 크게 반영해 맥락을 고려해서 learning rate를 줄이는 RMSProp가 등장했습니다.

우리가 지금껏 살펴본 이 옵티마이저들은 모멘텀 계열과 Ada 계열로 나뉩니다. 그럼 이 두 개를 합치면 어떻게 될까요?

그 유명한(!) Adam이 됩니다. 앞서 등장한 두 갈래의 옵티마이저들의 집합체이며, 가장 흔하게 이용되는 옵티마이저입니다. 방향을 중심으로 한 Momentum 계열과 보폭을 중심으로 한 Ada계열이 합쳐져, 보폭도, 방향도 적절하게 조절하는 옵티마이저가 등장했습니다.

코드를 보면서 아담을 한번 살펴보겠습니다. 먼저 아직 완벽한 아담은 아니고 아담과 가장 비슷한 형태의 optimizer인데요. Momentum 계열과 ada 계열의 두 가지 특징을 어떤 면에서 다 가지고 있다고 하는 건지에 집중해서 보시면 좋을 것 같아요.

먼저 Second_moment를 0으로 초기화한 상태입니다. 이제 한 번의 업데이트를 진행하고 나면, beta2(second_moment의 decay rate)가 0.9 또는 0.99와 같이 1에 매우 가깝게 됩니다. 또 한 번의 업데이트 후에도 second_moment는 여전히 0에 가깝습니다. 자 이제 여기에서 learning rate를 second_moment로 나누면 아주 작은 수로 나누게 되는 거겠죠. 그럼 learning rate가 엄청나게 커질 수 있고, 이렇게 큰 learning rate는 잘못된 방향으로 학습하게 될 가능성이 큽니다.

그래서 bias correction이 추가된 것이 바로 adam입니다. 첫 timestep이 매우 매우 컸던 문제를 해결하기 위해서 bias correction 과정을 통해 first, second moment 값을 0으로 시작할 수 있도록 만들어준다고 이해하시면 됩니다. 사실 이렇게만 보면 이게 어떤 과정인지 잘 이해가 안 가실 것 같아서 수식으로도 준비해봤어요. 하나씩 비교해보면서 다시 살펴보겠습니다.

코드와 동일한 내용을 수식으로 바꿔 표현한 것인데요. 이 식을 보면 우리는 이러한 사실들을 알 수 있습니다. 첫째로, Mt의 식에서 빨간색 박스 속 gt를 보니 이것은 gradient를 중심으로 하는 모멘텀 계열이라는 것을 알 수 있어요. 둘째로, 그 아래 파란색 박스 속 gt^2를 보니 vt는 gradient 제곱에 반비례하는 ada, rmsprop 계열이라는 것을 알 수 있죠. 마지막으로 mt와 vt모두 rmsprop 슬라이드에서 봤던 decay rate가 포함된 가중평균식과 비슷하다는 것을 알 수 있습니다. 그럼 여기서 저 1차 2차 moment가 무엇일까요?

Moment란 ‘적률’이라는 개념입니다. 기본적으로 통계학에서 n차 적률이라고 하면 Xn의 기댓값을 의미한다고 해요. 우리가 알고 있는 모평균은 원래 X의 1차 적률이었고, 분산을 구할 때 자주 등장하는 E(X^2) 이것은 X의 2차 적률이라고 불립니다. 우리는 표본평균과 표본제곱평균을 통해 모수에 해당하는 이 1차 적률과 2차 적률을 추정하는 거예요. 즉, Gradient의 1차 2차 moment에 대한 추정치는, 각각의 모수인 E(Gradient)E(Gradient2)를 추정하는 값을 가리키는 말입니다.

관련 내용이 더 자세히 정리되어 있는 블로그를 첨부합니다! 깊게 이해하고 싶으신 분은 더 참고해 보셔도 좋을 것 같습니다.

옵티마이저 Optimizer 정복기 (부제: CS231n Lecture7 Review)

딥러닝을 처음 공부할 때 주춤하게 되는 지점이 바로 이 옵티마이저 파트이다. 개인적 경험상 여러번 반복해서 공부하였고, 어느 정도 이해하는데에 꽤나 긴 시간이 소요되었다. 따라서 이 글을

velog.io

그럼 이렇게 구해진 추정치 m과 v가 가중치 업데이트 식에 바로 쓰일까요? 아직 한 단계가 더 남았습니다.

빨간색부터 보겠습니다. 여기서 만약 m의 초기값(즉, mt1)이 0이면, 그와 곱해지는 β1이 1에 가까운 값(0.9)으로 지정되어 있기 때문에 기울기인 gt의 값에 관계없이 (1β1)gt는 0에 가까운 값이 되어 결국 mt가 0에 가까워집니다. 이 mt가 그대로 아래 가중치 업데이트 식에 쓰이면, 기울기에 비례하는 momentum 계열의 특성이라고 할 수 있는 mt 부분의 값이 0에 가까워져 한 step에 이동을 거의 하지 못하는(가중치가 업데이트되지 못하는) 편향된 결과를 보일 수 있습니다. 따라서, 이러한 편향을 잡아주기 위해 mt대신 mt^을 계산하여 가중치 업데이트 식에 적용하는 것입니다. 이렇게 momentum 계열의 특성을 반영했다면, 이번엔은 ada 계열의 특성을 반영해보겠습니다.

파란색을 보겠습니다. 여기서 만약 v의 초기값(즉, vt1)이 0이면, 그와 곱해지는 β2가 1에 가까운 값(0.999)으로 지정되어있기 때문에 기울기 제곱인 gt^2의 값에 관계없이 (1β2)gt2는 0에 가까운 값이 되어 결국 vt가 0에 가까워지게 됩니다. 이 vt가 그대로 아래 가중치 업데이트 식에 쓰이면, 기울기 제곱에 반비례하는 ada 계열의 특성이라고 할 수 있는 vt1 부분의 값이 발산하게 되어 한 step에 너무 많이 이동해버리는 편향된 결과를 보일 수 있습니다. 따라서 이러한 편향을 잡아주기 위해 vt대신 불편추정치를 계산하여 가중치 업데이트 식에 적용하는 것입니다.

이제 다시 코드로 돌아와보겠습니다. 어떤 과정을 거쳐서 optimization을 진행하는지 이제 이해가 잘 되시죠? 편향을 잡아주기 위한 과정으로 bias-correction이 추가됐으며, 이것은 우리가 구하는 추정치들 중 편향이 0인, 즉 가장 좋은 추정치를 구하는 과정이다 라고 이해하시면 좋을 것 같습니다.

다른 optimizer와 비교한 그림입니다. 아담 또한 rsmprop의 특징을 가지고 있기 때문에 그래프 모양이 비슷하신 걸 확인하실 수 있어요. 만약 앞서 설명드린 식 전개 과정이나, 아담에 대해 더 알아보고 싶으신 분은 이 링크로 들어가셔서 논문을 참고해보셔도 좋을 것 같습니다.

지금까지 살펴본 optimizer들을 한 번에 보면 이런 모습이라고 하네요!(gif 파일 첨부 예정)

지금까지 우리가 봤던 것들은 대부분 first-order optimization에 속합니다! 지금 그림에 보이는 것처럼 선형 gradient를 이용해서 다음에 어떻게 움직일지를 최적화하는 것을 first-order optimization이라 합니다.


또 다른 방식으로 second-order optimization 방식이 있습니다. gradient와 hessian을 사용해서 2차 추정을 하는 방식입니다. 그림에서 보이는 빨간 화살표처럼 바로 최솟값을 찾아 이동을 할 수 있다는 장점이 있습니다. 이 부분만 보면 second-order optimization을 쓰는 게 더 좋아보입니다. 하지만 역시 장단점이 있는데요.


먼저 장단점을 보겠습니다. 식을 대강 보시면 이제껏 optimization에서 필요했던 hyperparameter나 learning rate들이 보이지 않는다는 사실을 알 수 있어요. 이렇게 실험적으로 결과를 지켜보며 값을 조절해야 하는 hyperparameter나 learning rate가 필요 없다는 것이 장점입니다.

대신에 이 방식은 아주 치명적인 단점이 있는데. 이 hessian 항이 O^n개의 엘리먼트를 가지고 있어서, 이것들을 inverse를 취하고(H^(-1)) 계산을 하려면 연산량이 굉장히 많아지게 됩니다. 그래서 이러한 방식은 실질적으로 잘 쓰이지 않기 때문에 장단점만 간단히 설명하고 넘어가도록 하겠습니다.




여기까지 optimizer 설명에 해당하는 lecture7 정리입니다. 다음 포스트에서는 lecture7의 후반부인 regularization에 대해 정리하겠습니다.

'Study > CS231n' 카테고리의 다른 글

CS231n - Lecture 7 (Regularization)  (0) 2021.06.08
CS231n - Lecture 6 (Training Neural Networks I)  (0) 2021.05.14
CS231n - Lecture 5 (ConvNet)  (0) 2021.05.09
CS231n - Lecture 4 (Backpropagation)  (0) 2021.05.09
CS231n - Lecture 3 (Loss Functions)  (3) 2021.04.08

댓글