확률적 경사 하강법 (손실 함수, 에포크 등)
샘플을 골라내는 일이 힘들고 추가되는 수산물은 샘플이 없는 등, 새로운 생선이 도착하는대로 가능한 즉시 훈련 데이터 제공을 약속해도 모든 생선이 도착할때까지 기다릴 수 없는 문제점 발생
"점진적인 학습"의 대표적 알고리즘이 "확률적 경사 하강법 "
문제점) 훈련 데이터가 한 번에 준비되는게 아니라 조금씩 전달된다는 점. 도착할때마다 생선을 판매 해야함.
해결제안1) 기존의 훈련 데이터에 새로운 데이터를 추가해 모델을 매일 다시 훈련하자
해결제안1 단점) 시간이 지남에 따라 데이터가 너무 늘어나고 서버도 늘려야함
해결제안2) 새로운 데이터를 추가할 때 이전 데이터 버리고 훈련 데이터 크기 일정하게 유지하기
해결제안2 단점) 버릴 데이터에 중요한게 있으면 큰일남
최종 제안) 훈련한 모델을 버리지 말고 새로운 데이터에 대해서만 조금씩 더 훈련
: 점진적 학습(=온라인 학습)
확률적 경사 하강법
: 딱 하나의 샘플을 훈련 세트에서 랜덤하게 골라 가장 가파른 경사를 따라 원하는 지점에 도달하는 방법
확률적 : 무작위, 랜덤으로
경사 : 기울기
하강법 : 내려가는 방법
=> 적당한 보폭으로 효율적으로 학습하는것이 중요. 아래와 같이 산을 내려오면 안된다
확률적 경사 하강법은 훈련 세트에서 랜덤하게 하나의 샘플을 선택해서 가파른 경사를 조금 내려감
다음 훈련 세트에서 랜덤하게 또 다른 샘플을 하나 선택해 경사를 조금 내려가 전체 샘플 모두 사용할때까지 계속함
모든 샘플을 사용하고도 산을 다 못 내려오면 다시 처음부터 시작한다. (= 훈련 세트에 모든 샘플 다시 채우기)
그러면서 만족할만한 위치에 도달할때까지 계속 내려간다.
※ 에포크 (epoch)
확률적 경사 하강법에서 훈련 세트를 한 번 모두 사용하는 과정
일반적으로 경사하강법은 수십, 수백번 이상 에포크를 수행함
※ 미니 배치 경사 하강법 (minibatch gradient descent)
1개씩 샘플을 선택이 아닌, 한 번에 랜덤으로 몇개의 샘플을 사용해 경사하강법 수행하는 방법
※ 배치 경사 하강법 (batch gradient descent)
극단적으로 한 번 경사로를 따라 이동하기 위해 전체 샘플 사용하기
전체 데이터를 써서 가장 안정적일수도, 하지만 전체 데이터 쓰면 컴퓨터 자원을 많이 사용하게 됨
너무 많으면 한 번에 전체 데이터를 모두 읽을 수 없을수도 있다.
※ 손실함수 (loss function)
어떤 문제에서 머신러닝 알고리즘이 얼마나 엉터리인지 충정하는 기준 => 작을수록 좋음
기술적으로 말하면 손실함수는 미분 가능해야하고 연속적이어야한다.
0.5, 0.25 이렇게 끊겨있으면 힘들다
로지스틱 손실 함수
양성클래스의 값을 기준으로 손실함수값을 만들어야한다. (1-음성클래스 값)
실제 확률은 0~1이고 손실값은 -1 ~ -0 이다.
(-1인 경우 예측값이 1로, 다 맞는 경우로 손실값이 가장 낮음)
(-0인 경우 예측값이 0으로, 다 맞지 않은 경우로 손실값이 가장 큼)
이를 로그함수로 적용해보자
이 손실 함수를 로지스틱 손실 함수 (logistic loss function), 이진 크로스엔트로피 손실함수(binary cross-entropy loss function)이라고도 부름
다중분류에 사용되는 손실함수는 크로스 엔트로피 손실 함수(cross-entropy loss function)이라고 부른다.
SDG Classifier : 확률적 경사 하강법을 제공하는 대표적인 분류용 클래스
max_iter는 에포크 횟수
/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_stochastic_gradient.py:702: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit. warnings.warn(
위의 경고로 인해서
모델이 충분히 수렴하지 않았다는 ConvergenceWarning 경고가 떠서 max_iter 매개변수 값을 늘려주면 된다.
모델을 이어서 훈련할때는 parial_fit()을 사용한다. fit()을 필수적으로 쓰고나서 써야한다.
fit()과 같지만 호출할때마다 1 에포크씩 이어서 훈련할 수 있다.
\
값이 더 늘어난 것을 확인할 수 있다.
에포크와 과대/과소적합
적은 에포크 횟수 : 훈련 세트와 테스트 세트에 잘 맞지 않은 과소적합 확률이 큼
많은 에포크 횟수 : 훈련 세트에 너무 잘 맞아 테스트 세트에는 오히려 점수가 나쁜 과대적합 모델 가능
조기 종료 : 과대적합이 시작하기 전에 훈련을 멈춘
100번째 에포크 이후에 훈련세트와 테스트 세트의 점수 격차가 늘어남 ㅁ=> 백번째 에포크가 적당한 반복 횟수
SDGClassifier는 일정 에포크동안 성능이 향상되지 않으면 더 훈련하지 않고 자동으로 멈춤
tol 매개변수 : 향상될 최솟값을 지정함 / None : 자동으로 멈추지 않고 max_iter=100만큼 무조건 반복 지정
<SDGClassifier의 loss 배개변수>
기본값 : hinge
hinge : 서프토 벡터 머신이라고 불리는 또 다른 머신러닝 알고리즘을 위한 손실함수
https://colab.research.google.com/drive/1_kjkbMgkS5gZ-VCBhQwN5-zw1fT_-vdx#scrollTo=LTXYe7d8YXV8