> For the complete documentation index, see [llms.txt](https://ai-society-1.gitbook.io/ai-society/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ai-society-1.gitbook.io/ai-society/10..md).

# 10. 옵티마이저

가중치 초기화때, 학습을 `어디서 시작할 것인가?` 에 대해서 알아보았다. 이번 옵티마이저를 통해서는, `어떻게 내려갈 것인가?` 에 대해서 알아보자.

1. **어떻게 내려 갈 것인가?**
2. 어디서 시작할 것인가?

### Stochastic Gradient Descent, 확률적 경사하강법

***

우리가 배워온 Neural Network를 학습시키는 방법은 Gradient Descent를 이용해서 네트워크안의 파라미터를 갱신시켜나가는 방법이었다.

이는 파라미터 $\theta$에 대해 다음과같은 식으로 나타낼 수 있다.

$$
\theta = \theta - \eta d\theta
$$

$$\eta$$ : 학습률 ( learning rate )

$$d\theta$$ : $$\theta$$에서의 미분값

아래 그림과 같이, 이런 학습을 진행할 때, 이때까지는 데이터셋을 구축했으면, 그 데이터 전체를 넣어서 학습을 시켰다.

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FiR401QiNaha6QjYpXizF%2FUntitled.png?alt=media" alt=""><figcaption></figcaption></figure>

* **시간이 너무 많이 걸린다.**

### 그럼 어떻게?

→ 데이터를 여러 조각으로 나눈다.

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FGMOB8XsYRB03lNBAakKU%2FUntitled%201.png?alt=media" alt=""><figcaption></figcaption></figure>

데이터를 여러 부분들로 나눠서, 여러번 넣어본다.

### 어떤점이 좋아지는데?

1. 데이터의 수가 작으므로, 기존 Gradient Descent방식에 비해 훨씬 빠르게 계산한다.
2. local minima에 빠질 위험이 적을 수도 있다.

### Adagrad

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FBGAMfrHXkAkLLt2oDiNw%2FUntitled%202.png?alt=media" alt=""><figcaption></figcaption></figure>

***

위 그림과 같이 학습 초기에는 가중치를 더 크게, 학습이 끝날 때 쯤에는 가중치를 더 작게 업데이트하게 된다.

**Adagrad**는 이를 학습률 (learning rate)에도 적용시켜 학습이 진행 될 수록, 학습률 자체를 떨어뜨리는 방법이다.

$$
g\_t = g\_{t-1} + (d\theta)^2 \ w := w - \frac{\eta}{\sqrt{g\_t + \epsilon}}d\theta
$$

$$\epsilon : g\_t$$가 너무 커지면, 학습률이 0에 수렴하게 된다. 이를 방지하고자, 아주작은값 $$\epsilon$$을 넣어 학습률이 0가되는것을 방지한다.

### 왜 $$(d\theta)^2$$인가요?

$$d\theta$$의 제곱을 넣어주는 이유는, 큰값에는 더 큰 가중치를 두기 위함이다. 제곱을 하게 되면, 큰값은 더 크게, 작은 값은 더 작게 된다.

이를 이용해서, $$d\theta$$의 값이 클때는 더 많이 학습률을 줄이고, $$d\theta$$의 값이 작을때는 더 적게 학습률을 줄여서 조절할 수 있다.

### 문제점

변화율이 계속 크게 되면, 학습률이 빠르게 0으로 수렴하여 학습이 끝나버리는 경우가 발생할 수 있다.

### 지수 가중 평균

***

`더 과거의 데이터일수록, 현재의 경향을 표현하는데 적은 영향을 미친다`

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FzHLr8yyQypEPFNPUuhQE%2FUntitled%203.png?alt=media" alt=""><figcaption></figcaption></figure>

기온에 대한 그래프

온도자체는 너무 자주 변하는 데이터이다. → 추이를 알고싶다.

**현재 데이터 근처의 몇개만 평균을 내서 추이를 계산하면 되지 않을까?**

* 오래된 데이터와, 최신의 데이터의 영향력이 비슷하다 → **추이를 제대로 표현할 수 없다.**

**시간이 지남에 따라 데이터의 영향력이 줄어들게 하자!**

$$
V\_t = \beta \times v\_{t-1} + (1-\beta)\theta\_t
$$

$$\beta$$ : 0\~1사이의 값

$$\theta\_1, \theta\_2, \theta\_3, \theta\_4$$ 에 대해서 $$\beta : 0.9$$라고 하고, 위의 식을 적용해 보면,

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FaqnuwOEIO5Kp2kPxTcXP%2FUntitled%204.png?alt=media" alt=""><figcaption></figcaption></figure>

위와같이 점점 과거의 데이터가 현재 추이에 덜 영향을 끼치게 된다는 것을 알 수 있다.

### RMSprop

***

Adagrad의 문제점을 해결하기 위한 방식.

$g\_t$를 계산하는 식에 지수가중평균을 적용하였다.

$$
g\_t = \gamma g\_{t-1} + (1-\gamma)(d\theta)^2
$$

Adagrad에서는 $g\_t$가 계속해서 증가하기 때문에, 너무 빨리 학습률이 감소하는 단점이 있었지만,

지수가중평균을 적용하므로서, 과거의 데이터를 덜 반영하게 되어, 학습률이 덜 빠르게 줄일 수 있게 되었다.

### Momentum

***

기존의 Gradient Descent는 local minima에 빠지면 나오기 힘든 방식이었다. 이를 해결하기 위해서 Momentum이라는 방식이 고안되었다.

비유를 하자면, 기존 Gradient Descent는 계단을 한칸한칸 내려가는 것이고, Momentum은 경사면에서 공을 굴리는 것이다.

**Gradient Descent**

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2FALhCvuIuGRGe4lTG7lai%2FUntitled%205.png?alt=media" alt=""><figcaption></figcaption></figure>

**Momentum**

<figure><img src="https://2406288691-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbJawx4CNR4GVxYKHpKbz%2Fuploads%2Fqbn8JyrCPT248MTmMgDt%2FUntitled%206.png?alt=media" alt=""><figcaption></figcaption></figure>

Momentum의 구현은 기존의 업데이트되는 가중치에 지수가중 평균을 적용하여 구현하게 된다.

$$
Vd\theta\_t = \beta Vd\theta\_{t-1} + (1-\beta)d\theta\_t\ w := w - \eta Vd\theta
$$

이를 통해서, local minima에 빠지지 않고 빠져나갈 수 있게 해준다.

### Adam

***

Adam은 Momentum과, RMSprop두개 모두를 적용시킨 옵티마이저이다.

학습률을 서서히 떨어지게 하며, 이전 가중치 업데이트값을 현재 업데이트에 반영할 수 있게 된다.

$$
Vd\theta\_t = \beta Vd\theta\_{t-1} + (1-\beta)d\theta\_t\ g\_t = \gamma g\_{t-1} + (1-\gamma)(d\theta)^2\ w := w - \frac{\eta}{\sqrt{g\_t+\epsilon}} Vd\theta\_t
$$
