본문 바로가기

Data Science/Deep Learning

[밑바닥부터 시작하는 딥러닝 1] Ch 5. 오차역전파법

여태까지 우리는 단순하고 구현하기도 쉬운 "수치 미분"을 통해 가중치 매개변수에 대한 손실 함수의 기울기를 구했다.

 

그러나 "수치 미분"계산 시간이 오래 걸린다는 단점이 있으므로, 일반적으로는 "오차역전파법"을 사용한다.

 

그렇다면 수치 미분은 아무런 쓸모가 없는 것일까?

 

그렇지 않다. 수치 미분오차역전파법을 정확히 구현했는지 확인하기 위해 필요하다. (기울기 확인 = Gradient Check)

(즉, 수치 미분의 결과와 오차역전파법의 결과를 비교하여 오차역전파법을 제대로 구현했는지 검증하는 용도로 사용)

 

이와 같은 작업이 필요한 이유는 "수치 미분"은 구현이 단순하고 쉬운 반면, "오차역전파법"은 구현하기 복잡해서 종종 실수를 할 수 있기 때문이다.

 

일반적으로 두 방법에 대한 결과의 오차가 0에 아주 가까운 값이면, 오차역전파법이 제대로 구현되었다고 판단할 수 있다.

 

 

 

자, 그럼 이제 가중치 매개변수에 대한 손실 함수의 기울기를 효율적으로 계산하는 "오차역전파법"에 대해 설명해보도록 하겠다.

 

본격적인 설명에 앞서 "순전파""역전파"에 대해 간략히 정의하면 다음과 같다.

 

  • 순전파
    • 계산을 왼쪽에서 오른쪽으로 진행
    • 즉, 계산 그래프의 출발점부터 종착점으로의 전파함
  • 역전파
    • 계산을 오른쪽에서 왼쪽으로 진행 (순전파의 반대 방향)
    • 오차역전파법이란 신경망의 구성 요소를 계층으로 구현하여 기울기를 효율적으로 계산하는 것을 의미함
    • 즉, 미분을 계산할 때 중요한 역할을 수행함

오차역전파법을 이해하는 방법으로는 크게 수식을 통한 것과 계산 그래프를 통한 것이 있다.

 

여기서 계산 그래프란 계산 과정을 그래프로 나타낸 것으로, 아래의 예시와 같이 복수의 노드(node)에지(edge)로 표현된다. 그리고 아래와 같이 계산 과정을 시각적으로 파악할 수 있는 장점이 있다.

 

계산 그래프 예시

 

또한 계산 그래프는 국소적 계산에 집중한다. 여기서 국소적 계산이란 전체에서 어떤 일이 벌어지든 상관없이 자신과 관계된 정보만으로 결과를 출력할 수 있다는 것이다.

 

따라서 전체 계산이 아무리 복잡하더라도 각 단계에서 하는 일은 해당 노드의 "국소적 계산"이다.

 

국소적 계산을 보여주는 예시

 

또한 "국소적 미분"을 전달하는 원리는 "연쇄법칙(Chain Rule)"에 따르기 때문에, 역전파가 하는 일은 연쇄법칙의 원리와 같다.

 

여기서 연쇄법칙이란 합성 함수(여러 함수로 구성된 함수)의 미분에 대한 성질을 의미한다.

(** 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다)

 

연쇄법칙 계산을 나타낸 계산 그래프 예시

 

다음은 덧셈 노드(+)의 역전파곱셈 노드(x)의 역전파에 대해 설명하겠다.

 

  • 덧셈 노드의 역전파
    • 입력 값을 그대로 흘려보냄
    • 때문에 순방향 입력 신호의 값은 필요하지 않음

덧셈 노드의 역전파 예시

  • 곱셈 노드의 역전파
    • 상류의 값에 순전파 때의 입력 신호들을 "서로 바꾼 값"을 곱해서 하류로 흘려보냄
    • 때문에 순방향 입력 신호의 값이 필요함
    • 이를 위해 곱셈 노드를 구현할 때는 순전파의 입력 신호를 변수에 저장해 둠

곱셈 노드의 역전파 예시

 

위와 같은 방법들로 앞서 언급한 활성화 함수들(ReLU, Sigmoid 등) 또한 하나의 계층으로 구현이 가능하다.

(계층 구현에 대한 설명은 따로 추가하지 않겠다)

 

 

 

신경망의 순전파에서는 가중치 신호의 총합을 계산하기 때문에 행렬의 곱(numpy의 np.dot( ))을 사용했다.

