반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

블로그

[딥러닝] #3 성능 관리 본문

공부/DL

[딥러닝] #3 성능 관리

beenu 2024. 3. 25. 19:53
반응형

[복습]

  • x : feature
  • y : target, label 
  • 열 : 정보, 변수
  • 행  분석 단위, 예측 단위
  • 위 행렬 구조 들고 데이터 분석
  • 모델링을 위한 데이터 구조 만들기
    • 모든 셀은 값이 있어야 함 ➔ NaN 조회 ➔ 언제 삭제하는지 ?
    • 모든 값은 숫자여야 한다. 범 ➔ 수 , 가변수화
    • (필요시) 숫자의 범위 일치 (스케일링)
  • 문제 해결 평가 후 AI 서비스 구축 -> MLOps
  • scaling : 거리 연산할 때 이상치의 영향을 받지 않기 위해서
    • 정규화 ➔ 이상치 많으면 너무 작은 값에 값들이 몰려있는 것처럼 보임
    • 표준화 ➔ 이상치 있을 때
    • 모델 학습, 최적화 할 때 데이터 크기가 너무 크면 오래 걸려서 y 값을 스케일링 하는 경우도 있음. ➔ 이런 경우 테스트 할 때는 다시 원복시켜야 함
  • 오차 계산식 : 분모가 작을수록 값이 커짐
  • 시각, 언어, 큰 data, 시계열의 경우 보통 우선 딥러닝을 시도함

 

