Gradient descent : 에러를 미분하여 weight를 업데이트 하는 방법.
Back-propagation : Hidden node에서 에러를 미분하여 weight를 업데이트 하는 방법.
Neural Network 학습 방법
1) Hebbian Learning (Hebbian Rule)
2) Perceptron Rule
3) Gradient Descent (Delta Rule, Least Mean Square)
4) Back propagation
5) 그 이외 응용기법
1) Hebbian Learning
기본 신경망 학습 규칙으로, 원래 무감독 학습 방법에 쓰는 것이었다.
* 아이디어 -> 만일 어떤 신경세포의 활성이 다른 신경세포가 활성하는 데 계속적으로 공헌한다면, 두 신경세포 간의 연결 가중치를 증가시켜야 한다.
즉 두개의 뉴런이 모두 켜져 1이되면(둘다 활성화시), 둘사이의 weight를 증가시킨다는 법칙. 로컬하게 오직 2개의 뉴런의 관계만을 갖고 학습하는 방법.
α : learning rate(학습률)
ex 1. A와 B 뉴런이 둘다 활성화됨 -> a_i =1, b_j = 1 따라서 α만큼 학습을 하게됨.
A또는 B 뉴런 둘중 하나가 비활성화 -> 두값의 곱은 항상 0이므로 학습하지 않음.
ex 2.
이렇게 앞쪽 A에 3개의 뉴런과 뒤쪽 B에 4개의 뉴런이 있다면, 모든 연결의 개수는 12개가 된다.
이때 A와 B각각의 데이터셋 (7개의 칼럼으로된 엑셀파일)이 들어온다고 가정하자.
데이터 셋에서 A_1과 B_1이 둘다 1로 켜지면, 그에 해당하는 경로의 연결 가중치(weight)를 Learning Rate 만큼 증가시킨다.
이것이 바로 헤비안 러닝. Hebbian Learning 은 원래 무감독 학습 모델이나, 지금은 발전하여 목적패턴이 추가되어, 인위적으로 학습을 제어할 수있는 감독학습으로 발전하였다.(Delta Rule을 의미함.)
2) Perceptron Rule
두개의 뉴런간의 weight를 학습할때 목적패턴과의 오차를 이용하는 학습 방법. 오차가 발생했을때 입력이 1인 뉴런에대해서만 오차만큼 학습을 시킨다.
* 아이디어 -> 만일 어떤 신경세포의 활성으로 다른 신경세포가 잘못된 출력을 낸다면, 두 신경세포 간의 연결 가중치를 오차에 비례하여 조절해야 한다.
여기서 t_j 는 목적 패턴, 즉 정답을 의미한다.
따라서 (t_j-b_j) 는 오차이며,
이 값이 0이면 완벽하게 원하는 정답을 낸 것이므로 학습하지 않는다.
이 값이 0보다 크면, 즉 오차가 존재하는 것이고, a_i가 활성화 된 만큼 학습을 한다.
ex 1. a_i가 양수이고, activation 함수(output값을 내는 함수)가 시그모이드라고 가정하자.
만약 t_j가 1인데, b_j가 0.5라면 오차는 0.5가되고, 이는 weight를 증가시켜 결국 b_j값이 증가하고 t_j와 가까워지게 된다.
만약 t_j가 0.5인이고, b_j가 1이라면 오차는 -0.5가 되고, 이 경우는 weight를 감소시켜 b_j값도 감소, t_j와 역시 가까워 진다.
Perceptron rule은 기존의 Hebbian Learning에서 목적 패턴이라는 개념을 도입하여 한마디로 Supervised Learning을 한것으로 보인다.
그래서 구체적으로는 먼저 각 weight를 랜덤하게 설정한다음, 위에서 말한 방식으로 트레이닝해서 목적패턴에 가까워지게 하는 것이다.
그러면 이 Perceptron 룰을 이용해서 AND gate를 학습해보자.
X가 input{threshold(=w1) 용 input x1, x2, x3}, O가 목적 패턴이며, 러닝 레이트는 0.5이며 초기 weight w1,w2,w3은 모두 1로 가정한다.(활성화 함수는 step function(계단 함수)이다.)
X1 : {1,0,0} O1:0
X2 : {1,0,1} O2:0
X3 : {1,1,0} O3:0
X4 : {1,1,1} O4:1
0 Step) w1 = 1, w2 = 1, w3 = 1
X1,O1 학습시 weighted summation(w1*x1+w2*x2+w3*x3)이 1로 0보다 크다. 따라서 output은 1이되고, 목적패턴이 0이므로 오차가 (0-1 = -1) 만큼 발생한다. 이때 켜진 X가 x1만 존재하므로, 그에해당하는 w1을 학습시켜야한다. 따라서 러닝레이트 0.5를 반영한 (-1*0.5 = -0.5)만큼의 weight를 w1이 학습한다.
1 Step) w1 = 0.5, w2 = 1, w3 = 1
X2,O2 학습시 weighted summation 이 1.5이므로 0보다 크기 때문에 output은 1이된다. 이때의 목적 패턴은 0이므로 오차는 -1이 된다. 마찬가지로 러닝레이트가 0.5이므로, 이때 켜져있는 x1과x3에 해당하는 weight인 w1,w3에대해 -0.5를 학습시킨다.
2 Step) w1 = 0, w2 = 1, w3 = 0.5
X3,O3 학습시 weighted summation 이 1로 0보다 크기때문에 output은 1이되고 목적패턴이 0이므로 오차가 -1이다. 마찬가지로 w1과 w2에 -0.5씩 학습을 시킨다.
3 Step) w1 = -0.5, w2 = 0.5, w3 = 0.5
X4,O4 학습시 weighted summation 이 0.5로 0보다 크기때문에 output은 1이되고 목적패턴 또한 1이므로 오차가 0이다. 정확한 결과이므로 따라서 학습이 일어나지 않는다.
4 Step) w1 = -0.5, w2 = 0.5, w3 = 0.5
이렇게 4개의 데이터 셋을 하고난 결과
w1 = -0.5, w2 = 0.5, w3 = 0.5
의 가중치를 학습하게되고, 이는 완벽하게 AND gate를 만족한다. (위 4개의 데이터 셋을 전부 테스트해도 완벽히 AND gate의 결과와 일치한다.)
트레이닝 데이터 셋이 좀 더 다양하고, 개수가 많으며, 러닝 레이트를 작게 잡을 수록 더욱 정교한 학습이 가능할 것이다.
그러나 이 Perceptron rule은 XOR같은 선형 분리가 불가능한 문제에 대해서는 적절히 학습할 수가 없다.
3) Gradient Descent (=Delta Rule, Gradient Descent, Least Mean Square)
<Gradient Descent에서의 Loss function이 반드시 LMS일 필요는 없다. 그냥 문제에 적합한 Loss function을 정의하고, 그것이 최소가 되는 방향을 찾아내기만 하면 된다. 예를 들어 멀티클래스 문제에서는 Cross-Entropy를 Loss function으로 사용한다.>
<Gradient Descent 는 파라미터 W에 대한 error를 계산하는 함수(=Objective Function=Loss Function)을 잘 정의하고, 이 함수가 최소화되는 방향을 찾아서 점점 나아가는 것이다. 구체적으로는 error function 을 각 파라미터로 편미분하여, 함수인 각 파라미터에 대한 기울기를 구해 local minima를 향하도록 움직여간다.>
이는 초고차원의 공간에 존재하는 error function의 hyperplane에서 각 차원(파라미터)에 대한 기울기를 구하는 것이다. 예를 들어 3차원 공간에 구형태의 error function이 존재하고 파라미터가 x,y,z라면 이 세개의 파라미터로 구형태의 함수를 편미분한다. 그래서 각각 x,y,z축에 대한 기울기를 구하여 그쪽 방향으로 점점 다가가는 것이다.
Delta Rule은 Perceptron Rule과 거의 유사하나, 전체 학습 데이터에대한 오차를 최소화 하는 방법이며, Threshold가 아닌 Gradient Descent 개념을 사용한다. Threshold가 없기 때문에, 출력값은 그냥 바로
(벡터의 내적)
로 정의 된다. 즉, 인풋에 가중치를 해서 더한 값이 바로 즉시 아웃풋이 되는 것
Mean Square : 평균 자승이란 다음을 의미한다.
에러를 정의하는데는 여러가지 기준이 있지만, Delta Rule에서는 위의 평균자승식에서 1/n 이아닌, 무조건 1/2로 나눈
이 식을 에러로 사용한다.(그래서 최소 평균 자승이라는 이름이 붙음.)
td는 목표 패턴(정답), od는 출력값(현재 학습 결과)
Error 를 위와같이 정의하는 이유는?
1) 두값의 차에대한 절대값이 필요하다. 제곱을 안쓰면 절대값을 씌워야하는데 이는 미분이 불가능하다.
2) 1/2로 나눈이유는 미분 했을때 생기는 계수 2를 없애기 위해서이다.
3) logistic regression에 가우시안 에러를 가정하였을 때의 라이클리후드가 위 식이다.(세미나에서 주어들음)
<Least Mean Sqaure를 Error로 정의하는 이유는, Linear Regression 에서 관측 데이터가 Gaussian Noise 만큼 의 오차를 갖는다고 가정 했을 때, 그에러를 확률로 생각하고 Likelihood를 계산해 보면 LMS식이 나오기 때문이라고 한다.>
에러의 정의는 여러가지가 있을 수 있음.
(a) 모든 점에서 동일한 편차가 나타나도록 -> 오차가 상쇄되는 문제가 있음
(b) 편차의 절대값의 합이 최소 -> 만족하는 곡선이 무수히 많음
(c) 최대 오차를 최소화 -> 최대 오차를 줄이면, 다른 점에서의 오차들이 증가함
(d) 오차의 제곱의 합이 최소 -> 가장 최적의 방법
물론 이밖에 Error를 다른식으로 정의해도 되겠지만, 가장 간단하고 쓰기편하여 위와 같이 정의한다.
Perceptron Rule 에서는 Error라는 개념이 없이, 오직 2개의 뉴런간의 weight만을 정의한다. 그러나 Delta Rule에서는 우선 정답에 해당하는 목표 패턴이 있으며, 이 목표 패턴과의 차이인 Error의 총합을 최소화 하는 것이 감독 학습의 최종 목표이다.
그러나 이 Error의 최소값은 수학적인 계산으로 구해낼 수가 없다. 왜냐하면 Error는 오직 데이터를 입력받아서 그에대한 출력을 봐야지만 계산할 수 있는 경험적인 결과이기 때문이다. 따라서 이 Error을 최소화하기 위해서 미분을 이용한다.
(이는 시뮬레이티드 어닐링과 유사한 발상의 알고리즘이다 : http://sens.tistory.com/404)
(시뮬레이트 어닐링은 쇠를 담금질 할 때, 가열했다가 두드리고, 식히는 것을 반복하면서 원자들이 Local minima에서 빠져나와 Global Minima의 구조로 들어갈 수 있게 하는 과정을 모델링한 것.)
Error를 미분해보자. (Error의 최소값을 계산 해낼 수 없다고 했는데, 어떻게 미분하냐고 의문이 들 수도 있다. 그러나 우리가 미분하는 것은 Error의 정의이고, 이 Error의 정의를 미분하여 접선의 기울기를 구하는 공식을 유도해, 이 수식에 값들을 입력하여 그 위치에서의 Error 곡선에서 접선의 기울기를 알 수가 있다는 것이다. 나는 이렇게 이해했다..)
Error도 결국 w들과 t에의해 정의된 하나의 함수이다.
(Error 미분 과정은 간단히 합성함수의 미분을 하면됨.)
weight의 학습은, 러닝레이트*미분값(접선의 기울기)만큼 학습함.
위에서 정의한 Error를 미분하기위해서는 (td-od)의 w에대한 속미분을 해야한다(제곱미분한 이후에 함수 내부의 속미분을 해주어야하니까). od=w*x 이므로, 속미분 결과는 -x가 나온다.
최종결과, 한 weight에대한 접선의 기울기는 (td-od)(-x)가 된다. 즉 정답과의 오차에다 그 weight에서 들어온 -input값을 곱한 것. (즉 큰 error가 나올수록, 그리고 큰 input이 온 엣지일 수록 더 많이 weight를 학습한다.)
<여기서 중요한 키 포인트>
Gradient Descent로 계산한 weight는 뉴럴 네트워크 뿐만 아니라, 다른 모든 종류의 Classifier에서 적용 가능하다. Multivariate Linear Regression 의 경우 각 파라미터에 대한 Weight(바꿀 값)가 결국 그 파라미터에 곱해진 값 X 만큼이 반영되서 적용된다. 즉 X값이 크다면, 이 에러에 끼친 영향이 크므로 크게 Weight를 수정하는 것이고, 만약 X값이 0이라면, 이 에러에 끼친 영향이 0이므로 학습하지 않는다. 즉, 들어온 데이터 의 Feature X의 값이 0이 아닐 때에만 그 파라미터는 학습을 한다. (아래 그림 참고. 계산되어진 Error 에 x0, x1, x2 값을 곱해서 반영한다. 마치 각 변수에대한 러닝 레이트의 느낌.)
또한 Error는 Batch를 계속 진행함에 따라 처음에는 크다가 나중에 점점 작아지게 된다. (정답에 가까워 질 수록 에러도 적어짐) 따라서 처음에는 크게 Weight를 학습하지만, 나중에는 매우 조금씩 학습하다가 결국 수렴하게 되는 것이다.
(활성함수를 적용하면 od=f(w*x) 형태인듯..그래서 활성함수가 항상 미분 가능해야함. 그래서 시그모이드나 하이퍼볼릭 탄젠트를 사용함. 하이퍼볼릭 탄젠트는 결과로 음수값이 필요할 때 사용?)
(활성함수는 각 뉴런마다 다를 수도 있고, 모든 뉴런이 같을 수도 있고, 레이어 별로 다를 수도 있고 마음대로임. 근데 보통 output뉴런들은 필요 목적에따라 ex)클래시피케이션 용 output or 랭킹용 output 등.)다르게 정의하나, 전체적인 활성함수는 시그모이드 등으로 통일시킴.
이 Error함수는 결국 우리가 풀고자하는 문제(인풋과 아웃풋의 관계)가 담겨있는 Objective Function 이다. 목표함수, 라이클리후드를 최대화 시키는 함수
Learning Rate 에대해 : Learning Rate가 1이면, 해당 파라미터에대해 에러를 100% 반영하겠다는 의미이다.만약 Learning Rate가 0.5라면, 50%만 반영하는 것임. 그러나 Learning Rate가 너무 클 경우, 특정한 상황에서 발산해 버리는 경우가 있다. 예를 들어 Objective Function 이 폭이 좁은 2차 함수이고, Learning Rate가 1이라면, 계산되어진 Weight가 너무 커서 2차함수를 타고 점점 올라갈 수가 있다.
만약 적절한 크기의 Learning Rate를 사용한다면,Gradient Descent 는 매 Iteration 마다 반드시 에러가 줄어들어야 한다. 만약 중간에 에러가 커지는 현상이 일어난다면, 위와 같이 기울기가 올라가 버리는 경우이니 Learning Rate를 줄여야한다.
그러나 Learning Rate가 너무 작다면, 학습이 지나치게 오래걸리는 문제가 있다. 따라서 발산하지 않는 최대크기의 적정 Learning Rate 를 찾아서 실험해야 한다. 발산의 경우 Objective Function 이 어떤 모양인가에 따라서 매번 다르므로, 문제가 달라지면 새로운 Learning Rate를 찾아야 한다.
4) Backpropagation
Backpropagation 은 요약하면, Delta Rule을 Multi Layer Perceptron 즉, 여러 계층을 가진 Neural Network 에 적용하기위해 고안된 알고리즘이다. (improved delta rule이라고 함)
간단히 설명하면, 앞쪽 레이어에서부터 각층의 Output 들을 계산해나가다가, 맨 마지막 레이어에 도달하면 Target 패턴과 비교하여 Error를 구하고, 이를 거꾸로 내려오면서 각 노드마다의 Partial Error를 계산한다. 이 부분 에러를 인풋만큼 곱해서 차곡차곡 역순으로 Error를 학습하는 것이다.(Feed forward 하듯 역방향으로 Partial error를 Feed backward)
핵심 : 각 노드에 대한 partial error를 feed backward 한다.
(feed forward로 weighted sum해서 partial inference를 feed forward 하듯)
error weighted sum한다음 시그모이드에 넣는대신, 에러 뉴런의 weighted sum에 대한 시그모이드의 기울기를 곱해서 그 이전 에러를 내놓음
BP 알고리즘 : PRML 244p 참조.
실제 구현할 때는, 위의 유도에서 빨간색 글씨만 보면 됨!
결국 error backpropagation은 에러에 대한 미분식을 체인룰을 사용하여 쪼개어서, 아래쪽에 있는 레이어까지에도 에러가 전파될 수 있게, 징검다리에 해당하는 (체인룰의 가운데 텀) 노드의 에러들을 계산해낸 것이다.
그런데 위의 방식의 백프로퍼게이션은 3층이상의 깊은 뉴럴넷에서 수식을 계산하기가 지나치게 복잡하다. 그래서 Error를 Weighted Sum으로 미분한 것을 '델타'로 정의하고, 이 term을 이용해서 수식을 간단하게 요약해서 쓴 것이 바로 위의 설명 방식이다.
그런데 위 방식은 아주 일반적인 MLP나 RNN에서는 적용이 가능하지만, gating등을 사용한 LSTM의 수식을 계산하기에는 적합하지 않다. node의 value값을 정의하기가 모호하기 때문.
따라서 이런경우에는 그냥 무조건 체인룰을 사용해서 한 단계씩, 한 단계씩 gradient를 구해가는 식으로 계산해야함.
예를 들어 LSTM의 맨 마지막 노드 Ht에서 softmax를 쓴다면, 먼저 Ht에서의 에러는 t-y가 될것이다.
그다음 이 Ht를 체인룰에 집어넣어 이것을 이용해서 다른 연결된 weight들도 에러를 계산한다.
5) 그 이외 응용기법
Stochastic Gradient Descent : 기존의 Gradient Descent는 매 번 모든 데이터들에 대해 전부 살펴보고 기울기를 계산한다. 그러나 이 방식은 시간이 매우 많이 소요되는 문제가 있다. 이를 개선한 것이 바로 Stochastic Gradient Descent 이다.
그래서 모든 데이터에대한 Error를 계산하는게 아니라 N개의 데이터에서의 Gradient 를 구한다음 학습하고, 다시 그 다음 N개 데이터로 넘어가는 방식이다. 이런식으로하면 전체 데이터를 매번 다 보는 것에비해 훨씬 빠르게 Convergence(수렴)에 도달할 수 있으며, 동시에 랜덤한 요소가 작용해 Local Minima에 덜 빠지게 된다.
이것은 전체 데이터 분포에 대한 approximated gradient를 적당히 모아서 weight를 업데이트 하는 개념이다. 이는 앞서 설명한 것 처럼 빠른 속도로 걸어내려가기 위함이다. 전체 데이터를 다보고 이동하면 걷는 속도가 너무나 느리다.
이때 에러 또는 노드의 에러를 다 더한다음 계산하면 안된다. 각 데이터에서 발생한 에러에 대한 weight의 기여도가 다르기 때문에 (노드의 에러에 각 데이터에서 노드의 weighted sum을 곱해서 gradient를 구해야함) 각 데이터에 대한 gradient를 다 따로 구한다음, 그것들을 모은다음 더해서 한 번 업데이트 하는 것임. 즉 gradient를 적당히 모아서 업데이트한다는 개념이다.
이때 각 데이터의 전체 분포에 대한 어느정도 어프록시메이션이 충분히 담긴 gradient를 모아서 더해야함. 그게 전체 데이터에 대한 분포가 아니라 일부 데이터에 대해서만 반영되면 online learning이 된다. 그리고 gradient를 만약 모든 데이터에 대해 모아서하면 그냥 배치러닝이 되어버림
즉 이 gradient를 얼마나 모았다가 업데이트하느냐에 따라 [Online, SGD, 배치]가 결정됨
Minibatch : stochastic gradient descent를 수행하는 단위이다(데이터 N의 크기). 실제로는 그냥 sgd와 비슷한 의미로 많이 쓰이는 듯.. 잘못된 쓰임이네
Online Learning : gradient를 모아서 업데이트 하는 단위가, 전체 데이터에 대한 approximated gradient가 아니라 일부 데이터에 대한 gradient만을 가지고 weight를 업데이트 하는것. 즉, stochastic gradinet descent와의 차이는 gradient를 얼마나 모았다가 업데이트 하는가의 차이. 보통은 데이터 1개 단위로 업데이트 하는 것을 의미한다고 함. 즉 미니배치 사이즈가 1인 것임.
온라인 러닝할거면, 학습에서 진동이 생기지 않게 하기위해 학습할 때마다 러닝 레이트를 1/3씩인가로 줄여주어야함.
Momentum : Local Minima에 덜 빠지기 위해 Learning Rate에게 일종의 관성이라 할 수 있는 모맨텀이란 개념을 둔다. 직전에 나온 방향성 즉, 직전에 계산된 기울기를 고려하여 새로 계산된 기울기와 일정한 비율 3:7 등으로
(0.3*기울기1)+(0.7*기울기2) 계산을 하는 것이다. 이렇게 하면 기울기가 갑자기 양수에서 음수로, 음수에서 양수로 바뀌는 경우가 줄어 들게 되고, 완만한 경사를 더 쉽게 타고 넘을 수 있게 된다.
Adative Learning Rate : 초기 단계의 학습에서는 Learning Rate 값을 크게 두어 Local Minima 를 잘 빠져나올 수 있게 하다가, 학습이 점차 진행되면 Learning Rate 를 줄여서 Global Minima에서 수렴 할 수 있게 한다.
(즉, Learning Rate가 상수가 아닌, 어떤 함수라고 볼 수 있다.)
Regularization : 지나치게 빠르게 Overfitting 하는 문제를 막기위해 얻어진 Gradient에 일종의 패널티를 두어, 조금만 반영시키는 방식이다. Weight는 보통 아주 작은 값(0~0.1)부터 시작해 학습이 진행 됨에 따라 보통 그 절대값이 커지게 된다. 따라서 Overftting은 Weight의 절대 값이 매우 클 때 일어나게 된다. 따라서 인위적으로 Weight의 증가 속도를 늦춰 Generalization을 해주는 기법이다.
Feature Scaling(Input Normalization) : 이것을 할때와 안할 때의 성능 차이가 매우 크다고 하는 보고가 있다.
각 Feature의 범위가 하나는 [0,1]이고, 하나는 [1~10000]이라면 두 Feature가 비슷한 범위를 갖도록 Scaling을 해주어 둘다 대략적으로 [-1,1]의 범위를 갖게하면 더욱 빠르게 수렴할 수 있다.(이경우 Objective Function 은 동그란 모양을 갖게 된다.) 즉, Feature의 범위가 크게 차이날 경우 Objective Function 의 모양이 굉장히 Skewed된 형태를 갖게 되어 학습이 더 느리다고 한다.(Feature가 매우 많을 경우 간단하게 전부 log를 씌우는 것도 가능해보임)
(그러나 결국 각 Feature가 곱해진 만큼이 에러에 반영되므로, 별 차이가 없지 않나라는 의구심이 듬.)
강의에서는 각 Feature를 N(0,1)에 가깝게 만들어주어야 한다고 말함.(평균을 빼주고 범위 또는 표준편차로 나누어주어)
local minima가 고차원 공간에서 나오기 힘든 이유 : N차원 공간에서, gradient가 -1 or +1 이라고 가정하면, 어떤 한 지점에서 모든 gradient가 전부 +1의 값을 가질 확률은 1 / 2^N 임. N차원의 값이 매우 커지면 이러한 확률은 0으로 수렴함.
http://darkpgmr.tistory.com/56
http://k.daum.net/qna/view.html?qid=3NKpZ
'Research > Deep Learning & Application' 카테고리의 다른 글
CNN, Spectrogram 을 CNN으로 학습 (0) | 2015.04.22 |
---|---|
TDNN, RNN, LSTM, ESN (0) | 2015.04.15 |
RNN 학습 알고리즘, BPTT (2) | 2014.07.08 |
Perceptron, TLU (0) | 2014.06.17 |
Activation Function (2) | 2014.06.12 |
댓글