티스토리 뷰

Mean Squared Error Function

 - 이전에 다뤄본 내용은 Log-Loss 에 관한 오류 최소화 방법이었다.

 - 신경망 네트워크에는 오류를 최소화하기 위한 여러 방법들이 존재하는데, 

 - 이번에 다뤄볼 내용은 Mean squared error function이다.

 - 이는 prediction 과 label의 차 에 대한 제곱의 평균을 의미함.






Gradient Descent with Squared Errors

 - 우리가 만들어 나갈 neural network에 들어갈 weights를 찾는법에 대해 고민해보자.

 - weights의 최종 목표는 prediction이 실제 값에 최대한 근사하도록 만드는것이다.

 - 이 오차율을 측정하기위해 error 값을 두고, 얻어낸 prediction이 얼마나 잘못되었는지를 판단하는 척도로 뒀다.


 - 이 오류의 일반적인 측정법으로 오류의 제곱의 합으로 표현하는 방법이 있다. 이름하여 SSE(the Sum of the Squared Errors)

 - yHat : prediction

 - y : true value

 - 그 뒤 모든 output 단위 j에 대해 그리고 data point u에 대해 합을 취한다.

 - j 는 위 네트워크 output의 unit을 나타낸다.

 - 따라서 각각의 output unit에 대해 true value인 y와 prediction인 yHat의 차를 구하고

 - 그 차에 대해 제곱을 취한뒤 그 모든 제곱값들의 합을 구한다.

 - 그다음 또다른 합인 u에대한 합은, 모든 data point들에 대한 합계이다.

 - 따라서 각 data point( = inner sum, 각 output unit에 대한 차를 제곱한 값들의 합)를 총합하게 됨.

 - 그러면 모든 data point에 대한 모든 prediction들의 에러를 리턴하게 됨.


 - SSE는 다음과같은 이점을 갖음

 - 1. 제곱을 하기때문에 error 값이 항상 양수.

 - 2. 오류가 클 경우 값이 훨씬 커지기 때문에 작은 오류보다 더욱 패널티를 받음

 - 3. 항상 양수이기때문에 연산을 할 때 부담이 없음

 - 신경망 네트워크의 output과 prediction은 weights에 영향을 받는다는점을 항상 기억해야한다.

 - 따라서 error 값은 weights에 따라 크고 작음이 달려있다.

 - 우리는 네트워크의 prediction error가 가능한 한 작게 만드는것이 목표이다.

 - 그러기 위해선 weights가 키를 쥐고있다. weights를 통해 error를 작게 만드는것임

 - 즉, 우리는 제곱된 에러(squared error)값인 E를 최소화 해주는 weights 인 Wij 를 찾는것이 우리의 목표이다.

 - 신경망 네트워크를 통해 이렇게 하려면 역시나 gradient descent 를 사용한다.






Enter Gradient Descent 

 - 앞서 진행했던것 처럼, gradient descent의 원리는 위와같다.

 - 어떤 곳의 gradient가 가장 급격한지를 확인하여 최단거리 또는 최단시간 내에 산에서 내려온다는 개념.



 - 이를 problem에서부터 solution을 찾아가는 과정으로 대입하여 연산해 나가는 것이다.



 - 앞서 다뤘던것처럼, gradient descent를 통해 error를 감소시키기 위해 weights를 바꿔나간다.

 - 비유적으로 다시 말하자면 error는 산에 해당하고, 우리는 그 산을 내려오는것을 목표로 하는것임

 - 산에서 가장 빠르게 내려오는 방법은 가장 가파른 길로 내려오는 것이기 때문에

 - 마찬가지로 error를 가장 최소화하는 방향으로 내려가는 개념이다.

 - 이 방향(direction)을 gradient of squared error를 통해 구해보는 방법을 적용해보자.

 - 그래디언트(gradient)는 다른말로 rate of change 또는 slope 등과 동일한 용어이다.


 - 이 변화율 즉, 기울기를 구하기 위해선 미적분중 특히 미분을 사용한다.

 - 함수 f(x)에서 한 점 x에서의 기울기는 f'(x)로 표현되고 구할 수 있다.




 - 그래디언트는 둘 이상의 변수가 있는 함수에서의 미분된 값이다.

 - 마찬가지로 미적분을 사용해서 input weights에 따라 달라지는 error function에서의 

 - 모든 지점에서의 그래디언트를 구할 수 있다.


 - 위의 그림은 두 개의 input을 갖는 neural network를 보여주고있으며, 따라서 두 개의 weights가 적용된다.

 - 등고선 처럼 바라볼 수도 있는데, 같은 error끼리 등고선으로 이어서 그린것이며, 어두운 선 일수록 더 큰 error이다.

 - 매 step별로 에러와 그래디언트를 계산하고, 각각의 weight를 얼마나 변경할 것인지를 결정하게 될 것임

 - 결국 우리의 최종 목표는 error function의 error를 최소화 하는 weights를 찾는것이 우리의 목표이다.

 - 위의 그림에선 가운데 점에 최대한 가까이 가는 그 weight를 찾는것이!!






