πŸ’»/ML

[λͺ¨λ‘λ₯Ό μœ„ν•œ λ”₯λŸ¬λ‹] λ‘œμ§€μŠ€ν‹± νšŒκ·€

ruhz 2020. 7. 27. 03:17

κ³΅λΆ€μ‹œκ°„(X)을 늘리면 더 쒋은 성적(Y)을 λ°›λŠ” 것은 ν†΅κ³„μ μœΌλ‘œ ν•©λ‹Ήν•  것이닀. 1μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ€ 20점, 3μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ€ 60점, 4μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ€ 80점을 λ°›κ³ , μ΄λŠ” μ„ ν˜•μ μΈ 관계에 μžˆλ‹€κ³  ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  데이터가 항상 이런 μ„ ν˜•μ μΈ 관계에 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€.

 

 

λ‘œμ§€μŠ€ν‹± νšŒκ·€

합격과 λΆˆν•©κ²©μœΌλ‘œλ§Œ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” P/F 상황을 κ°€μ •ν•΄λ³΄μž.
1μ‹œκ°„ ~ 3μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ€ λΆˆν•©κ²©μ„ λ°›κ³ , 4~6μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ€ 합격을 λ°›μ•˜λ‹€. 합격=1, λΆˆν•©κ²©=0 으둜 봀을 λ•Œ λ‹€μŒ 상황을 X=[1, 2, 3, 4, 5, 6], Y=[0, 0, 0, 1, 1, 1] 둜 말할 수 있고, 이 데이터λ₯Ό ν•™μŠ΅μ— μ΄μš©ν•  수 μžˆμ„ 것이닀.

ν‰μ†Œμ²˜λŸΌ μš°λ¦¬κ°€ H(X) = X*W + b둜 가정을 ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 κ²°κ³Όλ₯Ό 얻은 λ’€, yμ’Œν‘œκ°€ 0.5κ°€ λ„˜μ–΄κ°€λ©΄ 1(합격), 그렇지 μ•Šλ‹€λ©΄ 0(λΆˆν•©κ²©)으둜 νŒλ‹¨ν•  수 μžˆλ‹€. 이 νŒλ‹¨μ΄ ν•©λ¦¬μ μœΌλ‘œ 보일 수 μžˆμ§€λ§Œ 사싀은 λͺ‡κ°€μ§€ λΆˆνŽΈν•œ 점이 μžˆλ‹€.

  • μœ„ μ§μ„ μ—μ„œ 100μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ΄ ν•©κ²©ν•œ 경우((100, 1))이 ν•™μŠ΅λ°μ΄ν„°λ‘œ 주어진닀면, λΉ„μš©μ„ 쀄이기 μœ„ν•΄ μ§μ„ μ˜ κΈ°μšΈκΈ°λŠ” 더 쀄어듀 것이고 μ΄λŠ” 4μ‹œκ°„ κ³΅λΆ€ν•œ μ‚¬λžŒμ΄ λΆˆν•©κ²© ν•  것이라고 잘λͺ»λœ μ˜ˆμΈ‘μ„ ν•  μˆ˜λ„ μžˆλ‹€.
  • μ• μ΄ˆμ— 값이 0κ³Ό 1이면 λ˜λŠ”λ°, μœ„ μ§μ„ μ—μ„œ 500μ‹œκ°„μ„ κ³΅λΆ€ν–ˆλ‹€λ©΄ YλŠ” μ•½ 100의 값을 κ°–κ²Œ 될 것이고, 이λ₯Ό λ‹€μ‹œ 1둜 κ³ μ³μ€˜μ•Ό ν•œλ‹€. λͺ¨μ–‘이 쒋지 μ•Šλ‹€.

 

 

 

X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# W와 X의 곱은 shape이 클 경우 ν–‰λ ¬μ˜ 곱으둜 μ •μ˜ν•˜λŠ” 것이 μ’‹λ‹€.
# λ§Œλ“  가정을 sigmoidν•¨μˆ˜μ— λ„£μ–΄μ€€λ‹€.
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)

