'2018/02'에 해당되는 글 3건

  1. 2018.02.28 전미분, 편미분, Gradient에 대해 2
  2. 2018.02.27 공부할 때 참고한 자료들
  3. 2018.02.26 신경망 글을 시작하면서..

나와같은 수알못이지만 신경망을 공부하고 싶은 사람들을 위해 기초공사부터 지으려고 한다.

신경망 건물의 모퉁이 돌은 미분이다. 

미분을 모르면 남들이 만들어 놓은 망에 데이터를 넣어서 사용은 할 수 있겠지만,

망이 어떻게 동작하는지 이해할 수 없다.

그렇다고 해서 미분의 아주 심오한 부분까지 소개하려는 의도는 아니니 걱정마시길..

그런거는 나도 모른다...

(미분 무서워..)

1. 미분

어떤 공돌이가 위에 있는 그림같은 기계를 만들었다.

이 기계는 온도센서를 하나 가지고 있고 측정된 온도 a에 따라 전압 z를 출력한다.

그리고 전압 z와 온도 a사이의 관계는 f(a)와 같다.

이 기계에서는 온도 a가 만큼 변하면, 전압 z는 만큼 변한다.

바꿔 말하자면, 이 기계에서 a에 대한 z의 변화량은 와 같다고 쓸 수 있겠다.

그럼 여기서 문제! "를 알고 있을 때, a가 만큼 변하면 z는 얼마만큼 변할까?

아마 초등학교 의무교육을 마친사람이라면 누구나 대답할 수 있을 것 같다.

만큼 변한다.

어렵게 수식으로 썻지만 당연한 이야기다.

미분은 여기서 a가 변한 정도가 어마무시하게 째끔할 때인 경우를 이야기한다.

a가 어마무시하게 째끔 변한 량을 라고 해보자.

그럼 z도 어마무시하게 째끔 변한다.

째끔 변했다는 의미로 대신 d를 써보자. 그럼 위에서 쓴 수식은 아래와 같이 변한다.

윗 식에서 dz/da는 미분이라고 하고 a가 째끔 변할 때 z가 얼마나 째끔변했는지를 의미한다.

미분을 알고, a가 얼마나 째끔 변했는지 알 수 있다면 위 식으로 z가 얼마나 째끔 변했는지를 알 수 있다.

그런데 아래와 같이 2개의 input이 있는 경우는 어떻게 입력값과 출력값의 변화량 (미분)을 알 수 있을까?

 

(다! 변! 수!)

 

2. 다변수 함수의 미분 (편미분, 전미분)

누가 아래와 같은 기계를 또 만들어놨다. 왜 만들어 놨는지 모르겠지만 만들었다..

이 기계로 말씀드리자면(...)

이전 기계와 마찬가지로 온도 a를 측정하고, 여기에 추가로 무게 센서를 달아 무게 b를 측정한다.

그리고 온도 a와 무게 b를 고려하여 전압 z를 출력한다.

입력인 온도 a, 무게 b, 출력인 전압 z사이에는 f(a,b) = z의 관계가 있다.

 

골치가 아프다. 아까는 변하는게 온도 a 한개만 변했는데 이젠 무게 b까지 변한다.

하지만 단순화 시켜서 생각해보자면, 아래와 같이 두가지 경우로 나누어 생각할 수 있을 것 같다.

첫번째는 1개 변수만 변하는 경우. (편미분)

그리고 두번째는 모든 변수가 다 변하는 경우. (전미분)

 

첫 번 째로 변수 1개만 변하는 경우를 살펴보자

여기서는 a한개만 변한다. 그럼 이때, a가 쬐끔 변한다고 하면 z는 얼마나 째끔 변할까?

요렇게 쓰면 어떨까? 맞는것 같다.

그런데 여기에는 표기상의 문제가 있다. 앞서 살펴본 변수 1개만 있는 경우랑 똑같다는 것이다.

그래서 우리는 z가 다변수 함수라는 것,

