UOMOP

확률적 경사 하강법(Stochastic Gradient Descent) 본문

Ai/ML

확률적 경사 하강법(Stochastic Gradient Descent)

Happy PinGu 2022. 1. 27. 18:15

"확률적 경사 하강법"은 추출된 데이터 한 개에 대해서 그래디언트를 계산하고, 경사 하강 알고리즘을 적용하는 방법을 말한다.

 

이때 경사는 손실 함수의 경사를 뜻한다. 손실함수의 경사가 적을수록 좋은 모델일 것이고 손실함수의 최저점을 찾아서 해당하는 point에서의 가중치(weight), 절편(bias)를 업데이트하게 되는 것이다.

 

다양한 지표를 손실함수로 사용할 수 있지만 분류 알고리즘에서의 정확도는 사용될 수 없다. 정확도는 불연속적인 값을 지니게 때문에 미분이 불가능하기 때문이다. 예를 들어서 2진 분류라면 정확도는 [0 0.25 0.5 0.75 1]일 것이고, 5가지의 경우의 수만 존재할 것이다. 

 

분류 알고리즘에서는 성능을 평가할 때는 정확도를 사용하지만 최적화(확률적 경사 하강법 등)을 할 때는 다른 함수를 사용한다.(로지스틱 손실 함수 = 2진 크로스 엔트로피 손실함수)

 

회귀 알고리즘에서는 평균 절댓값 오차, 평균 제곱 오차 등을 성능 지표, 손실 함수로 사용 가능하다. 즉, 회귀 알고리즘에서는 성능 지표와 손실 함수를 구분없이 사용해도 된다. 현재까지는 회귀 알고리즘에서 결정계수만을 확인해보았지만 실제로는 평균 제곱 오차를 성능 평가하는데 많이 사용한다.


import pandas as pd

fish_df = pd.read_csv("http://bit.ly/fish_csv_data")

fish_df.head()
# input, target data를 분리
target_data = fish_df["Species"].to_numpy()
input_data = fish_df.drop("Species", axis = 1).to_numpy()

from sklearn.model_selection import train_test_split

# 학습/검증 데이터 분리
train_input, test_input, train_target, test_target = train_test_split(input_data, 
                                                              target_data, random_state = 42)

# 확률적 경사 하강법을 사용할 때는 꼭 Scaling 전처리 과정이 필요하다.

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()

ss.fit(train_input)

train_input_scaled = ss.transform(train_input)
test_input_scaled = ss.transform(test_input)

from sklearn.linear_model import SGDClassifier

sc = SGDClassifier(loss = "log", max_iter = 10, random_state = 42)
# 손실함수로는 "log", epoch로는 10

sc.fit(train_input_scaled, train_target)

print(sc.score(train_input_scaled, train_target))
print(sc.score(test_input_scaled, test_target))
0.773109243697479
0.775

sc.partial_fit(train_input_scaled, train_target)

print(sc.score(train_input_scaled, train_target))
print(sc.score(test_input_scaled, test_target))
0.8151260504201681
0.85
partial_fit 이라는 메소드는 그 전에 학습 했던 정보들 가중치, 절편 등에 대한 내용을 초기화하지 않고 그 값들을 유지한채 다시 훈련을 시키는 것이다.
실제로 점진적으로 훈련을 시켜본 결과 성능이 조금 더 좋아진 것을 확인할 수 있다

규제가 있는 릿지 모델을 확인해보면 alpha가 커질수록 과소적합, 작아질수록 과대적합이 발생하는 것을 확인할 수 있었다. 최적의 alpha를 찾아서 최고의 성능으로 설계하는 것이 목적이었다.

확률적 경사 하강법도 비슷하다. epoch(에포크 = 반복 횟수)가 커질수록 학습을 많이 하게 되고 학습 데이터에만 적합해져 과대적합 문제가 발생한다. 반대로 훈련을 너무 적게 하면 학습이 제대로 이루어지지 못해서 과소적합 문제가 발생한다.

최적의 epoch를 찾는 것이 중요하다. 
보통 epoch를 크게 설정한 후 테스트 세트의 score가 떨어지기 직전에 멈춘다.
이 과정을 조기 종료(early stopping)이라고 한다.
Comments