[TIL] 머신러닝_딥러닝

Hesoyam·2021년 1월 15일
0

TIL

목록 보기
1/5
post-custom-banner

머신러닝(Machine Learning)

머신러닝은 주어진 데이터로부터 패턴을 학습해서 원하는 값을 예측하는 것이 목표이다.

  • 머신러닝 모델을 학습시킬 때에는 데이터를 전처리하고 모델에 들어가도록 가공하는 작업이 필수적이다.

  • 주어진 데이터를 활용해서 더 좋은 피처(Feature)를 찾고 조합해서 만들어 내는것은 성능을 높이기 위해 해야하는 중요한 과정이다.

  • 이러한 과정을 피처 엔지니어링(Feature Engineering)이라 한다.

함수의 입ㆍ출력과 같은 형식으로 머신러닝의 일종인 지도학습의 회귀, 분류를 나타낼 수 있다.


회귀 [Regression]

  • 입력 데이터의 상관 없이, 단 하나의 연속된 실수(스칼라 값)을 맞추는 문제를 말한다.

  • One-to-One, Many-to-One 등이 해당된다.

One-to-One

  • 입력되는 변수가 하나기에 단변량 회귀(Univariate Regression)이다.

  • One-to-one 매핑은 입력값 xx와 출력값 yy
    가 모두 스칼라인 경우이다. 단 하나의 값을 입력했을 때, 단 하나의 값만 나온다.

  • f=Wx+bf = Wx + b

키-몸무게 : 키를 입력 몸무게 출력

성적-학점 관계 : 성적 입력 학점 출력


Many-to-One

  • 입력 변수가 여러개 이므로 다변량 회귀(Multivariate Regression)이다.

  • 여러가지의 정보를 입력 받아 하나의 값을 출력하는 경우

키-체지방-골격-몸무게 : 데이터를 입력받아서 몸무게를 출력

탄수화물-지방-단백질 등 영양분 : 데이터를 입력받아 해당 음식이 몇 kcal인지 출력


분류 문제 [Classifier]

  • 여러개의 카테코리 중 어떤 카테고리에 속하는지를 맞추는 문제를 말한다.

  • 분류 문제는 카테고리의 개수로 이루어져 있다.

Many-to-Many

  • 입력 변수도 여러개고 출력변수도 여러개인 분류(Classifier) 문제 이다.

오래된 명화의 화가가 누구인지 맞추는 분류문제 : 그림에 대한 붓 터치, 색감, 그려진 시기, 나라 등의 데이터로 그린 화가가 누구인지 카테고리에 대한 확률을 출력한다.

딥러닝 (Deep Learning)

딥러닝은 입력된 데이터에 내재되어 있는 표현 그 자체를 나타내도록 학습하는 것이 목표이다.

  • 딥러닝은 모델의 복잡성을 늘려 사람이 개입하는 피처 엔지니어링을 최소화한다.

  • 딥러닝에서는 데이터를 모델에 입력해서 바로 원하는 출력값을 얻어내는 End-to-End Learning을 추구하는 경우가 많다.

  • 이론적으로 딥러닝은 머신러닝의 ‘부분집합’이라고 할 수 있다.


퍼셉트론(perceptron)

인공신경망의 한 종류로서, 가장 간단한 형태의 피드포워드(Feedforward) 네트워크 선형분류기로도 볼 수 있다.
  • 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치(보통 0)보다 크면 뉴런이 활성화되고 결과값으로 1을 출력한다. 뉴런이 활성화되지 않으면 결과값으로 0 또는 -1을 출력한다.

  • 즉, 퍼셉트론은 선형 함수와 그 결과를 비선형 함수 활성화 함수까지 거치는 합성 함수라고 할 수 있다.

(Feedforward :실행에 옮기기 전에 결함을 미리 예측해 행하는 피드백 제어 방식)


다층 퍼셉트론(MLP: multi-layer perceptron)

기존 단일 퍼셉트론에선 입력층과 출력층만 존재 했다면, 다층 퍼셉트론에선 입력층과 출력층 사이에 은닉층을 포함한 3개의 층으로 이루어진 이루어진 구조를 다층 퍼셉트론이라고 한다.
- 실제 인공 신경망의 층 개수를 셀때는 입력층은 생략합니다.
(따라서 위 구조는 '총 2개의 층이 존재한다'라고 부릅니다.)
  • 입력층, 은닉층, 출력층 3개의 층 구조에서 은닉층의 개수가 많아질수록 인공신경망이 깊어졌다(Deep)라고 부릅니다.

    • 그리고 이렇게 충분히 깊어진 인공 신경망을 러닝 모델로 사용하는 머신러닝 패러다임을 바로 딥러닝(Deep Learning)이라고 합니다.
  • 딥러닝을 위해 사용하는 깊은 인공 신경망을 심층 신경망(DNN: Deep neural network)이라고 부릅니다.

일반적으로 ( 은닉층+출력층 )이 2개 이상이 되면 심층 신경망이라고 부릅니다.


완전 연결 신경망(fully-connected neural network)

다층 퍼셉트론을 지칭하는 다른 용어이다.
  • 다층 퍼셉트론의 일반적 구조에서와 같이 노드 간에 (횡적/종적) 2차원적 연결을 이룬다.
  • 서로 같은 층에 위치한 노드 간에는 연결 관계가 존재하지 않지만, 인접한 층에 위치한 노드들 간에만 연결 관계가 존재한다는 것이 특징이다.

완전 연결 신경망으로 이미지 분류를 했을때의 발생하는 문제 :
이미지를 1차원 텐서인 벡터로 변환하기에 변환하기 전 이미지가 어떤 모습이였는지 알아보기 힘들다는 문제가 있다.

  • 이미지를 1차원 구조로 변환하면서 이미지가 가지고 있던 공간적 구조 정보가 유실되기에 발생한다.

MLPClassifier Example

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

합성곱 신경망(CNN: convolutional neural network)

완전 연결 신경망에서 발생하는 이미지 분류 문제를 해결한 방법이다.
  • 이미지 분류(Image Classifier) 문제에 주로 사용된다.

  • CNN에서는 합성곱 층(Convolutional Layer)에서 입력 데이터의 형상을 유지한다.

  • 완전 연결 신경망에서 연결 개수가 증가함에 따라 가중치의 개수가 크게 증가하는 문제를 위해 크기가 작은 필터(Filter)가 존재한다고 가정하고 필터가 겹쳐지는 부분에 대해서만 가중합 및 활성함수 연산을 하도록 한다.

CNN Example

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: recurrent neural network)

이전 시점에 은닉층에서 나온 값을 자신의 입력으로 사용하는 재귀적 학습을 한다.
  • 다층 퍼셉트론 구조이며, 현재 은닉층이 이전 은닉층에 대한 데이터를 참조한다.

    • 지난 입력값이 다음 출력값에 영향을 미친다.
  • RNN의 시점이 길어질 수록 앞의 정보가 뒤로 충분히 전달하지 못하는 현상인 장기 의존성 문제가 있다.

    • 이를 해결하기 위해 LSTM(Long Short-Term Memory)이라 불리는 기법이 나타났다.
  • 시간의 흐름에따라 변화하는 데이터를 학습하기 위해 사용된다.

    • 시계열 데이터 (주식이나, 음성신호 등과 같은 연속적인 형태를 가지는 데이터)

RNN Example

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

Refercence

딥러닝이란 : 딥러닝 관련 내용

profile
거북이가 되고 싶은 자라
post-custom-banner

0개의 댓글