본문 바로가기

Study/딥러닝 텐서플로 교과서 - 길벗

[Book]8. 성능 최적화

개요

  • 책을 보고 공부한 내용을 정리합니다.

딥러닝 텐서플로 교과서

  • 저자 서지영님 
  • 길벗 출판사

코드 출처

https://github.com/gilbutITbook/080263

 

GitHub - gilbutITbook/080263

Contribute to gilbutITbook/080263 development by creating an account on GitHub.

github.com


8. 성능 최적화

8.1.1 데이터를 사용한 성능 최적화

  • 최대한 많은 데이터 수집하기
  • 데이터 생성하기 (예 ImageDataGenerator())
  • 데이터 범위(scale) 조정  (정규화, 규제화, 표준화)

8.1.2 알고리즘을 이용한 최적화

  • 유사한 용도의 알고리즘들을 선택해 모델 선택

8.1.3 알고리즘 튜닝을 위한 최적화

  • 성능 최적화를 하는데 가장 많은 시간이 소요
  • 하이퍼파라미터를 변경하며 훈련


💡 선택할 수 있는 하이퍼 파라미터 항목

진단

  1. 성능 향상이 어느 순간 멈추었다면 원인 분석해야함.
  2. 평가 결과를 바탕으로 모델이 과적합인지 혹은 다른 원인이 있는지 인사이트를 얻어서 해결
  3. 훈련성능이 검증보다 눈에 띄게 좋다면 과적합을 의심해 볼 수 있음.
  4. 훈련과 검증 결과 모두 좋지 않으면 과소적합을 의심

 


가중치

  1. 오토인코더 같은 비지도 학습을 이용하여 사전 훈련을 진행한 후 지도 학습을 진행하는 것도 방법

 

학습률

  1. 학습 결과를 보고 조금씩 변경
  2. 네트워크의 계층이 많다면 학습률은 높아야 함
  3. 네트워크의 계층이 몇 개 되지 않는다면 학습률은 작게 설정

활성화 함수

  1. 활성화 함수를 변경할 때 손실 함수도 함께 변경해야 하는 경우가 많음
  2. 일반적으로 활성화 함수로 시그모이드나 하이퍼 볼릭 탄젠트를 사용했다면 출력층에서는 소프트맥스나 시그모이드 함수 많이 사용

 

배치와 에포크

  1. 일반적으로 큰 에포크와 작은 배치를 사용하는 것이 트렌드
  2. 하지만 다양한 테스트가 필요함


옵티마이저 및 손실 함수

  1. 확률적 경사 하강법을 많이 사용
  2. 네트워크 구성에 따라 차이는 있지만 Adam, RMSProp 도 좋은 성능을 보임
  3. 다양한 테스트 할 것

네트워크 구성

  1. 네트워크 구성은 네트워크 토폴로지(topology)라고 함
  2. 여러 테스트가 필요
  3. 예를 들어 하나의 은닉층에 뉴런을 여러 개 포함시키거나(네트워크가 넓다고 표현), 네트워크 계층을 늘리되 뉴런 개수는 줄여봄(네트워크가 길다고 표현), 혹은 두가지 결합

8.1.4 앙상블을 이용한 성능 최적화

  • 모델을 두 개 이상 섞어서 사용하는 것


8.2 하드웨어를 이용한 성능 최적화

  • 성능 최적화에는 하드웨어를 이용하는 방법이 있음

8.2.1 CPU와 GPU 차이

  • 개발된 목적과 내부 구조가 달라서 위와 같은 성능 차이를 보임
  • CPU는 명령어가 입력되는 순서대로 데이터를 처리하는 직렬 처리 방식
  • 즉, 한 번에 하나의 명령어만 처리하기 떄문에 연산을 담당하는 ALU(Arithmetic Logic Unit, 산술 논리 장치) 개수가 많을 필요가 없음
  • GPU는 병렬 처리를 위해 개발, ALU 개수가 많음

8.2.2 GPU 이용한 성능 최적화

  • 윈도 환경에서 GPU용의 텐서플로를 설치하려면 CUDA(쿠다) , cuDNN을 설치
  • CUDA는 NVDIA에서 개발한 GPU 개발 툴
  • 쿠다 설치

8.3 하이퍼 파라미터를 이용한 성능 최적화

8.3.1 배치 정규화를 이용한 성능 최적화

1. 정규화(normalization)

  • 데이터 범위를 사용자가 원하는 범위로 제한하는 것
  • 예를 들어 이미지 픽셀은 0~255 사이의 값을 가지는데, 이를 255로 나누면 0~1.0 사이의 값을 가짐
  • 정규화는 각 특성 범위(스케일)을 조정한다는 의미로 특성 스케일링(feature scaling)이라고 함

2. 규제화(regularization)

  • 복잡도를 줄이기 위해 제약을 두는 방법
  • 제약은 데이터가 네트워크에 들어가기 전에 필터를 적용한 것

  • 오른쪽 그림처럼 필터로 걸러진 데이터만 네트워크에 투입되어 빠르고 정확한 결과를 얻음
