λ”₯λŸ¬λ‹

μ‹ κ²½λ§μ—μ„œμ˜ κ²½μ‚¬ν•˜κ°•λ²• κ΅¬ν˜„

주영 🐱 2022. 12. 10. 22:37
728x90
λ°˜μ‘ν˜•

신경망은 ν•™μŠ΅ μ‹œμ— 졜적의 λ§€κ°œλ³€μˆ˜(κ°€μ€‘μΉ˜μ™€ 편ν–₯)을 μ°Ύμ•„λƒ…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ΅œμ μ΄λž€ 손싀 ν•¨μˆ˜κ°€ μ΅œμ†Ÿκ°’μ΄ 될 λ•Œ λ§€κ°œλ³€μˆ˜μ˜ κ°’μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ§€κ°œλ³€μˆ˜ 곡간은 κ΄‘λŒ€ν•˜μ—¬ μ–΄λ””κ°€ μ΅œμ†Ÿκ°’μΈμ§€ μ°ΎκΈ° νž˜λ“­λ‹ˆλ‹€. 이런 μƒν™©μ—μ„œ 기울기λ₯Ό 잘 μ΄μš©ν•΄ ν•¨μˆ˜μ˜ μ΅œμ†Ÿκ°’ ν˜Ήμ€ κ°€μž₯ κ·Όμ ‘ν•œ 값을 ν•¨μˆ˜ 값을 점차 μ€„μž„μœΌλ‘œμ¨ 찾으렀고 ν•˜λŠ” 것이 κ²½μ‚¬λ²•μž…λ‹ˆλ‹€. 

 η(에타)λŠ” μ‹ κ²½λ§μ—μ„œ ν•™μŠ΅λ₯ μž…λ‹ˆλ‹€. ν•™μŠ΅λ₯ μ€ ν•œ 번의 ν•™μŠ΅μœΌλ‘œ μ–Όλ§ŒνΌ ν•™μŠ΅ν•΄μ•Ό ν• μ§€, 즉, λ§€κ°œλ³€μˆ˜λ₯Ό μ–Όλ§ˆλ‹€ μ—…λ°μ΄νŠΈν• μ§€ μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μœ„ μ‹μ²˜λŸΌ λ³€μˆ˜κ°’μ„ κ°±μ‹ ν•˜λŠ” 단계λ₯Ό μ—¬λŸ¬λ²ˆ 거치며 μ„œμ„œνžˆ ν•¨μˆ˜μ˜ 값을 μ€„μž…λ‹ˆλ‹€. ν•™μŠ΅λ₯ μ€ 0.01,0.001κ³Ό κ°™γ…Œμ΄ νŠΉμ • 값을 μ •ν•΄μ•Όν•©λ‹ˆλ‹€. λ„ˆλ¬΄ ν¬κ±°λ‚˜ μž‘μœΌλ©΄ 쒋은 μž₯μ†Œλ₯Ό μ°Ύμ•„κ°ˆ 수 μ—†μŠ΅λ‹ˆλ‹€. 보톡은 이 ν•™μŠ΅λ₯ μ„ λ³€κ²½ν•˜λ©΄μ„œ μ˜¬λ°”λ₯΄κ²Œ ν•™μŠ΅ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜λ©΄μ„œ μ§„ν–‰ν•©λ‹ˆλ‹€. 

def gradient_descent(f, init_x, lr=0.01, step_num=100):
	x = init_x
    
    for i in range(step_num):
    	grad = numerical_gradient(f,x)
    return x

fλŠ” μ΅œμ ν™”ν•˜λ €λŠ” ν•¨μˆ˜, step_num은 경사법에 λ”°λ₯Έ 반볡 횟수 μž…λ‹ˆλ‹€. ν•¨μˆ˜μ˜ κΈ°μšΈκΈ°λŠ” numerical_gradient둜 κ΅¬ν•˜κ³ , κ·Έ κΈ°μšΈκΈ°μ— ν•™μŠ΅λ₯ μ„ κ³±ν•œ κ°’μœΌλ‘œ μ—…λ°μ΄νŠΈλΌλŠ” 과정은 step_num만큼 λ°˜λ³΅ν•©λ‹ˆλ‹€. 

ν•™μŠ΅λ₯ κ°™μ€ λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜μ΄νΌνŒŒλΌλ―Έν„°λΌκ³  ν•©λ‹ˆλ‹€. μ΄λŠ” κ°€μ€‘μΉ˜, 편ν–₯과같은 μ‹ κ²½λ§μ˜ λ§€κ°œλ³€μˆ˜λ‘ΈλŠ” μ„±μ§ˆμ΄ λ‹€λ₯Έ λ³€μˆ˜μž…λ‹ˆλ‹€. μ‹ κ²½λ§μ˜ κ°€μ€‘μΉ˜λŠ” ν›ˆλ ¨λ°μ΄ν„°μ™€ μ•Œκ³ λ¦¬μ¦˜μ— μ˜ν•΄ μžλ™μœΌλ‘œ νšλ“λ˜λŠ” λ§€κ°œλ³€μˆ˜μΈ 반면, ν•˜μ΄νΌνŒŒλΌλ―Έν„°λŠ” μ‚¬λžŒμ΄ 직접 μ„€μ •ν•΄μ•Όν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€. 일반적으둜 이 ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ“€μŒ μ—¬λŸ¬ 후보 κ°’ μ€‘μ—μ„œ μ‹œν—˜μ„ 톡해 κ°€μž₯ 잘 ν•™μŠ΅μ΄ λ˜λŠ” 값을 μ°ΎλŠ” 과정을 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. 

 

 

λ°˜μ‘ν˜•