[혼공머신] CHAPTER 04-2 확률적 경사 하강법
i) 훈련데이터가 한 번에 준비되는 것이 아니라 조금씩 전달되는 문제 -> 기존의 훈련 데이터에 새로운 데이터를 추가하여 모델을 매일매일 다시 훈련시킨다
>> 시간이 지날수록 데이터가 늘어난다는 단점이 있다
ii) 새로운 데이터를 추가할 때 이전 데이터를 버림으로써 훈련 데이터 크기를 일정하게 유지 -> 데이터셋의 크기가 너무 커지지 않을 것
>> 버릴 데이터에 중요한 데이터가 있다면 앞으로 모델이 제대로 예측하지 못하는 단점이 있다.
∴ 점진적 학습 or 온라인 학습 : 앞서 훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 훈련시킨다.
- 대표적인 점진적 학습 알고리즘 : 확률적 경사 하강법이다.
확률적 경사 하강법(Stochastic Gradient Descent) : 학습 데이터셋에서 전체 샘플을 사용하지 않고 무작위로 한 개의 샘플을 고르는 것
- 샘플 데이터셋에 대해서만 경사(Gradient)를 계산하므로, 매 반복에서 다뤄야 할 데이터 수가 매우 적어 학습 속도가 매우 빠르다.
- 하나의 샘플만 대상으로 경사를 계산해 메모리 소모량이 매우 낮다
- 에포크(epoch) : 확률적 경사 하강법에서 훈련세트를 한 번 모두 사용하는 과정
배치 경사 하강법(Batch Gradient Descent) : 경사 하강법 계산에 전체 학습 샘플을 모두 사용하는 것
- 배치(batch) : 모델의 가중치를 한번 업데이트시킬 때 사용되는 샘플들의 묶음, 연산 한 번에 들어가는 데이터의 크기
- 학습 데이터셋이 커지면 커질수록 시간과 리소스 소모가 지나치게 크다
- 데이터셋 모두를 대상으로 해서 파라미터가 한번 이동할 때마다 계산해야 할 값이 지나치게 많아 계산 시간도 엄청 길어지고 소모되는 메모리도 엄청나다.
배치(Batch) | 에포크(epoch) |
- 연산 한 번에 들어가는 데이터의 크기 - 배치의 크기는 2의 n승 ->GPU구조 때문에 연산이 빨라짐 - 전체 데이터 수가 나누어 떨어지도록 하고 아니라면 마지막 배치는 버린다. - 배치 사이즈가 너무 크면 한 번에 처리해야 할 데이터의 양이 많아져, 학습속도가 느려지고 메모리 부족 문제가 발생 - 배치 사이즈가 너무 작으면 적은 데이터를 대상으로 가중치를 업데이트하고, 이 업데이트가 자주 발생해 훈련이 불안정해짐 |
- 훈련 데이터셋에 포함된 모든 데이터들이 한 번씩 모델을 통과한 횟수, 모든 학습 데이터셋을 학습하는 횟수를 의미 - 에포크를 높일수록 다양한 무작위 가중치로 학습을 해, 적합한 파라미터를 찾을 확률이 높아짐, 손실 값이 내려감 - 지나치게 에포크를 높이면 학습 데이터셋에 과적합되어 다른 데이터에 대해서 제대로 된 예측을 하지 못할 수도 있음 |
ex) 530개의 데이터를 100배치로 나누면 배치 속 데이터는 1/100만큼 영향력을 가지는데 마지막 30개의 배치는 1/30의 영향력을 갖게 되어 과평가 된다 -> 마지막 배치사이즈가 다르면 버린다.
미니 배치 경사 하강법(mini-Batch gradient descent) : 배치 크기를 줄이고, 확률적 경사 하강법을 사용하는 기법이다. 여러 개의 샘플을 사용해 경사 하강법을 수행하는 방식
- 1 batch size에 해당하는 데이터셋을 mini Batch라고 한다
ex) 학습데이터가 1000개, batch size를 100으로 잡으면 총 10개의 미니 배치가 나온다. 1 에포크 당 10번의 경사하강법을 진행
손실 함수(loss function) : 실제값과 예측값의 차이를 수치화해주는 함수
- 오차가 클수록 손실 함수의 값이 크고, 오차가 작을수록 손실 함수의 값이 작아짐
- 정확도를 손실함수로 사용한다면 미분 가능해지지 않아 연속적인 손실함수가 되지 않는다
>>연속적인 손실함수를 만들기 위해 로지스틱 회귀 모델이 확률을 나타내는 것을 기반으로
로지스틱 손실함수(logistic loss function) or 이진 크로스엔트로피 손실 함수(binary cross-entropy loss function)
- 이진 분류에서 사용
- 타깃 = 1일 때(양성클래스) -> -log(예측확률)
- 타깃 = 0일 때(음성클래스) -> -log(1 - 예측확률)
- y=1일 때 샘플이 올바르게 분류되기 위해서 a의 값이 1이 되어야한다. L의 값이 최소화될 때 a가 자연스럽게 1에 가까워진다
- y=0일 때 샘플이 올바르게 분류되기 위해서 a가 0이 되어야한다. L값이 최소화될 때, a가 자연스럽게 0에 가까워진다
즉, 로지스틱 손실함수를 최소화되면 a의 값이 가장 이상적인 값이 된다.
다중 분류에서 사용하는 손실 함수 : 크로스엔트로피 손실 함수(cross-entropy loss function)
확률 경사 하강법을 사용한 분류 모델 만들기
SGDClassifier
csv 파일에서 판다스 데이터 프레임을 만들고 'Species' 열은 타겟 데이터로, 이를 제외한 나머지 5개를 입력 데이터로 사용한다.
테스트세트와 훈련세트로 나눈다.
훈련세트와 테스트세트의 특성을 표준화 전처리 한다
* 훈련세트에서 학습한 통계 값으로 테스트세트도 변환해야한다.
SGDClassifier 클래스는 사이킷런에서 확률적 경사 하강법을 제공한다.
SGDClassifier의 객체를 만들 때 매개변수를 2개 지정한다.
loss | 손실함수(default = 'hinge') |
max_iter | 계산에 사용할 작업 수(default = 1000) |
tol | 반복을 멈출 조건(default = 0.001) |
random_seed | 난수 seed값 설정 |
확률적 경사 하강법은 점진적 학습이 가능하다!
SGDClassifier 객체를 다시 만들지 않고 훈련한 모델에 추가로 더 훈련을 시킨다.
partial_fit() : 학습된 것을 유지하면서 반복하여 학습할 수 있다
아직 점수가 낮지만 정확도가 향상되었다 -> 여러 에포크에 더 훈련해야하지만 무작정 훈련시킬 수 없으니 기준이 필요하다.
확률적 경사 하강법을 사용한 모델은 에포크 횟수에 따라 과소적합이나 과대적합이 될 수 있다.
에포크 횟수가 적으면 모델이 훈련세트를 덜 학습한다 -> 과소적합
에포크 횟수가 많으면 훈련세트를 완전히 학습해 훈련세트에 잘 맞는 모델이 만들어진다 -> 과대적합
훈련세트 점수는 에포크가 진행될수록 꾸준히 증가하지만 테스트세트 점수는 어느 순간 감소하기 시작한다.
이 지점이 과대적합 되기 시작하는 곳이다.
조기종료(early stopping) : 과대적합이 되기 전에 훈련을 멈추는 것
partial_fit() 메서드만 사용하려면 훈련세트에 있는 전체 클래스의 레이블을 partial_fit()메서드에 전달해준다.
np.unique() 함수로 train_target에 있는 7개 생선의 목록을 만든다.
300번의 에포크 동안 훈련을 반복하여 점수를 계산하여 train_score와 test_score리스트에 추가한다.
100번째 에포크 이후에 훈련세트와 테스트세트의 점수가 벌어지는 것을 볼 수 있다.
초기의 에포크는 과소적합되어 훈련세트와 테스트세트 점수 둘 다 낮다.
>> 100번째 에포크가 적절한 반복횟수로 보인다
SGDClassfier의 반복횟수를 100에 맞추고 모델을 다시 훈련한다
SGDClassfier는 일정 에포크 동안 성능이 향상되지 않으면 자동으로 훈련을 멈춘다.
tol을 None으로 지정해 자동으로 멈추지 않고 반복될 수 있도록 했다.
힌지 손실(hinge loss)은 서포트벡터 머신(support vector machine)이라 불리는 머신러닝 알고리즘을 위한 손실 함수이다.