모두의 딥러닝 시즌1과 학부에서 배운 인공지능 개념을 약간 덧붙여서 정리하고자 한다. 

https://www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm 

강의에서 사용한 코드

DeepLearningZeroToAll/ipynb at master · hunkim/DeepLearningZeroToAll · GitHub

 

GitHub - hunkim/DeepLearningZeroToAll: TensorFlow Basic Tutorial Labs

TensorFlow Basic Tutorial Labs. Contribute to hunkim/DeepLearningZeroToAll development by creating an account on GitHub.

github.com

 

Lec 00

목적 

- 머신러닝에 대한 기본적인 이해 

: 딥러닝을 이해하기 위한 기본적인 알고리즘 (Linear regression, Logistic regression)을 이해한다. 

- Tensorflow과 Python을 통해 문제를 푼다. 

 

수업 형식 

- 10분의 강의 영상 

- Tensorflow 튜토리얼

수업과 실습 2가지로 나누어서 진행 

 

Lec 01 머신러닝의 기본적인 용어와 개념 설명

1. 머신러닝이란?

- 어떤 자료에서 학습하여 배우는 능력이 있는 프로그램

- Explicit programming의 한계 

: 기존의 프로그래밍은 입력을 바탕으로 프로그래머가 출력에 대해 코딩함 

-> 그러나 정확하게 코딩하기 어려운 경우가 있음 ex 스팸 필터, 자동 운전 차 

- Arthur Samuel이 자료 또는 현상에서 자동으로 배우는 것을 제안함 

-> 프로그래머가 일일히 정하지 않고, 어떤 자료에서 학습함

 

2. 머신러닝의 종류 

1) Supervised learning(지도 학습)

- labeled 된 자료(training set)를 통해 배운다 

(* 입력(문제)에 대한 출력값(답)이 정해짐)

ex) 동물 사진을 보고 고양이인지, 강아지인지 구분한다. 

 

2) Unspervised learning

- un-labeled data를 통해 학습한다. 

- 일일히 label을 주기 어려운 경우 

(* 출력에 대한 데이터가 없는 경우)

ex) Google news grouping : 알아서 유사한 것끼리 모은다. 

ex) Word clustering : 비슷한 단어들을 모은다 (데이터를 통해 스스로 학습함)

 

3. Supervised learning

이 강의에서는 Supervised learning 에 대해서 주로 배운다. 

ex) Image labeling, Email spam filter, Predicting exam score

 

1) Training data set 

이미 답이 정해져 있는 데이터가 있을 때 label을 통해 모델이 학습함 

-> 그러면 어떤 새로운 x에 대한 값을 모델이 답을 구함 

이때 모델이 학습하는 데 이용한 label이 있는 데이터를 학습 데이터라고 함 

ex) AlphaGo 

알파고도 기존의 기보를 학습함 

이세돌이 둔 수를 보고 기존에 학습했던 것을 바탕으로 어디에 바둑을 둘지 정함 

-> 일종의 supervised learning 

이때 기보가 training data set 

 

2) supervised learning의 종류

  1. regression(회귀) : 학습 데이터에 부합되는 출력값이 실수인 함수를 찾는 문제 ex) 기말고사 성적 예측 
  2. binary classification(이진 분류) : 2개의 종류로만 분류하는 문제 ex)Pass/non-pass 
  3. multi-label classification : 여러가지의 종류로 분류하는 문제 ex)Letter grade (A,B,C,D,F)

 

Lab1 실습 TensorFlow의 설치 및 기본적인 operations

TensorFlow란?

- data flow graph를 이용하여 수치 계산을 하는 라이브러리

 

Data Flow Graph란?

- 노드 : operation 

- edges : data array(tensors)

-> 노드와 edge를 거쳐서 연산이 일어나 원하는 결과를 얻는 것 

 

간단한 예시 

hello = tf.constant("Hello, TensorFlow!") // constant를 만듦 -> 그래프 안에 노드를 만듦
sess = tf.Session() // 실행하기 위해서는 Session을 만들어야함 
print(sess.run(hello)) // run을 통해 실행

 

TensorFlow의 흐름 

  1. graph를 만든다. 
  2. sess.run을 통해 그래프를 실행한다. 
  3. 그래프 안의 값이 업데이트되거나 출력값을 잔환한다. 

 

Placeholder 

- 그래프를 실행하는 과정에서 값을 던저주고 싶을 때 

-> placeholder로 노드를 만든다. 

- feed dict를 통해 값을 넘겨준다. 

 

Tensor

- Rank

Rank Math entity example
0 Scalar s=11
1 Vector v=[1,2,3]
2 Matrix m=[[1,2],[3,4],[5,6]]
n n-Tensor  

 

-Shape : 각 element가 몇개 들어 있는가

ex) t = [[4,5,6],[7,8,9]] 

     shape = (2 3) 또는 [2,3]

 

- Type 

대부분 사용하는 것은 tf.float32 (DT_FLOAT) 또는 tf.int32(DT_INT32)

 

Lec2 Linear Regression

- label이 있는 데이터를 기반으로 학습하여 실수값의 형태로 출력을 내보내는 것

 

Hypothesis

