티스토리 뷰
2. Neural Networks / L2. Implementing Gradient Descent - Gradient Descent with Mean Squared Error Function
chrisysl 2018. 7. 4. 22:06Mean 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을 지칭.