multi layer perceptron(다층신경망)에 대한 설명에 앞서 single layer perceptron과의 차이를 먼저 얘기해보자면, 은닉층(hidden)의 존재 여부가 그 둘의 차이를 나타낸다고 할 수 있다. 은닉층이 존재하는 multi-layer perceptron 에서도 은닉층이 1개이냐 2개 이상이냐에 따라 얕은 신경망이냐 심층 신경망이냐로 나뉘게 된다.
그렇다면 왜 은닉층이 필요한지에 대해 알아보도록 하자.
기존의 single layer perceptron 의 경우 신경망을 통해서 선형 분류가 가능한 모델(linearly separable)을 만들 수 있었다. 하지만 선형으로 분류하지 못하는 문제(linearly inseparable)들이 존재하고, 이 문제(XOR gate)를 해결하기 위해서 신경망의 계층을 늘려 다층 구조로 만들어야 했으며, 이로써 single layer perceptron으로 풀 수 없던 XOR 문제를 해결한다. 아래의 그림에 XOR 을 나타낸 그래프는 AND와 OR 문제의 조합으로 탄생한 문제를 보여준다.
키가 매우 크고 몸무게가 매우 큰 사람과 키가 매우 작고 몸무게가 매우 작은 사람이 이루는 집단을 제외하고 싶은 문제를 생각해보면, 선형 분류자로 구분하기에 위의 부류의 사람들은 선형 분류자 상에 위치하기 십상이라 regression 같은 수치 예측에는 좋겠지만 classification 에서는 구분을 해야하기 때문에 오히려 분류가 잘 되지 않는다고 할 수 있다.
아래의 그림의 왼쪽은 single layer perceptron, 오른쪽은 multi layer perceptron이다. 오른쪽 그림 처럼 multilayer 는 비선형적인 분포에 대해서도 분류를 할 수 있게 된다.
단층 신경망의 경우 출력과 실제값 사이의 오차를 토대로 가중치를 업데이트했다. 그렇다면 다층 신경망의 경우에는 어떻게 학습을 할까. 위 그림에서 hidden layer의 경우에는 출력층에서 했던 것처럼 출력값과 실제값 사이의 오차를 구하는 방법을 사용할 수 없다. 잠시 신경망의 가중치를 학습시키는 델타규칙에 대해 잠깐 알아보고 나서 다음에 hidden layer에서의 학습과정을 알아보자.
델타규칙은 "어떤 입력 노드가 출력 노드의 오차에 기여했다면, 두 노드의 연결 가중치는 해당 입력 노드의 출력과 출력 노드의 오차에 비례해 조절한다." 에 의거하며, 쉽게 해석하면, 어떤 노드가 오차가 너무 많이 나게 했으면 많이 나게 만든 노드에는 그만큼 해당 가중치에 많은 수정을 하게한다는 말이다. 이를 식으로 표현하면 아래와 같다.
$ w_{i} \leftarrow w_{i} + \alpha e_{i} x_{i}$
$w_{i}$: 업데이트 된 가중치
$w_{i}$ : i번째 가중치
$\alpha$: 학습률(learning rate)
$e_{i}$: 입력노드 i번째 출력값의 오차
$x_{i}$: 입력노드의 i번째 출력값
기존의 가중치 $w_{i}$에 더하는 term인 $\alpha e_{i} x_{i}$ 는 변화량을 의미하고, 이를 다시 표현하면 아래와 같다.
$w_{i} \leftarrow w_{i} + \Delta w_{i}$
델타규칙을 활용해서 계속해서 가중치를 업데이트 시켜나간다. 위의 규칙은 활성함수가 선형함수일 때를 나타내는 옛 버전이다. 즉, $f(x) = x$인 형태의 활성함수인 경우를 말하며, 다층 신경망에서 은닉층에 선형함수가 활성함수로 사용될 경우 단층 신경망과 차이가 없기 때문에 이를 제외한 활성함수에 대한 델타규칙의 일반적인 형태를 알 필요가 있다. 일반적인 형태의 델타 규칙은 아래와 같다.
$w_{i} \leftarrow w_{i} + \alpha \delta_{i} x_{i}$
앞전에 $e_{i}$가 $\delta_{i}$로 바뀐 것을 알 수 있다. 아래는 $\delta_{i}$ 에 대한 설명이다. 아래의 식에서 입력값과 출력값의 구별을 위해 $x_{i}$는 입력값으로 바뀌고, 출력값은 $y_{i}$로 바꾸었다.
$\delta_{i} = (t_{i} - y_{i}) f^{'}(x_{i})$
직관적으로 보면 $e_{i}$ 의 부분이 오차 term $(t_{i} - y_{i})$ 과 $ f^{'}(x_{i})$ 활성함수의 도함수(기울기)의 곱으로 표현된 것이 기울기를 고려할 수 있고, 오차에 비례하게 할 수 있다는 것을 알 수 있다. 오차에 대한 편미분 과정은 생략하였다.
위의 $\delta_{i}$를 대입하면
$w_{i} \leftarrow w_{i} + \alpha (t_{i} - y_{i}) f^{'}(x_{i}) x_{i}$
델타규칙에 선형함수가 아닌 다른 활성함수로 시그모이드 함수를 적용하면 아래와 같은 식을 얻을 수 있다.
$w_{i} \leftarrow w_{i} + \alpha f(x_{i})(1-f(x_{i})) e_{i} x_{i} $
델타 규칙을 사용하여 오차를 사용해서 신경망을 학습시켰다. hidden layer가 생기면서 가중치가 곱해지는 구간이 두 개 이상으로 늘어나게 되었다. 단층 신경망일 때는 가중치를 곱하는 구간이 하나여서 출력값과 오차를 가지고 하나뿐인 가중치 행렬을 학습시킬 수 있었다. 그러나 multilayer perceptron으로 넘어오면서, hidden node로 이어지는 가중치 행렬의 오차가 없는 상황이 생기게 되고 그렇다면 어디서 오차를 가져와서 어떻게 학습을 시킬까?
은닉층의 노드는 학습데이터로부터 주어진 정답이 없다. 은닉층 노드에서 알 수 없었던 오차를 어떻게 정의하는가에 대한 대답이 역전파 알고리즘(back propagation)이다. 역전파 알고리즘의 핵심 알고리즘은 신경망의 출력 오차를 출력층에서 시작해 입력층 바로 앞 은닉층까지 역순으로 이동시키는 것이다.
아래와 같이 입력 노드가 2개 이고, 은닉 노드가 2개인 은닉층이 1개이며, 출력 노드가 2개인 신경망 구조가 있다고 하자. 우선 순서대로 가중합과 합성함수로 출력을 뽑아내면서 마지막 출력층까지 진행해 나간다.
출력노드까지 연산을 수행했다면, 오차를 구하고 그 오차로 $\delta$ 값까지 구한다. 여기서 위에서의 질문 "은닉 노드의 오차를 어떻게 정의하느냐?" 의 문제는 역전파 알고리즘에서는 바로 오른쪽에 있는 계층(여기서는 출력층)의 델타를 역전파시켜 얻은 가중합으로 오차를 정의한다.
output layer에서 구한 $\delta$ 와 가중치 $W^{(2)}$의 가중합을 은닉층 노드의 오차 $e$ 로 사용하며, 이 값에 활성함수의 도함수를 곱해 해당 은닉 노드의 델타 $\delta$를 구한다.
아래의 그림처럼 최종적으로 확보한 델타와 출력값, learning rate의 곱으로 계층별로 가중치를 조절할 수 있게 된다.
ref)
딥러닝 첫걸음
신경망 첫걸음
밑바닥부터 시작하는 딥러닝
https://roseline124.github.io/data-analytics/2019/03/30/ML-Deep-Delta.html
'딥러닝' 카테고리의 다른 글
RNN (0) | 2021.04.10 |
---|---|
Activation Function (0) | 2020.09.24 |
Single Layer Perceptron (0) | 2020.08.06 |
Convolution and Pooling (1) | 2020.06.27 |
fundamentals of machine learning (0) | 2020.06.20 |
댓글