개요
- 책을 보고 공부한 내용을 정리합니다.
딥러닝 텐서플로 교과서
- 저자 서지영님
- 길벗 출판사
코드 출처
https://github.com/gilbutITbook/080263
8. 성능 최적화
8.1.1 데이터를 사용한 성능 최적화
- 최대한 많은 데이터 수집하기
- 데이터 생성하기 (예 ImageDataGenerator())
- 데이터 범위(scale) 조정 (정규화, 규제화, 표준화)
8.1.2 알고리즘을 이용한 최적화
- 유사한 용도의 알고리즘들을 선택해 모델 선택
8.1.3 알고리즘 튜닝을 위한 최적화
- 성능 최적화를 하는데 가장 많은 시간이 소요
- 하이퍼파라미터를 변경하며 훈련
💡 선택할 수 있는 하이퍼 파라미터 항목
진단
- 성능 향상이 어느 순간 멈추었다면 원인 분석해야함.
- 평가 결과를 바탕으로 모델이 과적합인지 혹은 다른 원인이 있는지 인사이트를 얻어서 해결
- 훈련성능이 검증보다 눈에 띄게 좋다면 과적합을 의심해 볼 수 있음.
- 훈련과 검증 결과 모두 좋지 않으면 과소적합을 의심
가중치
- 오토인코더 같은 비지도 학습을 이용하여 사전 훈련을 진행한 후 지도 학습을 진행하는 것도 방법
학습률
- 학습 결과를 보고 조금씩 변경
- 네트워크의 계층이 많다면 학습률은 높아야 함
- 네트워크의 계층이 몇 개 되지 않는다면 학습률은 작게 설정
활성화 함수
- 활성화 함수를 변경할 때 손실 함수도 함께 변경해야 하는 경우가 많음
- 일반적으로 활성화 함수로 시그모이드나 하이퍼 볼릭 탄젠트를 사용했다면 출력층에서는 소프트맥스나 시그모이드 함수 많이 사용
배치와 에포크
- 일반적으로 큰 에포크와 작은 배치를 사용하는 것이 트렌드
- 하지만 다양한 테스트가 필요함
옵티마이저 및 손실 함수
- 확률적 경사 하강법을 많이 사용
- 네트워크 구성에 따라 차이는 있지만 Adam, RMSProp 도 좋은 성능을 보임
- 다양한 테스트 할 것
네트워크 구성
- 네트워크 구성은 네트워크 토폴로지(topology)라고 함
- 여러 테스트가 필요
- 예를 들어 하나의 은닉층에 뉴런을 여러 개 포함시키거나(네트워크가 넓다고 표현), 네트워크 계층을 늘리되 뉴런 개수는 줄여봄(네트워크가 길다고 표현), 혹은 두가지 결합
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로 유지
과정
미니 배치 평균구하기 → 미니배치 분산과 표준편차 구하기 - > 정규화 - > 스케일링
단점
- 배치 크기 작을 때 정규화 값이 기존 값과 다른 방향으로 훈련될 수 있음
분산이 0이 되면 정규화 자체가 안되는 경우 - RNN은 계층별로 미니 정규화를 적용해야해서 모델 복잡도가 올라감
8.3.2 드롭아웃을 이용한 성능 최적화
- 훈련할 때, 일정 비율의 뉴런만 사용, 나머지 뉴런에 해당하는 가중치는 업데이트 하지 않는 방법
- 노드를 임의로 그면서 학습하는 방법, 꺼진 노드는 신호를 전달하지 않으므로 지나친 학습을 방지
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
- 개선되고 있다 판단하기 위한 최소 변화량
'Study > 딥러닝 텐서플로 교과서 - 길벗' 카테고리의 다른 글
[Book] 10. 자연어 처리를 위한 임베딩 (0) | 2022.01.06 |
---|---|
[Book]9. 자연어 처리 (0) | 2022.01.06 |
[Book]7. 시계열 분석 (0) | 2022.01.05 |
[Book]6. 합성곱 신경망 2 (0) | 2022.01.04 |
[Book]5. 합성곱 신경망 1 (0) | 2022.01.02 |