본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
공부하는 습관을 들이자/Deep Learning (NLP,LLM)

[딥러닝 자연어처리] 8-3. (4) 딥러닝의 학습 방법

by 꿀먹은데이터 2023. 12. 18.

딥러닝을 이용한 자연어처리 입문 # 8-3. 4) 딥러닝의 학습 방법

1. 손실 함수

  • 실제값, 예측값의 차이를 수치화해주는 함수. 오차와 손실 함수의 값은 비례
  • 회귀 = MSE, 분류 = 크로스 엔트로피를 주로 이용.

1 ) MSE

  • 연속형 변수를 이용할 때 이용
model.compile(optimizer='adam', loss='mse', metrics=['mse'])
#loss에 문자열 mse을 써주면 돼.
model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError(), metrics=['mse'])
#이런 식으로 표현도 ok.
#하지만 딥러닝 자연어 자체가 일반적으로 분류 문제이기 때문에 MSE보단 Cross-entropy를 더 많게 사용.

2) 이진 크로스 엔트로피

  • 이진 분류의 경우 ⇒ binary_crossentropy를 사용
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
#binary_crossentropy 써주면 돼.
model.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer='adam', metrics=['acc'])
#역시 이것도 ok

3. 범주형 크로스 엔트로피

  • 주로 다중 클래스 분류일 경우 이를 이용
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
model.compile(loss=tf.keras.losses.CategoricalCrossentropy(), optimizer='adam', metrics=['acc'])

#원-핫 인코딩 생략하고, 정수값 레이블에 대해 다중 클래스 분류 수행하고 싶을 시, 
'sparse_categorical_crossentropy'이용.
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['acc'])
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(), optimizer='adam', metrics=['acc'])

2. 배치 크기에 따른 경사 하강법

  • Batch = 가중치 등의 매겨 변수의 값을 조정하기 위해 사용하는 원래의 데이터 양 의미.
  • 이에 따라 변하는 정도가 바뀌기 때문에 이의 설정이 매우 중요.

1) 배치 경사 하강법 = 전체 데이터 모두 이용하는 식

  • 업데이트 오래 걸리고, 메모리 사용이 상대적으로 매우 큰 단점.
model.fit(X_train, y_train, batch_size=len(X_train))

2) 배치 크기 1인 확률적 경사 하강법(SGD)

  • 랜덤으로 선택한 하나의 데이터에 대해서만 계산. 역시 속도적인 이익
model.fit(X_train, y_train, batch_size=1)

3) 미니 배치 경사 하강법

  • 주로 2의 n제곱을 선택하는 게 일반적, default는 32
model.fit(X_train, y_train, batch_size=128)

3. 옵티마이저

1) 모멘텀

  • 관성을 응용한 것.
  • 하강법에 관성을 더 해주는 방식.
  • 경사 하강법에서 계산된 접선의 기울기에 한 시점 전의 접선의 기울기를 일정 비율 반영.
  • 로컬 미니멈에 잘못 빠져있을 때, 글로벌 미니멈으로 갈 수 있도록 도와줌
tf.keras.optimizers.SGD(lr=0.01, momentum=0.9)
2) 아다그라드
#매개변수마다 서로 다른 학습률을 적용시켜주는 방식.
tf.keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)

3) 알엡에스프롭(RMSprop)
아다그라드의 단점 => 이후에 가선 학습률이 지나치게 떨어져.단점 개선
tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)

4) 아담(Adam)
RMSprop, Momentum 합친 방법, 방향, 학습륙 두 가지 모두 잠아.
tf.keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

5) 사용 방법
#optimizer로부터 호출할 수 있고, 단순히 문자열로 적어줘도 동작해.
adam = tf.keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['acc'])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])

5. 에포크와 배치 크기와 이터레이션

1) 에포크

  • 전체 데이터에 대해 순전파, 역전파가 모두 끝난 상태
  • 문제지 비유해서 문제지 모든 문제 끝까지 다 풀고, 채점해 한 번 끝난 상태를 의미.
  • epoch = 50 → 문제지 50번 푼 것.

2) 배치 크기

  • 문제지 예시에서 얼마나 풀고 옵티마이저를 통해 매개변수를 업데이트 하는 지를 의미.
  • 정답지/실제값을 확인하는 시점.
  • but, 배치 크기 ≠ 배치의 수

3) 이터레이션

  • 한 번의 에포크를 끝내기 위해 필요한 배치의 수
  • 전체 데이터 2000, 배치 크기 200 ⇒ 이터레이션 수 10.