왼쪽은 feedforward, 오른쪽은 backpropagation이다. feedforward방식은 input값을 통해 output값을 얻을 수 있다는 것이고, 이 과정에서 convolution과 activation 함수를 거쳤다.
그렇다면, 왼쪽 그림에서는 반대 방향으로 화살표가 향하는 것을 알 수 있는데, 이는 output의 어떤 값을 통해 input의 어떤 값을 알아내고자 하는 방식이라는 것이다. 각각이 어떤 값을 의미하는지 살펴보자.
우선, 우리는 neural network를 통해 임의의 input값에 대해 그에 맞는 label을 찾아야 한다. 이 과정에서 가중치를 업데이트 해야할 것이고, 이것의 간략한 부분은 앞선 feedforward neural network에서 다뤘다. 이때, input을 통한 출력 레이블과, 실제 가져야 하는 정답 레이블의 차이를 보고 가중치를 업데이트 시키고자 하였다. 이를 error function, cost function으로 쓰고, 이 값을 최소화하는 방향으로 가중치들을 업데이트 시킬 것이다.
error function은 위와 같이 나타낼 수 있다. 다른 funcition을 사용해도 되지만, 이번 포스팅에서는 위의 error function에 대해 다루고자 한다. feedforword neural network에서 다뤘던 것 처럼 각각의 가중치들은 다음과 같이 업데이트 할 수 있을 것이다. 여기서 $\eta$는 learning rate이다.
해석해보자면, 어떤 가중치 값에 따라 J가 변하게 되는데, 변하게 되는 반대방향으로 우리는 업데이트 시키고자 하는 것이다. 즉, 최솟값으로 만들어 줄 가중치를 찾고자 하는 것이다.
[hidden to output]
다음과 같이 나타낼 수 있고, 위에서 $\partial J /\partial net_k$의 값을 sensitivity로 정의하여 $\delta = -\Partial J/\Partial net_k$로 정의한다. 위 식을 정리하면 다음과 같이 나타낼 수 있다.
$\Delta w_kj$의 값으로 가중치를 업데이트 시켜줄 수 있다.
[input to hidden]
input에서 hidden layer로 가는 경우를 살펴보자.
Chain rule을 통해 다음과 같이 쓸 수 있고, 이제 각각을 구해보자.
각각의 식을 얻는 과정을 보였다.
우리는 위에서 sensitivity를 $\Partial J/\Partial net_j$로 정의했다. 가중치를 업데이트 하는 $\Delta w_{ji}$의 값은 sensitivity에 $\Partial y_j/\Partial net_j$를 곱하면 된다. $\Partial y_j/\Partial net_j$ 값은 $x_i$이므로, 가중치 업데이트 하는 값은 $delta_j$에 $x_i$를 곱한 형태가 된다. 이 점을 눈여겨 봐야 한다.
눈여겨 봐야 하는 점은 이 식에서 볼 수 있다. 결국 $delta_j$를 구하기 위해서는 $delta_k$를 구해야 한다는 결론이 나온다. $delta_k$는 hidden to output에서 구할 수 있는 값이고, $\delta_j$는 input to hidden에서 보일 수 있는 값이다.
처음에 언급했던 output의 어떤 값으로 input의 어떤 값을 찾고자 하는 과정이 바로 이것이다. output쪽의 $delta_k$값을 이전 레이어의 $delta_j$에게 전달해주면 $delta_j$를 구할 수 있게 되고, 가중치를 업데이트 해야하는 양을 알게 된다.
따라서, 우리가 다음레이어에서 이전레이어로 넘겨주어야 할 것은 $\delta$값인 것이다. 가중치를 각각 곱하여 전달하게 되고, 다음과 같이 나타낼 수 있다.
처음에 봤던 그림에 해당하고, 이 과정이 backpropagation이라 한다.
[Activation function]
위에서 언급한 activation function은 다양한 형태로 이용할 수 있는데, non-linear function은 쓰지 않는다. 여러 레이어가 하나의 레이어를 쓴것과 같은 효과를 주기 때문이다. 크게 볼 수 있는 것은 Relu함수와 sigmoid 함수이다.
왼쪽은 0~1의 값을 갖는 sigmoid, 오른쪽은 0 이상의 값을 취하는 relu함수이다.
sigmoid는 0~1의 값을 갖는다는 장점이 존재하지만, 단점도 존재한다. 위 backpropagation과정에서 $\delta$값을 이전 레이어에 전달해주게 되는데, $\delta$값에는 activation function의 미분 값이 곱하여 들어가게 된다. 만약 0~1의 값을 계속 곱하다 보면 0에 수렴하게 될 것이고, 이는 레이어가 커지게 되면 input쪽의 $\delta$값들은 전부 0에 가까워져 가중치 업데이트량이 매우 적을 것이다. 이를 Vanishing gradient라고 하며, 기울기 소실이라 한다.
따라서 Relu를 사용하게 되는데, 여기서도 생길 수 있는 문제점은 1보다 큰 값을 곱하다 보면 무한대에 가까워져 너무 큰 값을 사용하게 될 수 있다는 점이다. 이러한 점 때문에 Relu를 사용하기를 꺼려했지만, 생각보다 레이어마다 무한대 값을 갖지 않도록 소거해주는 항이 존재하여 그러한 문제는 많이 발생되지 않고, 가중치 업데이트가 잘 되는 면이 있어서 많이 사용한다고 한다.
'Review > Artificial Intelligence' 카테고리의 다른 글
Feedforward Neural Networks (0) | 2022.10.18 |
---|---|
XOR gate - Backpropagation (0) | 2022.10.18 |