[참조]

  • Gradient : 기울기(벡터)
  • Gradient Decent(경사하강법, optimizer의 기본)
    • w의 초기값 설정 w0
    • 초기값에서의 기울기(방향) 확인 ➔ 미분 df(w) / dw, w = w0
      • 기울기가 -면 x는 오른쪽(+방향)
      • 기울기가 +면 x는 왼쪽(-방향)
      • w` = w0 - η 편미분
  • Vanishing Gradient(기울기 소실)
    • 네트워크 깊은 부분으로 갈수록 기울기가 점점 작아져서 가중치가 거의 또는 전혀 업데이트 되지 않게 되는 현상
  • 소실 문제 해결을 위한 노력
    • 활성화 함수 조정 : ReLU
      • 음수 입력 - 0출력, 양수 입력 - 그대로 출력 : 양의 기울기를 유지하여 기울기 소실 문제 완화
    • 그 외에도 가중치 초기화 기법, 배치 정규화 등 다양한 기법들이 있음

1. 성능 관리

from keras.callbacks import EarlyStopping

es = EarlyStopping(monitor = 'val_loss', min_delta = 0, patience = 0)
# monitor : 기본값 val_loss
# min_delta : 오차(loss)의 최소값에서 변화량(줄어드는 양)이 몇 이상 돼야하는지 지정(기본값 0)
# patience : 오차가 줄어들지 않는 상황을 몇 번(epoch) 기다려줄건지 지정

model.fit(x_train, y_train, epochs=100, validation_split = .2, callbacks = [es])
# fit 안에 지정
# callbacks : epoch 단위로 학습이 진행되는 동안 중간에 개입할 task 지정
from keras.regularizers import l1, l2

model = Sequential( [Dese(128, input_shape=(nfeatures, ), activation='relu', kernel_regularizer=l1(0.01)),
		     Dense(64, activation='relu', kernel_regularizer=l1(0.01)),
                     Dense(32, activation='relu', kernel_regularizer=l1(0.01)),
                     Dense(1, activation='sigmoid'))] )
  • 과적합 (Overfitting)
    • 모델의 복잡도 : 학습용 데이터의 패턴을 반영하는 정도
    • 모델이 복잡해지면 가짜 패턴(혹은 연관성)까지 학습해버림
      • 가짜 패턴 : 학습 데이터에만 존재하는 특이한 성질
    • 미리 멈춤 Early Stopping
      • epoch가 많으면 과적합 될 수 있음
      • Training Set 오차는 계속 감소하는데, Validation Set은 일정 횟수 지나면 오차가 다시 증가하는 형태일 때
    • 가중치 규제 Regularization
      • L1규제 : Lasso
        • 오차함수 = 오차 + λ * ∑|w(가중치)|
        • 효과 : 가중치의 절대값의 합을 최소화 ➔ 가중치가 작은 값들은 0으로 만드는 경향
        • 규제 강도(일반적인 값의 범위) : 0.0001 ~ 0.1
      • L2규제 : Ridge
        • 오차함수 = 오차 + λ * ∑ w(가중치)²
        • 효과 : 가중치 제곱의 합을 최소화 ➔ 규제 강도에 따라 가중치 영향력을 제어 ➔ 강도가 크면, 큰 가중치가 좀 더 줄어드는 효과, 작은 가중치는 0에 수렴
        • 규제 강도 : 0.001 ~ 0.5
      • 강도가 높을수록 ➔ 일반화된 모델
      • 규제를 모든 Layer에 줄 수도, 노드가 많은 층에만 줄 수도 있음
# 모델 저장하기
# 딥러닝 모델의 메소드로 .save가 제공됨
# 파일이름.h5 파일 저장 (h5 : 하둡파일 형식)
model.save('파일이름.h5')

# 모델 로딩하기
from keras.models import load_model
model = load_model('파일이름.h5')

# 중간 체크포인트 저장하기
# keras.callback.ModelCheckpoint
# 각 epoch마다 모델 저장 가능
cp_path = '/content/{epoch:03d}'
mcp = ModelCheckpoint(cp_path, monitor='val_loss', verbose=1, save_best_only=True)

hist = model.fit(x_train, y_train, epochs=50, validation=.2, callbacks=[mcp]).history
# cp_path : 모델 저장할 경로와 모델 파일 이름
## epoch 번호를 세 자리로 표기 : 첫 번쨰 epoch => 001.h5
# mcp = ModelCheckpoint(cp_path, monitor='val_loss', verbose=1, save_best_only=True)
## validation loss 기준으로 이전 체크포인트의 모델들보다 성능이 개선되면 저장(save_best_only)

 

더보기

요약

딥러닝 모델 성능 높이기

  • 데이터
    • 입력 데이터 정제, 적절한 전처리
    • 데이터 늘리기 : 적절한 feature 추가, 데이터 건수 늘리기
  • 모델 구조
    • 은닉층, 노드 수 늘리기 : 성능이 증가할 때까지
    • activation
  • 학습
    • epochs, learning_rate, optimizer

과적합 문제

  • 모델링 목적 : 모집단 전체에서 좋은 성능을 내는 적당한 모델 만들기
  • 과적합 : 학습 데이터에 대해서만 좋은 성능을 보임

과적합 문제 해결

  • 데이터 건수 늘리기
  • 모델 복잡도 조절 -> 가중치 규제(Regularization)
  • 반복 학습 횟수(epochs) 조절 -> early stopping

모델 저장하기

  • 최종 모델 저장
  • 체크 포인트에서 모델 저장
    • 성능 개선될 경우에만 저장하기 옵션

 

2. Functional API

  • Sequential API
    •  순차적으로 쌓아가며 모델 생성
    • Input -> Output Layer로 순차적 연결
  • Functional API
    • 모델을 좀 더 복잡하게 구성할 수 있음
    • 모델을 분리해서 사용 가능
    • 다중 입력, 다중 출력 구현 가능
  • 다중 입력
    • 각 입력에 맞는 특징 도출(feature representation) 가능
# Sequential
# Sequential 함수 안에 리스트로 레이어 입력
model = Sequential([Dense(8, input_shape=(nfeatures, ), activation='relu'),
				Dense(1)])
                
# Functional
# Input 함수
# 레이어 : 앞 레이어와 연결 지정
# Model 함수로 시작과 끝 연결해서 선언
il = Input(shape=(nfeatures, ))
hl1 = Dense(8, activation='relu')(il)
ol = Dense(1)(hl1)

model = Model(inputs=il, outputs=ol)
# 다중 입력
# 모델 구성
input1 = Input(shape=(nfeatures1, ), name='input1')
input2 = Input(shape=(nfeatures2, ), name='input2')

# 입력을 위한 레이어
hl1_1 = Dense(10, activation='relu')(input1)
hl1_2 = Dense(20, activation='relu')(input2)

# 두 히든 레이어를 옆으로 합치기 (= pd.concat)
cb1 = concatenate([hl1_1, hl1_2])

# 추가 레이어
h12 = Dense(8, activation='relu')(cb1)
output = Dense(1)(hl2)

# 모델 예측 시, 전처리 된 두 가지 입력을 리스트로 묶어 사용
pred = model.predict([x_val1, x_val2])
728x90
반응형