[개인공부] 딥러닝 구조와 구성요소

Jajuna_99·2022년 10월 16일
0

딥러닝 구조와 구성요소

딥러닝을 크게 나눠서 보면

  • 모델에 입력되는 데이터와 그에 상응하는 라벨
  • 모델을 이루는
  • 학습의 오차 정도를 확인하는 손실 함수
  • 학습의 방식(기울기)를 정하는 옵티마이저가 있다.

옵티마이저는 예측과 학습 부분에서 다룰 예정이다.

층 (layer)

은 하나 이상의 텐서를 입력으로 받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈이다.

텐서 : 데이터를 담는 컨테이너이다. 여러 차원(1D, 2D...)으로 구분될 수 있다.

여러개의 텐서(혹은 뉴런(neuron), 노드(node)라고도 한다.)들이 모여 층을 이룬다.

층을 지나면서 데이터에 함수(가중치)가 적용되고, 값이 예측된다.

층은 입력층, 은닉층, 출력층으로 구분할 수 있다.

  • 입력층(input layer) : 데이터를 받아들이는 층, 은닉층으로 데이터를 전달한다.

  • 은닉층(hidden layer) : (이전 층의 있는 모든 혹은 다수의 노드로부터)입력 값을 받아 가중합을 계산, 활성화 함수에 적용하여 다음 층으로 전달한다.

  • 출력층(output layer) : 신경망의 최종 결과값을 가진다. (보통 확률로 나타내기 위해 0~1 사이에 값으로 반환하는 함수들을 많이 사용한다.)

가중치 (weights)

커널(kernel) 이라고도 불린다.

입력 값이 연산 결과에 미치는 영향력을 조절하는 요소이다. 훈련 데이터를 신경망에 노출시켜서 학습된 정보가 담겨 있다. (다른 모델의 가중치를 가져온다는 말도 이런 뜻이다.)

다시 말해, 입력 데이터를 다르게 하기 위해 입력 값에 곱해지는 웨이트가 가중치이다.

입력값과 같은 차원수를 갖게 된다. (입력값과 텐서 곱셈 연산을 수행해야 되니)

상황에 따라 임의로 정할 수도 있고, 난수로 정할 수도 있다. (어차피 학습이 될테니)

그 외에도 여러 가중치 초깃값들이 있다. ex) Xavier 초깃값, He 초깃값

가중치와 노드의 곱을 합한 것을 가중합(weight sum) 혹은 전달 함수(transfer function)이라고 한다.

가중합 (Weight sum, transfer function)

각 노드에서 들어오는 신호에 가중치를 곱해서 다음 노드로 전달되는데, 이 값들을 모두 더한 합계를 가중합이라고 한다. 노드의 가중합이 계산되면 이 가중합을 활성화 함수로 보내기 때문에 Transfer function이라고도 한다.

편향 (bias)

가중합에 더해지는 상수이다. 활성화 함수의 기준을 조절하는 역할을 한다.

#3층 단위의 신경망, 가중치와 편향 초깃값 포함
def init_network():
    network = {}
    network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    network['b1'] = np.array([0.1, 0.2, 0.3])
    network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])

    return network
    
 

활성화 함수 (activation function)

비선형성(non-linearity)이라고도 불리는 이 함수가 없다면 각 층은 선형적인 연산인 점곱덧셈 2개로 밖에 구성이 안된다.

그러므로 이 층은 입력에 대한 선형 변환(아핀 변환)만을 학습할 수 있다.

예를 들어 어떤 층의 가설 공간(hypothesis space)은 n개의 차원이 있다고 하면, 이는 n개 차원 공간으로 바꾸는 가능한 모든 선형 변환의 집합니다.

그러나 이 층에 차원을 아무리 많이 추가해도(깊게 만들어도) 의미가 없다. 선형 연산만 할 수 있으니, 그래서 층의 가설 공간을 풍부하게 만들어 층을 깊게 만드는 것에 장점을 살리는 비선형성 또는 활성화 함수를 쓴다.

네트워크의 구조는 가설 공간 정의한다. 네트워크 구조를 선택함으로써 가능성 있는 공간(가설 공간)을 입력 데이터에서 출력 데이터로 매핑하는 일련의 특정 텐서 연산으로 제한하게 된다.

  • 항등 함수(identity function) : 입력 그대로 출력한다.
    • f(x)=xf(x) = x
#항등함수
def identity_function(x):
    return x
  • 시그모이드(sigmoid function) : 선형 함수의 결과를 0~1 사이에 비선형 형태로 변형해준다.
    로지스틱 회귀 같은 분류 문제에서 확률로 표현할 때 사용된다. 기울기 소멸 문제 때문에 딥러닝에서는 자주 사용하진 않는다.
    • f(x)=f(x) = 11+ex1 \over 1 + e^{-x}
