[λͺ¨λλ₯Ό μν λ₯λ¬λ] ν μνλ‘μ° κΈ°μ΄, μ ννκ·
import tensorflow as tf
# λ°μ΄ν°μ λλ€ν κ°μ νλ λ£κ³ , μ΄λ¦μ 'weight', 'bias'λ‘ λΆμ¬μ€ Variableμ μμ±νλ€.
W = tf.Variable(tf.random_normal([1]), name = 'weight')
b = tf.Variable(tf.random_normal([1]), name = 'bias')
# λ€μ΄μ¬ λ°μ΄ν°μ νμ
μ float32, shapeμ μμ§ μ ν΄μ§μ§ μμ placeholderλ₯Ό μμ±νλ€.
X = tf.placeholder(tf.float32, shape=[None])
Y = tf.placeholder(tf.float32, shape=[None])
ν μνλ‘μ°λ 'ν μ(Tensor)'λ₯Ό μ΄μ©ν΄μ κ·Έλνλ₯Ό ꡬμ±νκ³ , κ·Έλνμ λ°μ΄ν°λ₯Ό λ£μ΄ 'νλ¦(Flow)'μ λ§λλ 컨μ μ κ°μ§κ³ μλ€. μ¬κΈ°μ ν μλ ν μνλ‘μ°μ κΈ°λ³Έ λ¨μκ° λλ μ΄λ€ ꡬ쑰체(λ°°μ΄)μ―€μΌλ‘ μκ°νλ©΄ μ’μ κ² κ°λ€. μ μ½λλ₯Ό μ΄ν΄νλ €λ©΄, ν μμ μλ£νκ³Ό μμ±μ λν΄ μμμΌνλ€. W, bλ νμ΅μν¬ λ³μ λκ°λ₯Ό, X, Yλ νμ΅μ μ¬μ©νλ λ°μ΄ν°λ₯Ό λ£μ placeholder λκ°λ₯Ό μμ±νλ€.
μλ£ν
- constant : μμλ₯Ό μλ―Ένλ ν μ
- Variable : νμ΅ κ³Όμ μ΄ μ§νλλ©΄ Tensorflowκ° κ°μ μμ νλ©°, μ°Ύκ³ μνλ κ°μΌλ‘ λμκ°κ² λλ νμ΅λ³μμ΄λ€.
- placeholder : μλ£ν constantλ μμλ‘ κ°μ μμ ν μ μμ§λ§, placeholderλ λμ€μ κ°μ μ€μ ν μ μλ€.
μμ±
- Rank : μ°¨μμ μλ―Ένλ€.
(Rank=0μΈκ²½μ° μ€μΉΌλΌ(κ°), Rank=1μΈκ²½μ° 벑ν°(1μ°¨μλ°°μ΄), Rank=2μΈκ²½μ° νλ ¬(2μ°¨μλ°°μ΄)μ΄ λλ€) - Shape : μ ν΄μ§ Rankμ μ΄λ ν ꡬ쑰μ λ°μ΄ν°κ° λ€μ΄κ°λμ§λ₯Ό λνλ΄λ κ°μ΄λ€.
(Shapeλ Rankλ§νΌ μμμ κ°μλ₯Ό κ°κ²λλ€. μλ₯Ό λ€μ΄, Rank=2 -> Shape=(3, 5) : 3X5μ νλ ¬) - dtype : ν μκ° κ°μ§ λ°μ΄ν° κ°μ΄ μ΄λ€ νμ μ κ°λμ§λ₯Ό μλ―Ένλ€. μ£Όλ‘ float32, int32λ₯Ό μ΄μ©νκ² λλ€.
- name : ν μμ μ΄λ¦μ λΆμ¬μ€ μ μκ³ νμλ μλλ€.
# κ°μ μ μ μνλ€.
hypothesis = W * X + b
# λΉμ©μ μ μνλ€.
cost = tf.reduce_mean(tf.square(hypothesis - Y))
νμ¬ μ°λ¦¬κ° λ³Ό μμ λ μΈκ³΅μ§λ₯ > λ¨Έμ λ¬λ > μ§λνμ΅(Supervised Learning)μ ν΄λΉνλ€. 볡μ΅νμλ©΄, μ§λνμ΅μ μ λ ₯μ λν κ²°κ³Όκ°μ κ°μ΄ μ£Όκ³ νμ΅μμΌ, λμ€μλ μ λ ₯κ°λ§ λ°μλ κ²°κ³Όλ₯Ό μΆλ‘ ν΄λΌ μ μκ² νλ κ²μ΄λ€. μμμ μμ±ν placeholder X, Yμλ νμ μ λ ₯κ°, μ λ ₯μ λν μΆλ ₯κ°μ΄ κ°κ° λ€μ΄κ° κ²μ΄λ€.
κ°μ
κ°μ μ 'μ
λ ₯κ³Ό μΆλ ₯μ¬μ΄μ μ΄λ° κ΄κ³κ° μμ κ²μ΄λ€' νκ³ ν¨μμμ μΈμ보λ κ²μ΄λ€. λ§μ½ λ°μ΄ν°κ° μ νμ κ΄κ³λ₯Ό κ°λλ€κ³ νλ©΄ κ°μ μ H(X) = W*X + b λΌκ³ μΈμΈ μ μλ€. μκΉ μ μν Wμ bμ μ΄κΈ°κ°μ λλ€μΌλ‘ λ€μ΄κ°λ€. μμΌλ‘ νμ΅μ λ°λ³΅νλ©° W, bλ 'X, Y μ¬μ΄μ κ΄κ³μ ν΄λΉνλ κ°'μΌλ‘ μ μ κ°κΉμμ§ κ²μ΄λ€.
( X=[1, 2, 3], Y=[3, 5, 7] μ΄ νμ΅λ°μ΄ν°λ‘ μ£Όμ΄μ‘λ€λ©΄ W=2, b=1μ μ μ κ°κΉμμ§λ€)
λΉμ©ν¨μ
κ·Έλ λ€λ©΄ μ΄λ»κ² W, bλ₯Ό νλμ μ λ΅μ§μ μ κ·Όμ¬μν¬ μ μμκΉ? μΈμ΄ κ°μ μμμ H(X)κ°κ³Ό μ€μ νμ΅λ°μ΄ν° Yκ°μ μ°¨μ΄λ₯Ό μ΅μννλ κ²μ΄λ€. μ΄ λ, λΆνΈμ κ΄κ³μμ΄ μ°¨μ΄λ₯Ό λ³΄κ³ μΆμ κ²μ΄λ―λ‘ square() μ μ΄μ©ν΄ κ°μ μ κ³±ν΄μ€λ€. reduce_mean() μΌλ‘ κ°μ λͺ¨λ λν λ€ λ°μ΄ν°μ κ°―μλ§νΌ λλ μ£Όλ©΄ λΉμ©(cost)κ° μ μ λλ€.
κ·Έλ λ€λ©΄ μμΌλ‘ μ΄ μ½λμ λͺ©μ μ λΉμ©μ μ΅μλ‘ μ€μ΄λ κ²μ΄ λλ€. λΉμ©μ΄ μ΅μκ° λλ€λ κ²μ κ°μ ν μ§μ κ³Ό μ€μ λ°μ΄ν° κ° κ°μ μ°¨μ΄κ° μ΅μν λλ€λ λ§μ΄ λκΈ° λλ¬Έμ΄λ€.
# μλλ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ costμ μ΅μκ°μ μ°Ύμκ°μΌ νλ€.
# μ€λͺ
μ μν΄ κ°λ¨ν μ H(X) = W * Xλ‘ κ°μ νλ€.
'''
learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X)
descent = W - learning_rate * gradient
update = W.assign(descent)
'''
# νμ§λ§ ν
μνλ‘μ°λ μ΄ κ³Όμ μ΄ μΉμ νκ² κ΅¬νλμ΄ μλ€.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
λ¨Όμ μ μ½λμμ λ°μμ λλ²μ§Έ μ€μ 보μ.
GradientDescentOptimizer λ κ²½μ¬(Gradient)λ₯Ό νκ°(Descent)νλ©° μ΅μ μ κ°, μ¦ μ¬κΈ°μλ μ΅μκ°μ μ°Ύμμ£Όλ(Optimizer) ν¨μλΌλ μλ―Έλ₯Ό κ°κ³ μλ€. λ¬΄μ¨ κ²½μ¬λ₯Ό μ νκ°νλ€λ λ§μΌκΉ, λ λ§€κ°λ³μλ‘ μ£Όμ΄μ§ learning_rate λ λ¬΄μ¨ λ§μΌκΉ?
κ²½μ¬νκ° μκ³ λ¦¬μ¦
λ¨Όμ λ¬΄μ¨ κ²½μ¬λ₯Ό μ΄λ»κ² νκ°νλμ§ μμμΌνλ€. μλ₯Ό λ€μ΄, H(X) = W*X λΌκ³ κ°μ νμ. λΉμ©(cost)μ κ³μ°ν λ, Xμ Yλ μ΄μ°¨νΌ μ£Όμ΄μ Έμλ λ°μ΄ν°μ΄λ―λ‘, κ°μ (hypothesis)μ λ°λΌ κ°μ΄ μ’μ° λλ€. λ κ°μ μ κ²°κ΅ κΈ°μΈκΈ°μΈ Wμ μν΄ μ§μ μ λͺ¨μμ΄ λ°λκ² λλ€. λ°λΌμ costλ Wμ κ΄ν ν¨μ cost(W)λΌκ³ λ§ν μ μλ€.
λ§μ½ κ°λ‘μΆμ Wλ‘, μΈλ‘μΆμ costλΌκ³ νλ€λ©΄ κ·Έλνλ λ€μκ³Ό κ°μ΄ κ·Έλ €μ§λ€. μ°λ¦¬λ μ²μ Wλ₯Ό random_normal([1])λ‘ μ΄κΈ°ννμλ€. μ΄λ 3μ΄ μ΄κΈ°νλλ€λ©΄, (3, cost(3)) λΆν° μμν΄μ μ μ μ κΈ°μΈκΈ°(κ²½μ¬)λ₯Ό νκ³ λ΄λ €κ°λ©°(νκ°) λΉμ©μ μ΅μκ°μ μ°Ύμ κ²μ΄λ€.
- W = W - learning_rate * gradient
learning_rateλ νκ°κ°κ²©μ μ‘°μ νκΈ° μν μμμΈ μμμ΄λ€. gradientλ μ μ μ κΈ°μΈκΈ°λ₯Ό μλ―Ένλ€. μμμ κ³±μ΄λ―λ‘, Wλ μλμ κ°λ³΄λ€ μ€μ΄λ κ°μΌλ‘ μ λ°μ΄νΈ λ κ²μ΄λ€. - μ΄λ₯Ό κ³μ λ°λ³΅νλ©΄ κΌμ§μ μ ν₯ν΄ νκ°νκ² λλ€.
- κΌμ§μ μ κ°κΉμμ§μλ‘ μ μ μ κΈ°μΈκΈ°κ° κ°μν΄ λ³νλμ΄ μμμ§λ€.
νμ§λ§, μ κΉ μλ‘μ΄ κ·Έλνλ₯Ό 보μ. λ§μ½ λΉ¨κ° μ λΆν° νκ°μ μμνλ€λ©΄, μμ μκ³ λ¦¬μ¦μΌλ‘ μκ°ν΄ λ΄€μ λ, λΉμ©μ μ΅μκ°μ΄ μλμλ λΆκ΅¬νκ³ λ Έλ λΆλΆμ κ·Όμ¬ν κ²μ΄λ€.
λ°λΌμ κ²½μ¬νκ°λ²μ convex functionμ΄λΌλ νΉμ 쑰건μ λ§μ‘±μν¬λλ§ μ¬μ©μ΄ κ°λ₯νλ€. λ³Όλ‘ν¨μ(convex function)βμ λν μ€λͺ μ΄ μ λμμλ λμμμ΄λ€(λ§ν¬)
μμ μ½λμμ μ£Όμμ²λ¦¬ λμ΄μλ λΆλΆμ κ²½μ¬νκ°λ²μ μ΄μ©ν΄μ costμ μ΅μκ°μ ꡬνλ κ·Έλνλ₯Ό μ§μ λ§λ κ²μ΄λ€. νμ§λ§ tensorflowμμ μ 곡νλ βGradientDescentOptimizer()βν¨μλ₯Ό μ¬μ©νλ©΄ νμ΅μ¨κ³Ό, μ΅μνν λμμ μ§μ νλ κ² λ§μΌλ‘ μ½κ² μ¬μ©ν μ μλ€. μμμ κ²½μ¬λ₯Ό κ³μ°νκ³ , νκ°μ νλ©°, κ·Έ κ°μ Wμ μ λ°μ΄νΈνλ€.
# κ·Έλνλ₯Ό μ€νν μΈμ
μ λ§λ€μ΄μ€λ€.
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# νμ΅μ 2000λ² μ§ννλ€.
for step in range(2001):
cost_val, W_val, b_val, _ = sess.run([cost, W, b, train],
feed_dict={X: [1, 2, 3, 4, 5],
Y: [2.1, 3.1, 4.1, 5.1, 6.1]})
# 20λ²μ ν λ²μ© νμ΅κ²°κ³Όλ₯Ό μΆλ ₯ν΄μ€λ€.
if step % 20 == 0:
print(step, cost_val, W_val, b_val)
ν
μνλ‘μ°λ ν
μ(Tensor)λ‘λ κ·Έλνλ₯Ό λ§λ€κ³ λ°μ΄ν°λ₯Ό λ£μ΄ νλ¦(Flow)μ λ§λλ μΈμ΄μ΄λ€.
μΈμ
μ λ§λ€κ³ μ€ννκΈ° μ μ, νμ¬ κ΅¬μ±λμ΄ μλ κ·Έλνλ₯Ό κ·Έλ €λ³΄λ©΄ μ΄λ¬νλ€.
ν μ보λλ₯Ό μ΄μ©ν΄ μΆλ ₯ν κ·Έλνμ΄λ€. μ°μ°λ Έλλ€μ κ±°μ³ λ°μ΄ν°κ° νλ₯΄κ² λκ³ , GradientDescentOptimizerκ° W, bμ λΆμ΄ νμ΅ν μ 보λ₯Ό λ°νμΌλ‘ μμ ν κ²μμ νμΈν μ μλ€. μ μ½λμμλ sess.run( [ ..., train, ... ])μ μ€ννλ©΄ train = optimizer.minimize(cost)λΆν° μμνμ¬ κ·Έλνμ νλ¦μ΄ μκΈΈ κ²μ΄λ€. μΆλ ₯λ κ²°κ³Όλ λ€μκ³Ό κ°λ€.
X ←[1, 2, 3, 4, 5 ]
Y ←[2.1, 3.1, 4.1, 5.1, 6.1] κ° μ
λ ₯λμμΌλ―λ‘,
μ΄λ¦Όμ‘μ 보μμ λ, y = x + 1.1 μ μ§μ , μ¦ W = 1, b = 1.1μ΄λ©΄ νλ₯νκ² νμ΅μ νλ€κ³ ν μ μμ κ²μ΄λ€. 2000λ²μ νμ΅κ²°κ³Ό κ½€λ νλ₯νκ² νμ΅μ΄ λμλ€.
μμ κ²μλ¬Όμ λ§ν¬νλ 'λͺ¨λλ₯Ό μν λ₯λ¬λ' κ°μλ₯Ό λ£κ³ νκΈ°ν λ
ΈνΈμ
μΆκ°μ μΌλ‘ 곡λΆν κ²μ λν΄ μμ±ν κ²μκΈμ
λλ€.