본문 바로가기
딥러닝/CS182

CS182 - [Lecture 5] Backpropagation

by sb99 2022. 7. 2.

Part 1

Neural Networks

 

이번 강의에서는 neural network의 구조와

파라미터의 업데이트 방법인 backpropagation에 대해 배운다.

 

먼저 neural network의 구조에 대해 살펴보자.

2개의 input으로 이루어진 x가 2개의 파라미터를 가진 모델에 입력되었을 때,

MSE loss를 계산하는 과정을 도식화하면 다음과 같다.

 

최종적인 결과는 \( ||(x_{1}\Theta_{1} + x_{2}\Theta_{2}) - y||^{2} \)이 된다.

 

 

하지만 실제 계산에서는 각각의 원소에 대해 고려하는 것이 아닌,

Input과 파라미터를 구성하는 여러 원소들을 하나의 vector 혹은 matrix로서 간주한다.

이에 따라 계산 과정을 도식화하면 위와 같으며, 곱은 dot product에 해당한다.

 

위의 식은 linear regression 모델의 MSE loss를 계산하는 과정이며

다음으로 logistic regression의 NLL(Negative Log-likelihood loss)에 대해 알아보자.

 

 

위의 그래프는 logistic regression의 NLL 계산에 대해 도식화 한 그래프이다.

여기서 x와 \( \Theta \)는 vector이며, y는 one-hot-vector의 형태이라는 것을 기억하자.

 

x와 \( \Theta \)의 곱은 softmax를 거쳐 확률 값을 가지게 될 것이며, 

이 값은 one-hot-vector인 y와 곱해져 log에 씌워지게 된다.

 

직관적으로 보면 cross-entropy 식과 동일하다는 것을 알 수 있는데,

cross-entropy와 negative log-likelihood의 식이 결론적으로 동일하다는 것을 고려했을 때

위 그래프를 거친 최종 결과는 negative log-likelihood와 동일하다는 것을 알 수 있다.

 

 

위 그래프를 조금 더 정교하게 그려보자.

그래프에는 두 가지 타입의 변수가 있다.

 1. Data: input과 target(label)로 구성된다.

 2. Parameters: 파라미터는 '보통' 한 번의 계산에만 영향을 준다.

                           Input인 x를 output으로 바꿔주는 역할을 한다고 보면 된다.

 

 

파라미터는 오직 x에 대해 y를 도출할 때만 사용되며,

Label인 y는 loss를 계산할 때에만 사용된다.

 

왼쪽 그래프를 더욱 간결하게 표현한 그래프가 오른쪽 그래프이며,

x는 linear layer(also called fully connected layer)를 거쳐 output을 생성하고

output은 softmax를 거쳐 확률 값으로 변환되며,

해당 확률 값은 cross-entropy loss라는 loss function을 거쳐 최종 loss가 도출된다.

 

 

그래프를 neural network diagram으로 나타내면 오른쪽 그림과 같다.

linear layer에는 파라미터가 항상 포함되기 때문에 앞으로의 diagram에서는 생략될 것이며,

softmax를 사용할 경우 보통 cross-entropy loss가 loss function으로서 사용되므로

이 또한 생략할 것이다.

 

 

Logistic regression의 경우 features를 추출해야 하는 경우가 있다.

데이터가 상단에 있는 그림처럼 하나의 직선만으로도 분류가 가능할 경우에는 features를 추출하지 않아도 되지만,

하단의 그림처럼 하나의 직선 만으로는 분류가 불가능할 경우, features를 추출해야 하는 과정이 필요하다.

즉, input 데이터 x로부터 features를 추출한 뒤에 softmax를 거쳐야 한다.

 

 

Features를 추출하는 방법에 대해 알아보자.

해당 챕터에서는 softmax를 통해 x의 features를 추출한다.

(softmax가 아니더라도 non-linearity 함수면 된다.)

단, 여기서의 softmax는 기존에 배운 softmax와는 약간 다르게,

각각의 feature element에 sigmoid를 취한다.

따라서 각 features는 독립적이라 할 수 있다.

 

 

이를 그래프와 diagram으로 나타내면 다음과 같다.

이전과 비교했을 때 하나의 layer와 sigmoid가 더 추가됨을 확인할 수 있다.

 

위의 그림은 좀 더 간략화된 버전이며,

새로 추가된 layer(linear + sigmoid)를 sigmoid layer라 칭하고 있다.

물론 deep learning의 경우 features를 추출하는 과정이 한 번만 존재하지는 않는다.

복잡한 deep learning일 수록 sigmoid layer와 같은 feature extraction layers가 많을 것이다.

(단, 마지막에 존재하는 softmax는 보통 한 개만 존재)

 

 