Caveats

 - 그래디언트가 있는곳엔 weights도 항상 있기 마련이기 때문에, 우리는 error가 낮은 지점에 있을 수 있지만,

 - 그 지점이 error가 최저인 점은 아닐 수 있다. 

 - 이런 지점을 local minima라고 하며, weights가 잘못된 값으로 초기화가 되었다면,

 - gradient descent는 weights를 이러한 local minimum으로 유도할 수 있다.

 - 이를 피하기위해서 momentum 이라 불리는 방법을 사용할 수 있다.






Gradient Descent : The Math

 - 위의 그림에서와 같이 우리는 output(yHat)을 뽑아낼 수 있는데,

 - 우리는 이 output을 이용하여 predictions를 구하고 싶지만, 

 - 올바른 weights가 어떤 값인지를 미리 알고있지 않은 상태에서 어떻게 prediction을 도출해낼 수 있을까?

 - 그러니깐 올바른 weights를 모른 상태에서 네트워크가 올바른 prediction을 뽑아낼 수 있는 방법??

 - 시도해볼만한 것으로는, 우리가 사실이라 판단하는 데이터를 모델에게 제시하고

 - 모델의 인자(parameters)를 해당 데이터와 일치하는 weights로 설정하는 것 정도이다.

 - 먼저 우리는 우리의 prediction이 얼마나 나쁜지를 측정해야한다.



 - 그러기 위해 가장 간단한 방법은 true value(label, y)와 prediction의 차를 구해보는것인데

 - 이 경우 위에서 언급하였듯, 값이 음수로 나올때도 있고 양수로 나올때도 있게 된다.

 - 그렇기 때문에 제곱을 취해줘서 모두 양의 값으로 만들어준다.

 - 또한 이 때의 추가적인 이점으로, 값의 차이를 극대화 시켜줌으로써,

 - true value와 prediction의 차이가 클 수록 패널티를 주기가 수월해진다.(제곱하므로 값의 증가폭이 커져서)

 - 그 다음 전체 data set에 들어있는 모든 error를 구해야하므로, 전체를 합해준다.

 - 그리고 1/2 즉, 반으로 나누는데, 나중에 수학적으로 정리할 때 필요하기 때문.

 - 이 공식을 일반적으로 the Sum of the Squared Errors(SSE) 라 칭한다.



 - yHat의 경우 일차방정식(linear equation)으로 구했으므로 여기서 위와같이 대체할 수 있다.

 - 또한 data records를 mu 라고 표현하고있는데, 그 data를 행렬로 생각해 볼 수 있다.

 - 그렇게 된다면, 하나의 행렬은 input data인 x를, 다른 하나의 행렬은 targets인 y가 될테고

 - 각각의 record는 위와같이 행렬 x의 첫번째 행의 값 그리고 행렬 y의 첫번째 행의 값이 되겠다.

 - 그리고 전체 error를 계산하기위해 이 행렬의 행들을 스캐닝하여 SSE를 계산해 내면 된다.

 - 그다음 그 결과들의 전체 합을 구하면 됨.


 - SSE는 우리가 작성한 네트워크의 퍼포먼스를 측정하는 척도라 볼 수 있다.

 - 만약 이 SSE값이 크다면, 그 네트워크는 bad prediction을 리턴하는것이고

 - 만약 SSE값이 작다면, good prediction을 도출해 내고있는것임

 - 따라서 우리는 가능한 한 작게 값을 리턴해 내는것이 목표다.

 - SSE를 이용해서 error를 최소화하기 위해 모델을 어떻게 설정해야하는지 알아보기위해

 - 우선 data record가 하나라 가정하여 예시를 들어보도록 하자. (이 경우 output unit도 하나)



 - 하나의 data record에 대해서만 다루므로, 전체 에러를 sum 할 필요 없이 하나에 대해서만 본다.

 - 위에서 언급한 것과 같이, error는 위와같이 구해주고 

 - 또한 이 때의 prediction은 input 과 weight를 곱한 방정식으로 표현할 수 있다.

 - 다시한번 말하자면, weights는 우리에게 일종의 knob라고 볼 수 있다.

 - weights에 따라 우리의 모델이 어떤 prediction을 리턴해 낼지를 조절할 수 있기 때문



 - 위의 그래프는 weights에 따른 우리의 error값에 대한 변화율을 나타낸 그래프이다.

 - 우리의 목표는 error가 가장 낮은 값 즉, 그래프상의 최저점을 찾는것이고

 - 이 때의 weights의 기울기는 음의 gradient 값으로 나타난다.

 - 따라서 랜덤한 지점에서 시작하여 error의 최저점 방향으로 가기위해 우리는 그래디언트를 사용하게되고

 - 이 방법을 Gradient descent라 부른다.




 - weights를 업데이트 할 때, new weight은 old weight + delta weight 로 표현할 수 있다.

 - 이 때, delta weight은 변화율 또는 기울기를 의미하고 이는 gradient에 비례하는데

 - 그래디언트는 error를 그 weight로 편미분한 값을 나타낸다.

 - 또한 우리는 임의로 scaling parameter를 추가할 수 있다. 

 - 이때 scaling parameter는 gradient descent의 step을 조절할 수 있고, 

 - 이는 learning rate라 부르고 eta로 표시한다.

 - 여기서 gradient를 구하려면 다변수 미적에 능해야함.

 - 다변시 미적을 다시 refresh 할 수 있는 사이트

 - 하지만 그보다 더 중요한것은 gradient descent의 개념과 그 최종 결과값이 의미하는바를

 - 정확하게 아는것이 더 중요하다.



 - 그래디언트를 구하기위해선 error의 제곱에 대해 weights로 편미분하면 된다.

 - 이를 구하기 위해선 chain rule을 사용하여 미분을 계산하여야 한다.



 - chain rule에 대한 quick review

 - 여기서 주목해야할 점은 두번째줄의 q를 error로 두고, 

 - p를 squared error로 두고 계산이 가능하다는 것이다.

 - 그 이후 Wi에 대하여 미분을 한다.

 - p를 q에대해 미분하면 error 자체를 리턴한다. (제곱이 미분되며 지수로 나오게되어 1/2와 곱해지므로)



 - y는 Wi의 영향을 받지 않지만, yHat은 Wi의 영향을 받으므로 미분시 합성함수 미분을 진행해주면 됨

 - Wi에 대해 미분하고 있다는 점만 염두하면 됨



 - W1에 대해서 미분을 하게되면 W1 * x1에서 x1만 남게되고 나머지는 모두 상수취급되어 0이됨

 - 따라서 Wi에 대한 시그마의 미분은 Xi가 된다.



 - 최종적인 수식은 위와같이 된다.



 - error term 으로 앞으로 정의하게 될 기호와 수식은 위와같다.



 - 다수의 output unit을 고려해야 하는 경우 위와같이 연산처리가 가능하다.






Gradient Descent : The Code


 - weight update 알고리즘



 - error term 인 델타 알고리즘



 - output error : (y - yHat)

 - f'(h) : activation function인 f(h)의 미분값, output gradient의 미분값이라고 부름

 - 이 때, activation function f(h)는 sigmoid function을 지칭.







gradient.py




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함