1. 퍼셉트론과 신경망

퍼셉트론은 복잡한 함수를 표현할 수 있고 컴퓨터가 수행하는 복잡한 처리 또한 표현할 수 있다. 하지만 가중치 설정을 사람이 수동으로 해야 한다는 번거로움이 있다. 하지만 신경망은 가중치 매개 변수의 적절한 값을 데이터로부터 자동으로 학습하는 성질이 있다.

신경망은 입력층(Input Layer), 은닉층(Hidden Layer), 출력층(Output Layer)로 구성된다.

2. 신경망의 구조

신경망 훈련에는 다음과 같은 요소들이 관련되어 있다.

  • 네트워크(또는 모델)를 구성하는 층
  • 입력 데이터와 그에 상응하는 타깃
  • 학습에 사용할 피드백 신호를 정의하는 손실 함수
  • 학습 진행 방식을 결정하는 옵티마이저

이들의 관계를 다음과 같은 그림으로 나타낼 수 있다.

3. Layer

신경망의 핵심적인 데이터 구조는 이다. 층은 하나 이상의 텐서를 입력받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈이다. 대부분의 층은 가중치라는 상태를 가진다. 가중치는 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서이며 이 가중치에 네트워크가 학습한 지식이 담겨있다.

층마다 적절한 텐서 포맷과 데이터 처리 방식이 다르다. 따라서 텐서의 차원에 맞는 층으로 데이터를 처리해야한다.

예를 살펴 보자. 첫 번째 차원이 784인 2D 텐서를 입력받으며 32개의 유닛으로 된 밀집 층을 선언을 다음과 같이 할 수 있다.

from keras.layers import Dense
layer = Dense(32, input_shape=(784,))

이 층은 첫 번째 차원의 크기가 32로 변환된 텐서를 출력한다. 따라서 하위 층은 32차원의 벡터를 입력으로 받아야 한다. Keras는 모델에 추가된 층을 자동으로 상위 층의 크기에 맞추어 주기 때문에 input shape를 일일이 선언할 필요가 없다. 따라서 32차원의 벡터를 입력으로 받아 10개의 유닛으로 된 밀집 층을 선언한다면 다음과 같이 작성할 수 있다.

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(32, input_shape=(784,))
model.add(Dense(10))

4. model

딥러닝 모델은 층으로 만든 비순환 유향 그래프이다. 비순환 유향 그래프란 그래프의 edge에 방향이 있고 한 node에서 다시 자기 자신으로 돌아올 경로가 없는 그래프를 뜻한다. 가장 일반적인 예는 하나의 입력을 하나의 출력으로 매핑하는 층을 순서대로 쌓는 것이다.

딥러닝을 공부하다 보면 가지가 2개인 네트워크, 출력이 여러 개인 네트워크, 인셉션 블록 등 다양한 네트워크 구조를 보게 될 것이다.

네트워크 구조는 가설 공간을 정의한다. 네트워크 구조를 선택함으로써 가능성 있는 공간(가설 공간)을 입력 데이터에서 출력 데이터로 매핑하는 일련의 특정 텐서 연산으로 제한하게 된다. 우리가 찾아야 할 것은 이런 텐서 연산에 포함된 가중치 텐서의 좋은 값이다.

5. loss function, optimizer

네트워크 구조를 정의하고 나면 두 가지 선택을 해야 한다.

  • 손실 함수(loss function, objective function): 훈련하는 동안 최소화될 값이다. 주어진 문제에 대한 성공 지표가 된다.

  • 옵티마이저(optimizer): 손실 함수를 기반으로 네트워크가 어떻게 업데이트될 지 결정한다. 특정 종류의 확률적 경사 하강법(SGD)를 구현한다.

여러 개의 출력을 내는 신경망은 여러 개의 손실 함수를 가질 수 있다. 하지만 경사 하강법 과정은 하나의 스칼라 손실 값을 기준으로 한다. 따라서 손실이 여러 개인 네트워크에서는 모든 손실의 평균이 하나의 스칼라 양으로 합쳐진다.

문제에 맞는 손실 함수를 선택하는 것은 아주 중요하다. 네트워크가 손실을 최소화하기 위해 편법을 사용할 수 있기 때문이다. 손실 함수를 현명하게 선택하지 않으면 원하지 않는 부수 효과가 발생할 것이다.

분류, 회귀, 시퀀스 예측과 같은 일반적인 문제에서는 올바른 손실 함수를 선택하는 간단한 지침이 있다. 예를 들어 이진 분류 문제는 binary crossentropy, 다중 분류 문제는 categorical crossentropy, 회귀 문제에서는 mean squared error, 시퀀스 학습 문제에는 CTC(Connection Temporal Classification) 등을 사용한다. 완전히 새로운 연구를 할 때만 독자적인 목적 함수를 만들게 된다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN