본문 바로가기

최적화 및 기계학습/기계학습(ML)

경사하강법1(Gradient-descent)

극한을 취한 식에 대한 설명.
우변에 대한 설명

결국엔 이렇게 봐도 저렇게 봐도 말하고자 하는 바는 같다. 두 포인트가 같아지면 수평이 된다는 이야기다.

최소값을 구하는 손풀이

사실 먼저 그레디언트값을 구해두고 헤시안행렬을 구할 수 밖에 없다. 아래의 얘기를 해두고 싶어서 그랬다.

 

최고차가 2차면 Gradient = Hessian 같은이유.

 

아래는 경사하강법을 사용하여 R 코딩을 이용했습니다. 

> f <- function(x1,x2){
+   3*x1^2 + 5*x2^2 +2*x1 -5*x1*x2
+ }
> f
function(x1,x2){
  3*x1^2 + 5*x2^2 +2*x1 -5*x1*x2
}

#그림으로 임계점이 있는지 보자.
#library(mosaic) 
#추가적으로 'manipulate'라는 패키지가 필요 할 수 있습니다. 필요하다면 받아주시고 라이브러리로 읽어주세요.
plotFun(3*x1^2 + x2^2 -2*x1 +5*x1*x2 ~ x1&x2,
        x1.lim = range(-50,50),
        x2.lim = range(-50,50),
        surface = T,
        alpha = 1,
        xlab = expression(x[1]),
        ylab = expression(x[2]),
        zlab = expression(f(x[1],x[2]))
        )

library('magrittr')
library('Deriv')
> partial_x1 <- Deriv(f,'x1')
> partial_x1
function (x1, x2) 
2 + 6 * x1 - 5 * x2
> partial_x2 <- Deriv(f,'x2')
> partial_x2
function (x1, x2) 
10 * x2 - 5 * x1

#초기값,alhpa 지정.
x<-c(-5,-5)
alhpa<-0.05

> #1번 새로운 x값으로 갱신. x=(-4.85,-3.75)
> x-alhpa*c(partial_x1(x[1],x[2]),partial_x2(x[1],x[2]))
[1] -4.85 -3.75

> #위 과정을 계속 반복하자.
> for(i in 1:200){
+   x<-x-alhpa*c(partial_x1(x[1],x[2]),partial_x2(x[1],x[2]))
+ }
> x
[1] -0.5714286 -0.2857143
> f(x[1],x[2])
[1] -0.5714286
#아래는 위에서 설명한 코드에 사용이 부적합한 이유이다.
#?는 갱신한 x값이라고 하자.
c(partial_x1(x[1],x[2]),partial_x2(x[1],x[2]))=x-?/-alpha 
#?를 알아내려면 "? = 식" 형태로 나타내야하기 때문에 적합하지 않다.