역전파(Back Propagation)
아래와 같이 x와 W로 total Loss를 구하는 과정을 Computational Graph라고 한다.
이제 역전파를 계산해보자.
대략적인 방식은 아래와 같다.
1. 각 local gradient
2. Chain Rule 적용을 위한 gradient들 구하기
3. Input이 마지막 단에 끼치는 영향 구하기
4. 의미파악
우선 아래와 같은 Computational Graph가 있다고 가정하고 역전파 계산하기
1. local gradient 구하기 - Forward Pass에서 Local Gradient를 구한다.
2. Chain Rule 적용을 위한 gradient들 구하기
3. Input이 마지막 단에 끼치는 영향 구하기 - Backward Pass에서 Global Gradient를 구한다, Local Gradient와 Global Gradient를 곱해서 최종 Gradient를 구한다.
4. 결론
따라서 이 과정에서 얻어야할 것은 아래와 같다.
1. Forward Pass에서 Local Gradient를 구한다.
- 신경망이 입력을 받아서 출력을 계산하는 과정을 forward pass라고 한다.
- 이 과정에서, 각 레이어가 자기 자신의 변화율을 계산하는데, 이걸 local gradient라고 부른다.
- 위의 계산 과정에서 1, 2번에 해당한다
- 각 레이어(덧셈, 곱셈)에서 local gradient를 계산한다.
2. Backward Pass에서 Global Gradient를 구한다.
- 이제 신경망이 계산된 출력을 가지고 오차(실제 값과 예측 값의 차이)를 계산한다. 이 오차를 줄이기 위해 역방향으로 오차를 전파하면서 각 레이어에서 변화율(기울기)을 계산하는데, 이걸 global gradient라고 한다.
- 위의 계산 과정에서 3번에 해당한다.
- 원래는 global gradient는 손실 함수(오차)를 이용해 계산되지만 위의 과정을 f가 어떻게 변화하는지 자체를 추척한다고 생각하면 된다.
3. Local Gradient와 Global Gradient를 곱해서 최종 Gradient를 구한다.
- 마지막으로, local gradient와 global gradient를 곱해서 각 레이어가 오차를 줄이기 위해 얼마나 조정되어야 하는지를 계산한다. 이 값이 최종 gradient(기울기)이다.
- 이걸 이용해서 신경망이 학습하는 거야. 즉, 가중치를 어떻게 업데이트할지 결정하는 것이다.
- 위 계산 과정에서 3번에 해당한다.
이 세 단계를 통해 신경망이 잘못된 예측을 조금씩 고쳐나가면서 더 나은 예측을 하게 된다. 이 전체 과정이 바로 역전파(backpropagation)라고 한다.
요약
- 예를 들어, f가 최종 출력이고, 이 f가 x라는 입력에 얼마나 영향을 받는지를 알고 싶다고 하면,
- 먼저 Forward Pass에서 x가 연산을 거쳐 각 레이어에서 직접적으로 계산된 변화율(기울기))를 계산한다. 로 이어질 때의 local gradient(
- 그다음, Backward Pass에서 출력 f가 x에 얼마나 영향을 받는지를 global gradient(이전 노드에서 전달된 기울기)로 계산한다.
- 이 두 값을 곱하면, x가 최종 출력 f에 얼마나 영향을 미치는지(최종 기울기)를 알 수 있어. 이를 통해 신경망은 x와 관련된 가중치를 조정하는 것이다.
이제 두 번째 문제를 풀어보자.
풀이)
이렇게 결국 w0, x0, w1, x1, w2를 구했다. 이제 이 각각의 가중치와 입력이 출력에 얼마나 영향을 미치는 알고, 이를 통해 모델이 더나은 방향으로 학습할 수 있도록 가중치를 조절할 수 있게 되었다.
2번 문제풀이 방식으로 1번 풀기
사실 위의 방식처럼 1번도 풀면된다. 굳이 forward pass를 하지 않아도 이미 값이 주어져 있으니 바로 back pass로 각 노드의 기울기를 구할 수 있다.
우선 f의 기울기는 무조건 1이다. 그리고 곱셈 노드는 A x B 라면 A = 이전 노드 기울기 * B / B = 이전 노드 기울기 * A이다. 따라서, Q = 1 * Z = 1 * (-4) = -4 / Z = 1 * Q = 1 * (3) = 3가 된다.
또한 덧셈 노드는 그대로 전파하기 때문에 x와 y도 모두 -4이다.
한번 확인 해보자.
똑같은 걸 알 수 있다.
중요한 개념
이렇게 각 노드에서 Local gradient * global gradient를 통해서 각 노드가 손실함수에 얼마나 기여했는지를 알 수있다.
Local gradient * global gradient은 양수, 음수 상관없이 절대값으로 기여도를 판단한다. 절대 값이 클수록 기여도가 높다.
따라서 손실함수가 큰 경우, 기여도가 높은 노드를 우선적으로 수정한다!!!
sigmoid function
시그모이드 함수
: 시그모이드 함수는 입력값을 0과 1 사이의 값으로 변화하는 함수
시그모이드 함수의 활용
: 시그모이드 함수는 주로 이진 분류 문제에 사용된다. 예를 들면 어떤 데이터가 두가지 카테고리 중 어느 곳에 속하는지 결정할 떄 시그모이드 함수를 사용한다.
- 0에 가까운 값 -> 가능성이 낮다.
- 1에 가까운 값 -> 가능성이 높다.
시그모이드 미분
σ(x)' = (1 - σ(x))*σ(x)
이게 중요한 이유는 신경망이 학습할 때 기울기(gradient)를 계산해서 가중치를 업데이트할 때, 이 미분을 사용한다.
역전파(BP)에서 시그모이드 함수의 역할
시그모이드는 Backward Pass에서 기울기을 전파할 떄 사용된다.
예를 들어 마지막에 시그모이드 함수가 있다면, 그 함수의 미분인 (1 - σ(x))*σ(x) 를 이용해서 기울기를 계산하고, 이전 노드로 전달하는 거다.
따라서 위에서 풀었던 이미지를 보면 σ(x)를 0.73이라고 하면, σ(x)의 기울기는 0.73 * (1 - 0.73) = 0.1971 =~ 0.2 이다.
연산 게이트
요약
- ADD: 역전파에서는 기울기를 그대로 전파된다.
- MUL: 역전파에서는 한 입력에 대한 기울기가 다른 입력 값이된다.
- MAX: 역전파에서는 큰 값에만 기울기를 전달한다.
지금까지는 레이어가 하나인 linear function만 알아봤다. 이제는 하나의 레이어가 아닌 여러개의 레이어를 쌓아보자.
레이어는 아래와 같이 한개의 레이어라면 f = Wx이고, 레이어가 2개라면 f = W2max(0, W1x), 레이어가 3개라면 f = W3max(0, W2max(0, W1x))로 계속 만들어나갈 수 있다.
인공 신경망(Neural Network) vs 실제 인간 신경망
NN(인공 신경망)은 인간의 신경망을 모방하려는 시도로 시작도었지만, 인간의 신경망은 다양한 종류의 뉴런으로 구성되어 있다. 따라서 단순한 형태의 인공신경망을 인간의 신경망과 비슷하다고 생각하는 것은 무리가 있다.
인공 신경망(Neural Network)의 기본 구조
위의 그림은 NN의 기본 구조이다. 왼쪽은 레이어가 2개(또는 hidden layer가 1개)인 NN, 오른쪽은 레이어가 3개(또는 hidden layer가 2개)인 NN이다.
💡 왜 레이어가 총 3개또는 4개인데 한개를 줄여서 말하는걸까?
이유: 레이어 개수를 따질 때는 W(가중치)를 가지고 있는 레이어만 따진다. 따라서 W를 가지는 hidden layer, output layer만 개수로 생가하면된다.
인공 신경망의 기본 구조는 여러 layer로 구성된다. 각 layer는 뉴런으로 이루어져 있고, layer 사이의 연결은 W(가중치)로 표현된다.
- Input layer
- 입력 데이터를 받아들이는 layer
- hidden layer
- 입력층과 출력층 사이에 위치하며, 비선형 변환을 통해 데이터를 처리한다.
- hiddent layer 개수에 따라 네트워크의 깊이가 결정된다.
- output layer
- 최종적으로 예측된 결과를 출력하는 layer
Activation Function(활성화 함수)
💡 활성화 함수란?
인공신경망에서 Input layer, hidden layer, output layer 내부에 있는 여러 개의 뉴런 중 특정한 뉴런이 계산한 결과값을 변환하는 함수이다. 즉, 입력한 대이터를 단순하게 통과시키는 것이 아니라, 비선형적인 변호를 주어서 복잡한 문제를 해결할 수 있도록 돕는 역할을 말한다.
싑게 말하면, 활성화 함수는 신경망이 더 똑똑하게 학습할 수 있도록 도와주는 필수적인 도구이다.
💡 왜 사용하는건가?
복잡한 문제해결
활성화 함수가 없다면 신경망은 모든 이력을 선형적으로만 처리해서 복잡한 패턴이나 비 선형 문제를 풀 수 없다.
뉴런의 활성화 결정
활성화 함수는 각 뉴런이 '활성화'될지 말지는 경한다. 특정 입력이 들어왔을 떄 뉴런이 작동할지, 0처럼 작동할지는 결정한다.
- Sigmoid
- 출력 값을 0과 1사이로 제한한다.
- 주로 이진 부류에서 사용한다.
- tanh
- 출력 값을 -1에서 1로 제한한다.
- 시그모이드보다 중앙값이 0이라 학습에 더 유리한 경우가 있다.
- ReLU
- 입력 값이 0일 떄는 0을 출력, 그 외에는 입력값을 그대로 반환하는 함수
- 현재 가장 많이 사용하는 함수 중 하나
- Leaky ReLU
- ReLU에서 입력이 0 이하일 떄도 작은 기울기를 가지도록 개선한 형태로, 죽은 뉴런 문제를 완화한다.
- Maxout
- 여러 개의 선형 함수중 가장 큰 값을 선택하는 방식의 활성화 함수이다.
- ELU
- ReLU와 비슷하나 더 부드러운 형태의 출력을 가지는 활성화 함수
'CVLab > cs231n (2016)' 카테고리의 다른 글
cs231n - lecture05(Trainit NN Part 1) (7) | 2024.09.28 |
---|---|
2024.09.27 Q&A (1) | 2024.09.27 |
cs231n - lecture03(손실함수, 경사하강법) (1) | 2024.09.23 |
cs231n - lecture02(이미지 분류, KNN, Linear Classification) (7) | 2024.09.22 |
cs231n - lecture01(컴퓨터 비전의 역사) (3) | 2024.09.21 |