그리고 다른 변수는 다 가만히 있는데 a만 움직인다는 것을 알리기 위해 아래와 같이 표기한다.

d가 살짝 꼬부라진 편미분 기호로 바뀌었다. 우리는 윗 식을 z의 a에 대한 편미분이라고 부르고,

이것을 통해 다변수 함수 f(a,b) = z에서 변수 a만 째끔 변할 때, z가 얼마나 째끔 변하는지 알 수 있다.

그럼 이전에 온도센서만 달린 기계에서 했던 것 처럼,

이제 우리는 z의 a에 대한 편미분과 a가 얼만큼 째끔 변했는지 da를 알고 있다면,

아래와 같이 z가 얼마나 째끔 변했는지 알 수 있다.

 

그럼 모든 변수가 변하는 경우, z는 얼마만큼 변할까?

정답은 개별 변수가 변할 때, 변하는 dz를 모두 더한것 만큼 변한다.

수식으로 써보자면 이렇다. 그리고 우리는 이걸 전미분이라고 부른다.

 

수식으로 보자면 어려운데, 이렇게 설명해 보면 좀 더 쉬울 것 같다.

온도는 1도 올라갈 때 전압이 1V올라간다.

무게는 1kg 올라갈때 전압이 2V 올라간다.

그럼 온도를 1도 올리고 무게를 2kg올리면 전압은 얼마나 높아질까? 5V가 높아진다.

 

때때로 수학기호는 당연한 이야기를 어렵게 전달하기도 한다...

 

3. Gradient

Gradient의 정의는 아래와 같다.

여기서 v는 f가 가지는 입력변수를 의미한다. (때때로 v를 생략하기도 한다.)

는 nabla라고 하는 연산기호로 아래와 같은 식을 의미한다.

위 온도센서, 무게센서를 가진 기계에서는 f는 a, b두가지 변수를 가지므로 v는 a, b라고 보면 된다.

Gradient의 각 요소는 모든 개별 입력변수에 대한 함수 f의 편미분 값이이다.

 

좀 어려워 지는것 같은데 사실 어려울 것이 없다.

정의라고 했으니까 이건 그냥 Gradient를 이렇게 쓰기로 하겠다는 약속이다.

따라서 그냥 우리는 이걸 받아들이면 되는거다.

 

중요한 것은 Gradient의 성질이다.

사실 다음 줄의 말을 하려고 구구절절 미분 부터, 편미분, 전미분을 이야기 한 것이기도 하다.

 

"입력변수 평면의 한 점에서 구한 Gradient는 해당 위치에서 f가 가장 크게 증가하는 방향을 가리킨다."

"그리고 그 Gradient의 크기는 얼마나 크게 f가 해당방향으로 변하는지 알려준다."

 

개인적으로는 신경망 알고리즘에서 가장 중요한 내용이 이게 아닌가 싶다.

그림으로 설명해 보자면 이렇다.

 

위 그림은 f의 그래프다.

f가 입력변수 2개를 가지고 있으니까 위와 같이 z축이 f값, x,y 축이 각각 a,b인 3차원 그래프가 될 것이다.

하지만 f가 입력변수를 100개 가진 함수라고 해도 뭐 상관 없다.

z축을 f 값, x,y 평면의 한 점이 (x1, x2, x3, ... , x100) 에 해당하는 한 입력세트라고 생각하면 된다.

여튼 이때 A점에 해당하는 입력값 v는 A에서 바닥평면에 수직으로 내려 찍은 한 점이 된다.

그리고 이 점에서 f에 대한 gradient는 검정 화살표가 된다.

 

근데 이 화살표는 f가 가장 많이 증가하는 방향을 가리키고 있다.

화살표의 크기가 크면 클 수록 더 크게 해당방향으로 증가한다고 보면 된다.

 

B점에서는 어떨까?

B점에 해당하는 입력변수 v는 A에서와 마찬가지로 점 B에서 바닥평면에 수직으로 내려 찍은 한 점이 된다.

여기서는 f가 대체로 완만하게 변하기 때문에 빨간 gradient 벡터 의 크기는 작다

