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에 입력과 학습률과 에러를 곱한 값을 더해주는 것
- 경사 하강법(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