7장 딥러닝을 위한 고급 도구

이 장에서는 딥러닝을 더 능숙하게 사용하기 위한 여러 도구와 스킬을 알아본다. -> 함수형 API, 케라스 콜백, 텐서보드, 배치 정규화, 잔차 연결, 하이퍼파라미터 최적화, 모델 앙상블을 배운다.

Sequential 모델을 넘어서: 케라스의 함수형 API

층을 차례대로 쌓아 구성하는 Sequential API와 달리 functional API는 여러 종류의 데이터를 입력받아 처리할 수 있다.

혹은 연관된 출력을 2개 이상 출력할 때 functional API를 사용하여 더 풍부한 표현을 사용해 정확한 값 출력이 가능하다.

즉, sequential은 안되는 다중 입력과 출력이 functional 에서는 가능하다.

최근에 개발된 많은 신경만 구조는 선형적이지 않은 네트워크 토폴로지(topology)가 필요로 하고 많이 쓰인다.

잔차 연결 : 하위 층의 출력을 상위 층의 출력 텐서에 더해서 아래층의 표현이 네트워크 위쪽으로 흘러갈 수 있도록 한다.

# Sequential과 Functional 비교

from keras.models import Sequential, Model
from keras import layers
from keras import Input

# Sequential
seq_model = Sequential()
seq_model.add(layers.Dense(32, activation='relu', input_shape=(64,)))
seq_model.add(layers.Dense(32, activation='relu'))
seq_model.add(layers.Dense(10, activation='softmax'))

# Functional
input_tensor = Input(shape=(64,))
x = layers.Dense(32, activation='relu')(input_tensor)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softmax')(x)

model = Model(input_tensor, output_tensor)

model.summary()

다중 입력 모델

함수형 API에서 다중 입력 모델을 만들 때, 여러 입력 가지를 합치기 위해 여러 텐서를 연결할 수 있는 층을 사용한다. (p.317)

# 2개의 입력을 가지는 '질문-응답' 모델

즉, 함수형 API로 다중 입출력 모델을 만들수 있다.

함수형 API를 사용하면 다중 입출력 외에도 내부 토폴로지(topology)가 복잡한 네트워크도 만들 수 있다. (비순환 유향 그래프, directed acyclic graph)

여기서 비순환이란 그래프들이 원형을 (루프가) 띨 수 없다는 것이다. 텐서 x가 자기 자신을 출력하는 층의 입력이 될 수 없다. 만들 수 있는 루프(순환 연결)는 순환 층의 내부에 있는 것 뿐이다.

이렇게 구현된 몇 개의 신경망 컨포넌트가 널리 사용되고, 가장 유명한 2개는 인셉션 모듈(inception module; GoogLeNet)과 잔차 연결(residual connect)이다.

또 하나의 장점으로는 층 가중치를 공유할 수 있다는 것이다.

한 입력에서 학습된 가중치를 다른 입력에 가중치와 공유하여 더 풍부한 표현이 가능하게 하는 것이다.

예를 들어 입력이 대칭적인 관계, 즉 A에서 B에 대한 유사도가 B에서 A에 대한 유사도가 같을 때, 이를 독립적인 모델에서 훈련하는 것이 아닌 같은 모델에 훈련하여 가중치를 공유하는 것이 맞다는 것이다.

이렇게 양쪽 입력을 하나의 LSTM 층에서 처리하는 LSTM 층을 Siamese LSTM 또는 공유 LSTM이라고 한다.

케라스 콜백과 텐서보드를 사용한 딥러닝 모델 검사와 모니터링

모델을 훈련할 때 낭비를 줄일 수 있는 여러 기법들 중 콜백(callback) 먼저 알아보겠다.

콜백은 모델의 상태와 성능에 대한 모든 정보에 접근하고 훈련 중지, 모델 저장, 가중치 적재 또는 모델 상태 변경 등을 처리할 수 있다.

본인이 첫 공모전하면서 제일 놀랐던 기능인 scheduler도 여기에 포함된다.

  • 모델 체크포인트 저장 : 훈련하는 동안 어떤 지점에서 모델의 현재 가중치를 저장한다.
  • 조기 종료(early stopping) : 검증 손실이 더 이상 향상되지 않을 때 훈련을 중지한다.
  • 훈련하는 동안 하이퍼파라미터 값을 동적으로 조정 : 옵티마이저의 학습률 같은 경우다.
  • 훈련과 검증 지표를 로그에 기록하거나 모델이 학습한 표현이 업데이트될 때 시각화

책에서는 여러 콜백 라이브러리 중 ModelCheckpoint, EarlyStopping, ReduceLROnPlateau를 예시로 설명해준다. (p.330)

그리고 또 하나의 강력한 시각화 도구인 텐서보드를 소개해준다. (p.334)

모델의 성능을 최대로 끌어올리기

앞서 말했던 잔차 연결 말고도 중요한 디자인 패턴인 배치 정규화(batch normalization)와 깊이별 분리 합성곱(depthwise separable convolution)이 있다.

배치 정규화 : 입력값들을 균등하게 만드는 광범위한 방법이다. 평균과 분산이 모델에서 어떻게 변하는지, 언제 사용해야되는지에 대해 설명한다. (p.342)

깊이별 분리 합성곱 : Conv2D를 대체하면서(훈련 파라미터가 적고), 더 빨라(부동 소수 연산이 더 적고) 모델의 성능을 몇 퍼센트 높일 수 있는 층.

이 층은 입력 채널별로 따로따로 공간 방향의 합성곱을 수행하고 점별 합성곱을 통해 출력 채널을 합친다. (이래서 separable이 붙었나보다.)

입력에서 공간산 위치는 상관관계가 크지만 채널별로 매우 독립적이라고 가정했을 때 타당하다고 한다.

이 방법은 모델 파라미터와 연산의 수를 크게 줄여 주기 때문에 작고 더 빠른 모델을 만든다.

깊이별 분리 합성곱 예시 (p.344)

하이퍼파라미터 최적화 : 모델의 매개변수와 별개로 사람이 직접 설정해야하는 파라미터들을 구분하여 하이퍼파라미터라고 한다.

과제마다 특성이 너무 때문에 아직 한창 연구되고 있고, 어려운 과제라고 소개하면서 여러 최신의 알고리즘들을 알려준다. (p.346) (ex. 베이지안 최적화, 유전 알고리즘, 간단한 랜덤 탐색 등)

모델 앙상블 : 여러 개 다른 모델의 예측을 합쳐 더 좋은 예측을 만든다. 물론 이에 관해서도 여러 구조들과 방법론, 알고리즘들이 많이 존재한다. (p.348)

요약

이 절을 공모전 전에 읽었더라면...ㅠ

profile
Learning bunch, mostly computer and language

0개의 댓글