본문 바로가기

카테고리 없음

ML, DL 개요

w = tf.random.uniform([3], 0, 1) # [n]개의 값으로 된 0과 1사이의 정규분포에 의해 생성된 난수 3개를 출력
w

머신러닝의 장점

  • 기존 솔루션으로는 많은 조정과 규칙이 필요한 문제들
    • 하나의 머신러닝 모델이 코드를 간단하게 만들고 전통적인 방법보다 더 잘 수행되게 할 수 있음 (팩맨 게임을 만드는 머신러닝 모델)
  • 전통적인 방식으로는 해결 방법이 없는 복잡한 문제
    • 가장 뛰어난 머신러닝 기법으로 해결 방법을 찾을 수 있음
  • 유동적인 환경: 머신러닝 시스템은 새로운 데이터에 적응 가능
  • 복잡한 문제와 대량의 데이터에서 통찰을 얻을 수 있음

 

전이학습(Transfer Learning)

  • 기존의 학습 방법들은 학습에 사용한 데이터와 이후 분석을 하려는 데이터가 같은 분포를 가지고 있다는 가정을 바탕으로 함
  • 새로운 문제를 해결하고자 할 때 기존에 학습된 모델을 이용하여 새로운 모델을 만드는 방법
  • 이미 잘 훈련된 모델이 있고, 해결하고자 하는 문제가 유사성이 있을 경우, 학습 데이터가 부족한 경우 등에 사용
  • 기존의 pre-trained model을 미세 조정하여 사용하는 학습 방법이 대표적

딥러닝과 머신러닝의 차이

Deep Learning

  • 머신러닝의 대표적인 학습법
  • 기계 학습의 한 분야인 인공 신경망에 기반하여 많은 양의 데이터를 학습해 뛰어난 성능을 이끌어내는 연구 분야
  • 여러 층을 거쳐 점점 추상화 단계로 접어드는 알고리즘 형태
  • 패턴을 찾기 위해선, 패턴을 견고하게 만드는 많은 훈련데이터가 필요하다

 

  • 역치(threshold) : 생물체가 자극에 대한 반응을 일으키는 데 필요한 최소한도의 자극의 세기를 나타내는 수치. 우리의 몸은 들어오는 모든 자극을 대뇌로 전송하지 않는다. 따라서 일정 강도 이상의 자극이 가해지지 않으면 자극의 변화를 느낄 수 없는데, 그때의 일정 강도치를 역치라고 한다. 물리학에서는 일반적으로 반응이나 기타의 현상을 일으키게 하기 위하여 계(系)에 가하는 물리량의 최소치를 말한다.

 

계단함수

  • 더 좋은 결정경계를 찾을 수 없음

 

2) 시그모이드 함수

  • 0에서 1 사이의 값을 갖는 함수로 확률을 표현 가능
  • 0 근처에선 기울기가 크나, 0에서 멀어질수록 기울기가 작아짐
  • 따라서 모델에 Layer가 많은 경우 이 활성화 함수를 사용하면 학습이 잘 되지 않음

3) 하이퍼볼릭 탄젠트

  • 값이 작아질수록 -1, 커질수록 1에 수렴
  • 모든 실수 입력 값에 대한 출력이 정의됨
  • 출력이 실수값이라 Soft Desicion
  • 입력값이 0에 가까울 수록 출력이 빨라짐
  • 모든 점에서 미분 가능

4) ReLU 함수

ReLU(x) = max(0, x)

  • 0보다 작은 값을 0으로 강제
  • 딥러닝에서 가장 많이 사용됨
  • 미분 값이 일정(0 or 1)하여 학습이 효율적
  • 구현이 단순하여 매우 빠른 연산

 

5) softmax 함수

  • 각 입력의 지수함수를 정규화
  • 각 출력은 0~1사이의 값
  • 모든 출력의 합이 반드시 1이 됨
  • 여러 경우의 수 중 한가지에 속할 '확률'을 표현함
  • 값이 상대적으로 큰값은 훨씬 더 도드라지게 만들어 최종 출력단에서 N가지 범주를 분류하는 Multi-class Classification에 주로 사용됨

 

tensorflow로 랜덤한 데이터 생성해보기

import numpy as np
import pandas as pd
import tensorflow as tf
np.set_printoptions(precision=6, suppress=True)

pd.options.display.float_format = '{:.5f}'.format
pd.reset_option('display.float_format')
w = tf.random.uniform( [1], 0, 1 ) 
# 0 ~ 1 사이의 어떤 값을 [3]개의 파라미터로 주겠다(정규분포에 의해 생성된 난수)
w

x = 1
y = 0
eta = 0.01 # learning rate - 기존의 학습 결과를 얼만큼 이번 예측에 반영할 것인지

