신경망 훈련에는 다음과 같은 요소들이 필요합니다.
이들이 어떻게 상호작용 하는지 아래 이미지에서 확인할 수 있습니다.
층
은 하나 이상의 tensor를 입력으로 받아 하나 이상의 tensor를 출력하는 데이터 처리 모듈을 말한다.
대부분의 층은 가중치
라는 층의 상태를 가진다. 여기서 가중치
란 확률적 경사 하강법에 의해 학습되는
하나 이상의 tensor이며, 이 곳에 학습한 지식이 담긴다.
층 마다 적절한 텐서 포맷과 데이터 처리 방식이 다르다!
완전 연결 층
(fully connected layer) 또는 밀집 층
(dense layer)로 불리는 밀집 연결층
(densely connected layer)순환 층
(recurrent layer)2D 합성곱 층
(convolution layer)여기서 케라스는 프레임워크로, 이로 인해 층을 딥러닝의 레고 블록처럼 생각할 수 있다.
케라스에서는 호환 가능한 층들을 엮어 데이터 변환 파이프라인(pipeline)을 구성함으로써, 딥러닝 모델을 만든다.
여기서 층 호환성
(layer compatibility)이란 각 층이 특정 크기의 입력 텐서만 받고 특정 크기의 출력 텐서를 반환한다는 사실을 말합니다.
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32. input_shape=(784,))) #첫번째 차원
model.add(layer.Dense(10)) #두번째 층
첫번째 차원이 784인 2D 텐서만 입력받는 층을 만든다.(배치 차원이 0번째인 축은 지정하지 않기 때문에, 어떤 배치 크기도 입력으로 받을 수 있다.) 이 후 32로 변환된 텐서를 출력한다.
이 입력층은 32차원의 벡터를 입력으로 받는 하위 층이 연결되어야한다.
여기서 케라스는 모델에 추가된 층을 자동으로 상위 층의 크기에 맞춰주기에 호환성 걱정 ❌❌ !!
두번째 층에서는 input_shape매개변수를 지정하지 않고, 앞선 출력 크기를 입력 크기로 자동으로 채택한다.
딥러닝 모델은 층으로 만든 비순환 유향 프래프
(Directed Acyclic Graph, DAG)이다. 하나의 입력을 하나의 출력으로 mapping하는 층을 순서대로 쌓는 것 하지만 이후 다양한 네트워크 구조를 볼 수 있다.
네트워크는 가설 공간
(hypothesis space)을 정의한다. 네트워크 구조를 선택함으로써 가능성 있는 공간을 입력 데이터에서 출력 데이터로 매핑하는 일련의 특정 텐서 연산으로 제한한다. 여기서 찾아야 할 것은 텐서 연산에 포함된 가중치 텐서의 좋은 값이 된다.
네트워크 구조를 정의한 후, 두가지를 더 선택해야하는데,
손실함수
(loss function) 또는 목적 함수
(objective function) : 훈련하는 동안 최소화될 값, 문제에 대한 성공 지표옵티마이저
(optimizer) : 손실 함수를 기반으로 네트워크가 어떻게 업데이트될지 결정, 특정 종류의 확률적 경가 하강법(SGD) 구현여러 개의 출력을 내는 신경망은 여러 개의 손실 함수를 가질 수 있다.(출력당 하나씩) 하지만 경사 하강법 과정은 하나의 스칼라 손실값을 기준으로 한다. 따라서 손실이 여러 개인 네트워크에서는 모든 손실이 ( 평군을 내서 ) 하나의 스칼라 양으로 합쳐진다.
문제에 맞는 올바른 목적 함수
를 선택하는 것은 아주 중요
예를 들어 "모든 인류의 평균 행복 지수를 최대화하기" 잘못된 목적 함수로 훈련된 AI가 있다고 가정
문제를 해결하기 위해 행복 지수가 낮은 모든 사람을 죽여서 행복 지수를 최대화할 수 있습니다. 이는 의도한 바가 아닙니다.
이렇듯 우리가 만든 모든 신경망은 단지 손실 함수를 최소화하기만 한다는 것을 기억해야한다. 목적 함수를 현명하게 선택하지 않으면 원하지 않는 부수 효과가 발생할 것이다.
회귀와 시퀀스 예측 같은 일반적인 문제에서는 올바른 손실 함수를 선택하는 간단한 지침이 있습니다.
케라스의 특징
케라스는 딥러닝 모델을 만들기 위한 고수준의 구성 요소를 제공하는 모델 수준의 라이브러리입니다. 텐서 조작이나 미분 같은 저수준의 연산을 다루지 않습니다. 대신 케라스의 백엔드 엔진에서 제공하는 최적화되고 특화된 텐서 라이브러리를 사용합니다. 즉 여러 딥러닝용 라이브러리를 조합하여 사용하는 것입니다.
CNTK
씨아노(theano)
케라스에는 다음 백엔드 엔진을 필요에 따라서 선택하여 사용할 수 있습니다. 다음 벡엔드를 사용하기에 CPU와 GPU에서 모두 사용할 수 있습니다. CPU에서는 저수준 텐서 연산 라이브러리인 Eigen을, GPU에서는 NVIDIA CUDA 심층 신경망 라이브러리를 사용하여 최적화된 딥러닝 연산 라이브러리를 이용합니다.
전형적인 케라스 작업 흐름은 다음과 같은 흐름을 지닙니다.
모델을 정의하는 방법 2가지
Sequential 클래스
: 층을 순서대로 쌓아 올린 네트워크
함수형 API
: 임의의 구조를 만들 수 있는 비순환 유향 그래프
# Sequential 사용
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32,activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))
# 함수형 API
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10,activation='softmax')(x)
함수형 API를 사용하면 모델이 처리할 데이터 텐서를 만들고 마치 함수처럼 이 텐서에 층을 적용
모델 구조가 정의된 후에는 Sequential 모델을 사용했는지 함수형 API를 사용했는지는 상관없습니다.
모델이 정의된 후에는 동일한 단계를 거치게 됩니다. 컴파일 단계에서는 학습 과정이 설정됩니다. 여기서는 옵티마이저, 손실함수, 모니터링에 필요한 측정 지표를 지정합니다. 그리고 마지막에 fit() 메서드에 전달함으로 학습 과정이 이루어집니다.
from keras import optimizers
model.compile(optimizer=optimizers.RMSprop(lr=0.001),
loss='mse',
metrics=[accuracy])
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)
최신 NVIDIA GPU
에서 딥러닝 코드를 실행하는 것을 권장합니다. 특히 합성곱 신경망을 사용한 이미지 처리나 순환 신경망을 사용한 시퀀스 처리 같은 일부 애플리케이션을 CPU에서 실행하면 멀티코어 CPU라도 매우 오래 걸립니다.
특징
특징