DL.1.1 _ 인공신경망이란, 퍼셉트론 알고리즘
DataScience/인공지능

DL.1.1 _ 인공신경망이란, 퍼셉트론 알고리즘

728x90

딥러닝의 역사

많은 사람들이 딥러닝이 최근에 개발이 된 기술이라고 많이 생각한다. 하지만 과거부터 존재했다.

신경망 개요

  • 1950년대 고양이 신경세포의 실험을 통해 얻어진 신경망 아이디어는 오늘날 다층신경망(MLP, multilayer perceptron)의 발전으로 매우 강력한 머신러닝 기술 중 한 가지가 되었다.
  • 이제는 머신러닝에서 독립하여 딥러닝이라는 학문으로 발전하여 단순 계산만 잘 하던 컴퓨터를 사물인식, 분할기술, 자연어 처리 등은 컴퓨터가 잘 못하는 영역까지 사람보다 뛰어난 성과를 보이며 발전하고 있다.

왜 신경망이 다시 대두되었는가?

  • 핵심 알고리즘의 발전,
  • Framework의 발전,
  • CUDA (Gpu library, 연산 속도 증가),
  • ImageNet과 같은 Dataset의 발전 등
  • 이런 각각의 발전에서 시작되었고, 2016년 알파고를 기점으로 사람들을 놀라게 하며 인공지능이 필요한 여러 분야, 심지어 필요없는 분야에까지 진출하여 급속한 투자와 함께 깊게 활용되고 있다. 물론 사람들의 과도한 기대와 마케팅적 활용으로 인해 그 진실이 가려지는 모습도 볼 수 있었다.

퍼셉트론(Perceptron)이란?

사람의 뇌는 치밀하게 연결된 100억개의 뉴런으로 구성되어 있다. 뉴런들 사이에는 시냅스라는 연결이 뉴런마다 1000개에서 10000개까지 연결이 되어서 인터넷처럼 망으로 구성되어 뭔가 찾고 싶을 때, 구글링으로 빠르게 검색하여 결과를 얻는 것처럼, 뇌 속에서 소위 "생각"이라는 검색도구를 통해서 얻고자하는 정보를 빠르게 뇌속에서 찾을 수 있게 된다. 그렇다면 우리도 이런 퍼셉트론의 개념을 따라하면 인공적으로 '생각'하는 것 같은 무엇인가를 만들 수 있지 않을까?

  • 퍼셉트론은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년 고안한 알고리즘이다.
  • 1950년대... 고대 화석 같은 이 알고리즘을 지금 시점에 왜 배우는가?
  • 퍼셉트론이 신경망(딥러닝)의 기원이 되는 알고리즘이기 때문이다.

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.

  • 여기서 신호란 전류나 강물처럼 흐름이 있는 것을 상상하면 된다. 전류가 전선을 타고 흐르는 전자를 내보내듯이, 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달하게 된다.
  • 다만, 실제 전기(전류)나 물길(수로)와는 다르게 '흐른다' 또는 '안 흐른다'로 0이나 1의 값으로 표현한다.
  • 가중치는 전류에서 말하는 저항에 해당한다. 저항은 전류의 흐름을 억제하는 파라미터로 저항이 낮을수록 큰 전류가 흐르죠.
  • 한편 퍼셉트론에서는 그 값이 클수록 강한 신호를 흘려보낸다.
  • 작용하는 방향은 반대지만, 언젠가 배웠던 저항의 개념으로 얼마나 잘 흐르는가를 통제한다는 점에서 저항과 가중치는 같은 기능을 한다.

신경망의 기본 구조

신경망(Neural Networks)은 새로운 기술이 아니다. 1943년경 뇌의 신경활동을 수학으로 표현한 아이디어와 위에서 배운 1957년 Rosenblatt이 고안한 Perceptron(퍼셉트론) 알고리즘이 발전해 지금까지 이르게 되었다. 
많은 한계점들이 있던 신경망 기술이 좋은 시대를 만나 꽃을 피우게 된 것이다.

정확한 용어로 Artificial Neural Networks(ANN, 인공신경망)이라고 불리는 학습 모델이며 뇌의 실제 신경계의 특징을 모사하여 만들어진 계산 모델(computational model)이다. 뇌 신경망의 작은 구조인 뉴런(Neuron)을 모사한 인공 뉴런인 퍼셉트론은 다수의 입력 신호를 받아 하나의 신호를 출력한다. 최근에는 '뉴럴넷'이라는 이름으로 가장 많이 사용된다.

  • 신경세포(Neuron)
    • 뉴런, 수상돌기(Dendrites)에서 입력신호(다른 뉴런과의 시냅스)를 받아들임
    • 신경세포(Cell body)에서 정보를 통합함.
    • Axon Hillock의 임계값을 통과하면 축삭돌기(Axon)로 최종 출력 신호(또 다른 뉴런으로 전파)를 전송함

신경망 연산

단순히 입력값에 가중치를 곱해 출력을 내는 매우 간단한 신경망 입니다.

이 신경망은 함수라고 생각 할 수 있습니다. (신경망 구조와 식의 색을 비교해 보세요)

이렇게 신경망은 노드들이 가중치로 연결되어 입력값을 출력값으로 내보내는 함수인데 이 가중치를 찾는 과정을 학습(training, learning)이라고 하며 가중치는 예측에 사용된다.