for i in range(100): # 1000번 학습 시킬거다
    output = w * x # y=wx라는 모델이 학습하고 있는 수식이 예측한 값
    error = y - output
    w = w + (x * error) * eta

    print(f"학습 횟수 : {i+1}, input : {x}, output : {output}, error : {error}, w : {w}")

    # eta 러닝 레이트 - 기존의 학습 결과를 이번 예측에 반영할 것인지
# 입력이 0이면 1을 출력하는 모델(뉴런 하나)을 만들어보겠습니다.

# wx + b 라는 모델의 수식을 만들어내는 것
# 모델은 학습을 거듭하며 랜덤한 수에서 시작해서 괜찮은 수식으로 진화합니다.
w = tf.random.uniform([1], 0, 1) # wx + b 에서 초기의 w는 랜덤한 값에서 시작됩니다
b= tf.random.uniform([1], 0, 1) # bias  : 가중치가 변화할 수 있도록  다음번 학습에 전달하는 역할
x = 0  # input 0
y = 1
eta = 0.1

# 학습을 덜 시키면 -> 과소적합 -> 더 좋은 결과를 얻기 위해서
# 1. 학습 횟수를 늘린다 1000 -> 1500 (1300번대에서 종료됨 )
# 2. Learning Rate를 키운다 0.01 -> 0.1로 10배 (104번대에서 종료됨)
# w(가중치)에 이전의 오차를 eta만큼 반영함으로써 모델을 학습시킬수 있다

for i in range(100000):
    output = sigmoid(w * x + b) # 출력된 결과를 0~1사이의 확률로 변환에서 출력 y=wx + b 라는 모델이 학습하고 있는 수식이 예측한 값(yhat)
    error = y - output # 예측한 값(output)과 실제값(y) 사이의 차이를 error(오차)
    w = w + (x*error) * eta # eta ( Learning Rate ) -> 기존의 학습결과를 얼마만큼 이번 예측에 반영할 것인지
    b = b + error* eta
    # 다음번 데이터가 입력될 때 w, b이 함께 전달이 되면서 eta만큼 다음번 계산에 반영을 하게 됩니다

    if i % 1000 == 999:
        print(f'학습횟수: {i}, input: {x}, output: {output}, error: {error}, w: {w}, b: {b}')

 

 

  • 뉴런 학습이란? 에러가 0에 가까워지게 기댓값에 가까운 값을 얻는 것...
    • W값을 얻기 위에 변화하는 알고리즘?
      • 경사 하강법(Gradient Descent)
        • w에 입력과 학습률과 에러를 곱한 값을 더해주는 것
  • 편향이란?
    • 입력으로는 늘 한쪽으로 치우친 고정된 값(예, 1)을 받아서 입력으로 0을 받았을 때 뉴런이 아무것도 배우지 못하는 상황을 방지

 

  • 인공 신경망(Artificial Neural Network)
    • 여러 개의 인공뉴런들이 모여 연결된 형태
    • 뉴런들이 모인 하나의 단위를 층(layer)이라고 하고, 여러 층(multi layer)으로 이루어질 수 있음
    • ex) 입력층(input layer), 은닉층(hidden layer), 출력층(output layer)

https://www.youtube.com/watch?v=aircAruvnKk&list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi&index=1&t=302s

import numpy as np

# 뉴런 1개를 재사용하기 위한 Perceptron

class Perceptron(object):
    """퍼셉트론 분류기

    매개변수
    ------------
    eta : float
      학습률 (0.0과 1.0 사이)
    n_iter : int
      훈련 데이터셋 반복 횟수
    random_state : int
      가중치 무작위 초기화를 위한 난수 생성기 시드

    속성
    -----------
    w_ : 1d-array
      학습된 가중치
    errors_ : list
      에포크마다 누적된 분류 오류

    """
  # __init__ : 기본적인 하이퍼파라미터를 Perceptron 클래스로 만든 객체에 전달합니다.
  # 학습을 돕기 위해 개발자가 조정하는 파라미터들을 
    def __init__(self, eta=0.01, n_iter=50, random_state=1):
      self.eta = eta
      self.n_iter = n_iter
      self.random_state = random_state


    # 학습을 시키기 위한 함수
    # 데이터를 집어 넣어야 합니다. x 0 -> y1  1-> 0
    # 독립변수(X) 집어 넣는 데이터들 중 변하지 말아야 할 값 - 상수처럼 우리가 값을 넣을 분 변경하지 않는다 대문자
    # 종속변수(y) 집어넣은 데이터의 결과(변하는 값) yhat - X가 무엇이냐에 따라 달라지는 변화이기 때문에 소문자
    def fit(self, X, y):
        rgen = np.random.RandomState(self.random_state) # 난수의 씨드값
        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1+ X.shape[1]) # w(가중치) - 독립변수가 몇차원으로 들어오건 
        self.errors_ = [] # 학습할 때마다 error 오차를 list로 저장하면서 관리
        # error 오차

    # 학습을 완료한 모델로 새로 들어온 데이터를 예측하는 함수
    def net_input:
        pass

    # 예측한 결과를 출력하는 함수
    def predict:
        pass