일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- binary search
- 라인
- 알고리즘
- Java
- dfs
- 백트래킹
- 머신러닝
- 릿코드
- 파이썬
- C++
- Spring Framework
- 백준
- 다이나믹프로그래밍
- BFS
- 프로그래머스
- 스프링 프레임워크
- 벤쿠버
- leetcode
- STL
- 모두를 위한 딥러닝
- spring
- 스타벅스
- 프로그래밍언어론
- jvm
- 딥러닝
- DP
- 시애틀
- C/C++
- Python
- 라인플러스
- Today
- Total
케이스윔의 개발 블로그
[Lec02] Linear Regression의 Hypothesis와 cost 설명 본문
오늘은 두번째 강의을 들었다. 하루에 최소 하나씩 들으면 지루하지도 않고 재미있을 것 같다.
우선 복습을 해본다. '몇 시간을 공부했더니 성적이 몇 점이었다.' 와 같은 데이터로 학습을 하여서 학생의 성적을 예측하자! 이 학습은 0점과 100점 중에 예측을 하는 것이므로 Supervised learning 중에서 regression이다.
data를 통해서 training을 하면 학습된 모델이 생긴다. 이러한 모델을 사용한다는 것은 '시험 치기 전에 어떤 학생이 x시간 공부했는데 몇 점을 받을 수 있을까?'라고 묻는 것이다. 모델에 묻는다면 regression은 학습된 데이터를 보고 예측하고 답을 한다.
Regression(data)
x |
y |
1 |
1 |
2 |
2 |
3 |
3 |
위의 표와 같이 regression을 위한 데이터를 주면 이를 통해 그래프로 그려본다.
(Linear) Hypothesis-> 세상에 많은 현상이 linear한 그래프로 표현할 수 있다. 따라서 어떤 데이터가 있다면 여기에 잘 맞는 선을 찾아야 하고, 선을 찾는 것이 학습하는 것이다.
(Linear) Hypothesis에 의한 식을 나타내보면 H(x) = Wx+b이다. 이 식을 통해 나타난 선 중에서 어떤 선이 가장 잘 나타낸 선인지를 판단하려면 주어진 데이터와의 거리를 계산하면 된다.
cost function
: 주어진 training data와 얼마나 적합한지를 계산하는 함수, 이를 통해서 어떤 선이 가장 잘 나타낸 선인지를 판단할 수 있다.
H(x)-y로 표현할 수 있고 보통 (H(x)-y)의 제곱으로 사용해서 일정하게 차이를 보여줄 수 있다.
계산하려면 값의 수에 따라 다음과 같이 계산한다. 이 식을 통해 예측된 H(x[i])의 값과 실제값 y[i]의 차이의 정도를 구한다.
for i=0; i<=m(개수만큼 수행)
cost = 1/m((H(x[i])-y[i])의 합)-> 여기서 y[i]는 실제값
* H(x)의 자리에 Wx+b를 넣으면 cost(W,b)에 대한 식이 된다.
Regression 학습에서의 Goal은 cost(W,b)를 최소화하는 것이다. W와 b의 값을 조정해서 최소가 되도록 한다.
<Lab 2 간단한 Linear regression 구현하기>
1. 텐서플로 연산을 통해서 그래프를 만든다.
#학습할 데이터를 준다.
x_train = [1, 2, 3]
y_train = [1, 2, 3]
#variable은 기존의 변수와 다른 node이고, 텐서플로가 사용하는 variable로 trainable 한 변수이다.
W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
#여기서 [1]은 값이 하나인 1차원 shape를 주는 것이다.
hypothesis = x_train * W + b
#hypothesis node가 만들어졌다.
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
#윗줄을 통해서 cost 함수를 텐서플로로 옮긴 것이다.
#t = [1.,2.,3.,4.]
#tf.reduce_mean(t) == 2.5 ->reduce_mean()은 평균을 계산하는 함수이다.
GradientDesent(마술같은 부분..매직..)
optimize = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
#cost를 최소화하라! -> 이 역할을 하는 node의 이름이 train이므로 실행시켜야 하는 것도 train node이다.
2. Run/update graph and get results
#sess.run(op,feed_dict={x:x_data})
sess = tf.Session()
sess.run(tf.global_variables_initializer())
#세션을 만들고, 글로벌변수를 초기화해줘야한다.
for step in range(2001):
sess.run(train)
if step % 20 == 0:
print(step, sess.run(cost, sess.run(W), sess.run(b))
위의 과정을 따라 해보면 다음과 같이 출력값이 나온다.
train을 실행시킨다는 것은 train node와 연결된 그래프를 실행시키는 것과 같다. 이를 통해 학습을 시키고, cost와 W, b의 값이 어떻게 되는지 확인을 할 수 있다. 학습이 진행될수록 cost가 0에 가까운 값으로 수렴하게 되고 W, b가 원하는 값으로 수렴하게 된다.
3. placeholder를 사용해서 학습시키는 방법
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
#shape=[Node] 로 아무 값이 들어와도 된다는 것을 정해둘 수 있다.
for step in range(2001):
cost_val, W_val, b_val, _(train에 들어갈 값은 필요 없다.) =
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]})
if step % 20 == 0:
print(step, cost_val, W_val, b_val);
placeholder를 쓰는 이유는 우리가 만들어 놓은 Linear regression 모델에 대해 값을 따로 넘겨줄 수 있다.
위의 과정을 통해서 직접 간단한 Linear Regression을 학습시켜볼 수 있다. 사실 기존의 y=ax+b의 꼴을 가지는 함수와 비슷한 것 같지만, optimizer을 통해서 스스로 학습해서 cost가 0에 가까운 값으로 수렴한다. 작은 데이터를 통해서 가장 가까운 선을 찾아낼 수 있다는 것이 신기하고, 좀 더 응용할 수 있도록 더 공부를 해봐야겠다.
'모두를 위한 딥러닝' 카테고리의 다른 글
[Lab4-1&4-2] Multi-variable regression 및 Loading Data from file (0) | 2018.04.30 |
---|---|
[Lec04] Multi-variable Linear regression 이란? (0) | 2018.04.29 |
[Lec03] Linear Regression의 cost 최소화 알고리즘의 원리 설명 (0) | 2018.04.29 |
[Lec01] 기본적인 머신러닝의 용어와 개념설명 (0) | 2018.04.25 |
[Lec00] 모두를 위한 딥러닝 강좌 오리엔테이션 (0) | 2018.04.25 |