가장 쉽게 배우는 머신러닝 - 1주차

귀찮Lee·2022년 3월 28일
0

□ 가장 쉽게 배우는 머신러닝 - 1주차

22.03.27(일) ~ 28(월)

◎ 머신러닝이란?

  • 알고리즘이란?
    수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것, 계산을 실행하기 위한 단계적 절차
    어떤 문제를 풀기 위해 수학 공식을 만드는 것과 유사
  • 머신러닝에서 해답을 내는 방법
    • 회귀 (Regression): 결과값을 연속적으로 나타냄 / float 형식
    • 분류 (Classification): 결과값이 불연속적, 정수 개수만큼 있음 / 이진 분류, 다중 분류 등으로 나눌 수 있음.
  • 머신러닝의 분류
    • 지도 학습(Supervised learning): 정답을 알려주면서 학습시키는 방법
    • 비지도 학습 (Unsupervised learning): 정답을 알려주지 않고 군집화(Clustering)하는 방법
    • 강화 학습(Reinforcement learning): 주어진 데이터없이 실행과 오류를 반복하면서 학습하는 방법 (알파고를 탄생시킨 머신러닝 방법!!)

◎ 선형 회귀 (Linear Regression)

  • 임의의 직선 1개로 이 그래프를 비슷하게 표현할 수 있다고 가설을 세움

  • 선형 모델의 가설(Hypothesis) : H(x)=Wx+bH(x) = Wx + b

    • W : Weigt / b : bias
  • 손실 함수(Cost or Loss function) :
    Cost=1Ni=1N(H(xi)yi)2Cost = {{1\over N}\sum_{i=1}^{N}{(H(x_i) - y_i) ^ 2}}

    • H(x)H(x) : 가설값 / yiy_i : 실제 값
    • 손실 함수의 값이 최소가 되어야 이 모델이 잘 학습되었다고 할 수 있다.

◎ 경사 하강법(Gradient descent method)

  • 실행 순서
    • 처음에 랜덤으로 한 점으로부터 시작합니다.
    • 좌우로 조금씩 그리고 한번씩 움직이면서 이전 값보다 작아지는지를 관찰한다..
    • 한칸씩 전진하는 단위를 Learning rate라고 부른다.
    • 그리고 그래프의 최소점에 도달하게 되면 학습을 종료
  • 적당한 Learning rate를 찾는 노가다가 필수적
    • Learning rate가 작으면 초기 위치부터 최소점을 찾는데 많은 시간을 사용함
    • Learning rate가 지나치게 크다면 최소값을 지나치고 해당 지점은 계속 진동, 발산(Overshooting) 하게 될 수 있음
  • 우리의 목표는 최소를 찾는 것
    • 우리의 목표는 이 손실 함수의 최소점인 Global cost minimum을 찾는 것
    • 우리가 한 칸씩 움직이는 스텝(Learning rate)를 잘못 설정할 경우 Local cost minimum에 빠질 가능성이 높다.
    • 우리는 최대한 Global minimum을 찾기 위해 좋은 가설과 좋은 손실 함수를 만들어서 기계가 잘 학습할 수 있도록 만들어야한다.

◎ 데이터셋 분할

  1. Training set

    머신러닝 모델을 학습시키는 용도로 사용합니다. 전체 데이터셋의 약 80% 정도를 차지합니다.

  2. Validation set

    머신러닝 모델의 성능을 검증하고 튜닝하는 지표의 용도로 사용합니다. 이 데이터는 정답 라벨이 있고, 학습 단계에서 사용하기는 하지만, 모델에게 데이터를 직접 보여주지는 않으므로 모델의 성능에 영향을 미치지는 않습니다.

  3. Test set

    정답 라벨이 없는 실제 환경에서의 평가 데이터셋입니다. 실제 머신의 성능을 평가

◎ 간단한 선형회귀 실습

  • Colab : 이번 머신러닝 실습 환경으로 이용
    개발 환경 설치를 하지 않아도 됨 (인터넷만 잘 되면 됨)
  • TensorFlow : 기본 머신러닝 프레임워크

    • 매번 똑같이 작성하는 코드가 많았음 ( weight, bias, placeholder 정의...)
    • verson1에서 실행함(v2에서는 이렇게 구현 할 수가 없음)
  • Keras: 상위 API (좀 더 사용하기 쉬운) - 앞으로 수업중 사용예정

  • TensorFlow
