[개인공부] 딥러닝 추론과 학습 과정

Jajuna_99·2022년 10월 16일
0

순전파법

네트워크에 훈련 데이터가 들어올 때 발생한다.

입력층 -> 은닉층 -> 출력층 순으로 데이터가 전체 신경망을 흐른다.

(보통의 경우에)모든 뉴런이 이전 층의 뉴런에서 수신한 정보에 변환(가중합 및 활성화 함수)을 여러 텐서 연산을 적용하여 다음 층(은닉층)의 뉴런으로 전송하는 방식이다.

#순전파 예시
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
    
    
def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = identity_function(a3)

    return 
    
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)  

사실 가중치와 편향을 임의(random)값으로 설정하고 데이터를 흘려 보내기만 하면 아무 의미 없는 값이 되지만, 딥러닝의 진짜 힘은 역전파에서 온다.

오차역전파법(error backpropagation)

역전파법 혹은 역전파로도 불린다. 쉽게 말하면 순전파에서 예측된 값을 실제 값 차이를 손실 함수로 추정한다.

이 손실 함수 값을 이용해서 매개변수를 순전파를 2번씩 수행하면서 조금씩 업데이트 할 수 있겠지만 조금 더 수학적인 방법이 있다.

신경망에 사용된 모든 연산이 미분 가능(differentiable)한 점을 이용하면 된다. 즉, 손실 연산의 미분 결과, 그래디언트(gradient, 기울기)를 계산하면 훨씬 효율적이다.

함수의 변화율(derivative)를 조금씩 움직여서 파라미터 공간의 최소점을 찾는 것이다. 이를 경사하강법(gradient descent)라고 한다.

경사 하강법의 종류로는 확률적 경사 하강법(stochastic gradient descent, SGD), 배치 확률적 경사 하강법, 미니 배치 확률적 경사 하강법이 있다.

위에 말한 변화율만큼 (그래디언트의 반대 방향으로) 조금 이동하는 기법이 미니 배치 확률적 경사 하강법이다.

여기서 확률적은 각 배치 데이터가 무작위로 선택된다는 의미이다.

미니 배치의 변종으로 반복마다 하나의 샘플과 하나의 타깃을 뽑는 것이 SGD이고, 반대되는 예로 가용한 모든 데이터를 사용하여 반복하는 것이 배치 SGD이다.

미분으로 변화율을 계산할 수 있는 것 까지 보았고 역전파 알고리즘을 볼 차례다. (후진 모드 자동 미분(reverser-mode automatic differentiation 라고도 한다.)

역전파는 연쇄 법칙을 적용한 알고리즘이고, 최종 손실 값에서부터 손실 값에 각 파라미터가 기여한 정도를 계산해서 연쇄 법칙을 적용하여 최상위 층에서 하위층(출력층 -> 은닉층 -> 입력층)까지 거꾸로 진행된다.

연쇄 법칙(chain rule)은 다음 항등식을 이용한 성질이다.

  • f(g(x))=f(g(x))g(x)f(g(x))\prime = f\prime(g(x)) * g\prime(x)

밑의 네트워크 ff를 보면 어떻게 적용해야 할지 감이 올 것이다.

  • f(W1,W2,W3)=a(W1,b(W2,c(W3)))f(W1, W2, W3) = a(W1, b(W2, c(W3)))
    텐서 연산 a,b,ca, b, c 와 가중치 행렬 W1,W2,W3W1, W2, W3 로 구성된 네트워크 ff이다.
def numerical_gradient(f, x):
    h = 1e-4
    grad = np.zeros_like(x)  # x와 형상이 같은 배열을 생성

    for idx in range(x.size):
        tmp_val = x[idx]
        # f(x+h) 계산
        x[idx] = tmp_val + h
        fxh1 = f(x)

        # f(x-h) 계산
        x[idx] = tmp_val - h
        fxh2 = f(x)

        grad[idx] = (fxh1 - fxh2) / (2 * h)
        x[idx] = tmp_val  # 값 복원

    return grad

딥러닝의 문제점과 해결 방안

과적합 (over-fitting)

여러 은닉층을 결합하여 비선형 영역을 표현하는 것이 딥러닝의 핵심임을 알아봤다.

하지만 지나치게 학습된 모델은 예측 값과 실제 값의(train set, test set) 오차가 출지만 검증 데이터에(validation set) 대해서는 오류가 증가하는 것을 말한다.

  • 드롭아웃 (dropout)
    일부 노드를 학습에서 제외 하는 기법으로, 과적합 발생시 유용하다.

기울기 소멸 문제 (gradient vanishing problem)
은닉층으로 전달되는 오차가 크게 줄어들어 학습이 되지 않는 현상을 기울기 소멸 문제라고 한다. 은닉층이 많은 신경망에서 주로 발생한다.

  • 활성화 함수 (learning rate) 바꾸기를 사용하여 보완 할 수 있다.
    ex) sigmoid or tanh => ReLU

