퍼셉트론 / 신경망

17781 단어 딥러닝딥러닝

1. 퍼셉트론(Perceptron)

신경망을 구성하는 가장 기본 단위
다수의 신호를 입력으로 받아 하나의 신호를 출력

  • 신호란 전류와 같은 일종의 흐름
  • 흐른다 / 안흐른다로 1과 0 값 중 하나를 가질 수 있다
  • 가중치는 전류의 저항과 비슷하지만 퍼셉트론에서는 가중치(저항)이 클수록 강한 신호를 흘려보낸다

2. 논리게이트(Logic Gate)

퍼셉트론의 가장 단순한 형태는 AND, NAND, OR과 같은 논리 게이트

① AND GATE : 입력 신호가 모두 1(True)일 때 1(True)을 출력
② NAND(Not AND) GATE : AND 와 결과가 반대
③ OR GATE : 입력 신호 중 하나만 1(True)이라도 1(True)을 출력
④ XOR GATE : 입력 신호가 다를 경우 1(True)을 출력
(신경망이 논의되던 초기에 퍼셉트론의 한계로 지적되었던 것이 바로 XOR GATE 의 표현)

3. 신경망의 기본구조

  • ANN(Artificial Neural Networks) : 인공 신경망은 실제 신경계의 특징을 모사하여 만들어진 계산 모델
  • 인공 신경망의 기본 구조인 퍼셉트론은 실제 뇌 신경망의 기본 구조인 뉴런을 모사하여 제작
  • 최근에는 줄여서 뉴럴넷(Neural-Net)으로 불린다

※ 원으로 표현된 부분이 뉴런 또는 노드 라고 한다
① 입력 신호( x0,x1,... )가 입력되면 각각 고유한 가중치( w0,w1,... )가 곱해진다
② 다음 노드에서는 입력된 모든 신호를 더해준다( ∑ )
③ 각 노드에서의 연산값이 정해진 임계값(Threshold Logic Unit)을 넘을 경우에만 다음 노드들이 있는 층(layer)으로 신호를 전달한다

우리의 목표는 생물의 신경망과 유사한 인공 신경망을 만드는 것이 아니라
복잡한 데이터 속에서 패턴을 발견할 수 있는 알고리즘으로서의 인공 신경망을 만드는 것

4. 활성화 함수(Activation Function)

  • 각 노드에서의 연산값이 정해진 임계값을 넘을 경우에만 다음 노드로 신호를 전달하는 역할
  • 다음 층으로 신호를 얼마만큼 전달할지를 결정

① 계단 함수(Step function)

  • 입력 값이 임계값을 넘으면 1을 출력하고 그렇지 않으면 0을 출력하는 함수
  • 단점 : 임계값 지점에서 미분이 불가능하고 나머지 지점에서는 미분값이 0이 나온다

② 시그모이드 함수(Sigmoid function)

  • 모든 지점에서 미분 가능하며 미분값도 0이 아니다
  • σ(x)=11+ex\sigma(x) =\frac{1}{1+{e}^{-x}}

  • 단점 : 음수 값을 0에 가깝게 표현하기 때문에 입력 값이 최종 레이어에서 미치는 영향이 적어지는 Vanishing Gradient Problem이 발생

③ ReLU 함수(Rectified Linear Unit, 경사함수)

  • 실제로 많이 사용되는 활성화 함수
  • sigmoid, tanh 함수보다 학습이 빠르고, 연산 비용이 적고, 구현이 매우 간단하다는 특징이 있다
  • x<0인 값들에 대해서는 기울기가 0이기 때문에 뉴런이 죽을 수 있는 단점이 존재한다

5. 순전파

입력층에서 입력된 신호가 은닉층의 연산을 거쳐 출력층에서 값을 내보내는 과정

y=f[(b+w0x0+w1x1+...+wnxn)]y = f \bigg[\sum(b + w_0x_0 + w_1x_1 + ... + w_nx_n) \bigg]

1. 초기상태를 설정
# 가중치와 편향의 값을 임의로 지정(가중치와 편향의 값을 통해 출력값이 나옴)

W1, W2 : 가중치
B1, B2 : 편향

2. 순전파(feed forward) 함수를 정의
# 순전파는 가중치와 편향의 연산을 반복하며 입력값을 받아 출력값으로 반환하는 과정
# (가중치와 곱 + 편향)
A1 = np.dot(x, W1) + b1    # x * 가중치1 + 편향1
Z1 = sigmoid(a1)   	   # 활성화 함수
A2 = np.dot(Z1, W2) + b2   # Z1 * 가중치2 + 편향2

3. 정의한 함수와 입력 데이터를 바탕으로 계산한 값을 출력
y = A2
  • 노드가 가중치로 연결되어 입력 신호와 연산한 뒤에 출력값으로 내보내는 함수라고도 할 수 있다
  • 가중치를 수정하면서 적절한 값을 찾는 과정이 학습(training, learning)이다

6. 신경망의 층

1. 입력층(Input layer)

  • 데이터셋이 입력되는 층
  • 데이터셋의 특성(Feature)에 따라 입력층의 노드의 수가 결정
    (Feature수 = Node수)
  • 입력층은 어떤 계산도 수행하지 않고 그냥 값들을 전달하기만 하는 특징을 가진다
  • 신경망의 층수(깊이, depth)를 셀 때 입력층은 포함하지 않는다

2. 은닉층(Hidden layer)

  • 입력된 신호가 가중치, 편향과 연산되는 층
  • 입력층과 출력층 사이에 있는 층을 은닉층이라 부른다
  • 은닉층에서 일어나는 계산의 결과를 사용자가 볼 수 없어서 은닉이라는 단어가 붙었다
  • 은닉층의 노드수는 특성 수와 상관 없이 구성할 수 있다

※ 일반적으로 딥러닝이면 2개 이상의 은닉층을 가진 신경망을 말한다

3. 출력층(Output layer)

  • 은닉층의 연산을 마친 값이 출력되는 층
  • 풀어야할 문제 종류에 따라서 출력층을 잘 설계하는 것이 중요
  • 이진분류 : 시그모이드(sigmoid) 함수 사용하며 출력층의 노드 수는 1 (출력되는 값이 0과 1사이의 확률값이 되도록 한다)
  • 다중 분류 : 소프트맥스(softmax) 함수 사용하며 출력층의 노드 수는 레이블의 클래스 수와 동일하게 설정
  • 회귀 : 일반적으로 활성화 함수를 지정하지 않으며 출력층의 노드 수는 출력값의 특성(feature)수와 동일하게 설정

7. Tensorflow 코드

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

# 신경망 모델 구축
# 각층의 노드수와 활성화 함수 지정
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)), # 차원 축소
  tf.keras.layers.Dense(100, activation='relu'), 
  tf.keras.layers.Dense(10, activation='softmax')
])

# 종류에 따라 옵티마이저, loss, metrics 지정
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
              
# 모델 학습(하이퍼파라미터 지정)
model.fit(x_train, y_train, epochs=5)

# 모델 평가
model.evaluate(x_test,  y_test, verbose=2)

※ 표현학습 (Representation learning)

  • 머신러닝은 전처리로 모델성능을 올릴 수 있었지만 신경망은 데이터에서 필요한 특성을 알아서 조합하여 찾아낸다
    따라서 최소한의 전처리만 해주어도 된다
  • 이렇게 스스로 특성 관계를 찾아내는 것이 표현 학습

좋은 웹페이지 즐겨찾기