물론 여기서도 gradient 벡터의 방향은 해당 지점에서 f가 가장 크게 증가하는 방향을 가리킨다.

 

별거 아닌것 같은 성질이지만, 이 Gradient의 성질이 모든 신경망을 낳았다. 꼭 기억해 두자. 

다음에 SGD (stochastic gradient descent) 기법을 설명하면서,

왜 Gradient가 모든 신경망을 낳았다고 하는지  다시 설명하도록 하겠다..

 

'이론 > 신경망' 카테고리의 다른 글

He 초기화 구현 in tensorflow  (0) 2018.09.19
tensorboard 간단 요약  (0) 2018.09.13
인공신경망과 학습  (0) 2018.03.05
공부할 때 참고한 자료들  (0) 2018.02.27
신경망 글을 시작하면서..  (0) 2018.02.26
Posted by 굿쟌
,

1. http://neuralnetworksanddeeplearning.com

 처음 신경망을 공부하려고 마음먹고 공부한 자료다. MNIST Hand writing 문제를 가지고 neural network와 CNN까지 설명한다. 장점이라면, 쉽게 설명되어 있으면서도 Regularization, dropout, softmax, gradient vanishing등 전반적인 문제를 다루고, tensor레벨이 아니라 수식레벨에서 SGD와 Back Propagation을 유도하고 있어서 다소 이해가 쉬웠던 것 같다. 단점이라면 이 수식 유도를 일부만 보여주고 독자들에게 해보라고 시킨다는 것.. (내가 할 줄 알았으면 이걸 안 봤겠지..)

( 저자가 보는 나의 수식유도.. )

그리고 나중에 Tensor레벨의 back propagation을 이해하기 위해, 계산그래프를 이용한 Back Propagation유도와 Tensor 미적분 내용을 다시 찾아 봐야 했다는 것도 좀 단점이라면 단점이겠다.. 하지만 전체적으로 입문서로 보기에 231n 보다 좋은 것 같다. (참고로 샘플코드도 제공한다)

 

2. 밑바닥부터 시작하는 딥러닝 / 한빛 미디어 / 사이토 고키 저, 개앞맵시 역

물고기 책이다. 한글로 되어 있어서 1번보다 가독성이 좋은 장점이 있다. 계산 그래프 방식으로 back propagation을 소개하고 있어서 1번 자료를 정독하고 나서 읽었다. 1번 자료는 개별 데이터 단위, 계별 뉴런 단위로 back propagation을 유도해서 설명하다보니, 거기서 배운 것을 바로 layer단위, tensor 단위로 이뤄지는 back propagation에 적용하기 어려워서 이 책에서 설명하는 계산그래프를 공부했다.

책에서 설명하는 주제들은 대부분 1번 자료에서 다루는 주제와 겹친다. 하지만 설명만 놓고 보자면 1번 자료보다는 디테일이 좀 떨어지는 것 같다는 생각이 든다. 그래서 1번 자료를 한번 정독하고 보면 좋을 것 같다.

단점이라면 이놈의 책도 은근슬쩍 어려운 수식유도는 독자에게 넘긴다. 예를 들자면 affine계층의 backward pass를 유도할 때 "실제로 전개해 보면 다음 식이 도출 됩니다. [식 5.13]으로 이끄는 과정은 생략합니다." 라고 쓰고 유도를 안한다. 수식을 유도할 수 있어야 뭔가를 이해한 것 같다고 생각하는 사람에게는 상당히 찜찜한 전개다.

(필요한 만큼 못봤는데...)

그래서 한동안 Tesnor 미분을 어떻게 해야 하는지, Tensor 미분에서 chain rule은 어떻게 생각해야 하는지 한동안 자료를 찾아 구글을 떠돌아 다녔다. 그래도 상당히 친절한 편이며 코드를 제공하고 있어서 처음에 같이 따라해보면서 배우기에는 좋은 책인 것 같다.

 