- Linear regression 모델을 학습한다는 것은 Linear 모델이 데이터에 맞을 것이다고 가정한다.

-> 모델에 맞는 선을 찾는 것이 학습의 목표

- H(x) = Wx + b  이런 형태로 가설을 세운다. 

 

 Cost function (Loss funtion)

- 어떤 선이 데이터에 맞는지 알아내기 위해 오차를 계산함

- 가설과 실제 데이터 값이 얼마나 차이가 있는가 

- H(x) - y -> 값이 음수가 될 수 있기 때문에 좋지 않다. 

-> (H(x)-y)의 제곱을 이용함 -> 항상 양수 

- 일반화 된 식 (m=학습 데이터의 수)

-Linear regression의 목표는 이 함수의 값이 최소가 되는 W와 b를 구하는 것

 

Lab2 TensorFlow로 간단한 linear regression 구현 

# 학습 데이터 
x_train = [1, 2, 3]
y_train = [1, 2, 3]

# Variable -> 텐서플로가 사용하는 variable 
# 텐서플로가 학습하면서 갱신하는 값 
# W, b의 값을 랜덤한 값을 준다. 
W = tf.Variable(tf.random_normal([1]), name='weight') 
b = tf.Variable(tf.random_normal([1]), name='bias')

# Out hypothesis XW+b
hypothesis = x_train * W + b

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train)) #reduce_mean : 평균값

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost) # cost를 최소화해라 

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer()) # 텐서 플로우의 variable을 초기화한다. 

for step in range(2001):
    sess.run(train) # 학습을 실행한다. 
    if step % 200 == 0:
        print(step, sess.run(cost), sess.run(W), sess.run(b)) 

# train을 실행하면 cost, hypothesis, W, b가 연결되어 있어 W, b값도 변경가능 
# 학습이 진행될 수록 cost가 0에 가까워진다.

 

Placeholder를 이용하는 방법 

X = tf.placeholder(tf.float32, shape=[None])
Y = tf.placeholder(tf.float32, shape=[None])

# ... (앞의 코드와 동일)

for step in range(2001):
    cost_val, W_val, b_val, _ = \
        sess.run([cost, W, b, train],
                 feed_dict={X: [1, 2, 3], Y: [1, 2, 3]}) # 값을 넘겨 준다. 
    if step % 200 == 0:
        print(step, cost_val, W_val, b_val)

Placeholder를 이용하면 값을 직접 넘겨줄 수 있다. 

코드를 실행해보면 W와 b 모두 1에 가까운 값으로 학습되고, 

새로운 데이터를 통해 학습이 잘 되었는지 확인 할 수 있다. 

 

Lec3 How to Minize Cost

설명을 위해 가설의 식을 더 간단하게 만든다. 

 

학습 데이터를 통해 W에 따른 cost를 구한다. 

x y
1 1
2 2
3 3

W=1, cost(W) = 0

W=0, cost(W) = 4.67

W=2, cost(W) = 4.67

이를 통해 함수를 그려보면 다음과 같다. 

cost가 0인 지점을 어떻게 찾을 것인가

-> Gradient descent algorithm 

 

Gradient descent algorithm 

- 경사를 따라 움직임

- 경사가 0이 되는 곳이 최소 

- W를 바꾸고 경사도를 계산하는 과정을 반복함 

- 미분을 이용함 

- Formal definiton

(알파는 learning rate)

- 이 수식을 기계적으로 계산하여 최소로 하는 W값을 구한다. 

- global 극소가 아니라 local 극소를 찾을 위험이 있음 

 

Convex function 

- 어느 점에서 시작하든 극소점이 같음 

- Gradient descent algorithm이 최적해를 보장함 

- Gradient descent algorithm을 적용하기 전에 Convex function임을 확인해야 함 

 

 

Lab3 Linear Regression의 cost 최소화 구현 

x_data = [1, 2, 3]
y_data = [1, 2, 3]

W = tf.Variable(tf.random_normal([1]), name='weight')

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

# Our hypothesis for linear model X * W
hypothesis = X * W

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize: Gradient Descent using derivative: W -= learning_rate * derivative
learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X) # gradient 값(미분한 값)
descent = W - learning_rate * gradient
update = W.assign(descent)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())

for step in range(21):
    sess.run(update, feed_dict={X: x_data, Y: y_data})
    print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))

이 예시의 경우 hypothesis가 간단하여 직접 Gradient를 구했지만 
복잡한 hypothesis의 경우 직접 미분하기 힘듦 -> tensorflow의 함수 이용

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train = optimizer.minize(cost)

Gradient를 변경하고 싶은 경우 

# Get gradients
gvs = optimizer.compute_gradients(cost, [W]) # gradient 계산한 것을 반환함 
# Optional: modify gradient if necessary
# gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs]
# Apply gradients
apply_gradients = optimizer.apply_gradients(gvs)

 

'STG 퀸트고 (딥러닝 기초) > 딥러닝 기초 (모두의 딥러닝 시즌1)' 카테고리의 다른 글

Lec10~12  (0) 2022.01.03
Lec 7 ~ 9  (0) 2021.12.27
Lec 4 ~ 6  (0) 2021.12.26

+ Recent posts