영넌 개발로그

다층 신경망 ( Artificial Neural Network, ANN) 본문

코딩/ML , Deep

다층 신경망 ( Artificial Neural Network, ANN)

영넌 2021. 1. 18. 13:10

다층 신경망의 구조

입력층, 출력층, 은닉층이 있다. 각 층에는 각각 자신만의 특정 함수가 있다.

입력층은 계산을 위한 뉴런은 거의 들어있지 않으며, 출력층은 은닉층에서의 출력 신호이다. 즉, 자극 패턴을 받아 들이고 전체 신경망의 출력 패턴을 정한다. 중요한건 은닉층인데, 은닉층에서는 입력의 특성을 파악해 뉴런의 가중치로 나타낸다. 가중치는 입력 패턴에 숨겨져 있는 특성을 의미한다.

다층 신경망 구조

 

다층 신경망 학습

다층 신경망 학습은 퍼셉트론과 유사하게 진행된다.

신경망은 출력 패턴을 계산하고 오차가 있다면(=실제와 목표 출력 간에 차이가 존재), 이 오차를 줄이도록 가중치를 조절한다. 다층 신경망에서는 가중치가 여러 개인데, 각각의 가중치는 두 개 이상의 출력에 영향을 미친다.

 

모든 데이터는 행렬로 변환하여 계산한다. 행렬은 복잡한 계산을 매우 간단한 형태로 압축해서 표혈할 수 있도록 도와주기 때문이다. 또한, 대부분의 컴퓨터 프로그래밍 언어는 행렬 작접을 잘 처리한다. 따라서 신경망에서 신호를 전달하는 연산은 행렬곱을 통해 간단하게 표현이 가능하다.

3계층(input layer/output layer/hidden layer) 신경망에 행렬을 적용하면 다음과 같은 행렬 곱을 가진다.

X는 결과 값, W는 가중치, I는 입력 데이터 값을 의미한다.

 

각 layer 행렬 곱 수식

 

 

1. 순전파 (forwardpropagation)

초기 입력 신호를 가중치와 조합하여 마지막 계층 쪽으로, 즉 앞쪽으로 전달하는 모습을 볼 수 있다. (feed forward)

이러한 방식을 순전파라고 하며 단순한 행렬곱으로 이루어져 있다. 하나의 계층에서 다음 계층으로 전파하는 데에 가중치를 이용한다.

 

2. 역전파 (backpropagation)

학습 과정 중 가중치가 수정되는 방법이다. 출력 값이 목표 값과 다르면 그 오차를 계산한 후 출력층에서 입력층까지 신경망을 따라 거꾸로 전파한다. 오차가 전파되면서 가중치가 수정된다.

 

"여러 개의 노드가 결과 값과 오차에 영향을 주는 경우에 가중치를 어떻게 업데이트 할거냐?"에 대한 대답으로 나온 방법이다. 오차를 하나의 계층에서 직전 계층으로, 즉 역으로 전파하는 데에도 가중치를 이용한다. 오차를 모든 연결에 나누어 주되 그 값은 각각 가중치에 따라 즉 각각의 연결이 오차에 영향을 주는 정도에 비례해서 전달한다. 이를 최종 출력 계층으로부터 각 계층마다 역방향으로 동일한 과정을 반복하면 된다.

이처럼 오차 관련 정보가 뒤쪽으로 계속해서 전파되므로 역전파라고 부른다.

행렬곱을 이용한 오차의 역전파

 

**

앞선 계층의 연결되어 있는 모든 노드의 오차를 재조합(combine) 함으로써 이를 뒤쪽 계층의 오차로 사용할 수 있다.

학습 데이터들은 최종 노드의 결과 값이 가져야 할 목표 값에 대해서만 말해주므로 은닉 계층에서의 오차를 목표 값과 실제 값 간의 차이라고 정의할 수 없기 때문이다.

 

만약 은닉 1이 출력 1, 2 노드와 연결 되어 있을 때 아래와 같은 수식으로 나타낼 수 있음

역전파 수식
은닉 1,2가 출력 1,2에 각각 연결되어 있음

3. 경사 하강법

경사 하강법을 통해 가중치를 변경하다가 최적의 해(solution)를 찾는다.

시작점에서 손실 곡선의 기울기를 계산한다. 기울기는 편미분의 벡터로서, 어느 방향이 '더 정확한지' 혹은 '더 부정확한지' 알려준다. 점차 접선의 기울기를 감소시키면서 접선의 기울기의 절댓값이 0이 되는 순간을 최적값으로 한다. 단계적 접근 방식으로 이 과정에서 잘못된 해답을 찾을 수도 있다. 따라서 초기 값을 다르게 하여 여러 번 실행시켜보거나 병렬적 실행으로 해결이 가능하다. 이는 매개변수가 여러 개일 경우에도 해결 방안이 된다. 

 

접선의 기울기를 감소시키는 정도를 러닝레이트라고 부르는데 러닝레이트가 너무 크면 오버슈팅(overshooting) 날 가능성이 있고, 러닝 레이트가 너무 작으면 수렴성을 보장되면 현실적으로 너무 느려서 사용하지 못한다.

경사 하강법

 

 

4. 오차 함수

신경망의 output function 자체는 오차함수가 아니다. 여러가지 오차 함수가 있는데 보통 제곱오차(squared error)방식을 선호한다. 우선적으로 경사 하강법의 기울기를 구하는 대수학이 간단해지기 때문이다. 또한 오차함수가 부드럽고 연속적이므로 경사 하강법이 잘 동작하게 된다. 값이 갑자기 상승하거나 빈 틈이 존재하지 않기 때문이다. 따라서 최저점에 접근함에 따라 경사가 점점 작아지므로 목표물을 오버슈팅 할 가능성이 낮아지게 된다.

 

이를 수식으로 나타내보자. 일단 구하고자 하는 바는 가중치의 값이 변화함에 따라 오차 E의 값이 얼마만큼 변하는지 이므로 최저점의 방향으로 감소하기 원하는 오차함수의 기울기와 같다. 아래 수식에서 j는 은닉계층, k는 최종 출력계층을 의미한다. 은닉계층과 출력계층 사이에서의 기울기를 나타낸다. 수식에 대한 자세한 풀이는 다음 포스팅에서 한다.

hidden layer & output layer 오차함수의 기울기

 

같은 방식으로 입력계층과 은닉계층 사이의 가중치에 대한 오차함수의 기울기는 다음과 같다. 마찬가지로 수식에 대한 풀이는 다음 포스팅에서 하는 것으로 한다.

input layer & hidden layer 오차함수의 기울기

 

 

5. 학습률

오버슈팅을 방지하기 위해 변화의 강도를 조정하는 역할을 한다. 이를 학습률이라 하고 아래 수식에서 a 이다.

업데이트 된 가중치는 방금 구한 오차 기울기에 상수를 곱한 값을 원래 가중치에서 빼준다. 그 값이 양의 기울기면 가중치를 줄이고, 음의 기울기면 가중치를 늘린다.

새로운 가중치에 대한 수식

 

 

모든 과정을 거쳐 나온 최종 가중치 업데이트 행렬은 다음과 같다.

사실상 출력 노드들로 이루어진 행렬이기 때문에 아래 수식에서 시그모이드는 생략하였다.

 

 

 

 

 

 

reference :)

책-신경망 첫걸음

Comments