728x90
머신러닝에서 사람이 직접 가중치 조절을 하는 반면, 딥러닝에서는 컴퓨터가 가중치 조절을 한다.


그렇다면 딥러닝을 위해 사람이 해야 할 일은 무엇일까?

바로 문제에 맞는 신경망 구성과 신경망을 돌릴 수 있는 강력한 high quaility의 컴퓨터를 준비하는 것이다.

Money 또한 실력의 일부!!

 

 

출처: https://compmath.korea.ac.kr/appmath2021/Perceptron.html

 

뉴런의 수학적 표현 - 활성화 함수(Activation Function)

 

활성화 함수(Activation function)란 입력된 데이터의 가중 합을 출력 신호로 변환하는 함수이다. 인공 신경망에서 이전 레이어에 대한 가중 합의 크기에 따라 활성 여부가 결정된다. 신경망의 목적에 따라, 혹은 레이어의 역할에 따라 선택적으로 적용한다.

 

 

출처: https://imgur.com/euw7qQu

 

 

 

  • f: 활성화 함수. 임계값을 경계로 출력이 바뀐다.
  • b: bias. 편향값으로 결정 경계선을 원점에서부터 벗어나게 한다. 노드의 민감도나 활성화를 조정하여 만족스러운 모델을 fit하기 위함
  • i: input의 계수

 


완전 연결 계층(Fully-Connected Layer)의 수학적 표현

뉴런이 모인 한 단위를 계층(Layer)라고 하며, 모든 뉴런이 서로 연결된 계층을 Fully-Connected Layer(dense layer)라고 한다.

 

 


논리회로

 

    • 논리 게이트(Logic Gate)

 

AND

Input(A, B) → Output(Y)

0, 0 → 0

1, 0 → 0

0, 1 → 0

1, 1 → 1

 

: 두 입력이 모두 1인 경우에만 출력이 1이 되고, 그 외의 경우에는 출력이 0이 된다.


NAND

Input(A, B) → Output(Y)

0, 0 → 1

1, 0 → 1

0, 1 → 1

1, 1 → 0

 

: NOT AND의 약자로, AND 게이트의 출력을 반대로 만들어준다.


OR

Input(A, B) → Output(Y)

0, 0 → 0

1, 0 → 1

0, 1 → 1

1, 1 → 1

 

: 두 입력 중 하나라도 1이면 출력이 1, 두 입력 모두 0일 경우에만 0이 출력된다.


NOR

Input(A, B) → Output(Y)

0, 0 → 1

1, 0 → 0

0, 1 → 0

1, 1 → 0

 

: OR 게이트의 출력을 반대로 만들어준다.

두 개의 입력을 받으며 , 입력이 모두 0일 경우에만 출력이 1이 되고 그 외의 경우에는 출력이 0이 된다.

 

 


NOT

Input(A) → Output(Y)

0 → 1

1 → 0

 

: 입력이 1이면 출력은 0, 입력이 0이면 출력은 1이 된다.

 


XOR

: 배타적 논리합(Exclusive OR)의 약자로, 두 입력이 같으면 0이 출력된고 다르면 1이 출력된다. 

 

 

파이썬 코드로 구현해 보기

 

import numpy as np
import matplotlib.pyplot as plt

 

  • AND 게이트
 

def AND(a, b):
  input = np.array([a,b])

  *가중치 설정
  weights = np.array([0.4,0.4])
  bias = -0.6

  *출력값
  value = np.sum(input * weights) + bias

---> 여기까지 뉴럴 한 개의 프로그램을 짠 것!!

  *반환값
  if value <= 0:
    return 0
  else:
    return 1

print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
 
>>
0
0
0
1
 
*시각화 하기
 
x1 = np.arange(-2,2, 0.01)
x2 = np.arange(-2,2, 0.01)
bias = -0.6

y = (-0.4 * x1 - bias) / 0.4

plt.plot(x1, y, 'r--')
plt.scatter(0,0, color='orange', marker='o', s=150)
plt.scatter(0,1, color='orange', marker='o', s=150)
plt.scatter(1,0, color='orange', marker='o', s=150)
plt.scatter(1,1, color='orange', marker='^', s=150)
 
>>

*보기 좋게 그리드를 추가한다.
plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)
plt.grid()

>>

 

  • OR 게이트
def OR(a, b):
  input = np.array([a,b])

  *가중치 설정
  weights = np.array([0.4,0.4])
  bias = -0.3

  *출력값
  value = np.sum(input * weights) + bias