성능이 나빠지는 문제
경사 하강법으로 기울기가 낮은 쪽으로 이동시키는 과정을 반복할 때 성능이 나빠지는 문제가 발생한다.

이러한 문제점을 개선하고 여러 경사 하강법을 사용한다.

  • 경사하강법의 종류
    • 배치 경사 하강법(BGD) : 전체 데이터셋에 대한 오류를 구한 후 기울기를 한 번만 계산하여 모델의 파라미터를 업데이트하는 방법.
      즉, 전체 훈련 데이터셋에 대해 가중치를 편미분하는 방법.
    • 확률적 경사 하강법(SGD) : 임의로 선택한 데이터에 대해 기울기를 계싼하는 방법.
      적은 데이터를 사용하므로 빠른 계산이 가능하다.
    • 미니 배치 경사 하강법(mini-batch gradient descent) : 전체 데이터셋을 여러 개의 배치로 나누고, 나눠진 배치 한개마다 기울기를 구한 후 그것의 편균 기울기를 이용하여 모델을 업데이트 하는 방법

옵티마이저

옵티마이저 또는 최적화 방법 또한 SGD의 변종으로 불안정한 파라미터 변경 폭을 해결하기 위해 학습 속도와 운동량을 조정하는 역할을 한다.

현재 그래디언트 값만 고려하는 것이 아니라 여러 다른 방식(이전 값, 다른 이론 등)으로 고려하는 것에서 여러 옵티마이저가 파생된다.

이들 방법을 통해 지역 최솟값에 가중치가 머물지 않게 하면서, 더 효율적으로 업데이트 시킬 수 있다.

옵티마이저 종류

  • 아다그라드(Adagrad, Adaptive gradient) : 가중치 업데이트 횟수에 따라 학습률을 조정

  • 아다델타(Adadelta, Adaptive delta) : 아다그라드에서 커짐에 따라 학습이 멈추는 문제를 해결하기 위한 해결법

  • 알엠에스스프롭(RMSProp) : 아다그라드의 값이 무한히 커지는 것을 방지하고자 제안된 방법

  • 모멘텀(Momentum) : 경사 하강법과 마찬가지로 매번 기울기를 구하지만, 가중치를 수정하기 전에 이전 수정 방향을 참조하여 같은 방향으로 일정한 비율만 수정하는 방법.

  • 네스테로프 모멘텀(Nesterov Accelerated Gradient, NAG) : 모멘텀 값과 기울기 값이 더해져 실제 값을 만드는 기존 모멘텀과 달리 모멘텀 값이 적용된 지점에서 기울기 값을 계산한다.

  • 아담(Adam, Adaptive Moment Estimation) : 모멘텀과 알엠에스프롭의 장점을 결합한 경사하강법

주어진 데이터셋과 모델의 따라 최적의 옵티마이저는 달라진다.

ref

profile
Learning bunch, mostly computer and language

0개의 댓글