딥러닝 (Deep Learning)/딥러닝 기초

신경망의 구조 : layer, data, loss function, optimizer

DS지니 2021. 4. 26. 11:52
728x90
반응형

[케라스 창시자에게 배우는 딥러닝] 참고

 

신경망의 구조 

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

 

1. 층(layer) 

 

층은 신경망의 핵심적인 데이터 구조이며, 하나 이상의 텐서를 입력으로 받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈이다. 어떤 종류의 층은 가중치가 없지만(Flatten, Dropout, Pooling 등), 대부분의 경우 가중치를 갖는다.

가중치는 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서이며 여기에 네트워크가 학습한 지식이 담겨 있다.

 

층마다 적절한 텐서 포맷과 데이터 처리 방식이 다르다.

 

예를 들어 (samples, features) 크기의 2D 텐서가 저장된 간단한 벡터 데이터는 완전 연결 층(fully connected layer)이나 밀집 층(dense layer)이라고도 불리는 밀집 연결 층(densely connected layer)에 의해 처리되는 경우가 많다. (케라스는 Dense 클래스이다.)

 

(samples, timesteps, features) 크기의 3D 텐서로 저장된 시퀀스 데이터는 보통 LSTM 같은 순환 층(recurrent layer)에 의해 처리된다.

 

4D 텐서로 저장되어 있는 이미지 데이터는 일반적으로 2D 합성곱 층(convolution layer)에 의해 처리된다. (Conv2D클래스)

 

층을 딥러닝의 레고 블록처럼 생각할 수 있다. 이런 비유는 케라스 같은 프레임워크 때문에 생겼는데, 케라스에서는 호환 가능한 층들을 엮어 데이터 변환 파이프라인(pipeline)을 구성함으로써 딥러닝을 만든다. 여기에서 층 호환성(layer compatibility)은 각 층이 특정 크기의 입력 텐서만 받고 특정 크기의 출력 텐서를 반환한다는 사실을 말한다.

 

from keras import layers

layer = layers.Dense(32, input_shape=(784,))  #32개 유닛으로 된 밀집층

 

첫 번째 차원이 784인 2D 텐서만 입력으로 받는 층을 만들었다. (배치 차원인 0번째 축은 지정하지 않기 때문에 어떤 배치 크기도 입력으로 받을 수 있다.) 이 층은 첫 번째 차원 크기가 32로 변환된 텐서를 출력한다.

따라서 이 층에는 32차원의 벡터를 입력으로 받는 하위 층이 연결되어야 한다. 케라스에서는 모델에 추가된 층을 자동으로 상위 층의 크기에 맞추어 주기 때문에 호환성을 걱정하지 않아도 된다.

 

from keras import models
form keras import layers

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

 

두 번째 층에는 input_shape 매개변수를 지정하지 않았다. 그 대신 이전 층의 출력 크기를 입력 크기로 자동으로 채택한다.

 

 

2. 모델 : 층의 네트워크

 

딥러닝 모델은 층으로 만든 비순환 유향 그래프(Directed Acyclic Graph, DAG)이다.

* 그래프 이론에서 비순환 유향 그래프는 에지(edge)에 방향이 있고 한 노드(node)에서 다시 자기 자신으로 돌아올 경로가 없는 그래프를 말한다.

 

네트워크 구조는 아주 아주 다양한데, 다음은 자주 등장하는 네트워크 구조들이다.

  • 가지(branch)가 2개인 네트워크
  • 출력이 여러 개인 네트워크
  • 인셉션(Inception) 블록

네트워크 구조는 가설 공간(hypothesis space)을 정의한다.

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

 

딱 맞는 네트워크 구조를 찾아내는 것은 과학보다는 예술에 가깝다. 신뢰할 만한 모범적인 사례와 원칙이 있지만 연습을 해야만 적절한 신경망을 설계할 수 있는 기술을 갖추게 된다.  

신경망을 만드는 원리는 배우고 특정 문제에 적용 가능한 것과 그렇지 않은 것에 대한 직관을 길러보자.

 

 

3. 손실 함수와 옵티마이저 

 

이 둘은 학습 과정을 조절하는 열쇠와도 같다. 네트워크 구조를 정의하고 나면 이들을 더 선택해야 한다.

 

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

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

 

여러 개의 출력을 내는 신경망은 여러 개의 손실 함수를 가질 수 있다. (출력당 하나씩)

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

 

문제에 맞는 올바른 목적 함수를 선택하는 것은 아주 중요하다. 네트워크가 손실을 최소화하기 위해 편법(빠르고 효율적인 방향)을 사용할 수 있기 때문이다. 목적 함수가 주어진 문제의 성공과 전혀 관련이 없다면 원하지 않는 일을 수행하는 모델이 만들어 질 것이다.

"모든 인류의 평균 행복 지수를 최대화하기" 같은 잘못된 목적 함수에서 SGD로 훈련된 멍청하지만 전지전능한 AI가 있다고 가정해보자. 이 문제를 쉽게 해결하려고 이 AI가 몇 사람을 남기고 모든 인류를 죽여서 남은 사람들의 행복에 초점을 맞출지도 모른다. 왜냐하면 평균적인 행복은 얼마나 많은 사람이 남겨져 있는지와 상관없기 때문이다. 이는 의도한 바가 아닐 것이다. 우리가 만든 모든 신경망은 단지 손실 함수를 최소화하기만 한다는 것을 기억하자! 목적 함수를 현명하게 선택하지 않으면 원치 않는 부수 효과가 발생할 것이다.

 

다행히 분류, 회귀, 시퀀스 예측 같은 리반적인 문제에서는 올바른 손실 함수를 선택하는 간단한 지침이 있다. 

 

문제 종류 손실함수(Loss funciton) 종류
2개의 클래스의 분류문제 이진 크로스엔트로피(binary crossentropy)
(= Logistic loss, Log loss)
3개 이상 클래스의 분류문제 범주형 크로스엔트로피(categorical crossentropy)
회귀 문제 평균 제곱 오차 (MAE, MSE 등)
시퀀스 학습 문제
(음성 인식이나 필기 인식처럼 입력에 레이블 할당 위치를 정하기 어려운 연속적인 시퀀스를 다루는 문제)
CTC(Connection Temporal Classification) 

 

 

728x90
반응형