공부를 하는 입장(번역만 하는 것이 아니라 제가 이해하고 정리하려 했기 때문에)이기 때문에, 내용에 오류가 있을 수 있습니다. 오류가 있다면 적극적으로 알려주시면 감사합니다!
밑바닥부터 시작하는 딥러닝의 chap6이 Learning skill들에 관한 내용인데, 이를 보고 찾아보다가 이 논문을 발견했다. 책으로만 정리하는 것도 좋지만 책이 이 내용과 매우 유사하다고 느껴져서 이 논문을 리뷰하게 되었다.
Ruder, S. An Overview of Gradient Descent Optimization Algorithms. 2016.
An overview of gradient descent optimization algorithms
Gradient descent optimization algorithms, while increasingly popular, are often used as black-box optimizers, as practical explanations of their strengths and weaknesses are hard to come by. This article aims to provide the reader with intuitions with rega
arxiv.org
이건 내가 공부한 흔적?이다.
1.1 Batch gradient descent
BGD는 가장 기본적인 형태의 경사하강법이다. 모든 데이터를 사용하여 cost function의 기울기를 계산한 뒤 파라미터 \(\theta\)를 계산하는 알고리즘이다.
$$ \theta=\theta-\eta \cdot \triangledown_{\theta} J(\theta) $$
- \(\eta\,\): 학습률(learning rate).
- \( \triangledown_{\theta} J(\theta) \,\): cost function의 기울기.
BGD는 최솟값과 국소 최솟값으로 모이고 있다는 것을 보장한다. 하지만 매번 기울기를 계산할 때 전체 데이터셋을 사용하므로, 매우 느려질 수 있다. 또한, 매우 큰 데이터의 경우 데이터 크기가 메모리 용량(RAM)을 초과할 경우 처리하기 어려워질 수 있다.
1.2 Stochastic gradient descent
SGD는 BGD와 다르게 각각의 훈련 데이터 \(x^{(i)}\)와 라벨 \(y^{(i)}\)에 대하여 파라미터를 업데이트하는 알고리즘을 말한다.
$$ \theta=\theta-\eta \cdot \triangledown_{\theta} J(\theta;x^{(i)};y^{(i)}) $$
- \(( x^{(i)}\,,\,y^{(i)})\, \): i번째 데이터 샘플.
- \( x^{(i)} \,\): 입력 데이터.
- \(y^{(i)} \,\) : 해당 입력 데이터에 대응하는 출력값(라벨).
SGD는 상대적으로 BGD보다 매우 빠르고, 온라인 학습이 가능하여 새로운 데이터가 들어와도 바로 모델이 업데이트가 가능하다. 하지만 각 샘플의 기울기가 전체 데이터 셋을 대표하지 않을 수 있어 불안정하고, 변동성이 있다. 이 변동성은 새로운 국소 최솟값으로 이동할 가능성이 있지만, 국소 최솟값으로 수렴하지 못하고 발산하는 overshooting 가능성 또한 있다.(이 부분은 점점 학습률을 줄이면 최솟값으로 수렴할 가능성이 매우 높아진다.)
1.3 Mini-batch gradient descent
미니 배치 경사 하강법은 우리가 지금까지 써온 경사 하강법을 의미한다. 예전에 작성한 글에서 설명했듯이:
"컴퓨터는 행렬연산이 매우 빠르다. 하지만 파일을 읽거나 출력하는 것은 느리다. 따라서 학습할 때, 데이터를 하나씩 읽고 학습하는 것이 아닌, 데이터를 한 번에 묶어서 행렬로 계산을 하는 것이 효율적이다. 그리고 이렇게 묶은 입력 데이터를 배치라고 한다."
이러한 배치 단위로 데이터를 처리하는 것이 미니 배치 경사 하강법의 핵심이다. 이 방식은 배치의 수(batch size)가 많아질수록 학습의 일반성을 확보할 수 있다는 개념을 기반으로 한다. 또한, Stochastic Gradient Descent(SGD)에 비해 변동성이 적고 안정적이며, Batch Gradient Descent(BGD)에 비해 훨씬 빠르게 학습을 수행할 수 있다. 논문에서는 batch size가 50에서 256이 일반적이라고 한다. 미니 배치 경사하강법은 배치 사이즈에 따라 성능과 훈련 속도의 차이가 매우 크므로 유의해야 한다.
2. Challenges
경사 하강법은 간단하면서도 강력한 최적화 알고리즘이지만, 여전히 몇 가지 문제점을 가지고 있다.
- 좋은 학습률을 고르기 어렵다
학습률은 사람이 임의로 선택해야 하는 값으로, 적절한 학습률을 찾기 위해 실험과 시행착오를 반복해야 한다는 단점이 있다. - 학습률 스케줄을 동적으로 조절하기 어렵다
학습률을 동적으로 증가시키거나 감소시키는 것이 아니라, 미리 정해진 스케줄에 따라 점진적으로 학습률을 줄이거나, 기울기 값이 일정 임계값 이하로 떨어질 때 학습률을 감소시키는 방식으로 제한된다. - 모든 데이터에 동일한 학습률이 적용된다
모든 데이터가 동일한 학습률로 학습한다는 것은 드물게 나타나는 특징과 빈번하게 나타나는 특징을 같은 비율로 학습한다는 것을 의미한다. 하지만 드물게 나타나는 특징은 학습 기회가 적으므로 보상을 통해 학습률을 높여야 한다. 그렇지 않으면 충분히 일반화된 특성을 얻기 어려울 수 있다. - 안장점(saddle point)에 빠질 경우 탈출이 어렵다
안장점은 한 방향으로는 증가하고, 다른 방향으로는 감소하는 지점으로, SGD는 이러한 영역에서 기울기가 거의 0에 가까워지기 때문에 빠져나오기 매우 어렵다.
3.1 Momentum
모멘텀 알고리즘은 경사 하강법(SGD)을 적절한 방향으로 가속하고, 진동(변동성)을 억제하는 기법이다. 이 방식은 이전 단계의 벡터를 현재 단계의 벡터에 일정 비율로 더하여 작동한다.
$$ v_{t} = \gamma v_{t-1}+\eta\triangledown_{\theta}J(\theta) $$
$$ \theta = \theta-v_{t} $$
- \(v_{t}\,\): 현재 벡터(이전 벡터와 현재 기울기의 조합).
- \(\gamma\,\): 모멘텀 계수, 보통 0.9 또는 비슷한 값으로 설정.
모멘텀 알고리즘은 경사 하강법에 관성을 추가한 것처럼 이해할 수 있다. 예를 들어, "계속 내려갈수록 점점 더 가속되며 빠르게 이동하고, 방향이 살짝 바뀌어도 관성으로 인해 원래 방향을 어느 정도 유지한다"라고 생각하면 쉽다.
모멘텀 알고리즘을 공부하다가 보면 궁금한 것이 생긴다. 관성에 따라 이동하다 보면, 최적점(local minima)에 도달했을 때 관성으로 인해 계속 진행하여 최적점을 지나치는 문제가 발생할 수 있다는 것이다. 물론 반복을 통해 결국 최적점으로 수렴하겠지만, 이 과정은 매우 비효율적이다. 이러한 문제를 해결하기 위해 이 논문은 Nesterov Accelerated Gradient (NAG)을 제시한다.
3.2 Nesterov accelerated gradient
Nesterov Accelerated Gradient(NAG)는 모멘텀 알고리즘에서 한 단계 더 나아가, 미리 이동할 위치(\(\theta-\gamma v_{t-1})\)를 예상하여 그곳에서 기울기\(\triangledown_{\theta} J(\theta-\gamma v_{t-1})\)를 계산하고 보정하는 알고리즘이다. 이는 관성 효과를 현재 위치에서 보정함으로써, 더 민첩하고 안정적인 수렴을 가능하게 합니다.
$$ v_{t} = \gamma v_{t-1}+\eta\triangledown_{\theta} J(\theta-\gamma v_{t-1}) $$
$$ \theta = \theta-v_{t} $$
NAG는 모멘텀으로 예상한 그다음 스태프의 기울기를 바로 계산하고, 관성은 현재 값이기 때문에 이를 보정하는 방식으로 작동한다.
아래 부분이 내가 더 이해하기 쉬웠던 그림이다. 모멘텀 같은 경우 현재 점에서의 \(v_{t}\)과 현재점의 기울기를 구해서 \(\theta\)를 업데이트한다. 하지만 NAG 같은 경우는 현재점에서 \(v_{t}\)와 \(v_{t}\)로 인해 움직여지는 \(\theta-\gamma v_{t-1}\) 위치의 기울기로 보정해서 실제 \(\theta\)를 구한다.
이를 통하여 NAG는 예측력을 통해 더 빠른 수렴이 가능해진다.
다음은 내가 만든 \(f(\theta) = \theta^2\) 함수에 대한 momentum 알고리즘과 NAG를 비교한 것이다. t = 30까지 진행하였고, \(\theta\)초기 값은 2.0, 학습률은 0.1로 실행하여 그림으로 표현하였다.
아래 코드는 Learning_skill2/compare_momentum_and_NAG.py 에서 확인 할수 있다.
Study_with_book/DeepLearning-from-Scratch/Learning_skill2 at main · dy0221/Study_with_book
Contribute to dy0221/Study_with_book development by creating an account on GitHub.
github.com
모멘텀은 수렴하지 못하고 진동이 크지만, NAG는 진동이 작고 빠르게 수렴하고 있다는 것을 눈으로 바로 알 수 있다.
3.3 Adagard
Adagrad는 각 매개변수마다 개별적인 학습률을 조정하여, 드물게 발생하는 특징(feature)과 빈번하게 발생하는 특징을 효과적으로 처리할 수 있다.
$$ \theta_{t+1, i} = \theta_{t, i} - \frac{\eta}{\sqrt{G_{t, ii} + \epsilon}} g_{t, i} $$
- \(\theta_{t, i}\,\): i번째 매개변수의 현재 값.
- \( g_{t, i} \,\): t시점에서 iii번째 매개변수에 대한 기울기.
- \( G_{t, ii} \in \mathbb {R^{d\times d}}\,\): 시간 t까지의 모든 기울기의 제곱값의 누적 합을 대각선 행렬로 나타낸 것.
- \( \eta \,\): 학습률 딱히 조정할 필요가 없고, 0.01을 기본 값으로 사용한다.
- \( \epsilon \,\): 0으로 나누는 것을 방지하기 위한 작은 값(일반적으로 \(1e-8\)).
보면 각 층에서 \( G_{t, ii}\)는 각각의 해당 유닛에게만 적용이 되는 것을 알 수 있다. 예를 들어 1층에 100개의 유닛이 있다고 하면 각각의 유닛에 맞는 \( G_{t, ii}\)를 계산해 놓고 최적화를 할 때마다 해당 \( G_{t, ii}\)를 맞는 유닛에 사용하여서 계산한다. 이러한 장점 각각의 매개변수(유닛)마다 개별적으로 학습률을 조정할 수 있다는 것이다. 학습 과정에서 드물게 나타나는 특징의 학습률을 크게 유지하면서, 빈번하게 나타나는 특징의 학습률은 줄이는 효과를 가진다. 흥미롭게도 루트를 사용하지 않으면, 성능이 급격하게 떨어진다고 한다.
해당 유닛에 \(G_{t, ii}\)가 각각이 사용된다는 것은 벡터로써 표현해, 요소별 곱셈(element-wise matrix-vector multiplication, \(⊙\))으로 다시 표현할 수 있다. $$ \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{G_{t} + \epsilon}} ⊙ g_{t} $$
adgard의 단점은 \( G_{t}\)가 누적 합이라 계속 커지므로 학습률이 점점 줄어들어 학습이 많아질수록 추가적인 학습이 불가능해진다.
3.4 Adadelta
Adadelta는 adagrad의 단조롭게 감소하는 학습률을 해결하기 위해 만들어졌다. decaying average of squared gradients 방식을 통해 최근의 기울기에 더 많은 가중치를 부여하는 방식으로 작동한다.
$$ E[g^2]_t = \gamma E[g^2]_{t-1} + (1 - \gamma) g_t^2 $$
- \( E[g^2]_t \,\): 시점 t에서의 기울기 제곱의 이동 평균.
- \(\gamma \,\): 모멘텀과 비슷, 일반적으로 대략 0.9로 설정한다.
ex)
$$ E[g^2]_1 = 0.1 g_1^2 $$
$$ E[g^2]_2 = 0.9 E[g^2]_{1} + 0.1 g_2^2 =0.1 g_2^2 + 0.09g_1^2 $$
$$ E[g^2]_3 = 0.9 E[g^2]_{2} + 0.1 g_3^2 =0.1 g_3^2 + 0.09g_2^2+0.081 g_1^2 $$
$$ E[g^2]_4 = 0.9 E[g^2]_{3} + 0.1 g_4^2 =0.1 g_4^2 + 0.09g_3^2+0.081 g_2^2+0.0729g_1^2 $$
예시를 살펴보면 이전의 기울기가 지수적으로 감소하고 있는 것을 알 수 있다.
Adadelta는 adagrad에서 \( G_{t}\)를 기울기의 감소 평균 \( E[g^2]_{t}\)로 대체한다.
$$ \Delta \theta_t = - \frac{\eta}{\sqrt{E[g^2]_{t} + \epsilon}} g_t $$
분모를 확인하면 \(g^2_{t}\)의 식이고, 이를 다시 \(\sqrt{} \)되어 있다. 이는 사실상 root mean squared (RMS)의 형태가 된다.$$ \text{RMS}[g]_t = \sqrt{E[g]_t + \epsilon} $$
최종적으로는 다음의 형태가 된다. $$ \Delta \theta_{t} = -\frac{\eta}{\text{RMS}[g]_{t}}g_{t} $$
하지만 이 식은 단위 불일치 문제가 발생한다고 한다.
지금부터 하는 말은 adadelta 논문 3.1, 3.2만 읽고 간단하게 정리한 것입니다. 수학적 지식이 부족해서 더욱더 오류가 있을 수 있습니다.
Zeiler, M. D. "ADADELTA: An Adaptive Learning Rate Method." 2012.
ADADELTA: An Adaptive Learning Rate Method
We present a novel per-dimension learning rate method for gradient descent called ADADELTA. The method dynamically adapts over time using only first order information and has minimal computational overhead beyond vanilla stochastic gradient descent. The me
arxiv.org
우리는 파라미터 \(\theta\)를 업데이트를 해야 하기 때문에 \( \triangle \theta \)는 \(\theta \)와 같은 단위를 가져야 한다. (예를 들어 속도의 단위가 m/s라면 속도를 올리려면 xx m/s만큼 올려야 하지 xx m만큼 올리는 것은 부적절하다.) 하지만 지금까지 SGD나 momentum 같은 경사 하강법을 보면, \(\theta \)와 같은 단위가 아닌 \(\theta \)를 사용하는 cost function의 기울기 \(g\)를 이용한다.
$$ \text{units of } \Delta \theta \propto \text{units of } g \propto \frac{\partial f}{\partial x} \propto \frac{1}{\text{units of } \theta} $$
하지만 second order method(Newton's method)를 이용하여 해시안 정보를 사용하거나 해시안으로 근사하면 매개변수의 단위를 알맞게 업데이트할 수 있다고 한다.
$$ \Delta \theta \propto H^{-1} g \propto \frac{\frac{\partial f}{\partial x}}{\frac{\partial^2 f}{\partial x^2}} \propto \text{units of } \theta $$
$$ \Delta \theta =\frac{\frac{\partial f}{\partial x}}{\frac{\partial^2 f}{\partial x^2}} \Rightarrow \frac{1}{\frac{\partial^2 f}{\partial x^2}} = \frac{\Delta \theta}{\frac{\partial f}{\partial x}} $$
\( \Delta \theta_{t} = -\frac{\eta}{\text{RMS}[g]_{t}}g_{t}\)에 해당 식을 참조하여 단위를 보정한다고 한다.
맨 오른쪽 항인 \(\frac{\Delta \theta}{\frac{\partial f}{\partial x}}\)에서 \(\frac{\partial f}{\partial x}\)는 기울기의 RMS로 이미 포함되어 있다. 따라서 \(\Delta \theta \)를 이전 \(\Delta \theta \)의 값을 RMS로 근사 했다고 한다.
$$ \Delta \theta_{t} = -\frac{\text{RMS}[\Delta \theta]_{t-1}}{\text{RMS}[g]_{t}}g_{t} $$
이러한 식은 갑작스러운 큰 기울기는 분모를 키워 효과적으로 학습률을 줄일 수 있고, 모멘텀과 비슷하게 분자는 과거의 기울기를 일정시간 동안 누적하여 가속하는 효과를 가진다.
최종적으로 adadelta의 알고리즘은 다음과 같다.
$$ \Delta \theta_{t} = -\frac{\text{RMS}[\Delta \theta]_{t-1}}{\text{RMS}[g]_{t}}g_{t} $$
$$ \theta_{t+1} = \theta_{t} + \Delta \theta_{t} $$
추가적으로 이건 나의 생각인데, 이전 방법들에서는 단위를 맞추지 않은 이유는 인위적으로 학습률을 고정된 값(상수)을 사용하기 때문에 이걸로 단위에 대한 오차를 보정하는 것이 아닌가 라는 생각이 들었다.
3.5 RMSprop
RMSprop은 방금 했던 Adadelta에서 처음 다뤘던 식과 같다.
$$ E[g^2]t =0.9E[g^2]_{t-1} +0.1 g_{t}^2 $$
$$ \theta_{t+1} = \theta_{t} -\frac{\eta}{\sqrt{E[g^2]_{t} + \epsilon}}g_{t} $$
3.6 Adam
Adaptive Moment Estimation (Adam)는 decaying average of past gradients를 이용해서 학습률을 \(v_{t}\)로 조정하여 RMSprop의 특징과, decaying average of past gradients를 이용해서 모멘텀(\(m_{t}\)을 유지하는 momentum의 특징을 섞어서 만든 알고리즘이다.
$$ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t $$
$$ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 $$
- \(m_{t}\,\): 기울기의 1차 모멘트(평균).
- \(v_{t}\,\) : 기울기의 2차 모멘트(분산).
- \(\beta_1\,,\, \beta_2\,\): 일반적으로 \(\beta_1 = 0.9, \beta_2 = 0.999 \)
\( m_t \)와 \(v_t\)는 처음에는 0으로 초기화되기 때문에 초기 단계에서 \(\beta\)가 1에 가까울수록(감쇠율 이 작을수록) 편향이 0을 향한다고 한다. 따라서 편향이 보정된 모멘트 추청 치를 계산하여 편향을 상쇄한다.
$$ \hat{m}_t = \frac{m_t}{1 - \beta_1^t} $$
$$ \hat{v}_t = \frac{v_t}{1 - \beta_2^t} $$
이를 바탕으로 Adam의 업데이트는 다음과 같다.
$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$
3.7 AdaMax
AdaMax는 노름을 이용하는데, 내가 아직 노름을 잘 모르기 때문에 넘어가겠다.
3.7 Nadam
adam이 RMSprop와 momentum을 이용했다고 했는데, 그러면 momentum의 개선 버전인 NAG를 이용하면 어떨까 라는 생각으로 adam에 momentum 대신 NAG를 사용한 알고리즘이다.
여기서 NAG를 사용하는데 Nadam은 NAG를 약간 변형하여 사용한다. 기존에는 미리 예측한 지점(\(m_{t-1}\)을 사용해서 )에 가고 예측한 지점에 기울기를 이용하여 보정 (또 \(m_{t-1}\)을 사용해서)을 했다. 하지만 새로운 NAG는 마지막 파라미터 업데이트 할 때, 미리 그 위치로 업데이트를 하는 것이다.
이 방식이 이해가 안 될 것 같아 똑같이 \(f(\theta) = \theta^2\) 함수에 대해 비교하자면 다음과 같다.
이 코드는 Learning_skill2/compare_NAG_and_New_nag.py 에서 확인 할 수 있다.
Study_with_book/DeepLearning-from-Scratch/Learning_skill2 at main · dy0221/Study_with_book
Contribute to dy0221/Study_with_book development by creating an account on GitHub.
github.com
기존 NAG의 \(m_t\)와 새로운 방식의 NAG의 \(m_t\)가 같다. 이는 새로운 NAG 알고리즘 같은 경우는 \(\theta\)를 업데이트 할때 미래의 정보를 미리 반영하여 업데이트를 수행하기 때문이다. 새로운 NAG 역시 \(\theta\) 를 미리 움직여 업데이트를 수행하기 때문에, 결과적으로 \(m_t\)값이 기존 NAG와 동일하게 나타난다고 추론할 수 있다
식에서는 \(m_t\)부분만 고치면 되는데, 이건 기존의 식이다.
$$ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t $$
$$ \hat{m}_t = \frac{m_t}{1 - \beta_1^t} $$
$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$
이 식을 확장하면 \( \hat{m}_{t-1}\)이 나오는데 이를 \(\hat{m}_t\)로 바꾸면 된다.
$$ \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t = \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \frac{m_t}{1 - \beta_1^t} = \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \frac{\beta_1 m_{t-1} + (1 - \beta_1) g_t}{1 - \beta_1^t} $$
$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon}\left( \frac{\beta_1 m_{t-1}}{1 - \beta_1^t}-\frac{ (1 - \beta_1) g_t}{1 - \beta_1^t}\right) $$
$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon}\left( \beta_1\hat{m}_{t-1} -\frac{ (1 - \beta_1) g_t}{1 - \beta_1^t}\right) ...(\because\hat{m}_{t-1} = \frac{m_{t-1}}{1 - \beta_1^t}) $$
$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon}\left( \beta_1\hat{m}_{t} -\frac{ (1 - \beta_1) g_t}{1 - \beta_1^t}\right) $$
4. 어떤 최적화 방법을 사용해야 하는가?
입력 데이터가 희소한 경우 학습률을 각각에 적용하는 Adam, Adadelta, RMSprop를 사용하는 것이 가장 좋은 결과를 얻는 경우가 많다고 한다. 또한 Adam의 보정 기능(bias-correction)은 학습이 많이 진행되어 기울기가 0에 가까워질 때, RMSprop보다 더 우수한 성능을 보인다고 한다.
하지만 이 논문이 나올 즈음에는 모멘텀이 없는 기본 SGD와 단순하게 학습률 내리는 스케줄을 사용했다고 한다. SGD를 통하여 학습하는 경우 최소 값을 찾을 수도 있지만 안장점에 빠질 문제 또한 존재한다. 따라서 빠른 수렴과 깊은 신경망을 다루고 싶다면 the adaptive learning rate methods( Adam, Adadelta, RMSprop)를 사용하는 것을 추천한다고 한다.
5. SGD의 추가적인 전략
SGD의 성능을 올리기 위한 몇 가지 방법을 소개만 하고 마치겠다
Shuffling and Curriculum Learning
매 epoch마다 데이터의 순서를 바꾸는 방법인데, 일반적으로는 훈련 데이터가 의미 있는 순서로 되어있는 것을 피하는 것이 좋다. 하지만 점진적으로 어려운 문제의 경우 의미 있는 데이터 순서가 좋을 수 도 있다고 한다.
Batch normalization
Batch normalization은 각 층의 활성화 값을 정규화하여 데이터 분포가 평균이 0, 분산이 1이 되도록 정규하 하는 것을 말한다. 이를 통하여 학습 속도가 대폭 증가하고 dropout을 감소하거나 필요 없도록 만들 수 있다.
Early stopping, Gradient noise
이 밖에도 학습이 잘 안 될 때, 검증데이터의 에러가 충분히 향상되지 않을 때 멈추는 Early stopping이나 가우시안 분포를 이용한 기울기에 노이즈를 넣는 Gradient noise를 소개하고 있다.
더 공부해 볼만한 내용
아직 선형대수를 배우지 않아서 몇몇 내용이 이해되지 않는 부분이 있었다. 특히, 선형대수는 최적화와 딥러닝에서 기본이 되는 개념들이 많아 꼭 학습해야겠다고 느꼈다.
벡터의 미분(야코비안, 헤시안)에 대해서도 전혀 알지 못하기 때문에 관련 내용을 읽어도 제대로 이해하기 어려웠다. 학습률을 헤시안을 통해 구하는 방식이 더 효율적이라는 글을 본 적이 있어, 이 부분도 깊이 있는 학습이 필요하다고 생각되었다.
또한, 여기서 다룬 최적화 기술들을 "paper with code" 사이트를 통해 찾아보며 PyTorch나 JAX로 구현된 사례들을 확인할 수 있었다. 이를 통해 나 역시 PyTorch를 다룰 수 있도록 공부를 시작해야겠다고 생각했다.
참고한 글
[0] https://hiddenbeginner.github.io/deeplearning/2019/09/22/optimization_algorithms_in_deep_learning.html
[1] https://deep-learning-study.tistory.com/415
'밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
Learning Skill (1) | 2025.01.03 |
---|---|
Backpropagation Example (0) | 2024.12.24 |
Backpropagation (0) | 2024.12.24 |
Neural Network Learning Example (0) | 2024.12.22 |
Neural Network Learning (0) | 2024.12.22 |