κ°€μ •

λ”°λΌμ„œ μš°λ¦¬λŠ” μƒˆλ‘œμš΄ 가정을 λ§Œλ“€μ–΄μ€„ ν•„μš”κ°€ μžˆλ‹€. λ¨Όμ € 기쑴에 μ‚¬μš©ν•˜λ˜ κ°€μ • H(x) = Wx + b λ₯Ό 0κ³Ό 1μ‚¬μ΄μ˜ κ°’μœΌλ‘œ 적절히 λ³€ν™˜ν•΄μ£ΌλŠ” 필터에 넣어쀄 것이닀.

이 ν•¨μˆ˜λŠ” Sigmoid 라고 ν•˜λ©°, μž…λ ₯값이 컀지면 1에 κ°€κΉŒμ›Œμ§€κ³ , μž…λ ₯값이 μž‘μ•„μ§€λ©΄ 0에 κ°€κΉŒμ›Œμ§€κ²Œ λœλ‹€. μš°λ¦¬λŠ” ν•™μŠ΅μ— 과정을 ν•˜λ‚˜ μΆ”κ°€ν•˜μ—¬, H(x) = Wx + b 가정을 μƒμ„±ν•˜κ³  y = Sigmoid(x) ν•¨μˆ˜μ— H(x)λ₯Ό μž…λ ₯κ°’μœΌλ‘œμ„œ λ„£μ–΄ μƒˆλ‘œμš΄ κ°€μ • H'(x) = Sigmoid(H(x)) λ§Œλ“€ 것이닀. 이 μƒˆλ‘œμš΄ κ°€μ • H'(x)λŠ” H(x)의 값이 컀질 수둝 1에 κ°€κΉŒμ›Œμ§€κ³ , μž‘μ•„μ§ˆ 수둝 0에 κ°€κΉŒμ›Œμ§„λ‹€.

 

 

 

cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *
                       tf.log(1 - hypothesis))

train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

λΉ„μš©ν•¨μˆ˜

λ‹€μŒ μŠ€ν…μ€ μƒˆλ‘œμš΄ 가정에 λŒ€ν•˜μ—¬ μƒˆλ‘œμš΄ λΉ„μš©μ„ μ •μ˜ν•˜λŠ” 것이닀. 기쑴의 λ°©μ‹λŒ€λ‘œ λΉ„μš©μ„ κ΅¬ν•œλ‹€λ©΄, y = cost(W)의 κ·Έλž˜ν”„λŠ” λ³Όλ‘ν•¨μˆ˜κ°€ μ•„λ‹Œ 정체λͺ¨λ₯Ό ν•¨μˆ˜κ°€ λ‚˜μ˜¬ 것이닀. 그럼 κ²½μ‚¬ν•˜κ°•λ²•μ„ μ μš©ν•΄ μ΅œμ €λΉ„μš©μ μ„ μ°ΎλŠ”λ° λ¬Έμ œκ°€ 생기기 λ•Œλ¬Έμ— μƒˆλ‘œμš΄ 방법을 μ°Ύμ•„μ•Ό ν•œλ‹€. 방법을 μ°ΎκΈ° μœ„ν•΄μ„œ λ¨Όμ € κ°€μ •κ³Ό 데이터 μ‚¬μ΄μ˜ 였차λ₯Ό κ³„μ‚°ν•˜λ˜ 기쑴의 방법을 λ°”κΎΌλ‹€.

