데이터분석-머신러닝-AI/강의 정리

[혼자 공부하는 머신러닝+딥러닝] 10강. 확률적 경사 하강법 알아보기 - 점진적 학습, 온라인 학습

bluebamus 2023. 11. 11.

https://www.youtube.com/watch?v=A1UUnfijQfQ&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=10

 

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

   - 머신러닝 알고리즘이 아니다.

   - 머신러닝, 딥러닝 알고리즘을 훈련하는 방법이다. 혹 최적화 하는 방법이다

 

 - 경사하강법의 종류

   - 확률적 경사 하강법 : 1개씩 샘플을 선택해 경사를 내려간다

   - 미니배치 경사 하강법(minibatch gradient descent): 1개씩이 아니라 무작위로 몇 개의 샘플을 선택해 경사를 내려간다.

   - 배치 경사 하강법(batch gradient descent): 극단적으로 한 번 경사로를 이동하기 위해 전체 샘플을 사용하는 것이다.

      - 전체 데이터를 사용하기 때문에 가장 안정적인 방법이 될 수 있다. 단, 그만큼 컴퓨터 자원을 많이 요구한다.

 

 - 손실 함수

   - 머신러닝 알고리즘의 나쁜 정도를 측정하는 함수이다.

   - 확률적 경사 방법을 이용해 손실함수가 낮아지는 쪽으로 가중치(W), 계수/기울기 절편(b)를 옮긴다.

   - [0, 0.25, 0.5, 0.75, 1] 이렇게 구간이 있는 정확도에서는 손실함수로 사용할 수 없다. 

      - 정확도는 손실함수로 사용할 수 없는 측정 방법이다.

   - 정확도 = 미분 가능하지 않다(?) -> 연속적인 데이터만 가능하다.

   - 미분가능한 함수가 필요하다. 

   - 최적화를 위해서는 다른 손실함수를 사용한다.

      - 로지스틱 손실 함수

      - 이진 크로스 엔트로피 손실 함수

   - 손실 함수에 로그 함수를 적용하면 0에 가까울 수록 아주 큰 음수가 되기 때문에 손실을 아주 크게 만들어 준다.

      - 로그함수를 적용해 '높은 손실'일수록 아주 큰 양수값이 되도록 만들어 준다.

 

 - 로지스틱 손실함수

   - 분류일때 사용

   - 정답과 가까운 예측은 '낮은 손실'로 표현되고, 먼 예측은 '높은 손실'로 표현되도록 계산

 

 - 회귀 방법

   - 평균 절대값 오차나 평균 제곱 오차를 사용할 수 있다. 둘 다 미분가능해서 손실함수를 사용할 수 있다.

      - 평균 절댓값 오차 : 타깃에서 예측을 뺀 절댓값을 모든 샘플에 평균한 값

      - 평균 제곱 오차 : 타깃에서 예측을 뺀 값을 제곱한 후 모든 샘플에 평균한 값

   - 손실함수나 측정지표를 동일하게 가져갈 수 있다.

   - 머신러닝, 딥러닝 대부분 모델에서 평균 제곱 오차를 사용하는 편이다.

 

 - 분류일 때는 정확도로 모델의 성능을 보고 정확도는 로지스틱 손실함수로 최적화를 한다. 

   - 정확도는 미분이 안되기 때문에 경사 하강법을 사용할 수 없다. 때문에 경사 하강법을 사용할 수 있는 방법으로 찾은 것이 로지스틱 손실함수이다.

 

 - 확률적 경사 하강법을 사용하기 위해서는 각 특성마다의 스케일이 같아야 한다.

   - 경사를 공평하게 평가하기 위해서이다.

   - 데이터를 전처리 해야 한다 대표적으로 표준점수로 특성의 스케일을 바꿔줄 수 있다.

 

 - 다중 분류일 경우 SGDClassifier에 loss='log'로 지정하면 클래스마다 이진 분류 모델을 만든다.

   - 생선 클래스를 예로들면 도미를 양성 클래스로 두고 나머지를 모두 음성 클래스로 두고 모델을 만드는 식이다.

   - 이런 방식을 OvR(One versus Rest)라고 부른다.

 

 - 데이터 분할 : 훈련 세트와 타겟, 테스트 세트와 타겟 

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(
    fish_input, fish_target, random_state=42)

 

 - StandardScaler는 평균과 분산을 이용한 전처리 스케일러이다.

   - 학습 세트를 fit 함수를 이용해 평균과 표준편차를 구한다.

   - transform()을 이용해 정규화/표준화를 수행한다.

   - fit_transform()으로 두 작업을 한번에 수행할 수 있다.

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

 

 - 사이킷런에서 제공하는 경사 하강법 : SGDClassifier(분류) <-> SGDRegressor(회귀)

from sklearn.linear_model import SGDClassifier

 

 - 머신러닝을 최적화 하는 방법이기에 어떤 모델을 최적화 할지를 정의해 줘야 한다.

 - loss 변수는 손실함수의 종류를 정의하며, 'log'만 정의하면 로지스틱 손실 함수를 사용하겠다는 뜻이 된다.

 - max_iter 변수는 수행할 에포크 횟수를 지정한다.

sc = SGDClassifier(loss='log_loss', max_iter=10, random_state=42)

 

 - fit()을 사용할 때는 이전 학습 내용을 사용하지 않고 매번 새로 학습을 한다.

 - partial_fit()은 기존 학습한 내용을 그대로 유지하면서 학습을 한다.

sc.partial_fit(train_scaled, train_target)

 

 - SGDClassifier는 확률적 경사 하강법만 지원한다. 배치, 미니배치 하강법은 지원하지 않는다.

 

 -  조기종료

   - 에포크 또한 과대 적합과 과소 적합이 존재한다.

 

 - partial_fit()는 데이터의 일부부만 전달된다고 가정한다. 때문에 가능한 전체 샘플의 클래스 객체 갯수, 목록을 전달해 줘야 한다.

   - fit()을 이전에 사용했다면 이미 전체 목록을 전달했었기 때문에 따로 고려할 필요가 없다.

   - 하지만 두 메서드를 섞어 사용하는 것은 사이킷런이 안전을 보장하지는 않는다.

 sc.partial_fit(train_scaled, train_target, classes=classes)

 

 

 

 - reference :

https://velog.io/@dnfl1563/chapter4.-%ED%99%95%EB%A5%A0%EC%A0%81-%EA%B2%BD%EC%82%AC-%ED%95%98%EA%B0%95%EB%B2%95

 

chapter4. 확률적 경사 하강법

('혼자 공부하는 머신러닝+딥러닝' 199~217p 내용을 정리한 것입니다.)만약 훈련 데이터가 한 번에 준비되는 것이 아니라 조금씩 만들어진다면, 앞서 훈련한 모델을 버리지 않고, 새로운 데이터에

velog.io

https://velog.io/@simon919/%ED%98%BC%EA%B3%B5%EB%A8%B8%EC%8B%A0-4-2.-%ED%99%95%EB%A5%A0%EC%A0%81-%EA%B2%BD%EC%82%AC-%ED%95%98%EA%B0%95%EB%B2%95-tkld4rzy

 

[혼공머신] 4-2. 확률적 경사 하강법

김 팀장🗣️ "이제는 7개의 생선 말고 새로운 생선도 추가될 거고, 수산물들이 오는 족족 분류모델을 업데이트 해야 해. 기존 데이터를 유지하면서 새로운 데이터가 올 때마다 조금씩 훈련시킬

velog.io

 

댓글