머신러닝은 주어진 데이터로부터 패턴을 학습해서 원하는 값을 예측하는 것이 목표이다.
머신러닝 모델을 학습시킬 때에는 데이터를 전처리하고 모델에 들어가도록 가공하는 작업이 필수적이다.
주어진 데이터를 활용해서 더 좋은 피처(Feature)를 찾고 조합해서 만들어 내는것은 성능을 높이기 위해 해야하는 중요한 과정이다.
이러한 과정을 피처 엔지니어링(Feature Engineering)이라 한다.
함수의 입ㆍ출력과 같은 형식으로 머신러닝의 일종인 지도학습의 회귀, 분류를 나타낼 수 있다.
입력 데이터의 상관 없이, 단 하나의 연속된 실수(스칼라 값)을 맞추는 문제를 말한다.
One-to-One, Many-to-One 등이 해당된다.
입력되는 변수가 하나기에 단변량 회귀(Univariate Regression)이다.
One-to-one 매핑은 입력값 와 출력값
가 모두 스칼라인 경우이다. 단 하나의 값을 입력했을 때, 단 하나의 값만 나온다.
키-몸무게 : 키를 입력 몸무게 출력
성적-학점 관계 : 성적 입력 학점 출력
입력 변수가 여러개 이므로 다변량 회귀(Multivariate Regression)이다.
여러가지의 정보를 입력 받아 하나의 값을 출력하는 경우
키-체지방-골격-몸무게 : 데이터를 입력받아서 몸무게를 출력
탄수화물-지방-단백질 등 영양분 : 데이터를 입력받아 해당 음식이 몇 kcal인지 출력
여러개의 카테코리 중 어떤 카테고리에 속하는지를 맞추는 문제를 말한다.
분류 문제는 카테고리의 개수로 이루어져 있다.
오래된 명화의 화가가 누구인지 맞추는 분류문제 : 그림에 대한 붓 터치, 색감, 그려진 시기, 나라 등의 데이터로 그린 화가가 누구인지 카테고리에 대한 확률을 출력한다.
딥러닝은 입력된 데이터에 내재되어 있는 표현 그 자체를 나타내도록 학습하는 것이 목표이다.
딥러닝은 모델의 복잡성을 늘려 사람이 개입하는 피처 엔지니어링을 최소화한다.
딥러닝에서는 데이터를 모델에 입력해서 바로 원하는 출력값을 얻어내는 End-to-End Learning을 추구하는 경우가 많다.
이론적으로 딥러닝은 머신러닝의 ‘부분집합’이라고 할 수 있다.
각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치(보통 0)보다 크면 뉴런이 활성화되고 결과값으로 1을 출력한다. 뉴런이 활성화되지 않으면 결과값으로 0 또는 -1을 출력한다.
즉, 퍼셉트론은 선형 함수와 그 결과를 비선형 함수 활성화 함수까지 거치는 합성 함수라고 할 수 있다.
(Feedforward :실행에 옮기기 전에 결함을 미리 예측해 행하는 피드백 제어 방식)
입력층, 은닉층, 출력층 3개의 층 구조에서 은닉층의 개수가 많아질수록 인공신경망이 깊어졌다(Deep)라고 부릅니다.
딥러닝을 위해 사용하는 깊은 인공 신경망을 심층 신경망(DNN: Deep neural network)이라고 부릅니다.
일반적으로 ( 은닉층+출력층 )이 2개 이상이 되면 심층 신경망이라고 부릅니다.
완전 연결 신경망으로 이미지 분류를 했을때의 발생하는 문제 :
이미지를 1차원 텐서인 벡터로 변환하기에 변환하기 전 이미지가 어떤 모습이였는지 알아보기 힘들다는 문제가 있다.
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=100, random_state=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=1)
clf = MLPClassifier(random_state=1, max_iter=300).fit(X_train, y_train)
clf.predict_proba(X_test[:1])
# >>> ([[0.03838405 0.96161595]])
clf.predict(X_test[:5, :])
# >>> ([1, 0, 1, 0, 1])
print(clf.score(X_test, y_test))
# >>> 0.88
이미지 분류(Image Classifier) 문제에 주로 사용된다.
CNN에서는 합성곱 층(Convolutional Layer)에서 입력 데이터의 형상을 유지한다.
완전 연결 신경망에서 연결 개수가 증가함에 따라 가중치의 개수가 크게 증가하는 문제를 위해 크기가 작은 필터(Filter)가 존재한다고 가정하고 필터가 겹쳐지는 부분에 대해서만 가중합 및 활성함수 연산을 하도록 한다.
import tensorflow as tf
input_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
y = tf.keras.layers.Conv2D(16, (2, 3), activation='relu', input_shape=input_shape[1:])(x)
print(y.shape)
>>> (4, 27, 26, 16)
다층 퍼셉트론 구조이며, 현재 은닉층이 이전 은닉층에 대한 데이터를 참조한다.
RNN의 시점이 길어질 수록 앞의 정보가 뒤로 충분히 전달하지 못하는 현상인 장기 의존성 문제가 있다.
시간의 흐름에따라 변화하는 데이터를 학습하기 위해 사용된다.
import numpy as np
inputs = np.random.random([32, 10, 8]).astype(np.float32)
simple_rnn = tf.keras.layers.SimpleRNN(4)
output = simple_rnn(inputs) # output shape : `[32, 4]`.
simple_rnn = tf.keras.layers.SimpleRNN(
4, return_sequences=True, return_state=True)
whole_sequence_output, final_state = simple_rnn(inputs)
final_state
딥러닝이란 : 딥러닝 관련 내용