최적화 (Optimization)
- 손실 함수 값(loss)을 최소화하는 파라미터( : )를 구하는 과정
_image_1.gif)
기울기(Gradient)
- 미분 가능한 N개의 다변수 함수 를 각 축이 가리키는 방향마다 편미분 한것 (Gradient)
\nabla f(x) = \begin{bmatrix} \cfrac{{\partial f}}{\partial x} \ \cfrac{{\partial f}}{\partial y} \end{bmatrix} \ \ \ = \begin{bmatrix} 2x + 3y \ 3x + 2y \end{bmatrix}
<br> ## 최적화 기법 ### 경사 하강법(Gradient Descent) - 일차 미분을 이용한 최적화 기법 ([[Gradient Descent]] 참고) - $\alpha$ = Learning Rate, Step Size (하이퍼 파라미터, 보통 0.01 ~ 0.001) - step size가 너무 작으면 매 step 별로 이동하는 거리가 너무 작아 수렴하지 못하고, 너무 크면 발산하게 될 수 있다 $$\theta_{i+1} = \theta_{i} - \alpha \nabla f(\theta_i)$$ - 수식을 통해 손실 함수의 값이 거의 변하지 않을 때까지(약 $10^{−6}=0.000001$) 가중치를 업데이트하는 과정을 반복 ![[6. 최적화와 경사하강법(Optimization)_image_2.png|+center]] ### 경사 하강법(Gradient Descent) 예시 - 경사 하강법을 통해 손실 함수 [[4. 손실 함수(Loss Function)#평균-제곱-오차-mean-squared-error-mse--l2-loss|Mean Squared Error (MSE)]]의 값이 최소가 되는 $(w, b)$를 찾는다. - 손실함수 $L(w, b)$는 다음과 같이 정의한다. $$L(w,b)={\cfrac 1 n \sum\limits(\hat y-y)^2}$$ - 여기서 예측값 $\hat{y}$는 $w, b$가 스칼라 값인 간단한 선형 모델이라 설정하고 이것을 대입하면 다음과 같다. - 실제 딥러닝에서 $\hat{y}$ 는 선형 변환과 비선형 활성화 함수가 층층이 쌓여 계산되는 형태이고, 매우 많은 가중치($w$)와 바이어스($b$)에 대해 모든 편미분 값을 계산해야한다. $$\hat y = wx+b$$ $$L(w,b)={\cfrac 1 n \sum(wx+b-y)^2}$$ - Gradient 계산\begin{align} gradient(w) = \frac{\partial loss}{\partial w}&=\frac{\partial}{\partial w}({\cfrac 1 n \sum\limits(wx+b-y)^2)}\ &= \frac{\partial}{\partial w}({\cfrac 1 n \sum A^2)}\ &= \cfrac 2 n \sum (A\frac{\partial}{\partial w}(A))\ &= \cfrac 2 n \sum ((wx+b-y)(\frac{\partial}{\partial w}(wx+b-y)))\ &= \cfrac 2 n \sum ((wx+b-y)(x))\ &= \cfrac 2 n \sum ((\hat y-y)(x)) \end{align}
\begin{align} gradient(b) = \frac{\partial loss}{\partial b}&=\frac{\partial}{\partial b}({\cfrac 1 n \sum\limits(wx+b-y)^2)}\ &= \frac{\partial}{\partial b}({\cfrac 1 n \sum A^2)}\ &= \cfrac 2 n \sum (A\frac{\partial}{\partial b}(A))\ &= \cfrac 2 n \sum ((wx+b-y)(\frac{\partial}{\partial b}(wx+b-y)))\ &= \cfrac 2 n \sum ((wx+b-y)\times1)\ &= \cfrac 2 n \sum (\hat y-y) \end{align}
w_{i+1} = w_i - \alpha (\cfrac 2 n \sum ((\hat y-y)(x)))
w_{i+1} = w_i - \alpha (\cfrac 2 n \sum (\hat y-y))
- 이때, $\alpha$와 2는 상수이므로 2는 생략가능w_{i+1} = w_i - \alpha (\cfrac 1 n \sum ((\hat y-y)(x)))
b_{i+1} = b_i - \alpha (\cfrac 1 n \sum (\hat y-y))
### 배치 경사 하강법(Batch Gradient Descent) - 일반적으로 Batch Gradient Descent를 Gradient Descent라 지칭하기도 함. - 주요 특징은 역전파가 이루어질 때 전체 데이터셋을 이용하는 것이며, 전체 데이터셋에 대한 평균 손실과 각 파라미터의 평균 gradient를 역전파에 사용함. ```python errors = [] # random 한 값으로 w, b를 초기화 합니다. w = np.random.uniform(low=-1.0, high=1.0) b = np.random.uniform(low=-1.0, high=1.0) for epoch in range(num_epoch): y_hat = x * w + b error = ((y_hat - y)**2).mean() if error < 0.0005: break w = w - learning_rate * ((y_hat - y) * x).mean() # w 파라미터의 gradient 평균 b = b - learning_rate * (y_hat - y).mean() # b 파라미터의 gradient 평균 errors.append(error) if epoch % 5 == 0: print("{0:2} w = {1:.5f}, b = {2:.5f} error = {3:.5f}".format(epoch, w, b, error)) print("----" * 15) print("{0:2} w = {1:.1f}, b = {2:.1f} error = {3:.5f}".format(epoch, w, b, error)) ``` ### 경사 하강법의 한계 #### 1. Local Minimum ##### 볼록함수(Convex Function) - 아래 또는 위로 볼록한 함수를 볼록 함수 - 초기 파라미터 값이 어떻게 설정되어도 경사 하강법을 활용하면 최적의 값에 도달할 수 있지만, 현실에서는 대부분의 함수는 비볼록 함수 형태 - [[4. 손실 함수(Loss Function)#평균-절대-오차-mean-absolute-error-mae-l1-loss|L1 Loss]], [[4. 손실 함수(Loss Function)#평균-제곱-오차-mean-squared-error-mse--l2-loss|L2 Loss]] 등 ![[6. 최적화와 경사하강법(Optimization)_image_3.png]] ##### 비볼록함수(Non-Convex Function) - Global minimum < Local minimum 일 때, Global minimum 을 구해야 하지만, **Local minimum**에 빠지는 현상을 초례함 ![[6. 최적화와 경사하강법(Optimization)_image_4.png|+center]] <br> #### 2. 안장점 (Saddle Point) - 기울기가 0이지만 극값이 되지 않음 - 경사하강법은 안장점에서 벗어나지 못함 ![[6. 최적화와 경사하강법(Optimization)_image_5.png|+center]] --- ![[6. 최적화와 경사하강법(Optimization)_image_6.png]] --- ### 확률적 경사 하강법 (Stochastic Gradient Descent) - GD의 경우 모든 데이터를 한꺼번에 넣고 순전파 후 전체에러에 대해 역전파를 통해 파라미터를 업데이트시킴(전체 데이터셋에 대해 epoch 만큼 학습). - 베이직 SGD는 한 개 혹은 임의의 샘플데이터만 활용해서 gradient를 계산함. - **Mini-Batch Gradient Descent**를 Stochastic Gradient Descent (SGD)의 한 변형으로 표현하기도 한다. 엄밀히 말하면, Mini-Batch Gradient Descent는 **SGD의 일반화된 형태**로 볼 수 있으며, 두 알고리즘 간의 차이는 **배치 크기(batch size)** 에 있다. #### Mini-Batch Gradient Descent - Mini-batch SGD는 Min-batch의 크기만큼 데이터의 일부만 활용해서 gradient를 계산함. - 특히, 실제로 딥러닝에서 사용되는 대부분의 "SGD" 알고리즘은 Mini-Batch Gradient Descent를 의미함. - Mini-batch SGD에서는 배치 단위 내에서 각 데이터마다 손실과 파라미터들의 gradient를 구하고, **평균 손실과 평균 gradient의 정보를 이용해 배치 단위의 파라미터 업데이트가 이루어짐.** ![[6. 최적화와 경사하강법(Optimization)_image_7.png]] --- ### GD, SGD - **Gradinet Descent** - 최적값을 찾아가는 것은 정확하지만 너무 느리다. - local minimum에 수렴할 가능성이 있다. - **Stochastic Gradient Descent (Mini-batch Gradient Descent)** - 최적값을 찾아가는 방향이 뒤죽 박죽이고, 한 스텝 나아가기 위한 사이즈를 정하기 어렵지만 빠르다. - Mini-Batch를 사용하면 배치 평균을 기반으로 기울기를 계산하므로, 기본 SGD보다 더 **안정적인 업데이트**를 수행하며 **수렴 속도**를 높일 수 있다. - local minimum 문제를 어느정도 해결할 수 있다. --- ## 다양한 최적화 기법 - [[6-1. 최적화 알고리즘]] ### Momentum - 관성의 법칙을 이용해 최적화하는 방법이다. 속도가 크게 나올수록 기울기가 크게 업데이트 된다. 진행중인 방향으로 **관성**을 더해 지역 최소점(Local minimum)에 빠지지 않도록 한다. ### AdaGrad - Adagrad의 경우 **squared gradient(기울기 제곱)에 반비례하도록** 학습률을 조정하는데, 이는 **기울기가 가파를수록 조금만 이동**하고, **완만할 수록 조금 더 이동하게 함**으로써 **변동을 줄이는** 효과가 있다. 무엇보다 **행렬곱 연산**을 통해 **가중치마다 다른 학습률을 적용**한다는 점에서 더욱 정교한 최적화가 가능해진다. - 단점은 기울기가 0인 부근에서는 학습이 느려져서 local minima에 빠지게 될 수 있다. 그 문제를 해결하고자 나온 것이 **RMSProp** 이다. ### RMSProp - AdaGrad의 업그레이드 버전인데 보폭을 줄이되 이전 기울기 변화의 맥락을 살핀다. a가 너무 작아져서 학습이 안되는 것을 방지해준다. ### Adam - Momentum + AdaGrad의 장점을 합쳐서 만든 기법이다. 방향과 보폭 둘 다 적절하게 조절해준다. 대부분의 상황에서 결과가 잘 나오는 편이라 잘 모를 때는 Adam을 쓰도록 하자. --- ## 참고 - [경사하강법(gradient descent)](https://angeloyeo.github.io/2020/08/16/gradient_descent.html) - [[Deep Learning] 최적화 개념과 경사 하강법(Gradient Descent)](https://heytech.tistory.com/380) - [신경망 학습 최적화 방법 Optimization](https://cashew-nut.tistory.com/79) - [딥러닝(Deep learning) 살펴보기 2탄](https://seamless.tistory.com/38) - 👍[최적화 알고리즘들](https://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html) - [Gradient Descent (경사하강법)과 기초 수학](https://velog.io/@rjtp5670/httpsvelog.iowriteidd63de75c-d929-40c1-863f-ba13c3b51fcb) - [경사하강법의 세 종류(BGD, SGD, MGD)](https://bruders.tistory.com/91) --- Prev: [[5. 역전파(Back Propagation)]] Next: [[7. 성능평가지표(Evaluation)]] --- #DeepLearning