관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

다양한 분류 알고리즘 6 - 확률적 경사 하강법 심화 학습 본문

인공지능/머신러닝

다양한 분류 알고리즘 6 - 확률적 경사 하강법 심화 학습

huenuri 2024. 10. 2. 12:22

이번에는 확률적 경사 하강법에 대한 실습을 다시 한번 진행해 볼 것이다. 아침 공부 시간이 1시간 반 정도 남아있는데 그동안에 2개의 소단원은 마치려고 한다.

복습을 할 때는 신기하게도 처음 공부할 때의 절반의 시간도 걸리지 않는 것 같다.


 

 

 

확률적 경사 하강법 실습해보기

앞의 이론 부분은 모두 학습하여 정리했으므로 생략한다.

 

 

 

여기까지는 이전에 배웠던 내용을 반복하는 거라 설명하지는 않겠다.


 

 

 

 

이전에 했던 것처럼 무슨 경고창이 떴다. 이것은 확률적 경사 하강법을 사용하여 모델을 학습할 때 발생하는 ConvergenceWarning입니다. 이 경고는 최대 반복 횟수(max_iter)에 도달했지만 모델이 수렴하지 못했다는 것을 의미한다. 즉, 모델이 최적의 해를 찾기 전에 학습이 종료되었다는 뜻이다. 하지만 지금은 별로 상관이 없을 것 같아 그냥 두기로 했다.

 

SGDClassifier의 객체를 만들 때 2개의 매개변수를 지정한다. loss는 손실 함수의 종류를 지정한다. 여기서는 loss='log_loss'로 지정하여 로지스틱 손실 함수를 지정했다. max_iter는 수행할 에포크 횟수를 지정한다. 10으로 지정하여 전체 훈련 세트를 10회 반복했다. 

훈련 세트와 테스트 세트의 정확도가 낮다. 아마도 지정한 반복 횟수 10번이 부족했던 것 같다.


 

 

 

max_iter를 10에서 1000으로 늘려주자 경고 메시지도 뜨지 않고 평가지수도 훨씬 더 높게 나왔다. 

 

 

 

 

그런 다음 추가 훈련을 해주었더니 점수가 정말 많이 높아졌다. 책 예제보다 내가 측정한 값은 10점 정도 높게 나왔는데 조금 전에 max_iter를 높여주었기 때문이다.

모델을 이어서 훈련할 때는 partial_fit() 메서드를 사용한다. 이 메서드는 fit() 메서드와 같지만 호출할 때마다 1 에포크씩 이어서 훈련할 수 있다.


 

 

 

 

 

확률적 경사 하강법을 사용한 모델은 에포크 횟수에 따라 과소적합이나 과대적합이 될 수 있다. 왜 이런 현상이 일어날까? 에포크 횟수가 적으면 모델이 훈련 세트를 덜 학습한다. 마치 산을 다 내려오지 못하고 훈련을 마치는 셈이다. 에포크 횟수가 충분히 많으면 훈련 세트를 완전히 학습할 것이다. 훈련 세트에 아주 잘 맞는 모델이 만들어진다.

 

이 예제에서는 fit() 메서드를 사용하지 않고 partial_fit() 메서드만 사용한다. 이 메서드만 사용하려면 훈련 세트에 있는 전체 클래스의 레이블을 partial_fit() 메서드에 전달해 주어야 한다. 이를 위해 np.unique() 함수로 train_target에 있는 7개  생선의 목록을 만든다. 또 에포크마다 훈련 세트와 테스트 세트에 대한 점수를 기록하기 위해 2개의 리스트를 준비했다.

300번의 에포크 동안 훈련을 반복하여 진행해 보았다. 데이터가 작기 때문에 아주 잘 드러나지는 않지만, 100번째 에포크 이후에는 훈련 세트와 테스트 세트의 점수가 조금씩 벌어지고 있다. 또 확실히 에포크 초기에는 과소적합되어 훈련 세트와 테스트 세트의 점수가 낮다. 


 

 

 

 

SGDClassifier의 반복 횟수를 100에 맞추고 모델을 다시 훈련했다. 그리고 최종적으로 훈련 세트와 테스트 세트에서 점수를 출력한다.

SGDClassifier는 일정 에포크 동안 성능이 향상되지 않으면 더 훈련하지 않고 자동으로 멈춘다. tol 매개변수에서 향상될 최솟값을 지정한다. 최종 점수가 좋다. 확률적 경사 하강법을 사용한 생선 분류 문제도 성공적으로 수행했다.

 

 

 

한지 손실은 서포트 벡터 머신이라 불리는 또 다른 머신러닝 알고리즘을 위한 손실 함수이다. SGDClassifier가 여러 종류의 손실 함수를 loss 매개변수에 지정하여 다양한 머신러닝 알고리즘을 지원한다.

 


 

 

 

학습을 마치고

이번 시간에는 확률적 경사 하강법에 대해서 학습해 보았다. 확률적 경사 하강법은 손실 함수라는 산을 정의하고 가장 가파른 경사를 따라 조금씩 내려오는 알고리즘이다. 충분히 반복하여 훈련하면 훈련 세트에서 높은 점수를 얻는 모델을 만들 수 있었다. 요즘에는 대량의 데이터를 이용해 문제를 해결해야 하는 일이 흔해졌다. 기존의 전통적인 머신러닝 방식으로는 모델을 만들기 어렵다고 한다.

그렇기에 데이터를 조금씩 사용해 점진적으로 학습하는 방법이 필요해졌다. 지금까지 배운 것들을 사용해 나중에 머신러닝 알고리즘과 모델을 만들면 재미있을 것 같다.