import tensorflow as tf

# verson 1 사용
tf.compat.v1.disable_eager_execution()

x_data = [[1, 1], [2, 2], [3, 3]]
y_data = [[10], [20], [30]]

# placeholder: X,Y 데이터를 넣어줄 공간
# 데이터의 형태 32비트 소수점 (float32)
# shape=[None,2] // None: 배치 사이즈(딥러닝에서 공부함) / 2: variable 개수
X = tf.compat.v1.placeholder(tf.float32, shape=[None, 2]) # Multi-variable linear regression
Y = tf.compat.v1.placeholder(tf.float32, shape=[None, 1])

# H(x) = W*x + b // W: Weigt / b:bias : Variable로 지정함
# 초기화는 random하게 initialize함
W = tf.Variable(tf.random.normal(shape=(2, 1)), name='W') # W는 (2,1)의 행렬 / name 지정은 크게 상관없음
b = tf.Variable(tf.random.normal(shape=(1,)), name='b') # b는 (1,1)의 행렬

# 가설: 선형회귀(Linear Regrassion) / W*x + b
# matmul : matrix multiplication
hypothesis = tf.matmul(X, W) + b

# cosr function : mean squared error 
# tf.square : 행렬의 제곱
# tf.reduce_mean : 산술평균
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# GradientDescentOptimizer : GradientDescentMethod(경사하강법) 사용 
# learning_rate : 0.01 // 결과가 안이쁘면 자주 변경해주어야 함
# minimize(cost): cost(편차 제곱의 평균)를 최소화하는 방향으로 간다.
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

# TensorFlow에서 Model을 학습시킬때는 Session이 필요함 (모든 변수들과 모든 그래프들을 다 저장하고 있는 저장소)
with tf.compat.v1.Session() as sess:
  # 모든 변수들을 초기화하는 명령어
  sess.run(tf.compat.v1.global_variables_initializer())

  # 반복 학습 실시 (50회)
  for step in range(50):
    # feeding :데이터 셋을 넣어준다. X,Y: placehodler, x_data, y_data를 넣어줌
    # 반환값: cost, weigt, bias를 계산함 // cost가 낮아야 학습이 잘 된 상태
    c, W_, b_, _ = sess.run([cost, W, b, optimizer], feed_dict={X: x_data, Y: y_data})
    # 각 step에 따라 cost를 출력하는 명령어
    print('Step: %2d\t loss: %.2f\t' % (step, c))

  print(sess.run(hypothesis, feed_dict={X: [[4, 4]]}))
  • Keras
import numpy as np
from tensorflow.keras.models import Sequential # 모델을 정의함
from tensorflow.keras.layers import Dense # 가설을 구현할 때 사용
from tensorflow.keras.optimizers import Adam, SGD

# Keras는 numpy.array 값을 받음
x_data = np.array([[1], [2], [3]])
y_data = np.array([[10], [20], [30]])

# 모델을 정의 / Sequential(순차적으로 모델을 쌓아나갈 수 있도록 만든 구조)
model = Sequential([
  # 출력 1개임을 알림
  Dense(1)
])

#모델 compile (모델을 구성함)
#loss function :  mean_squared_error 사용 // 수식을 안써도 됨
# optimizer: STG(Stochastic Gradient Descent / 배치 크기가 1인 경사하강법 알고리즘 )
# https://everyday-deeplearning.tistory.com/entry/SGD-Stochastic-Gradient-Descent-%ED%99%95%EB%A5%A0%EC%A0%81-%EA%B2%BD%EC%82%AC%ED%95%98%EA%B0%95%EB%B2%95
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.1))

# 학습시키는 명령어 fit
# fit: hypothesis 가설의 정답값을 맞춘다. / epochs(에폭) : 반복하는 횟수
model.fit(x_data, y_data, epochs=1000) # epochs 복수형으로 쓰기!

# 예측한 값을 보여줌
y_pred = model.predict([[5]])
print(y_pred)
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글