[Deep learning] Gradient Descent Optimizer

https://icim.nims.re.kr/post/easyMath/70


알기 쉬운 산업수학

알기 쉬운 산업수학

Gradient Descent Optimizer

2017년 12월 13일(수)|김민중
 주어진 목적함수 f의 최솟값(minimum)을 찾아가는 알고리즘으로 다음과 같은 방식으로 최솟값을 찾아간다.
  • 초기값 x0을 임의로 설정, 적당한 Learning rate α 설정
  • n0인 정수에 대해서 xn+1은 다음과 같이 정의한다.
xn+1:=xnαf(xn)
  • 주의사항
    • 함수f의 모양이 convex가 아닌 경우 global minimum이 아닌 local minimum으로 xn이 수렴할 가능성이 있다.
    • Learning rate α 값이 큰 경우 최솟값으로 xn이 수렴하는 것이 아니라 발산할 수 있다.
    • Learning rate α 값이 작은 경우 수렴하는 속도가 지나치게 느릴 수 있다.
global minimum, local minimum, large learning rate, small learning rate 그래프
방정식 2x=10 의 근을 Gradient Descent를 이용해서 찾아보자.
  • 목적함수 f(x):=(102x)2으로 설정하겠다(f의 최솟값인 0이 되게 하는 x값이 우리가 원하는 방정식의 근이다).
  • 초기값 x0=0, Learning rate α=0.05으로 설정
f(x)=4(2x10)이므로 x1은 다음과 같이 구할 수 있다.
x1=x0αf(x0)=00.05(40)=2
그리고 x2
x2=x1αf(x1)=20.05(24)=3.2
반복적으로 이 같은 작업을 하면 xn의 수열을 다음과 같이 얻을 수 있다.
(xn)=(0,2,3.2,3.92,4.352,4.6112,...)
Seauence of x 그래프 (가로축 : Steps, 세로축 : x value)
이를 그래프로 나타내면 다음과 같고 xn은 5로 수렴하는 것을 확인할 수 있다. 이를 TensorFlow code로 작성하면 다음과 같이 작성할 수 있다.
# 방정식 2*x = 10 을 만족하는 x 찾기
# x 초깃값 = 0

X = tf.Variable(0.)
Y = tf.constant(10.)
H = 2 * X


loss = tf.square(H-Y)
optimize = tf.train.GradientDescentOptimizer(0.05).minimize(loss)


sess = tf.Session()
sess.run(tf.global_variables_initializer())
sequence = []

for i in range(10):
    print("x_%i = %s" %(+i, sess.run(X)))
    sess.run(optimize)
    sequence.append(sess.run(X))

plt.suptitle("Sequence of x", fontsize=20)
plt.ylabel("x value")
plt.xlabel("Steps")
plt.plot(sequence, "o")

실행화면

x_0 = 0.0
x_1 = 2.0
x_2 = 3.2
x_3 = 3.92
x_4 = 4.352
x_5 = 4.6112
x_6 = 4.76672
x_7 = 4.86003
x_8 = 4.91602
x_9 = 4.94961

Learning rate가 0.5인 경우(발산)

x_0 = 0.0
x_1 = 20.0
x_2 = -40.0
x_3 = 140.0
x_4 = -400.0
x_5 = 1220.0
x_6 = -3640.0
x_7 = 10940.0
x_8 = -32800.0
x_9 = 98420.0

댓글

이 블로그의 인기 게시물

@import' when modules are disabled

MagicaVoxel black screen

[Iphone][build error] pngcrush caught libpng error: PNG unsigned integer out of range.