딥러닝 경사 하강법?
이전 글에서 살펴본 선형회귀에서
오차를 줄여나가면서 예측값을
수정한다고 했다.
선형회귀에서 a값과 b값을 조정하면서
오차를 줄여나가게 되는데, 만약
기울기 a를 너무 크게 잡으면 오차가
커지게 된다.
오차와 기울기의 관계를 그래프로
표현하는 2차 방정식 형태의 그래프가
표현된다.
오차가 가장 작은 점은 그래프의
가장 아래부분이 된다. 즉, 오차
그래프에서 가장 작은 부분으로
이동하는 방법이 바로 경사 하강법
(Gradient Decent)이다.
경사하강법에는 미분을 사용한다.
계속 어려운 용어가 나와서 머리가
아픈가?
이것만 이해하면 딥러닝의 전체적인
그림을 이해하는 것이니 조금더 힘내길
바란다.
문과생이라면 미분을 이해하지 못할 수도
있다. 하지만 개념은 간단하다.
x축 변화량 대비해서 y축 변화량이 얼마나
되는가를 보는 것이다. 이를 순간 변화량이라고
하며 그래프를 미분하면 순간 변화량을
찾는 것이다.
우리가 찾아야 하는 지점은 미분이 0이
되는 지점, 즉 기울기가 0인 지점을 찾는 것이다.
경사하강법은 임의의점 a1에서 미분을 하고,
a2에서 미분을해서 미분값이 0인지점을 계속
해서 찾아나가게 된다.
학습률 Learning Rate
우리는 기울기를 조금씩 조정하면서,
미분이 0인 지점, 오차가 0인지점을
찾아야 한다.
하지만 기울기의 변화값을 너무 크게
줘버리면 미분이 0인 지점을 찾지 못하고
오류값을 반환한다.
이 때 기울기의 변화값을 학습률이라고
한다. tensorflow의 keras에서는 학습률을
자동으로 조절해준다.
딥러닝 경사하강법 구현해보기
먼저 tensorflow 라이브러리를 호출한다.
x,y 데이터값을 정의한다. 데이터는 4개의
데이터를 입력해본다.
기울기 a값과 절편 b값을 tensorflow에서
변수를 정의한다. a값은 0~10사이의 float64형
데이터를, b값은 0~100사이의 float64형
데이터를 정의한다.
seed는 매 실행마다 동일한 결과값을 얻기위한
파라미터라고 생각하면 편하다.
회귀 모형을 그려준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
# x,y 데이터 값
data = [[2,81],[4,93],[6,91],[8,97]]
x_data = [x_row[0] for x_row in data]
y_data = [y_row[1] for y_row in data]
# 기울기 a와 y절편 b의 값을 임의로 정한다.
# 단, 기울기 범위는 0~10 사이며, y 절편은 0~100 사이에서 변하게 한다.
a = tf.Variable(tf.compat.v1.random_uniform([1], 0, 10, dtype=tf.float64, seed=0))
b = tf.Variable(tf.compat.v1.random_uniform([1], 0, 100, dtype=tf.float64, seed=0))
# y에 대한 일차 방정식 ax+b의 식을 세운다.
y=a*x_data + b
|
cs |
이전 포스팅에서 살펴본 평균제곱근 오차식을
사용해서 오차를 추적한다.
학습률은 임의로 0.1을 부여한다. keras에서는
학습률을 자동으로 조절해준다.
경사하강법은 tensorflow에서 GradientDescentOptimizer()
를 사용한다. 평균제곱근오차를 최소화하는 방향으로
경서하강법 함수를 사용한다.
이제 tensorflow에서 세션을 열고,
변수들을 초기화 해주고,
경사하강법을 20000만번 for loop으로 돌리면,
세션을 실행하면 결과값을 얻을 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# tensorflow RMSE 함수
rmse=tf.sqrt(tf.reduce_mean(tf.square(y-y_data)))
# 학습률 값
learning_rate = 0.1
# RMSE 값을 최소로 하는 값 찾기
gradient_descent = tf.compat.v1.train.GradientDescentOptimizer(learning_rate).minimize(rmse)
# tensorflow 이용 학습
with tf.compat.v1.Session() as sess:
# 변수 초기화
sess.run(tf.compat.v1.global_variables_initializer())
# 2001번 실행
for step in range(20000):
sess.run(gradient_descent)
# 100번 마다 출력
if step % 100 == 0:
print("Epoch : {0}, RMSE : {1}, 기울기 : {2}, y 절편 : {3}".format(step, sess.run(rmse), sess.run(a), sess.run(b)))
|
cs |
위 코드의 결과값은 다음과 같다.
'Programming > MachineLearning' 카테고리의 다른 글
딥러닝 오차 역전파 10분만에 이해하기 (0) | 2021.12.15 |
---|---|
딥러닝 핵심 개념 신경망 10분만에 이해하기 (0) | 2021.12.15 |
딥러닝 로지스틱 회귀 알고리즘 10분만에 이해하기 (0) | 2021.12.15 |
딥러닝 기본 구조 이해하기 선형회귀 , 평균 제곱근 오차 10분만에 이해하기 (0) | 2021.12.15 |
딥러닝의 층 구조 딥러닝을 배워보자 (0) | 2021.12.15 |
딥러닝 머신러닝 차이, 머신러닝 딥러닝 (0) | 2021.12.15 |
댓글