신경망의 Nonlinearities(비선형성)

선형 회귀는 n-차원 공간에서 선형 모델을 학습하기 위한 방법이다. 물론 비선형(non-linear) 특성들도 다항식(polynomial)을 사용한 선형회귀모델을 사용하면 학습 가능하다. 문제는 데이터의 차원이 매우 높으며 비선형 패턴을 가진 데이터를 학습하려면 그에 따라 매우 복잡한 다차원의 특성 조합이 필요하게 된다.

 

머신러닝은 특징에 맞는 특성들을 설계하고 찾아내었다. 하지만 신경망 학습은 데이터에서 필요한 특성들을 신경망이 알아서 조합하여 찾아낸다. 즉 우리는 최소한의 데이터에 대한 전처리는 해야 하지만 심화된 특성 공학(Feature Engineering)을 사용해 특성들을 찾아낼 필요는 없다.

 

딥러닝과 머신러닝의 차이는 표현학습(representation learning)에 있다. 딥러닝은 데이터 특성(feature)을 우리가 풀고자 하는 문제를 풀기 쉽도록 표현(representation)하도록 학습하는 능력이 있다. 신경망의 구조와 깊이를 변화시키며 데이터를 더욱 유용하게 표현할 수 있다.

신경망 층 (Layer)

신경망은 여러 층(layers)으로 구성이 되는데 다음 그림과 같이 기본적으로 입력층(input layers), 은닉층(hidden layers), 출력층(output layers) 으로 나뉜다.

입력층 (Input Layers)

  • 입력층은 데이터셋으로부터 입력을 받는다.
  • 입력 변수의 수와 입력 노드의 수는 같다.
  • 보통 입력층은 어떤 계산도 수행하지 않고 그냥 값들을 전달하기만 하는 특징을 가지고 있다.
  • 신경망의 층수(깊이, depth)를 셀 때 입력층은 포함하지 않다.
  • 위의 그림의 신경망은 2층이라고 할 수 있다.

 

은닉층 (Hidden Layers)

  • 계산이 일어나는 층이 둘 이상인 신경망을 다층(multilayer) 신경망 이라고 부른다.
  • perceptron에서 이름을 빌려와서, multilayer perceptron (MLP)라고 부르기도 한다.
  • 계산이 없는 입력층과 마지막 출력층 사이에 있는 층들을 은닉층(Hidden Layers) 이라고 부른다.
  • 은닉층에 있는 계산의 결과를 사용자가 볼 수 없기(hidden) 때문에 이런 이름이 붙었다.
  • 딥러닝(deep learning)은 사실 두 개 이상의 (이때 부터 깊다(deep)라고 한다) 은닉층들을 가진 신경망, 입력층을 제외하고 세보면, 3개 이상의 Layer를 갖는 신경망을 의미한다.

출력층 (Output Layers)

  • 신경만 가장 오른쪽, 마지막 층이 출력층 이다.
  • 출력층에는 대부분 활성함수(activation function)가 존재하는데 활성화함수는 풀고자 하는 문제에 따라 다른 종류를 사용한다.
  • 회귀 문제에서 예측할 목표 변수가 실수값인 경우 활성화함수가 필요하지 않으며 출력노드의 수는 출력변수의 갯수와 같다.
  • 이진 분류(binary classification) 문제의 경우 시그모이드(sigmoid) 함수를 사용해서 출력을 확률 값으로 변환하여 클래스(Class or label)를 결정하도록 한다.
  • 다중클래스(multi-class)를 분류하는 경우 출력층 노드가 부류 수 만큼 존재하며 소프트맥스(softmax) 함수를 활성화 함수로 사용한다.
  • 복잡한 딥러닝 방법론들에서는 은닉층에서도 활성함수를 사용하기 시작한다.

Tensorflow 신경망 예제

Google에서 제공하는 FrameWork인 Tensorflow의 MNIST 예제

 

 

import pandas as pd
!pip install tensorflow-gpu==2.0.0-rc1
import tensorflow as tf

# 라이브러리 데이터셋을 불러옵니다. 
mnist = tf.keras.datasets.mnist

# Training Set, Test Set을 분류해줍니다. 
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# Value normalization을 수행합니다. 
x_train, x_test = x_train / 255.0, x_test / 255.0

# 데이터의 레이블 구성 형태를 살펴봅니다.
# 처음보는 데이터의 경우 데이터 자체를 디스플레이 하여 보면 도움이 됩니다.
pd.unique(y_train) ## 출력-> [5, 0, 4, 1, 9, 2, 3, 6, 7, 8]

# 신경망 모델을 구축합니다.
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2), # 다음강의에서 설명이 될 component :: 존재목적 Overfitting 방지
  tf.keras.layers.Dense(10, activation='softmax')
])
# 구축한 모델을 컴파일하며, 옵티마이저, loss function 등을 설정해줍니다.
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

## 학습을 하는 부분입니다. 다음 시간에 배우게될 Bp에 대해서 이해를 하신다면 이 과정이 이해가 될 것입니다. 
model.fit(x_train, y_train, epochs=5) # epoch의 수를 변화시키며 더 많이 학습하거나 적게 학습할 수 있습니다. 

## 만들어진 모델을 이용하여 예측하는 부분입니다. 
model.evaluate(x_test,  y_test, verbose=2) ## 테스트 과정

 

 

 

 

 

728x90