reference :
https://github.com/taehojo/deeplearning
사람의 신경망은 신경말단에서 다음 뉴런으로 자극을 전달하는 형태인데 이것은 입력 값을 활성화 함수에 의해 어떤 임계 값을 넘으면 참을, 아닐 시 거짓을 내보내는 로지스틱 회귀와 닮았다.
뉴런과 비슷한 메커니즘을 사용하면 인공적으로 생각하는 무언가를 만들 수도 있을 것이다.
이를 인공 신경망(artificial neural network)라고 한다. 첫 형태는 on/off기능이 있는 신경을 그물망 형태로 연결하면 동작하는 가능성이 있다는 맥컬럭-윌터 피츠의 1943년 논문이었으나 이후 1957영 프랑크 로젠블랫이 이 개념을 실제 장치로 만들었는데 이것의 이름이 퍼셉트론(perceptron)이다.
퍼셉트론 : 입력값을 여러 개 받아 출력을 만드는데, 이때 입력 값에 가중치를 조절할 수 있게 만들어 최초로 '학습'을 하도록 만들었다.
3년후, 경사 하강법을 도입해 최적의 경계선을 그릴 수 있게 한 아달라인(Adaline)이 개발됐다. 이 아달라인은 이후 서포트 벡터 머신(support vector machine)등 머신 러닝의 중요한 알고리즘들로 발전해 갔다. 이 중 시그모이드를 활성화 함수로 사용한 것이 바로 로지스틱 회귀이다.
퍼셉트론과 아달라인에 의해 현실 세계의 다양한 문제를 해결하는 인공지능이 개발될 것으로 기대되었으나 퍼셉트론에는 한계가 있었다. 이 한계를 해결하는 과정이 딥러닝인데 이를 해결하는 과정을 보며 신경망의 기본 개념을 확립할 수 있다. 점에 선 긋기 예제
XOR(exclusive OR)는 논리회로에서 등장하는 개념인데 두 입력이 서로 다른 값을 가지면 참이되고 거짓을 출력하는 게이트(gate)레벨의 회로이다.
x1과 x2의 진리표(truth table)을 x1,x2입력의 좌표 평면으로 나타낼 때 결괏값이 0이면 흰색으로 1이면 검은 색일 때 이를 직선 하나로 구분할 수 없다는 문제가 있다.
하지만 이러한 문제는 두 가지 방법이 순차적으로 개발되면서 해결된다.
1) 다층 퍼셉트론(multilayer perceptron)
2) 오차 역전파(back propagation)
위의 두가지 방식이다.
성냥개비 6개로 정삼각형 4개를 만들려면 입체로 쌓아 올려야 하듯 퍼셉트론의 문제를 해결하기 위해서도 다른 방법이 필요했다
바로 종이를 휘어서 선을 하나 그으면 선 두개를 동시에 긋는 것과 같은 효과를 낸다는 것이다.
이를 위해 퍼셉트론 두 개를 각각 처리하는 은닉층(hidden layer)를 만든다.
은닉층이 XOR 문제를 해결하는 방법
1) x1과 x2를 두 연산으로 각각 보낸다
2) 첫 연산에서는 NAND 처리를 한다
3) 이와 동시에 두 번째 연산에서 OR 처리를 한다.
4) 2와 3을 통해 구한 결괏값을 AND 처리를 하면 우리가 원하는 출력값을 얻을 수 있다.
복잡하다
행렬식을 만든다.
표를 보면 n1,n2,y를 구하는 공식에 차례로 대입하니 우리가 원하는 결과를 구할 수 있다는 것을 알 수 있다.
우리가 원하는 XOR 문제의 정답이 도출되었다는 것을 확인할 수 있다.
이리하여 퍼셉트론으로 해결되지 않은 문제가 은닉층으로 해결된 것을 볼 수 있다. XOR문제는 다층퍼셉트론으로 해결되지만, 은닉층에 들어 있는 가중치를 데이터를 통해 학습하는 방법이 없었기 때문이다. 이후 다층 퍼셉트론의 학습방법을 찾기 위한 혁신적인 아이디어가 오차 역전파이다.
XOR 문제를 다층 퍼셉트론으로 해결하였지만 이 가중치를 업데이트 할 방법이 오랜 시간이 지난 후
오차 역전파라는 방법을 통해 해결이 되었다.
입력 값과 출력 값을 알고 있는 상태에서 가중치(w)와 바이어스(b)를 미리 알아본 후 이를 넣은다. 여기서 조금 더 나아가서
오차 역전파 방법을 사용하여 숨겨진 은닉층의 가중치를 업데이트 해야 한다. 경사 하강법을 사용해 오차가 최소인 지점을 찾는 방법을 이용하여야 한다. 은닉층이 생기면서 두번의 경사하강법을 써야 한다.
1) 이때 한번의 순전파가 일어나서 각 가중치의 초깃값이 정해진 후 초깃값의 가중치로 만든 값과 실제 값을 비교한다.
2) 이때 생긴 오차를 계산하여서 첫 번째 가중치와 두 번째 가중치를 계산한다.
3) 이 다음에는 오차 2개를 이용하여 편미분 한다. 첫 번째 가중치 업데이트 공식과 두 번째 가중치 업데이트 공식은 다음과 같다.
첫 번째 가중치 업데이트 공식 : (yo1 - y실제 값)yo1(1-yo1)yh1
두 번째 가중치 업데이트 공식 : (dyo1w31+dyo2w41)yh1(1-yh1)*x1
이러한 out(1-out) 형태를 취하고 있다는 것을 알 수 있다. 이를 델타식이라고 한다.
델타식을 이용해 깊은 신경망의 계산이 가능해 졌다. 이제 수많은 층을 연결하면 되지만 아직 한 가지 문제가 남아있다. 바로 역전파를 진행할 수록 점점 기울기가 소실된다는 것이다.
이는 활성화 함수로 사용된 시그모이드 함수의 특성 때문이다. 시그모이드 함수를 미분하면 최대치는 0.25다. 이를 계속 곱하면 0에 가까워 지게 된다. 따라서 역전파를 진행할 수록 계산하기 어려워진다.
이를 해결하기 위해 소프트플러스 함수를 사용하는 등의 노력이 이어지고 있다.
경사하강법은 정확하게 가중치를 찾아가지만, 계산량이 많다는 단점이 있어서 고급 경사하강법이 등장하게 되었다.
a. 확률적 경사 하강법
경사 하강법이 한 번 업데이트 될 때마다 전체 데이터를 미분하는 것을 랜덤하게 추출한 일부 데이터를 사용하여서 빠르고 더 자주 업데이트 하는 방식이다.
b. 모멘텀
모멘텀 확률적 경사 하강법 (모멘텀 SGD)를 사용해 양수나 음수 한 방향으로 일정한 비율만 수정되게 하는 방법이다. 이를 통해 양 방향 음 방향 한 번이 아닌 일정 이동 값을 고려해 일정 비율만큼 다음 값을
결정 하는 관성효과를 낼 수 있다.
요즘은 adam이라는 고급 경사 하강법이 가장 많이 쓰이고 있다.