모두의 딥러닝 시즌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의 종류
- regression(회귀) : 학습 데이터에 부합되는 출력값이 실수인 함수를 찾는 문제 ex) 기말고사 성적 예측
- binary classification(이진 분류) : 2개의 종류로만 분류하는 문제 ex)Pass/non-pass
- 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의 흐름
- graph를 만든다.
- sess.run을 통해 그래프를 실행한다.
- 그래프 안의 값이 업데이트되거나 출력값을 잔환한다.
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 |