Search

경사하강법

일반적인 최적화 알고리즘. 비용함수를 최소화하기 위해 반복해서 파라미터 조정.
중요한 파라미터는 학습률. 학습률이 너무 작으면 반복을 많이 수행해야 하므로 시간이 오래 걸린다는 문제가 있고 너무 크면 수렴하지 못할 수도 있다는 문제가 있음.
BUT, 선형 회귀를 위한 일반적인 비용함수인 MSE는 볼록함수라 지역 최솟값이 없다. 따라서 문제가 없다.
비용함수는 특성들의 스케일이 서로 너무 다르면 길쭉한 모양으로 나타난다. 따라서, 경사하강법을 사용할 때는 반드시 모든 특성이 같은 스케일을 갖도록 만들어야 한다. 그렇지 않으면 수렴하는데 매우매우 오래 걸린다. —> ‘경사하강법 스케일링 필수’

배치 경사 하강법

경사 하강법을 구현하려면 각 모델 파라미터에 대해 비용 함수의 기울기를 계산해야 한다. 즉, 매 경사 하강법 스텝마다 전체 훈련 세트 X에 대해 계산한다. 이를 배치 경사 하강법이라고 한다.
매우 큰 훈련 세트에서는 아주 느리다는 단점이 있다. BUT, 특성 수에 민감하지 않다는 장점이 있다.

확률적 경사 하강법

매 스텝에서 한 개의 샘플을 무작위로 선택하고, 그 하나의 샘플에 대한 기울기를 계산한다. 따라서 배치 경사 하강법보다 훨씬 빠르다. 또한, 하나의 샘플만 메모리에 있으면 되므로 매우 큰 훈련 세트도 훈련시킬 수 있다. BUT 단점은 확률적(=무작위)이므로 배치 경사 하강법보다 훨씬 불안정하다.(비용 함수가 최솟값에 도달할때까지 위아래로 요동침)
따라서, 비용 함수가 매우 불규칙하다면 오히려 확률적 경사 하강법이 전역 최솟값을 찾을 가능성이 배치 경사 하강법보다 높다.
즉, 무작위성의 경사 하강법은 지역 최솟값에서 탈출시킬 수 있지만 전역 최솟값에 아예 도달하지는 못한다는 점에서는 좋지 않다. 이 문제를 해결하기 위해서는 학습률을 점진적으로 감소시키면 된다.
시작할 때는 학습률을 크게 하고, 점차 작게 줄여서 전역 최솟값에 도달하게끔 하는 것이다. 이때 학습률을 결정하는 함수‘학습 스케쥴’이라고 부른다.
사이킷런에서 SGD 방식으로 선형 회귀를 사용하려면 기본값으로 제곱 오차(SSE) 비용 함수를 최적화하는 SGDRegressor 클래스를 사용한다.
보통, 반복 횟수는 허용오차가 있다면 그 반복수를 허용오차의 역수배로 한다.
< 회귀에서의 사이킷런 sgd >
from sklearn.linear_model import SGDRegressor sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1) # 학습률=0.1, 허용오차=0.001, 최대반복수=1000, 패널티: 없음 sgd_reg.fit(X, y)
Python
복사
SGDRegressor learning_rate 의 기본값은 ‘invscaling’ 이고, SGDClassifierlearning_rate의 기본값은 ‘optimal’로 각각 학습률을 계산 공식이 다르다.

미니배치 경사 하강법

각 스텝에서 전체 훈련 세트나 하나의 샘플을 기반으로 기울기를 계산하는 것이 아니라 미니배치라 부르는 임의의 작은 샘플 세트에 대해 기울기를 계산한다. 미니배치 경사 하강법의 주요 장점 행렬 연산에 최적화된 하드웨어, 특히 GPU를 사용해서 얻는 성능 향상이다.
특히, SGD보다 덜 불규칙하게 움직인다는 특성으로 SGD보다 최솟값에 더 가까이 도달하게 된다. 물론, 지역 최솟값의 문제가 있는 경우에는 더 안좋기는 하겠지만.

정리

모델
데이터 수가 많을 때
외부 메모리 학습 지원 유무
특성 수가 많을 때
하이퍼 파라미터 수
스케일 조정 필요 유무
사이킷런
정규방정식
빠름
NO
느림
0
NO
N/A
SVD(특이값 분해)
빠름
NO
느림
0
NO
LinearRegression
배치 경사 하강법
느림
NO
빠름
2
YES
SGDRegressor
확률적 경사 하강법
빠름
YES
빠름
≥2
YES
SGDRegressor
미니배치 경사 하강법
빠름
YES
빠름
≥2
YES
SGDRegressor
앞서 살펴본 경사 하강법의 알고리즘 모두 훈련 결과에 큰 차이가 없다. 다만 학습 효율의 문제라고 생각하면 된다.