위에서 x의 features를 추출하기 위해 사용된 sigmoid 같은 함수를 activation functions이라 한다.

이는 model에 non-linearity를 추가해주며, sigmoid 이외에도 다양한 함수들이 존재한다.

만약 activation functions이 linear function이라면

아무리 많은 layer를 쌓아도 결과적으로는 단순한 matrix multipilication일 뿐이므로,

모델의 capacity가 늘어나지 않는다. (= x의 features를 뽑아낼 수 없다.)

 

 

Part 2

Training Neural Networks

 

이제 neural networks를 학습시키는 방법에 대해 알아보자.

이전 챕터에서 언급했던바와 같이, 모델을 학습시키기 위해서는 위와 같은 과정이 필요하다.

 

파트 1에서 배웠던 것처럼, model class를 정의할 때는 여러 layers를 쌓게 된다.

Loss function은 자주 언급된 negative log-likelihood와 같은 알고리즘을 사용할 것이며,

Optimizer는 stochastic gradient descent를 사용할 것이다.

 

우리는 앞서 정의한 loss function을 토대로 optimzer를 활용하여

모델의 파라미터를 업데이트하며, 이때 loss function에서의 gradient가 필요하다는 것을 배웠다.

이번 파트에서는 gradient가 어떠한 과정을 거쳐 계산되는지 알아보자. 

 

 

우리는 각 layer에 해당하는 gradient를 chain rule을 활용하여 계산할 수 있다.

 

만약 x가 g와 f라는 함수(layer)를 거쳐 최종 output인 z로 변환된다고 생각해보자.

이 때 z에 대한 x의 gradient, 즉, \( \frac {d}{dx} f(g(x))\)는 위와 같이 계산된다.

 

여기서 모든 값들은 벡터이므로,

gradient는 jacobian matrix(각 원소에 대해 미분한 값을 행렬 값으로 갖는 행렬)로 표현된다.

 

 

이제 chain rule을 neural networks에 적용해보자.

Neural networks는 많은 함수들의 집합으로 생각할 수 있다.

 

데이터 x가 두 개의 layer를 거쳐 loss가 계산되는 모델을 고려했을 때,

업데이트될 파라미터는 2개의 layer 부분에 해당한다.

각각의 파라미터에 대한 gradient는 chain rule을 활용하여 계산할 수 있다.

 

 

하지만 이를 딥러닝에 적용하기란 한계가 있다.

파라미터가 평균 n dimentions를 갖는 모델을 생각해보자.

각각의 Jacobian은 nxn 차원의 파라미터를 저장해야 하므로

Gradient를 계산하는데 \(O(n^{3})\)의 시간이 소요된다.

딥러닝 모델의 크기를 고려했을 때 이러한 계산 방식은 매우 비효율적일 것이다.

 

효율적인 계산을 위해 우리는 오른쪽에서 계산을 해나가는 방식을 생각해볼 수 있다.

오른쪽에서부터 gradient를 계산하고 저장함으로써,

왼쪽의 gradient에 필요한 gradient를 사용할 수 있고, 계산을 효과적으로 시행할 수 있다.

 

 

실제 적용 방법은 위와 같다.

먼저 forward pass를 통해 \( a^{(i)}와 z^{(i)}\)를 계산하고,

backword pass의 시작으로써 \( \frac {d}{L} dz^{(n)}\)을 계산한다.

(backpropagation 참고 자료: https://wikidocs.net/37406)

 

 

Part 3

Practical Implementation

 

Neural network 구조에 backpropagation을 실제로 적용해보자.

 

Activation functions에는 굉장히 많은 함수들이 있는데, 그중 가장 유명한 건 ReLU가 아닐까 싶다.

ReLU는 값이 음수인 경우 0, 양수인 경우 자기 자신을 반환하는 매우 간단한 함수이기 때문에

Gradient나 forward pass에서 매우 적은 양의 계산이 필요할뿐더러

신기하게도 모델에 non-linearity를 부여하기 때문에 자주 활용되는 함수이다.

 

 

우리는 여태까지 linear layer을 거쳐 나온 값은

단순히 이전에 입력받은 값과 파라미터를 곱한 값으로서 여겼다.

하지만 input이 영 벡터 일 경우 파라미터를 곱했을 때 output이 무조건 0이 나오기 때문에

각각의 linear layer에 bias라는 상수를 추가로 더해준다.

 

 

(강의에는 linear layer, sigmoid, ReLU에 대한 미분 과정이 나와있는데 생략함...ㅎ)

해당 챕터를 요약하자면, backpropagation은 가장 마지막 layer부터 gradient를 계산해나가며,

맨 앞의 layer까지 chain rule을 활용하여 gradient를 계산하는 방법이다.


References

 

댓글