💡 규제를 이용하여 모델 복잡도를 줄이는 방법
   1.드롭아웃 
   2.조기 종료

3. 표준화(standardization)

  • 기존 데이터를 평균은 0, 표준편차를 1인 형태의 데이터로 만드는 방법
  • 다른 표현으로 표준화 스칼라(standard scaler) 혹은 z-스코어 정규화(z-socre normalization)

4. 배치 정규화(batch normalization)

  • 기울기 소멸이나 기울기 폭발 같은 문제를 해결하기 위한 방법
  • 일반적으로 기울기 소멸이나 폭발 문제를 해결하기 위해 손실 함수로 Relu를 사용하거나 초깃값 튜닝,  학습률 등을 조정
💡 기울기 소멸과 기울기 폭발
- 기울기 소멸 : 오차 정보를 역전파시키는 과정에서 기울기가 급격히 0에 가까워져 학습이 되지 않는 현상
- 기울기 폭발 : 학습 과정에서 기울기가 급격히 커지는 현상

 

  • 기울기 소멸과 폭발 원인은 내부 공변량 변화(internal covariance shift) , 떄문인데 이것은 네트워크가 각 층마다 활성화 함수가 적용되면서 입력 값들의 분포가 계속 바뀌는 현상을 의미
  • 따라서 분산된 분포를 정규 분포로 만들기 위해 표준화와 유사한 방식을 미니 배치(mini-batch)에 적용하여 평균은 0, 표준편차는 1로 유지

과정
미니 배치 평균구하기 → 미니배치 분산과 표준편차 구하기 - > 정규화 - > 스케일링

단점

  1. 배치 크기 작을 때 정규화 값이 기존 값과 다른 방향으로 훈련될 수 있음
    분산이 0이 되면 정규화 자체가 안되는 경우
  2.  RNN은 계층별로 미니 정규화를 적용해야해서 모델 복잡도가 올라감

배치 정규화 해보기

 

GitHub - heohyunjun/Sk_Shieldus: SK Infosec 클라우드 AI 융복합 과정

SK Infosec 클라우드 AI 융복합 과정. Contribute to heohyunjun/Sk_Shieldus development by creating an account on GitHub.

github.com

 

8.3.2 드롭아웃을 이용한 성능 최적화

  • 훈련할 때, 일정 비율의 뉴런만 사용, 나머지 뉴런에 해당하는 가중치는 업데이트 하지 않는 방법
  • 노드를 임의로 그면서 학습하는 방법, 꺼진 노드는 신호를 전달하지 않으므로 지나친 학습을 방지

드롭 아웃

 

GitHub - heohyunjun/Sk_Shieldus: SK Infosec 클라우드 AI 융복합 과정

SK Infosec 클라우드 AI 융복합 과정. Contribute to heohyunjun/Sk_Shieldus development by creating an account on GitHub.

github.com

 

8.3.3 조기 종료를 이용한 성능 최적화

  • 조기 종료(early stopping)은 뉴럴 네트워크가 과적합을 회피하는 규제 기법
  • 매 에포크마다 검증 데이터에 대한 손실을 측정 하여 모델의 종료 시점 제어

체크포인트 설정

import os
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, verbose=1)

tf.keras.callbacks.ModelCheckpoint

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=maxlen) 
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)

모델 생성

model = Sequential()
# 임베딩
# 첫번째 인자 : 단어 사전 크기, 단어 종류갸 max_features 개, 이 값은 imdb.load()
# 메서드의 num_words 파라미터 값과 동일

# 두번쨰 인자 : 단어를 인코딩한 후 나오는 벡터 크기
# input_length : 단어수, 즉 문장 길이
model.add(Embedding(max_features,
                    embedding_dims,
                    input_length=maxlen)) ------ ①

 # 무작위로 20%의 뉴런을 다음 층의 입력에서 무시
model.add(Dropout(0.2))
model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu',
                 strides=1)) ------ ②
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()

조기 종료 적용 모델

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

keras_callbacks = [
    EarlyStopping(monitor='val_loss', patience=30, mode='min', min_delta=0.0001),
    ModelCheckpoint(checkpoint_path, monitor='val_loss', save_best_only=True, mode='min')
] ------ ①

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2,
          callbacks=keras_callbacks)

EarlyStopping

  • monitor = 'val_loss'
  • 관찰 하고자 하는 항목으로 주로 'val_loss' , 'val_acc'

  • patience = 30
  • 개선이 없다고 바로 종료하지 않고 새선이 없는 에포크를 얼마나 기다려 줄지 지정
  • 30인 경우 개선이 없는 에포크가 서른 번째 지속될 경우 종료

  • mode ='min'
  • 개선이 없다고 판단하기 위한 기준 지정
  • 'val_loss'의 감소가 더 이상 발생하지 않으면 종료시킴

  • min_delta = 0.001
  • 개선되고 있다 판단하기 위한 최소 변화량