3. cs231n (http://cs231n.stanford.edu/)

"딥러닝 입문자의 바이블이다." 라고 들었는데 실제로 나는 나 혼자 먼먼길을 돌아돌아 지금 이제서야 이걸 공부하고 있다. 하지만 1번 자료, 2번 자료를 어느정도 보고나서 공부하고 있기 때문에 그나마 이해를 하고 있는게 아닌가 싶다. 강의 비디오와 강의 노트가 제공되는데 강의 비디오를 아무 사전지식 없이 봤다면 영어 청취가 잘 안되는 나로서는 뭔소리인지 이해를 못하지 않았을까 싶다. 바이블인만큼 가장 많은 참고자료를 찾을 수 있어서 좋긴하다.

( 영어 잘하고 싶다.. )

'이론 > 신경망' 카테고리의 다른 글

He 초기화 구현 in tensorflow  (0) 2018.09.19
tensorboard 간단 요약  (0) 2018.09.13
인공신경망과 학습  (0) 2018.03.05
전미분, 편미분, Gradient에 대해  (2) 2018.02.28
신경망 글을 시작하면서..  (0) 2018.02.26
Posted by 굿쟌
,

 인공지능 연구실에서 석사과정을 마쳤다. 석사 과정 때 지문인식과 얼굴인식 관련 연구를 했는데, 당시 첫번 째 연구 목표가 "생체인식 기능을 스마트 카드에 이식하는 것" 이었다. 두번 째는 얼굴과 지문을 잘 대표할 수 있는 양질의 feature를 뽑아 내는 것, 마지막wish 수준의 주제가 뽑아낸 feature간 유사도를 잘 판별 할 알고리즘을 찾는 것이었다. 지금와서 생각해보면 운이없게도 연구목표를 잘못 잡았다는 생각이 든다. 지금은 스마트카드와 아무 상관 없는 일을 하고 있는데...

(사실 목표를 잘 못 잡아서가 아니라, LoL때문에 더 많은 시간을 허비했다..)

 당시에 다른 연구생들은 계량기 숫자인식 프로젝트를 하면서 여러 분류기를 다뤘다. 그 중 하나가 신경망이었는데, 지도교수님께 뭘 물어보기만 하면 "응.. 신경방에다가 돌려봐"라고 하셨던 기억이 난다. 당시에는 feature base의 알고리즘이 주류를 이룰때라 "뭐만 하면 신경망이구만.. 그렇게 아무데나 갔다 붙여도 되나.." 하고 생각했다.

 그런데 그것이 실제로 일어났다... 이제는 신경망이 아니라 Deep Learning 이라는 이름을 달고 나와 세상을 바꿔 나가고 있고, 오만간데 심층신경망을 적용 했다는 뉴스가 나온다. 그래서 뒤늦게 나마 학부 때 잠깐 배웠던 기억을 떠올려 요즘 다시 deep learning을 공부하고 있는데 너무 어렵다..뭐 하나 배우면 다른걸 까먹고.. 원래 CS가 다 그렇지만, 수학이 너무 많다 수학공부좀 잘 해 놓을껄....

 여튼 그래서 여디가다 공부한걸 정리 해보려고 한다. 나중에 휙 보고 다시 기억이 떠올랐으면 좋겠다. 아울러 혼자 끙끙대며 공부하는 다른 사람들에게도 작은 도움이 되었으면 좋겠다. 아무리 구글링을 해도 쓸모없는 정보만 나올 때의 절망감을 잘 안다. 나도 공부하는 처지라 항상 정답은 아니겠지만, 혼자 끙끙대고 있는누군가에게 작은 도움이나마 된다면 이 글을 올리는데 큰 보람이 될 것 같다.

'이론 > 신경망' 카테고리의 다른 글

He 초기화 구현 in tensorflow  (0) 2018.09.19
tensorboard 간단 요약  (0) 2018.09.13
인공신경망과 학습  (0) 2018.03.05
전미분, 편미분, Gradient에 대해  (2) 2018.02.28
공부할 때 참고한 자료들  (0) 2018.02.27
Posted by 굿쟌
,