(여기서 핵심은 행렬의 곱 계산 시, 대응하는 차원의 원소 수를 일치시키는 것이다)

 

이와 같이 신경망의 순전파 때 수행하는 행렬의 곱은 기하학에서 "Affine 변환"이라고 한다.

 

  • Affine 계층
    • 신경망의 순전파 때 수행하는 행렬의 곱을 처리해주는 계층
    • Affine 계층에서 주의할 점은 변수가 "다차원 배열(행렬)"이라는 것임

Affine 계층의 계산 그래프 예시

  • 배치용 Affine 계층
    • 일반적인 Affine 계층을 데이터가 N개인 경우로 확장시킨 계층
    • 묶은 데이터"배치"라고 부르기 때문에 배치용 Affine 계층이라 불림

데이터 N개를 묶어 순전파하는 배치용 Affine 계층의 계산 그래프 예시

 

여기서 한 가지 주의할 점은 배치용 Affine 계층의 "편향" 부분인데, 역전파 때는 각 데이터의 역전파 값이 편향의 원소에 모여야 한다.

 

따라서 편향의 역전파각 데이터에 대한 미분을 데이터마다 더해서 구해주어야 한다. 따라서 열 방향으로의 총합(sum)을 구해주어야 한다.

 

 

 

마지막으로 출력층에서 사용하는 Softmax 함수에 대해 설명하도록 하겠다.

 

Softmax 함수입력 값을 정규화(출력의 합이 "1"이 되도록 변형)해서 출력한다.

 

신경망에서 수행하는 작업은 "학습""추론" 두 가지인데, 추론할 때는 일반적으로 Softmax 계층을 사용하지 않는다.

(즉, 신경망의 추론에서는 마지막 Affine 계층의 출력(Score; 점수)을 인식 결과로 이용한다)

 

Softmax 계층 예시

 

다시 말해 신경망 추론에서 답을 하나만 내는 경우에는 가장 높은 점수만 알면 되기 때문에 Softmax 계층은 필요가 없다는 것이다. (반면, 신경망을 학습할 때는 Softmax 계층이 필요하다)

 

본 교재에서는 Softmax 계층을 구현할 때, 다음과 같이 손실 함수인 교차 엔트로피 오차도 포함하여 "Softmax-with-Loss 계층"으로 구현하였다.

 

Softmax-with-Loss 계층의 계산 그래프 예시

 

위 계산 그래픈는 보기에도 다소 복잡한데, 아래와 같이 "간소화"하여 Softmax-with-Loss 계층을 나타낼 수도 있다.

 

"간소화"한 Softmax-with-Loss 계층의 계산 그래프

 

신경망 학습의 목적신경망의 출력이 정답 레이블과 가까워지도록 가중치 매개변수의 값을 조정하는 것이다.

 

따라서 신경망의 출력과 정답 레이블의 오차를 효율적으로 앞 계층에 전달해야 하며, 위 두 개의 Softmax-with-Loss 계층 계산 그래프에서 (y1 - t1, y2 - t2, y3 - t3) 라는 결과가 바로 Softmax 계층의 출력과 정답 레이블의 차이(오차)를 의미한다.

 

결과적으로 Softmax 계층의 앞 계층들은 이러한 오차로부터 깨달음을 얻고 신경망의 출력이 정답 레이블과 가까워지도록 가중치 매개변수의 값을 조정하게 되는 것이다.

 

 

 

지금까지의 내용들을 정리해보면, 신경망에는 적응 가능한 가중치편향이 있고, 이 가중치와 편향을 학습 데이터에 적응하도록 조정하는 과정"학습"이라고 한다. 그리고 신경망 학습은 다음과 같이 4단계로 이루어진다.

 

  1. 미니배치
    • 학습 데이터 중 일부를 무작위로 가져옴
    • 이렇게 선별한 데이터를 "미니배치"라고 함
    • 해당 미니배치의 손실 함수 값을 줄이는 것이 목표
  2. 기울기 산출
    • 미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구함
    • 기울기는 손실 함수의 값을 가장 작게 하는 방향으로 제시
    • 여기서 "오차역전파법"이 사용
  3. 매개변수 갱신
    • 가중치 매개변수를 기울기 방향으로 아주 조금 갱신
  4. 반복
    • 1 ~ 3단계를 반복

 

 

★ 참고 자료

- 밑바닥부터 시작하는 딥러닝 교재