코딩하는 해맑은 거북이
인공지능(AI) 기초 다지기 (7) 본문
본 게시물의 내용은 '인공지능(AI) 기초 다지기(부스트코스)' 강의를 듣고 작성하였다.
해당 글은 3-2. 경사하강법 2가지 파트를 다룬다.
1. 경사하강법(순한맛)
2. 경사하강법(매운맛)
1. 경사하강법(순한맛)
- 미분이란?
: 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법
최근엔 미분을 손으로 직접 계산하는 대신 컴퓨터가 계산해줄 수 있다. → sympy.diff 사용
- 미분을 어디에 쓸까?
미분은 함수 f의 주어진 점 (x, f(x))에서의 접선의 기울기를 구한다.
한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가하는지/감소하는지 알 수 있다.
* 위로 볼록한 함수, 미분값(f'(x))이 음수일 때.
x + f'(x) < x는 왼쪽으로 이동하여 함수값 증가 ≫ 경사상승법
x - f'(x) > x는 오른쪽으로 이동하여 함수값 감소 ≫ 경사하강법
* 아래로 오목한 함수, 미분값(f'(x))이 양수일 때.
x + f'(x) > x는 오른쪽으로 이동하여 함수값 증가 ≫ 경사상승법
x - f'(x) < x는 왼쪽으로 이동하여 함수값 감소 ≫ 경사하강법
미분값을 더하면 경사상승법(gradient ascent)이라 하며 함수의 극대값의 위치를 구할 때 사용
미분값을 빼면 경사하강법(gradient descent)이라 하며 함수의 극솟값의 위치를 구할 때 사용
경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다.
- 경사하강법 : 미분
Input: gradient, init, lr, eps, Output: var
———————————————————————————————————————————
# gradient: 미분을 계산하는 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건
var = init
grad = gradient(var)
# 컴퓨터로 계산할때 미분이 정확히 0이 되는 것은 불가능하므로 eps보다 작을 때 종료하는 조건이 필요하다.
while (abs(grad) > eps):
var = var - lr * grad # x-λf(x)을 계산하는 부분 / lr은 미분을 통해 업데이트 속도 조절한다.
grad = gradient(var) # 종료조건이 성립하기 전까지 미분값을 계속 업데이트한다.
- 변수가 벡터라면?
미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법이다.
벡터가 입력인 다변수 함수의 경우 편미분(partial differentiation)을 사용한다
각 변수 별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용하여 경사하강/경사상승법에 사용할 수 있다.
- 그레디언트 벡터란?
그레디언트 벡터 ▽f(x, y)는 각 점 (x, y)에서 가장 빨리 증가하는 방향으로 흐르게 된다.
마이너스 그레디언트 벡터 -▽f(x, y), -▽f는 ▽(-f)랑 같고, 이는 각 점에서 가장 빨리 감소하는 방향과 같다
- 경사하강법 : 그레디언트 벡터
Input: gradient, init, lr, eps, Output: var
———————————————————————————————————————————
# gradient: 그레디언트 벡터를 계산하는 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건
var = init
grad = gradient(var)
# 경사하강법 알고리즘은 그대로 적용되나, 벡터는 절댓값 대신 노름(norm)을 계산해서 종료조건을 설정한다.
while (norm(grad) > eps):
var = var - lr * grad
grad = gradient(var)
2. 경사하강법(매운맛)
- 선형회귀분석 복습
np.linalg.pinv 를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있다.
선형회귀분석은 데이터를 가장 잘 표현하는 선형모델을 찾는 것.
L2-Norm을 최소화하는 선형모델을 찾을 때 무어-펜로즈(Moore-Penrose) 역행렬을 이용해서 계수를 찾는데,
이번에는 무어-펜로즈(Moore-Penrose) 역행렬을 사용하지 않고, 경사하강법을 이용해서 선형모델을 찾는 방법을 알아보자!
Q. 왜 경사하강법을 이용해서 선형모델을 구할까?
선형모델의 경우에는 경사하강법을 사용하지 않고 무어-펜로즈(Moore-Penrose) 역행렬을 이용하면 되지만,
선형모델이 아닌 경우에는 경사하강법을 이용해서 찾기 때문에 일반적인 기계학습 모형에서 최적화를 할 때 사용하는 방법론이다!
- 경사하강법으로 선형회귀 계수 구하기
선형회귀의 목적식은 \(||y-Xβ||_2\) 이고, 이를 최소화하는 β를 찾아야 하므로 다음과 같은 그레디언트 벡터를 구해야 한다.
* \(β_k\)를 가지고 목적식을 편미분 한 결과
주의점 : 여기서 사용된 L2-Norm은 n개의 데이터를 가지고 계산되기 때문에, 평균값을 취해주기 위해 1/n을 곱해줘야한다!
이제 목적식을 최소화하는 β를 구하는 경사하강법 알고리즘은 다음과 같다.
L2-Norm 대신 L2-Norm의 제곱을 최소화하는 방법으로 풀어도 똑같다.
- 경사하강법 기반 선형회귀 알고리즘
이 알고리즘을 이용하면 역행렬을 이용하지 않고 회귀계수를 계산할 수 있다!
경사하강법 알고리즘에선 무어-펜로즈(Moore-Penrose) 역행렬을 이용할 때 처럼 정확한 값에 도달할 때까지 계속 수렴하는 것은 아니기 때문에, 학습률(lr)과 학습횟수(T)를 적절하게 조절해야하기 때문에 중요한 hyperparameter가 된다.
* 학습률을 너무 작게 잡으면, 수렴이 늦다.
* 학습률을 너무 크게 잡으면, 알고리즘이 불안정하게 움직인다.
* 학습횟수를 너무 적게 잡으면, 수렴이 잘 안될 수 있다.
Input: X, y, lr, T, Output: beta
———————————————————————————————————————————
# norm: L2-노름을 계산하는 함수
# lr: 학습률, T: 학습횟수
# 종료조건을 일정 학습횟수로 변경한 점만 빼고, 앞에서 배운 경사하강법 알고리즘과 같다
for t in range(T):
error = y - X @ beta
grad = - transpose(X) @ error # (▽β||y-Xβ||2의 제곱)항을 계산해서 β를 업데이트한다
beta = beta - lr * grad
- 경사하강법은 만능일까? No!
이론적으로 경사하강법은 미분가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습횟수를 선택했을 때에 수렴이 보장되어 있다.
특히 선형회귀의 경우 목적식 \(||y-Xβ||_2\)은 회귀계수 β에 대해 볼록함수이기 때문에 알고리즘을 충분히 돌리면 수렴이 보장된다.
하지만, 비선형회귀 문제의 경우 목적식이 볼록하지 않을 수 있으므로 수렴이 항상 보장되지는 않는다.
위 그림과 같이 볼록한 부분이 두군데가 있는 경우는 Non-convex(볼록함수가 아닌)라고 한다.
딥러닝에서 사용하는 대부분의 모델과 목적식은 볼록성을 보장하지 못하기 때문에 경사하강법 알고리즘이 항상 수렴하지는 않는다. 그래서 변형된 경사하강법 알고리즘을 사용해야한다.
- 확률적 경사하강법 (SGD, Stochastic Gradient Descent)
볼록이 아닌 목적식에서 최적화가 힘들기 때문에 경사하강법을 대체하는 방법이고,
모든 데이터를 사용해서 업데이트하는 대신 데이터 한개 또는 일부 활용하여 업데이트한다.
cf) '확률적 경사하강법에서 일부 데이터를 사용해서 구한 그레디언트 벡터'와
'앞서 설명한 경사하강법은 모든 데이터를 사용해서 계산한 그레디언트 벡터'와 유사하긴 하지만, 절대 같을수는 없다.
* 데이터의 일부를 이용하는 경우 : mini-batch SGD
* 데이터를 한 개만 이용하는 경우 : SGD
→ 데이터를 한 개만 사용하는 경우 비효율적이기 때문에, 보통 mini-batch SGD를 사용한다. 그래서 SGD는 mini-batch SGD 를 통용해서 부른다고 보면 된다.
볼록이 아닌(non-convex) 목적식은 SGD를 통해 최적화할 수 있다.
SGD도 학습률과 학습횟수를 고려해야하기 때문에 만능은 아니지만, 딥러닝의 경우 SGD가 경사하강법보다 실증적으로 더 낫다고 검증되었다.
SGD는 데이터의 일부를 가지고 패러미터를 업데이트하기 때문에 연산자원을 좀 더 효율적으로 활용하는데 도움이 된다.
- 확률적 경사하강법의 원리 : 미니배치 연산
경사하강법은 전체 데이터 D = (X, y)를 가지고 목적식의 그레디언트 벡터인 \(▽_θL(D, θ)\)를 계산한다.
SGD는 미니배치 \(D_{(b)} = (X_{(b)}, y_{(b)})\) ⊂ D를 가지고 그레디언트 벡터를 계산한다.
미니배치는 확률적으로 선택하므로 매번 목적식 모양이 바뀌게 된다.
즉, 매번 다른 미니배치를 사용하기 때문에 곡선 모양이 바뀌게 된다.
SGD는 극솟점을 탈출할 수 있기 때문에 Non-convex 함수여도 최솟점을 찾을 수 있다.
SGD는 볼록이 아닌 목적식에서도 사용 가능하므로 경사하강법보다 머신러닝 학습에 더 효율적이다.
경사하강법은 정확한 그레디언트 벡터를 사용하기 때문에 최솟점으로 계속 바라보며 움직이지만,
확률적 경사하강법은 그레디언트 벡터가 확률적으로 왔다갔다 움직이는 모양을 보인다.
하지만, 최솟점으로 향하는 움직임은 똑같은 경향을 가진다.
→ SGD는 정확하지 않은 방향으로 움직이지만, 각각의 화살표가 일부의 데이터를 이용하므로 연산속도가 훨씬 더 빠르므로 경사하강법보다 최적해에 더 빠르게 도달한다.
위의 그림에서 봤을 때, 미니배치를 적용한 SGD (초록색) 선이 경사하강법 (파란색) 보다 훨씬 더 빠르게 최소점에 도달한다. 또한, SGD에서 미니배치를 적게 설정한 경우 (주황색)이 경사하강법 (파란색) 보다 훨씬 느리게 수렴할 수 있다.
- 확률적 경사하강법의 원리 : 하드웨어
엄청나게 큰 데이터를 가지고 경사하강법을 계산하고자 하면, 하드웨어적인 한계인 메모리 부족으로 Out-of-memory가 발생한다. 즉, GPU상에서 메모리가 통제가 되지 않기때문에 경사하강법으로는 딥러닝 학습을 돌리는 것은 한계가 있다.
그래서 확률적 경사하강법을 이용하면 좀 더 빠르게 연산도 가능하고, 하드웨어 한계를 극복 가능하다.
추가자료
https://gosamy.tistory.com/240
'AI' 카테고리의 다른 글
딥러닝 기초 다지기 (1) (0) | 2022.12.25 |
---|---|
인공지능(AI) 기초 다지기 (8) (0) | 2022.12.23 |
인공지능(AI) 기초 다지기 (6) (0) | 2022.12.19 |
인공지능(AI) 기초 다지기 (5) (0) | 2022.12.18 |
인공지능(AI) 기초 다지기 (4) (0) | 2022.12.17 |