#시그모이드 함수
  def sigmoid(x):
    return 1 / (1 + np.exp(-x))
  • 하이퍼볼릭 탄젠트(hyperbolic tangent) : 선형 함수의 결과를 -1~1 사이에 비선형 형태로 변형해 준다.
    시그모이드에서 결과값의 평균이 0이 아닌 양수로 편향된 문제를 해결했다.
    기울기 소멸 문제는 여전히 존재
    • tanh(x)\tanh(x)
#항등함수
def identity_function(x):
    return x
  • 렐루(ReLU) : 입력이 음수일 때는 0을 출력 양수일 때는 xx를 출력한다.
    기울기 소멸 문제가 발생하지 않고 경사 하강법에 영향을 주지 않아 학습 속도가 빠르다.
    음수 값을 받으면 0을 출력해서 학습 능력이 감소하는 문제가 있다.
    • max(0,x)\max(0,x)
#렐루함수
def relu(x):
    return np.maximum(0, x)
  • 리키 렐루(Leeky ReLU) : 입력 값이 음수이면 매우 작은 수를 반환, 양수일 때는 xx를 출력한다.
    • max(0.1x,x)\max(0.1x, x) 상수 0.1은 예시이다.
#리키 렐루함수
def leekyrelu(x):
    return np.maximum(0.1 * x, x)
  • 소프트맥스(softmax) : 입력 값을 0~1 사이에 출력되록 정규화하여 출력 값들이 총합이 항상 1이 되도락 하는 함수.
    통상 딥러닝에서 출력 노드의 활성화 함수로 많이 사용된다.
    • yk=y_k = exp(ak)i=1nexp(ai)\exp(ak) \over \sum^n_{i=1}\exp(a_i), exp\exp는 지수함수를 의미
    • 함수의 분자는 입력 신호 aka_k의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다.
'''
소프트맥스 함수
yk = exp(ak) / sigma(i=1 to n)(exp(ai))
'''

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)  # 오버플로 대책
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

이 외에도 여러 활성화 함수들이 존재한다.

손실 함수 (loss function)

예측값과 실제값의 오차를 계산하는 함수, 훈련하는 동안 최소화될 값이다. 주어진 문제에 대한 성공 지표가 된다.

  • 평균 제곱 오차(mean squared error, MSE) : 실제 값과 예측 값의 차이를 제곱하여 평균을 낸 값.
    실제 값과 예측 값의 차이가 클수록 MSE도 커진다.
    반대로 MSE가 적을수록 예측력이 좋다는 말이 된다.
    회귀에서 손실 함수로 주로 사용된다.

    • MSE=MSE = 1n1\over ni=1n(yiy^i)2\displaystyle\sum^n_{i=1}(y_i - ŷ_i)^2
      • y^ŷ : 신경망의 출력(추정된 값)
      • yiy_i : 정답 레이블
      • ii : 데이터의 차원 개수
#MSE
def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)
  • 크로스 엔트로피 오차 : 분류 문제에서 자주 사용되는 오차 계산법
    일반적으로 분류 문제에서 시그모이드 함수를 사용해서 0과 1로 구분한다.
    시그모이드 함수는 자연 상수 ee 때문에 그래프가 울퉁불퉁 해진다. -> 지역 최소점에서 학습이 멈출 수 있다.
    이것을 방지하고자 자연 상수 ee에 반대되는 자연 로그를 모델의 출력 값에 취한다.
    • CEE=i=1nyilogy^iCEE = -\displaystyle\sum^n_{i=1}y_i\logŷ_i
      • y^ŷ : 신경망의 출력(추정된 값)
      • yiy_i : 정답 레이블
      • ii : 데이터의 차원 개수
#CEE
def cross_entropy_error(y, t):
    delta = 1e-7  # 0일때 -무한대가 되지 않기 위해 작은 값을 더함
    return -np.sum(t * np.log(y + delta))

이 외에도 여러 손실 함수들이 존재한다.

요약

딥러닝의 입력 데이터들은 여러 층을 지나면서, 가중치와 편향, 여러 활성화 함수에 적용되고, 마지막에는 손실함수로 정답 값과 얼마나 비슷한지 예측되고 수정되서 정답과 가까워지는 구조이다.

ref

  • 밑바닥부터 시작하는 딥러닝
  • 케라스 창시자에게 배우는 케라스
  • 딥러닝 텐서플로 교과서
profile
Learning bunch, mostly computer and language

0개의 댓글