---> 여기까지 뉴럴 한 개의 프로그램을 짠 것!!

  *반환값
  if value <= 0:
    return 0
  else:
    return 1
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
 
>>
0
1
1
1
 
  • NAND 게이트
def NAND(a, b):
  input = np.array([a,b])
 
  *가중치 설정
  weights = np.array([-0.6,-0.6])
  bias = 0.7
  
  *출력값
  value = np.sum(input * weights) + bias
 
---> 여기까지 뉴럴 한 개의 프로그램을 짠 것!!
 
  *반환값
  if value <= 0:
    return 0
  else:
    return 1
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
 
>>
1
1
1
0
 
 
NOT, AND, NAND, OR, NOR를 사용하면 한 쪽으로 몰린 것만 해결할 수 있었다. 그러나 XOR(-신경망을 뭉쳐서 사용)는 해결 가능하다!

 

  • XOR 게이트
def XOR(x1, x2):
  s1 = NAND(x1, x2)
  s2 = OR(x1, x2)
  y = AND(s1, s2)

  return y
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

>>

0

1

1

0


풀려는 문제에 따라 신경망의 형태가 바뀐다.

 

이전의 값들이 영향을 미치는 것은 순환 신경망(Recurrent Neural Network, RNN)을 사용하는 것이 좋다.

합성곱 신경망(Convolutional Neural Network, CNN)은 필요한 특징을 잡아낼 때 사용한다.

 

순환 신경망(RNN)

 

합성곱 신경망(CNN)

                          ------> 특징을 잡아 정보량을 줄여 나간다.

 

활성화 함수(Activation Function)는 입력 신호의 총합을 출력 신호로 변환하는 함수이다. 단층/다층 퍼셉트론을 모두 사용한다.

다음은 대표적인 활성화 함수이다.

  • Sigmoid
  • ReLU
  • tanh
  • Identity Function
  • Softmax

파이썬 코드로 구현하기

 

1. 계단 함수(Step Function)

def step_function(x):
  if x > 0:
    return 1
  else:
    return 0
def step_function_for_numpy(x):
  y = x > 0
  value  = y.astype(np.int)

  return value
print(step_function(-3))
print(step_function(5))

>>

0

1

 

 

2. 시그모이드 함수(Sigmoid Function)

: 주로 이진분류 문제에서 사용. 출력값이 0~1의 값으로 나오며 확률로 표현 가능하다. np.exp(-x)는 지수 함수

 

def sigmoid(x):

  value = 1 / (1 + np.exp(-x))
  return value

print(sigmoid(3))
print(sigmoid(-3))

>>

0.9525741268224334

0.04742587317756678

 

plt.grid()
x = np.arange(-5,5,0.01)
y1 = sigmoid(x)
y2 = step_function_for_numpy(x)

plt.plot(x, y1,'r-')
plt.plot(x, y2, 'b--')

중앙을 기점으로 개와 고양이가 구분될 수 있다. 가운데가 지수 성장 부분

 

3. 렐루 함수(ReLu)

: 0보다 크면 그대로 출력. (0 아래로 살짝 내려가는 LeakyReLu도 있다.)

def ReLu(x):
  if x > 0:
    return X
  else:
    return 0
 
 
 

4. 항등 함수(Identity Function)

 
def identity_function(x):
  return x
 

 

 

5. 소프트맥스 함수(Softmax)

: 소프트맥스는 세 개 이상으로 분류하는 다중 클래스 분류에서 사용되는 활성화 함수. 분류할 클래스가 n개이면 n차원의 벡터를 입력받아 확률을 추정한다.

def Softmax(a):
  exp_a = np.exp(a)
  sum_exp_a = np.sum(exp_a)
  y = exp_a / sum_exp_a

  return y
a = np.array([0.3,0.2,3.0,-1.2])

print(Softmax(a))
print(np.sum(Softmax(a)))

>>

[0.0587969 0.05320164 0.8748821 0.01311936]

1.0

 

---> 소프트맥스 함수는 overflow(컴퓨터가 표현할 수 있는 숫자의 범위를 넘어서는 현상)문제로 위의 수식에서 약간 수정되어 사용된다.

 

softmax(x_i) = exp(x_i - max(x)) / (sum(exp(x_j - max(x))) for j in range(num_classes))

 

 

활성화 함수를 비선형 함수로 사용하는 이유?

  • 신경망을 deep하게 하기 위해서
  • 선형함수는 은닉층의 갯수가 의미가 없어짐
728x90

+ Recent posts