$$(H(x) - Y)^{2}\to{ c\ (H(x), y) }\\\\{ c\ (H(x), y) } \cases{ -log(H(x))\ \ \ \ \ \ \ \ \ \ :y=1 \\ -log(1-H(x))\ \ \ :y=0 }$$

  • y=1인 경우, signoid ν•„ν„°λ₯Ό 거친 H(x)λŠ” 0λΆ€ν„° 1μ‚¬μ΄μ˜ 값을 κ°–λŠ”λ‹€. H(x)κ°€ 0에 κ°€κΉŒμ›Œμ§ˆ 수둝 λΉ„μš©μ€ 점점 컀질 것이고, H(x)κ°€ 1에 κ°€κΉŒμ›Œμˆ˜λ‘ λΉ„μš©μ€ μž‘μ•„μ§ˆ 것이닀.
  • y=0인 경우, H(x)κ°€ 0에 κ°€κΉŒμ›Œμ§ˆ 수둝 λΉ„μš©μ€ 점점 μž‘μ•„μ§ˆ 것이고, H(x)κ°€ 1에 κ°€κΉŒμ›Œμˆ˜λ‘ λΉ„μš©μ€ μž‘μ•„μ§ˆ 것이닀.

$${ c\ (H(x), y) } = -y \times log(H(x)) -(1-y)\times log(1-H(x))$$

이 λΉ„μš©ν•¨μˆ˜λŠ” μ‹€μ œ 데이터 y에 가정이 κ°€κΉŒμ›Œμ§ˆμˆ˜λ‘ λΉ„μš©μ΄ 점점 μž‘μ•„μ§€λŠ” 것을 λ³΄λ‹ˆ, μ œλŒ€λ‘œ μ„€κ³„λ˜μ—ˆλ‹€κ³  ν•  μˆ˜μžˆλ‹€.λΉ„μš©ν•¨μˆ˜κ°€ μ •μ˜λ˜μ—ˆμœΌλ‹ˆ λ‚˜λ¨Έμ§€ 과정은 tensorflowκ°€ μ•Œμ•„μ„œ μ°©μ°©μ°© 해쀄것이닀.

 

 

 

# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

# Launch graph
with tf.Session() as sess:
    # Initialize TensorFlow variables
    sess.run(tf.global_variables_initializer())

    for step in range(10001):
        cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
        if step % 200 == 0:
            print(step, cost_val)

    # Accuracy report
    h, c, a = sess.run([hypothesis, predicted, accuracy],
                       feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)

결과적으둜 μ½”λ“œμ˜ 흐름을 정리해보면 이렇닀.

  1. κ°€μ •(초둝 κ·Έλž˜ν”„)을 sigmoid ν•¨μˆ˜μ— ν•„ν„°μ‹œμΌœ 0~1 λ²”μœ„λ‘œ(보라 κ·Έλž˜ν”„) λ§Œλ“€μ–΄ μ€€λ‹€.
  2. κ°€μ •κ³Ό Y의 였차, 즉 λΉ„μš©μ„ 계산할 λ•Œμ—λŠ”, Y값에 따라 ν•¨μˆ˜(- log(X) / - log(1-X) )λ₯Ό 선택해 가정을 λŒ€μž…ν•΄μ€€λ‹€.
  3. κ²°κ³Όλ₯Ό λͺ¨λ‘ 더해 λ°μ΄ν„°μ…‹μ˜ 개수둜 λ‚˜λˆ  μ΅œμ’…μ μœΌλ‘œ λΉ„μš©μ„ κ΅¬ν•œλ‹€.
  4. κ²½μ‚¬ν•˜κ°•λ²•μ„ μ‚¬μš©ν•΄ λΉ„μš©μ˜ μ΅œμ €μ μ„ μ°Ύμ•„κ°€λ©° W, bλ₯Ό ν•™μŠ΅ν•œλ‹€.

 

μ•žμ„  κ²Œμ‹œλ¬Όμ— λ§ν¬ν–ˆλ˜ 'λͺ¨λ‘λ₯Ό μœ„ν•œ λ”₯λŸ¬λ‹' κ°•μ˜λ₯Ό λ“£κ³  ν•„κΈ°ν•œ λ…ΈνŠΈμ—
μΆ”κ°€μ μœΌλ‘œ κ³΅λΆ€ν•œ 것을 더해 μž‘μ„±ν•œ κ²Œμ‹œκΈ€μž…λ‹ˆλ‹€.