CS231n - lecture 4: backpropagation and nueral networks
임의의 복잡한 함수를 통해 어떻게 analytic gradient를 계산하는지에 대해 이야기할 것입니다. computational graph라고 부르는 프레임워크를 사용할 것입니다. 그리고 기본적으로 computational graph 같은 종류의 그래프를 이용해서 어떤 함수든지 표현할 수 있습니다. 그리고 그래프의 각 노드는 연산 단계를 나타냅니다.
ex)이 예제는 우리가 말해왔던 input이 x,W인 선형 classifier입니다. 곱셈 노드는 행렬 곱셈을 나타냅니다. 파라미터 W와 데이터 x의 곱셈은 score vector를 출력합니다. 그리고 우리는 hinge loss라는 다른 계산 노드를 가지고 있습니다. 데이터 항 Lᵢ를 계산하는데, 우리는 오른쪽 하단에 보이 regularization 항 또한 가지고 있습니다. 이 노드(R)는 regularization 항을 계산하고 우리의 최종 loss는 L은 regularization 항과 데이터 항의 합입니다.
computational graph를 사용해서 함수를 표현하게 됨으로써 backpropagation이라고 부르는 기술을 사용
backpropagation
1. gradient를 얻기위해 computational graph 내부의 모든 변수에 대해 chain rule을 재귀적으로 사용
2. 매우 복잡한 함수를 이용하여 작업할때 아주 유용하게 사용
딥러닝의 다른 종류인 neural turing machine을 알고있을텐데요 이 경우의 computational graph를 볼 수 있습니다.
엄청나게 겹쳐진 레이어는 계산하기엔 너무 복잡합니다. 이 시간에는 이것들을 풀어볼것입니다.
만약 여러분이 어떤 중간 변수의 gradient를 계산하고 싶으면 이것은 기본적으로 아주 복잡하고, 비실용적입니다.
How does backpropagation work?
1) 스칼라
우리의 목표는 우리가 함수를 가지는 것입니다. 이 경우 x,y,z로 구성된 function f는 (x+y)*z와 같습니다. 그리고 우리는 function f의 출력에 대한 어떤 변수의 gradient를 찾기 원합니다.
1 단계 . computational graph
항상 함수 f를 이용해서 computational graph로 나타내는 것입니다. computational graph가 오른쪽에 있습니다. x,y에 대한 덧셈 노드를 보실 수 있으며 오른쪽에는 다음 연산을 위한 곱셈 노드도 가지고 있습니다. 그리고 이 네트워크에 우리가 가지고 있는 값을 전달할 것입니다. x는 -2, y는 5, z는 -4입니다. 또한 중간중간 값도 계산하여 computational graph에 값을 적어 놓았습니다. x+y는 3입니다. 그리고 마지막으로 최종 노드를 통과시켜 -12를 얻습니다. 여기에서 모든 중간 변수에 이름을 줘봅시다. 그래서 나는 x+y 덧셈 노드를 q라고 부를 것입니다. 또한 여기에서 f는 q*z입니다. 의 gradient를 표시해 놓았습니다. 그것은 단순 덧셈이기때문에 1입니다. 의 gradient는 미분에 의해 각각 z와 q입니다. 그리고 우리가 찾기 원하는것은 x,y,z 각각에 대한 f의 gradient입니다.
backpropagation은 chain rule의 재귀적인 응용입니다. chiain rule에 의해 우리는 뒤에서부터 시작합니다.
2 단계. computational graph의 가장 끝, 우리는 뒤에서부터 gradient를 계산
computational graph의 가장 끝, 우리는 뒤에서부터 gradient를 계산합니다.끝에서부터 시작해봅시다. 우리는 출력의 f에 대한 gradient()를 계산하길 원합니다.그리고 이 gradient는 1입니다,
3 단계 . 각 노드의 gradient 계산
한칸 앞으로이동해서 z에 대한 gradient를 계산해봅시다. 이 라는 것을 알고 있습니다. 그리고 q의 값은 3이죠. 그래서 여기에서 z에 대한 f의 미분값은 3을 갖습니다.
그리고 다음으로 q에 대한 f의 미분값을 알아봅시다. 값이 얼마일까요? q에 대한 f의 미분값은 얼마인가요?q에 대한 f의 미분값은 z와 같네요. 그리고 z는 여기에서 -4입니다. 여기에서 우리는 q에 대한 f의 미분값이 -4라는 것을 알았습니다.
자 이제 그래프의 뒤로 이동해봅시다.
여러분은
값을 알고 싶습니다.
하지만 여기에서 y는 f와 바로 연결되어 있지 않습니다. f는 z와 연결되어있습니다. 이것을 구하는 방법은 chain rule을 이용합니다.
으로 나타낼 수 있습니다. 이것은 직관적으로 y가 f에 미치는 영향을 구하기 위한 것을 알 수 있습니다. 실제로 이것은 우리가 q*f의 연산에서 q의 영향을 구할때와 동등합니다.
만약 우리가 똑같이 x의 gradient를 알고싶다고 해봅시다. 여러분은 이전과 같은 방법으로 구할 수 있습니다. 어떻게 할 수 있을까요?이 경우 우리는 다시한번 chain rule을 적용할 수 있습니다.
의 gradient는 -4 * 1 이므로 -4입니다.
앞서 과정을 다시 정리해보면
지금 우리가 하고 있는 backpropagation에서 우리는 computational graph안에 모든 노드를 포함하고 있었습니다. 하지만 각 노드는 오직 주변에 대해서만 알고 있습니다. 우리가 가지고 있는건 각 노드와 각 노드의 local 입력입니다. 입력은 그 노드와 연결되어있고 값은 노드로 흘러들어가 이 노드로부터 출력을 얻게 됩니다. 여기에서 local 입력은 x,y이고 출력은 z입니다.
그리고 이 노드에서 우리는 local gradient를 구할 수 있습니다. 우리는 z에서 x에 대한 gradient를 구할 수 있으며 y에 대한 gradient도 마찬가지입니다. 그리고 이것들은 대부분 간단한 연산입니다.각 노드는 우리가 이전에 보았던 것처럼 덧셈 혹은 곱셈입니다. 그것들은 쉽게 gradient를 구할 수 있고, 우리는 그것을 찾기 위해 복잡한 미적분을 할 필요가 없습니다
우리가 말했던 것처럼 우리가 가지고 있는 각 노드는 local 입력을 받고 보이는 것처럼 다음 노드로 출력값을 보냅니다. 그리고 우리가 계산한 local gradient가 있는데 이는 들어오는 입력에 대한 출력의 기울기입니다.
backpropagation이 어떻게 동작하는지 알아봅시다. 우리는 그래프의 뒤에서 부터 시작합니다. 각 노드에 도달하면 출력과 관련한 노드의 gradient가 상류의(입력과 가까운) 노드로 전파됩니다.
이제 우리는 x와 y의 값에 대한 바로 직전 노드의 gradient를 찾고자합니다. 우리가 이미 보았듯이, 우리는 chain rule을 사용합니다. x gradient를 local gradient와 곱해서 (노드의)입력에 대한 gradient를 구합니다.
y에 대한 L의 gradient는 다시 한번 완전히 같은 방식입니다. chain rule을 사용해서, z에 대한 L의 gradient와 그리고 y에 대한 z의 gradient를 서로 곱합니다. chain rule에 의해 이 둘의 곱은 원하는 gradient를 줍니다.
우리가 gradient를 구하면 이 노드와 연결된 직전 노드로 전달할 수 있습니다. 이것으로부터 얻을 수 있는 중요한 것은 각 노드는 우리가 계산한 local gradient를 가지고 있습니다. 우리는 backpropagation을 통해 그것을 얻습니다. 값들은 상위 노드 방향으로 계속 전달되고 우리는 이것을 받아 local gradient와 곱하기만 하면 됩니다. 우리는 노드와 연결된 노드 이외의 다른 어떤 값에 대하여 신경쓰지 않아도 됩니다.
이제부터는 다른 예제에 대해서 살펴보겠습니다. 이것은 이전보다는 조금 복잡합니다. 그렇기 때문에 backpropagation이 얼마나 유용한 방식인지를 알게 될 것입니다. 이 경우 함수 w,x에 대한 함수 f는
와 같습니다. 다시 말하지만 첫 번째 과정은 이것을 computational graph로 나타내는 것입니다. 이 경우의 graph를 볼 수 있습니다.
w와 x를 곱합니다. x0과 x0, x1과 x1,w2와는 이것들을 모두 더하게됩니다.
그리고 이것에 -1을 곱하고 exponential을 취하고, 1을 더합니다. 마지막으로 모든 term을 역수로 뒤집습니다. (1/x) 여기서도 값을 채워 놓았습니다.
우리에게 ws와 xs가 주어졌다고 했을때, 우리는 값을 이용해 모든 단계마다 계산을 통해서 앞으로(오른쪽 방향으로) 진행할 수 있습니다.
이전에 단순한 예제에서 했던 것과 같이 backpropagation을 진행할 것입니다. 다시한번 그래프의 뒤에서부터 시작합니다. 그리고 여기에서 최종 변수에 대한 출력의 gradient는 1입니다.
이제 다음 노드로 가봅시다. 1/x 이전의 input에 대한 gradient는 얼마입니까?
이 경우 우리는 upstream gradient를 알고 있습니다. 빨간색으로 쓰여있는 1입니다. 이것은 흐름에 따라 전파되는 gradient입니다.
이제 local gradient를 찾아야 합니다. 이 노드(1/x)에 대한 local gradient입니다. 우리가 가지고 있는 f는 1/x 이고, 이것의 local gradient인 x에 대한 f의 미분은 -1/x^2와 같습니다. (빨간 박스 참고)그래서 여기에서 우리는 -1/x^2를 얻습니다. 그리고 x에 값을 대입합니다. 이것(x)은 1.37이고,이 변수에 대한 우리의 최종 gradient는 1/-1.37^2 * 1 = -0.53과 같습니다.
다음 노드로 다시 이동해봅시다. 우리는 똑같은 과정을 거치게 될 것입니다. 여기에서 upstream gradient는 -0.53입니다. 그리고 현재 노드는 +1입니다. 아래의 유도식을 다시 살펴보겠습니다. (x+상수)에 대한 local gradient는 1입니다. 이제 chain rule을 이용하면 이 변수에 대한 gradient는 얼마입니까? upstream gradient는 -0.53이고, 우리의 local gradient는 1입니다. 그렇기 때문에 (gradient 는) -0.53이 됩니다.
한 단계 더 진행해봅시다. 여기에서 우리는 exponential을 가지고 있습니다. upstream gradient는 얼마입니까?, upstream gradient는 -0.53이죠. 여기에서 local gradient는 얼마일까요? 이것은 x에 대한 e의 local gradient가 될 것입니다. exponential 노드에서, chain rule에 의해 gradient가 -0.53*e^x임을 알 수 있습니다. (x의) 값이 -1인 경우 (exponential 노드에서) 최종 gradient는 -0.2가 됩니다.
노드가 하나 더 있습니다. 다음 노드는 -1과 곱하는 노드입니다. 여기에서 upstream gradient는 얼마인가요? -0.2 그리고 local gradient는 무엇이 될까요 유도식을 한번 살펴 보세요. local gradient는 x에 대한 f의 미분입니다. 그러므로 이 노드의 결과는 -1이 됩니다. (1 -1이 되므로) 그렇기 때문에 gradient는 -1 -0.2이므로 0.2가 됩니다.
이제 우리는 덧셈 노드에 도달했습니다. 그리고 여기에서 우리는 두 개의 노드와 연결됩니다. 일단 여기에서 upstream gradient는 얼마인가요? 그것은 0.2일거에요, 그리고 각 브랜치에 대한 gradient를 추가해봅시다. 이전의 간단한 예제에서 덧셈 노드를 가지고 있을 때 덧셈 노드에서, 각 입력에 대한 local gradient는 1이었습니다. 여기에서 local gradient는 upstream gradient 0.2와 한번 곱해질 것입니다. 맞죠? 1 * 0.2 = 0.2입니다. 그리고 우리는 아래(bottom) 브랜치에 대해서도 똑같이 할 것입니다. 같은 들어오는 gradient 0.2를 이용해서 그리고 총 gradient는 0.2입니다.
곱셈 gradients 에 대해 채워봅시다.
w₀과 x₀이 있는곳까지 가면 여기에서는 곱셈 노드를 가지고 있습니다. 이전에 보았던 곱셈 노드에서 input에 대한 gradient는 한 인풋에 대하여 다른 인풋의 값이었습니다. 이 경우 w₀에 대한 gradient는 얼마일까요? w0의 관점에서 upstream gradient 0.2를 가지고 있죠. 아래에 있는 다른 하나(x0)는 -1이기 때문에 -1과 0.2를 곱해 -0.2를 얻게 됩니다. x0에 대해서도 같은 과정을 반복하면 0.2 * 2를 하게 되므로 0.4를 얻게 됩니다.
우리는 w0과 x0에 대한 gradient 또한 같은 방법을 사용해 구했습니다. 그리고 주목하기 바라는 것은 우리가 computational graph를 만들 때, computational 노드에 대해 우리가 원하는 세분화된 정의를 할 수 있는 것입니다. 우리는 이번 케이스에서 덧셈과 곱셈, 절대적으로 작은 단위로 쪼갰습니다. 알다시피 덧셈과 곱셈은 더 단순해질 수 없습니다. 실제로 원한다면 이 노드들을 더 복잡한 그룹으로 묶을 수 있습니다. 우리는 그 노드에 대한 local gradient를 적어두기만 하면 됩니다.
예를 들어 sigmoid 함수를 보겠습니다.
이 예제에서 이것은
(1- sigmoid(x)) * sigmoid(x)
와 같습니다. 이것은 하나의 big 노드, sigmoid로 바꿀 수 있습니다.
입력이 1 (초록색으로 쓰여 있음) 출력은 0.73을 갖습니다. 이것은 sigmoid 함수에 연결하면 될 것입니다. 그리고 gradient를 얻기 원한다면 하나의 완전한 sigmoid 노드를 이용할 수 있습니다. 앞에서 이것의 local gradient를 유도했었습니다. 그것은 (1-sigmoid(x)) * sigmoid(x) 였죠. 즉 이것을 여기에 대입해봅시다. 알고있는 값은 x는 0.73이고 이 값을 위의 식에 대입하면 gradient로 0.2를 얻게 됩니다. 우리는 이것을 upstream gradient인 1과 곱합니다. 그러면 우리는 sigmoid gate로 바꾸기 이전의 작은 노드들로 계산된 값과 정확히 같은 값을 얻을 수 있습니다.
우리가 gradient를 뒤에서부터 가져오는 동안 이제 어떤 일이 일어나는지 봅시다. 직관적 해석으로 알 수 있는 패턴이 있습니다. 덧셈 게이트는 gradient를 나눠줍니다. 두 개의 브랜치와 연결되는 덧셈 게이트에서는 upstream gradient를 연결된 브랜치에 정확히 같은 값으로 나눠줍니다.
max 게이트 모양은 어떤 모양입니까?
아래에 max 게이트가 있습니다.
입력으로 z와 w가 들어오고 z는 2, w는 -1입니다. 그리고 최대값을 취한 다음에 그것을 통과시킵니다. 이것에 대한 gradient를 구해보면, upstream gradient는 2입니다.
이 것(max 노드)의 local gradient는 무엇일까요? z는 gradient 2를 가질 것이고 w는 gradient 0을 가질 것입니다.
maxgate는 gradient가 통과하는 효과입니다. 하나는 전체 값이, 다른 하나에는 0의 gradient가 향하게 됩니다.
mul 게이트 모양은 어떤 모양입니까? 아래에 mul 게이트가 있습니다.
이것을 gradient switcher라고 생각할 수 있습니다.
upstream gradient를 받아 다른 브랜치의 값으로 scaling 합니다.
mul node : w0 = x0 * upstream gradients 그래서 다른 브랜치 값을 사용하므로 스위쳐라 할 수 있습니다.
위의 노드들을 정리해보면
add gate : 분배기
max gate : 라우터
mul gate : 스위처
다른 주목할만한 것은 우리가 여러 노드와 연결되어 있는 하나의 노드를 가지고 있을 때 gradient는 이 노드에서 합산됩니다. multivariate chain rule을 사용하는 노드들에서 우리는 단지 각 노드들로부터 들어오는 upstream gradient 값을 취하고 그리고 이것들을 합합니다.이것들로부터 다변수 chain rule을 볼 수 있습니다.
만약 당신이 이 노드를 조금 변경시킨다면 그래프를 따라 forward pass를 할 때 연결된 노드들에게 영향을 미칠 것입니다. 그리고 당신이 backpropagation을 할 때 이 두개의 gradient가 돌아오면 이 노드에 영향을 미치게 될 것입니다. 따라서 이 값을 더해야 총 upstream gradient가 됩니다.
2) 벡터
이제 벡터가있을 때 어떻게 될까요? 우리의 변수 x,y,z에 대해서 숫자 대신에 vector를 가지고 있다고 합시다. 모든 흐름은 정확히 같습니다. 차이점이라면 우리의 gradient는 Jacobian 행렬이 될 것입니다. 그래서 이것들은 각 요소의 미분을 포함하는 행렬이 될 것입니다.
jacobian matrix : https://ko.wikipedia.org/wiki/%EC%95%BC%EC%BD%94%EB%B9%84_%ED%96%89%EB%A0%AC
입력은 4096차원의 벡터입니다. 그리고 이 노드는 요소별로(elementwise) 최대값을 취합니다. 우리는 f를 가지고 있습니다. 요소별로 0과 비교해 최대 값을 같는 x를 취하는, 그리고 출력 또한 4096 차원의 벡터입니다.
이 경우에 Jacobian 행렬의 사이즈는 얼마인가요?
Jacobian 행렬의 각 행은 입력에 대한 출력의 편미분이 될 것입니다.답은 4096의 제곱인데요 맞습니다. 그리고 4096*4096은 매우 큽니다. 그리고 실질적으로 이것은 더 커질 수 있습니다. 예로들면 100개의 인풋을 동시에 입력으로 같는 배치를 이용해 작업할 수 있습니다.
이제 computational graph에서 구체적인 벡터화 된 예제를 보겠습니다.
computational graph 를 그려보면 x에 의해 곱해진 W를 가지고 있고 그리고 L2가 뒤따릅니다.
W는 2x2 행렬인 것을 볼 수 있고 x는 2차원의 벡터입니다. 우리는 중간 노드를 다시 쓸 수 있습니다. 그것은 q로 할 것이고, W와 x의 곱입니다. 이것은 요소별 방식으로 쓸 수 있습니다. W1,1 x1 + W1,2 x2 등등 그러면 우리는 이제 f를 q에 대한 표현으로 나타낼 수 있습니다.
q의 두 번째 노드를 보면 이것은 q의 L2 norm과 같습니다. 이것은 q1의 제곱과 q2의 제곱을 합친 것과 같습니다. 네 이것을 채워넣었습니다.우리는 q를 구했고 최종 출력을 구했습니다.
이제 이것에 대해 backpropagation을 해봅시다. 출력에 대한 gradient를 가지고 있고 이것은 1입니다.
이제 한 노드 뒤로 이동합시다.우리는 L2 이전의 중간 변수인 q에 대한 gradient를 찾기 원합니다.
그리고 q는 2차원의 벡터입니다. 그리고 우리가 진짜 원하는것은 q의 각각의 요소가 f의 최종 값에 어떤 영향을 미치는지 입니다. 여기에 f식이 있습니다. 의 gradient를 볼 수 있습니다. 이것을 q1이라고 부르겠습니다.
기존 f(q) = q^2 을 미분하면 ,이것은 qi * 2가 될 것입니다.
각각의 요소 qi에 대해서. 우리는 또한 이것을 벡터의 형태로 쓸 수 있습니다. 이것은 우리의 벡터 q에 대해서 2를 곱한 것이었습니다. 그리고 우리는 이 벡터에서 gradient를 0.44와 0.52를 얻었습니다. 그리고 여러분은 그것이 q를 취해 단순히 2로 곱한것임을 보았습니다.
벡터의 gradient는 항상 원본 벡터의 사이즈와 같습니다. 그리고 gradient의 각 요소는 의미합니다.
W의 gradient는 무엇입니까? 그리고 여기에서 우리는 다시 chain rule을 사용할 것입니다.우리가 W에 대한 q의 local gradient를 계산하기 원한다면 요소별 연산을 다시 해야할 것입니다. 각각의 q에 대한 영향을 봅시다. W의 각 요소에 대한 q의 각 요소 그리고 이것은 이전에 말했던 Jacobian일 것입니다. 그리고 우리는 곱셈의 형태로 볼 수 있습니다. 여기에서 q는 W*x와 같습니다.
우리가 구하고자하는 값은 노란색 네모식입니다. 저 식을 구하기위해 위에서 구한 식과 chain rule을 이용해서 구하게 되면
2q(2x1)와 x의 전치행렬(1x2) , 이 두 개의 곱이 w 에 들어가는 것을 확인 있습니다.
이제 우리가 찾아야 할 마지막 것은 x에 대한 gradient입니다. dqk/dxi가 Wki와 같은 것을 볼 수 있습니다. 우리가 W에 했던 것과 같은 방식으로 그리고 다시 우리는 체인 규칙을 사용할 수 있습니다. 그리고 그것에 대한 총 표현식을 얻을 수 있습니다. 그리고 이것은 x와 같은 모양을 가진 x에 대한 gradient가 될 것입니다. 4 또한 이것을 벡터 형식으로 쓸 수 있습니다.
2W의 전치행렬(2x2) 와 q (2x1) 을 계산
우리는 각 노드를 local하게 보았고 upstream gradient와 함께 chain rule을 이용해서 local gradient를 계산했습니다.
여기에 forward pass, backward pass의 API가 있습니다. forward pass에서는 노드의 출력을 계산하는 함수를 구현하고 backward pass에서는 gradient를 계산합니다. 그래서 우리가 실제로 코드에서 이것을 구현한다면, 우리는 똑같은 방식으로 이 작업을 수행 할 것입니다. 각각의 gate에 대해 생각해 볼 수 있습니다.
특정 게이트에 대한 구현 살펴보면 여기에 곱셈 게이트가 있습니다.
forward pass
- x,y를 입력으로 받고 z를 리턴합니다.
backward pass
- 입력으로 upstream gradient인 dz를 받고 출력으로 입력인 x와 y에 gradient를 전달할 것입니다. 그래서 여기서 출력은 dx와 dy입니다.
그리고 이 예제의 경우 모든 것은 scalar 입니다.
forward pass를 보면 중요한 것은 forward pass의 값을 저장(cache)해야 하는 것입니다. 왜냐하면 이것(forward pass)이 끝나고 backward pass에서 더 많이 사용하기 때문입니다. 그리고 forward pass에서 x와 y도 저장하는데 backward pass에서 chain rule을 사용하여 upstream gradient 값을 이용해 다른 브랜치의 값과 곱합니다. self.y 와 dz를 곱해 얻은 dx를 보관하게 될 것입니다. dy에 대해서도 마찬가지입니다.
딥러닝 프레임워크 그리고 라이브러리를 보면 그들은 이러한 종류의 모듈화를 따르는데, 예를들면 Caffe는 유명한 딥러닝 프레임워크입니다. 이곳에서는 Caffe의 소스 코드를 볼 수 있습니다.
이 경우 sigmoid 레이어를 살펴볼 수 있습니다. 그것의 forward pass를 볼 수 있습니다. sigmoid 식과 똑같은 계산을 합니다. 그리고나서 backward pass로 전달합니다. 여기서 upstream gradient인 top_diff를 취합니다. 그리고 우리가 계산한 local gradient와 그것을 곱합니다.
What is neural net?
이제 신경망에 대해서 이야기 해 봅시다. single 변환을 사용하는 대신에 아주 간단한 형태의 신경망을 사용해봅시다. 위에 있는 것은 선형 변환식이고 다른 하나는 2층짜리 신경망의 레이어입니다. W1과 x의 행렬 곱입니다. 그리고 우리는 이것의 중간값을 얻고, 우리가 가진 max(0, W)의 비선형 함수를 이용해 선형 레이어 출력의 max를 얻습니다. 그리고 이 비선형 변환은 매우 중요합니다.
우리는 첫번째 선형 레이어를 갖고 있습니다. 그 다음 우리는 비선형 레이어를 가지고 있습니다. 그리고 이것의 위에 선형 레이어를 추가할 것입니다. 여기에서 최종적으로 우리는 score 함수를 얻을 수 있습니다.
두 레이어로 구성된 신경망에 대해서 이야기 했습니다. 그리고 우리는 더 많은 레이어를 쌓아 임의의 깊은 신경망을 구성할 수 있습니다. 우리는 이것을 한번 더 곱해봅시다. 다른 비선형 행렬 W3로 곱할 수 있습니다. 이제 우리는 3-레이어 신경망을 가지고 있습니다. 깊은 신경망이라는 용어가 나오게 됩니다. 복잡한 네트워크의 경우 이러한 계층을 여러 개 쌓는 아이디어에서 나옵니다.
신경망 중 하나를 학습하다보면, forward pass, backward pass를 완벽하게 구현하게 됩니다.
gradient를 구하기 위해 앞서 보았던 chain rule을 사용하게 됩니다. 2-레이어 네트워크의 전체 구현은 실제로 매우 단순합니다.
우리는 신경망이 무엇인지를 함수로써 살펴보았습니다. 알다시피, 우리는 신경망에 대한 생물학적 영감에 대해 많은 이야기를 하는것을 듣게 됩니다. 비록 분석이 실제로 loose 하지만 이것은 정말로 loose한 관계입니다. 이것에 대해서 간략하게 이야기해봅시다. 뉴런에 대해서 생각해보면 그것은 단순합니다.
뉴런의 다이어그램
우리는 각 뉴런을 따라 전달되는 신호를 가지고 있습니다. 우리는 서로 연결된 많은 뉴런을 가지고 있습니다.
- 각 뉴런은 수상돌기(dendrite)를 가지고 있습니다. 그것들은 뉴런에 들어온 신호를 받습니다.
- 우리는 세포체(cell body)를 가지고 있습니다. 이것은 기본적으로 들어오는 신호를 종합합니다. 이것들을 받아 합친 후에 모든 신호는 하류 뉴런과 연결된 다른 세포체로 이동합니다.
- 이것은 축삭(axon)을 통해 운반됩니다. 지금까지 우리가 해왔던 것을 보았을 때 각 computational node는 실제 동작과 비슷한 방식으로 볼 수 있습니다.
노드가 computational graph에서 서로 연결되어 있고 입력 또는 신호는 x입니다. 뉴런에 들어가는 것처럼 모든 x0, x1, x2, 모든 x는 우리의 가중치 W와 결합되어 합쳐집니다. 우리는 일종의 계산을합니다. 우리가 해왔던 일부 계산에서는 W를 x와 곱하고 b를 더했습니다. 모든것을 통합하였고 그리고 활성 함수를 꼭대기에 적용했습니다. 출력 값을 얻었고 아래로 연결된 뉴런에 전달했습니다.
여러개의 뉴런과 연결된 시냅스, 그리고 수상돌기는 세포체로 이 모든 정보를 합칩니다. 그리고 나서 우리는 출력을 실었습니다. 이것은 표현할 수 있는 일종의 비유입니다
-
2 layer neural net = 1 hidden-layer neural net
-
3 layer neural net = 2 hidden-layer neural net
Author And Source
이 문제에 관하여(CS231n - lecture 4: backpropagation and nueral networks), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dothe7847/CS231n-lecture-4-backpropagation-and-nueral-networks저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)