오늘은 cs231n 4강을 제 소신껏 정리해 보도록 하겠습니다.
우리는 저번 3강 때 score function , SVM의 loss인 hinge loss, softmax loss ( cross entropy loss ) , 규제 ( regularization ) 등 배웠습니다.
Optimization에 대해서도 알아보았습니다. 여기서 경사하강법을 배웠습니다.
일반적으로 계산하는 방법은 numerical 방법입니다. 근데 이거는 속도가 느리고 정확하지 않다는 단점이 있습니다.
그래서 우리는 해석적 방법인 analytic 방법을 많이 사용하고 보통 gradient check를 할 때 numerical gradient를 사용한다고 배웠습니다.
앞서 배웠던 내용을 그림으로 표현하면 위와 같은 그림이 될 것입니다.
Ws가 곱해져서 들어오고 그 score값을 function에다가 넣고 거기에 + 규제를 해서 loss가 나오게 되는 것입니다.
AlexNet, Neural Turing Machine이 있는데 이런 그림과 같은 층을 계속 이어서 이렇게 네트워크를 쌓게 되는 것입니다.
지난 시간에 배웠던 gradient를 자세히 살펴 보겠습니다.
어떻게 gradient를 이용하여 가중치를 업데이트 시키는지 자세히 배울 것입니다.
여기서 backpropagation을 배우게 될 것입니다.
위 그림과 같이 간단한 예제가 있다고 가정을 해봅니다.
(x+y)z식으로 표현되어 있고 x = -2 이고 , y = 5 , z = - 4 라고 가정을 해보겠습니다.
이제 차례대로 더하고 , 곱하면 이렇게 초록색 값이 나오게 될 것입니다.
우리는 이것을 알아야 합니다. x가 f에 미치는 영향, y가 f에 미치는 영향 마지막으로 z가 f에 미치는 영향을 알아야 합니다.
이 부분을 미분 식으로 표현하면 Want 오른쪽에 홰당하는 식이 될 것입니다.
그렇다면 해는 어떻게 구할까요 ..?? 이거를 바로 미분으로 구하게 됩니다.
미분을 구할 때 필요한 식을 몇 개 써보도록 하겠습니다.
q = x+y 식에서 dq/dx = 1 , dq/dy = 1 입니다.
이것은 편미분이겠죠 ? 그리고 f=qz에서 df/dq = z 이고 df/dz = q 입니다.
보면 여기서 한가지 특징이 있습니다.
덧셈 연산에서 미분은 1이고 곱셈 연산에서는 서로의 값을 가지게 되는 것입니다. 이게 무슨말이냐면 qz에서 미분을 하면 z에 대해서 미분을 하면 q가 나오고 q에 대해서 미분을 하면 z가 나오는 것입니다.
이제 계산을 해보겠습니다.
앞에서 forward식으로 구했습니다.
이제 각 값이 최종 f에 영향을 미치는 정도를 파악하기 위해서 gradient를 계산합니다.
F가 f에 영향을 미치는 것은 당연히 1일 것입니다.
이제는 z가 f에 영향을 미치는 정도를 확인해 보겠습니다.
앞에서 이미 구해놓았기 때문에 q의 값인 3을 확인할 수 있습니다.
위 그림에서 확인 가능하듯이 3이 나옵니다.
이제 q가 f에 미치는 영향을 알아 보겠습니다.
똑같습니다.
앞에서 구했듯이 z가 될 것이며 z값인 -4가 될 것입니다.
위 그림처럼 -4가 될 것입니다 !
이제 y가 f에 미치는 영향을 알아 볼 것입니다.
다른 문제와는 별개로 바로 구할 수 없습니다.
그래서 chain rule이 적용이 되고 , Chain rule은 미분에서 사용되는 방법입니다.
만약 x가 f에 대해서 영향을 미치는 값을 알고 싶으면 x-> q-> f 이므로
x가 q에 미치는 영향 * q가 f에 미치는 영향을 구하면 됩니다.
근데 q가 f에 미치는 영향은 이미 알고 있습니다.
간단한 미분식으로 아까 구했기 때문입니다.
그리고 x+y의 미분은 1이라고 이미 구해놓았습니다.
그래서 이걸 local gradient라고 부릅니다.
이 local gradient는 forward passing을 하면서 그냥 구해버릴 수 있기 때문에 미리 값을 가지고 있습니다.
그러면 이제 y가 q에 미치는 영향만 알면 됩니다.
근데 이미 그 값을 알고 있습니다.
바로 1입니다.
그래서 1 * q 의 값 ( - 4 ) 를 곱하면 - 4 가 됩니다.
x도 마찬가지 입니다.
위에서 구한 것 처럼 x또한 똑같이 구해줍니다.
그래서 qz나 x+y 같은 미리 구할 수 있는 미분 값을 local gradient라고 합니다.
이 local 값과 앞에서 넘어온 gradient 를 global gradient라고 하는데 이 값을 곱해서
gradient를 계산합니다.
위 와 같은 과정들은 앞에서 말한 과정을 그림으로 나타낸 것입니다.
그림으로 확인해 보면 대충 감이 오시나요~!?
이렇게 보면 생각 보다 간단한데 (?) 라고 생각할 수 있습니다.
그러나 이 부분은 빙산의 작은 일부이죠.
실제로는 더 많은 node들이 있을 겁니다.
그래서 여기서 구한 gradient를 다시 뒤로 보내고 ( global gradient 값 ) 그리고 뒤에 있는 local gradient와 이 받은 global gradient를 곱해서 다시 구하고 다시 구하고 다시 구하고 .... 이 과정을 반복하게 되는 것입니다.
반복되는 과정을 통해서 적절한 gradient를 찾아 가게 되는 것입니다.,
이제 조금 더 심화된 내용을 알아 볼 것입니다.
시그모이드라는 것을 구해볼 것입니다.
시그모이드도 미리 계산하기 편하도록 local gradient의 식을 써봅니다.
위 그림처럼 4개의 식이 될 것입니다.
그림을 보시면 아시겠지만 맨 처음 gradient는 당연히 1이 될 것입니다.
다음을 보겠습니다.
1.37 쪽 기준에서는 global gradient는 1이 될 것이고 1/x 이니까 local gradient는
-1 / x ^ 2 가 됩니다.
- 1 / 1.37 ^ 2 와 1을 곱하면 되는 것이므로 gradient 는 -0.53이 나오게 됩니다.
다음을 구해 보겠습니다.
0.37 기준에서는 global gradient가 -0.53이 됩니다. 근데 여기서 local gradient는 1이므로
1 * -0.53을 하면 -0.53이 됩니다.
이런식으로 쭉 구해시면 될 것입니다.
exp를 하는 부분에서 보면 global gradient는 -0.53입니다.
local gradient는 e ^x 값 즉 e ^ -1 이 되므로 -0.20이 나오게 됩니다.
그 다음은 0.2가 나오게 되고 , 이제 덧셈 연산을 거치면 다시 0.2가 나오게 되고 그림들 처럼 쭉- 구해주시면 됩니다.
뒤에서 나오는 과정들은 앞에서 했던 과정과 똑같습니다.
구해주시면 계산값이 나올 것입니다 .
위 그림들 처럼 쭉- 구해보실 수 있습니다.
근데 여기서 다른 장점을 하나 살펴볼 수 있습니다.
시그모이드에 대한 값인데요. 이 파란색 네모 쳐진 부분이 바로 시그모이드죠 !!
여기를 sigmoid gate라고 할 수 있습니다. 앞에서는 여기를 일일이 구했지만 굳이 그럴 필요가 없습니다.
sigmoid 게이트가 들어가기전 gradient는 시그모이드 값인 0.73을 기준으로 (1-0.73)(0.73)으로 구할 수 있는 것입니다
즉 굳이 복잡하게 구하지 않고도 바로 구할 수 있는 것입니다.
위 그림을 보겠습니다.
여기서 보시면 gradient의 특성을 알 수 있습니다.
바로 add,mul 등의 gate에 대한 특징입니다.
add는 local gradient가 1입니다. 그래서 global gradient를 하면 local이 1이기 때문에
global gradient가 그대로 나오게 됩니다. 즉 , add gate는 gradient를 그대로 전해주는 역할을 하게 됩니다.
그래서 distributor 라고 불립니다.
max게이트가 있는데 Max gate는 큰 값에게 gradient를 그대로 전달하고
작은 값은 0으로 만들어서 보내는 것입니다.
위 그림처럼 말입니다.
위 그림에서 보이는 것과 같이 mul ( 곱하기 ) 가 있었는데요.
곱하기는 서로의 값을 교환할 때 사용합니다.
qz라고 하면 q는 z의 값을 가지게 되는 것이고 z는 q의 값을 가지게 되는 것입니다.
즉, 이 친구는 스위칭의 역할을 하게 되는 것입니다.
그래서 mul gate는 switcher라고도 불립니다.
그런데 말입니다.
위 그림처럼 gradient가 1개가 아니라 여러 개면 어떻게 될까요??
그러면 그냥 복수의 gradient를 더해줍니다.
근데 우리는 이게 하나의 값이 아니라 다변수일 확률이 높습니다.
보통 딥러닝이 그렇다고 하죠 !?
그럴때는 자코비안 행렬 방식으로 되게 됩니다.
자코비안 행렬은 다변수 함수일때의 미분값입니다.
이걸 행렬로 표현한 것이죠 !!
그래서 input이 이제 d 차원의 벡터가 들어가게 됩니다.
그리고 output도 d 차원의 output이 됩니다.
그럼 jacobian matrix의 크기는 어떻게 될까요 ??
input도 4096이고 output도 4096이니까 4096 x 4096이 될 것입니다.
위 그림을 보시면 그렇습니다 !!
여기에 minibatch를 추가하게 되면
예를 들어서 100개씩이면 100을 곱해야 할 것입니다.
그래서 409600 x 409600 이 됩니다.
숫자로도 느껴지죠 ! 매우 거대한 양입니다.
그런데 실제로는 이 거대한 양의 자코비안 행렬을 계산하지 않습니다.
첫번째 차원은 오직 출력의 해당 요소에만 영향을 주기 때문에 요소별로 보일것입니다.
그렇기 때문에 자코비안 행렬은 대각행렬이 됩니다.
그래서 실제로 이 전체 jacobian 행렬을 작성하고 공식화할 필요가 없는 것입니다.
우리는 출력에 대한 x의 영향과 이 값을 사용하는 정도로만 알고 있으면 될 것입니다.
그리고 계산되어 나온 gradient를 채워 넣는 것이고 , 이렇게 사용되는 구나 ~ 정도로만 알면 될 것입니다.
이제는 앞에서 본 graph보다 더 구체적인 것을 확인해 볼 것입니다.
위 예시를 보면 규제값을 넣은 뒤 x에 의해 곱해진 w의 L2처럼 만듭니다.
위 경우를 보겠습니다
이 경우 x를 n-차원이라고 하는 w는 n^*n이라고 합시다
그림을 그려보면 위와 같은 그림이 될 것입니다.
그런 다음 앞에서 한 것처럼 q=wx이고 w와 x가 각 값이 위처럼 된다고 가정을 해봅니다.
이제 행렬곱을 하면 아래 식처럼 되고 우리는 L2 정규화를 했으니 제곱을 하게 될 것입니다.
계산을 해보아야 할 듯 합니다.
위에 0.22는 어떻게 해서 나오게 된 것일까요??
0.1 * 0.2 + 0.5 * 0.4 를 해서 0.22가 나오게 된 것입니다.
0.26은 위와 똑같은 방법으로 -0.3 과 0.8 을 0.2와 0.4에 각각 곱해준 뒤 더해준 값이 되겠군요.
0.22를 제곱하면 0.048 , 0.26을 제곱하면 0.067이 나오게 됩니다.
이 둘을 더하면 0.116이 나오게 됩니다.
이제 gradient를 구해볼 것입니다.
맨 처음은 1이 될 것입니다.
위 그림에서와 같이
df에 qi가 미치는 영향은 2qi 이므로 우리는 2q값을 취합니다.
그래서 local gradient 가 2q이고 global이 1이므로 0.44, 0.52값이 각각 나오게 됩니다.
그리고 우리는 새로운 식을 보게 될 것입니다.
dwi,j일 때 dqk를 구해야 합니다.
쉽게 말하자면 w가 q에 미치는 영향을 구하는 것입니다.
그리고 1 = k = ixj가 있는데요.
이것은 k가 i일 때 1이라는 것입니다.
그리고 아닌 것은 0으로 두게 되는 것입니다.
왜 이렇게 두냐면 행렬에서 값을 계산할 때 각 행의 계산 시에 다른 행은 관여하면 안되기 때문입니다.
참고로 i는 행 , j는 열입니다.
그래서 이 식에 대해서 미분값을 구하게 되면 앞 그림처럼 나오게 됩니다.
뭔가 수식이 많고 어지럽고 확 와닿지 않을 거란 생각이 드는데요.
천천히 보면 아 ~ 이런게 있구나 라고 생각이 들 것 같기도 합니다.
시그마 k옆에 df/dqk 는 k 일때 q가 f에 미치는 영향 * w가 q에 미치는 영향입니다.
우리는 앞에서 보았던 chain rule 이 생각이 날까요..?!
chain rule이 다차원을 만나면서 조금 복잡해진 것이지만 원리는 똑같다고 생각하면 됩니다!!
결국에는 2qixj가 됩니다.
그렇다면 행렬의 계산값을 보겠습니다.
어떻게 0.088 이 나왔을까요??
바로 앞에서 온 gradient인 0.44 * 0.2 을 했기 때문에 0.088이 나옵니다.
왜냐하면 이제 2x2 행렬이 나와야 하기 때문입니다.
그래서 x를 전치시킵니다.
그래서 2x1 행렬이었던 x가 1x2로 되고 앞에서 온 행렬은 2x1이므로
2x1 행렬 곱하기 1x2 행렬 이니까 2x2 행렬이 나오게 됩니다.
그렇게 해서 다른 것들도 곱해줘서 구해주면 행렬의 값이 나옵니다.
위 그림을 보겠습니다.
위 식은 우리가 유도하였던 식을 벡터화된 형식으로 표현해 본 것입니다.
위 그림을 보겠습니다.
빨간색으로 무엇인가 써져있는데요.
중요한 것은 변수에 대해 gradient를 항상 체크하는 것입니다.
이것들은 항상 변수와 같은 shape를 가지고 있습니다.
더 설명해 보자면, gradient가 무엇인지 계산을 했으면 이 결과가 변수의 shape와 동일한것인가(?) 를 체크해야 합니다.
이부분을 체크하지 않는다면 에러를 낼 수 있습니다.
변수와 같은 shape를 꼭 !! 가지고 있어야 합니다
위의 그림 처럼 dqk / dxi 도 알아 보겠습니다.
x가 q에 미치는 영향인데요.
이건 wk,.i 입니다.
이걸 더 자세하게 식으로 계산하면 시그모이드 k dk/dqk * dqk / dxi 가 됩니다.
앞에서 했던 것과 똑같습니다.
chain rule을 적용한 것입니다.
아까 위에서 한 것과 같이
이번에는 w가 전치가 됩니다.
w가 전치가 되면 첫번째 행은 [ 0.1 , -0.3 ] 이 되고 두번째 행은 [0.5 , 0.8 ]이 됩니다.
그래서 0.1 * 0.44 + -0.3 * 0.52를 하게 되면 -0.112가 됩니다
0.636 도 마찬가지로 구해주면 됩니다.
위 그림들은 아까 위에서 보았던 식을 코드화 하면 이렇게 된다는 것을 보여주고 있습니다.
곱셈에 대한 클래스는 forward 시에는 그냥 곱하지만
backward 시에는 어떻게 되는 걸까요?
x일 때는 y의 값을 / y일 때는 x의 값을 구합니다
여기서는 스칼라이니까 '전치'가 적용되지 않고 그냥 구하면 됩니다.
벡터는 당연히 '전치'가 들어가게 됩니다
파이썬 numpy에선 , T연산자로 간단하게 전치가 가능합니다
caffe에 있는 layer를 설명해주고 sigmoid가 어떻게 되어 있는지 설명해 주고 있습니다.
아 ~ 이런게 있구나 라고 생각하고 넘어 가겠습니다.
이제는 Neural Networks라는 것에 대해서 알아볼 것입니다.
예전에 단순한 linear 한 score를 알아봤습니다.
F = Wx 입니다.
그런데 이제는 basic한것이 아니라
W2max(0,W1x)와 같이 됩니다.
Rule에서 이렇게 사용이 됩니다.
위 그림을 보겠습니다.
처음에 3072개의 x가 들어오면 w1와 곱해져서 중간인 h(hidden)노드에 들어가고
이 hidden node를 통해 나와서 다시 10개의 출력값 ( CIFAR - 10 ) 이 나오게 됩니다.
위 그림을 보겠습니다.
hidden layer가 하나 더 생기게 된 것입니다.
과거에는 그냥 하나의 분류기로 판단했던 것과는 다릅니다.
위 그림은 우리가 과거에 봤던 하나의 분류기로 했던 것입니다.
말 머리가 2개로 보이는 등 잘 분류가 되지 않았던 기억이 있습니다.
근데 이제는 그렇지 않죠
히든 노드가 100개면 우리는 서로 다른 100개의 분류기를 가지고 있는 것이기 때문입니다.
3 - layer가 존재한다면 위와 같이 될 것입니다.
위 그림들을 보겠습니다.
뉴런인데요.
뉴런은 사실 신경망입니다.
우리 뇌속의 뉴런이죠.
그래서 하나의 input이 들어오면 axon을 거쳐서 다른 뉴런으로 들어가게 됩니다.
서로에게 영향을 미치는 것입니다.
위 그림을 보겠습니다.
위 그림은 우리가 지금까지 알아보았던 내용과 비슷해 보입니다.
input이 있으면 그것에 따른 w를 곱해서 그걸 어떤 활성화 함수를 통해 output으로 나가는 형태와 비슷해 보이네요.
활성화 함수는 우리가 전에 배웠던 시그모이드 ( sigmoid ) 함수 같은 것이 될 것입니다.
코드로 보면 위와 같은 그림이 된다고 하네요 !
그러나 여기서 주의해야할 것이 있습니다.
실제로 생물학 뉴런은 많이 다르고 우리가 만드는 이 뉴런 네트워크가 실제와는 많이 다르다는 것 입니다.
그래서 우리는 지금 딥러닝에서 만드는 모델을 실제 신경망과 같다고 판단하면 안될 것이다 라는 내용을 알려주고 있습니다.
그리고 우리는 지금까지 activation functions를 sigmoid를 계속 보았습니다.
실제로는 이렇게 다양한 활성화 함수가 있다는 것을 알려주고 있습니다.
보통은 ReLU를 많이 사용한다고 합니다.
우리가 앞에서 봤던 이 2-layer or 3 - layer 는 서로 fully 하게 connected 되어 있습니다.
그러나 fully connected 라고 합니다 .
그래서 줄여서 fc라고도 많이 불리운다고 하네요
4장은 이렇게 마무를 하겠습니다.
'컴퓨터비전' 카테고리의 다른 글
#IT #먹방 #전자기기 #일상
#개발 #일상