본문 바로가기
Deep Learning

[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 3-1 : 신경망과 활성화 함수

by 단깅수 2024. 1. 31.
728x90

이번에 소개할 내용은 단층 퍼셉트론의 한계를 해결한 인공신경망활성화함수에 대한 이야기입니다.

 

저번 포스팅 내용은 퍼셉트론의 한계 및 다중 퍼셉트론에 대해서였습니다.

 

[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 2-1 : 퍼셉트론의 한계 및 다중 퍼셉트론

이번에 소개할 내용은 밑시딥 2장의 뒷부분 퍼셉트론의 한계와 다중 퍼셉트론이다. 저번 내용은 퍼셉트론의 개념, AND, NAND, OR 게이트를 설명했다. 1. 이 3가지 논리 회로를 구현할 수 있었지만 배

dangingsu.tistory.com

1. 퍼셉트론에서 신경망으로

  • 인공신경망이란?
    • 신경망은 그 이름에서 알 수 있듯이, 사람의 뇌 신경을 닮았다고 해서 붙여진 이름입니다.
    • 인공신경망은 수많은 '노드'들로 구성됩니다. 하나의 노드는 여러 함수로 이루어진 하나의 프로그램인데, 이 프로그램의 구조 자체가 뉴런을 모방하고, 각 노드를 용도별로 분리한 단위를 '층' 또는 'Layer' 라고 부릅니다. 또한 각 노드가 얼마나 많은 노드와 신호(정보)를 주고 받는지 따질 수 있는 그 연결의 수를 '망'이라 하기 때문에 최종적으로 인공신경망이라고 하는 것이죠.
  • 인공신경망의 특징
    • 위 그림처럼 인공신경망은 입력층, 은닉층, 출력층으로 이루어져 있습니다.
    • 은닉층의 뉴런은 입력층, 출력층과 달리 사람 눈에는 직접적으로 보이지 않아 '은닉'층이라고 불리고 있습니다.
    • 그래서 형태적으로 보면 다수의 퍼셉트론이 연결되어 있는 듯한 느낌을 받습니다.

2.  활성화함수

  • 인공신경망의 계산 과정을 살펴보면 편향가중치의 개념이 들어있습니다.
  • 이 그림에서 b의 의미가 편향인데요.
  • 식으로 나타내면
    • h(x) = 0 (b + w1x1 + w2x2 <= 0) / 1 (b + w1x1 + w2x2 > 0)
  • 그리고 여기서의 h(x)를 일반적으로 활성화함수라고 부릅니다.
  • 아래에서는 여러 가지 활성화함수에 대해서 알아보고 코드 구현까지 해보겠습니다.

 

 

 

 


2-1. 계단함수 개념 및 구현

  • 계단함수는 입력이 0을 넘으면 1을 출력하고 그 외에는 0을 출력하는 극단적인 함수입니다.
  • matplotlib 라이브러리와 numpy 패키지를 사용해서 간단하게 코드 구현을 통해 형태를 알아보겠습니다.
import numpy as np
import matplotlib.pyplot as plt

# 계단함수 정의
def step_function(x):
    return np.array(x > 0, dtype = 'int64')

x = np.arange(-5.0, 5.0, 0.1) # -5부터 5까지 0.1간격으로 numpy배열 생성
y = step_function(x) # 계단함수 적용
plt.plot(x,y) # 시각화
plt.ylim(-0.1, 1.1) # y축 범위 지정
plt.title('계단함수 구현')
plt.show()


2-2. 시그모이드 함수 개념 및 구현

  • 시그모이드 함수 공식 : σ(x)=1+e−x1
  • ​시그모이드 함수는 계단함수를 더 매끄럽게 곡선형태로 바꾼 형태입니다.
  • 입력이 한없이 커져 무한대에 가까워진다면 출력은 1에 가까워지고 한없이 작아진다면 출력은 -1에 가까워집니다.
  • 하지만 시그모이드 함수에는 기울기 소실이라는 치명적인 단점이 존재해 요즘에는 잘 쓰이지 않고 있다고 합니다.
  • matplotlib 라이브러리와 numpy 패키지를 사용해서 간단하게 코드 구현을 통해 형태를 알아보겠습니다.
import numpy as np
import matplotlib.pyplot as plt

# 시그모이드함수 정의
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.arange(-5.0, 5.0, 0.1) # -5부터 5까지 0.1간격으로 numpy배열 생성
y = sigmoid(x) # 시그모이드함수 적용
plt.plot(x,y) # 시각화
plt.ylim(-0.1, 1.1) # y축 범위 지정
plt.title('시그모이드함수 구현')
plt.show()


2-3. ReLU 함수 개념 및 구현

  • ReLU함수는 앞선 두 함수와는 다르게 비선형 함수입니다.
  • 최근에는 시그모이드 함수의 기울기 소실 문제를 해결해 ReLU함수를 많이 사용하고 있습니다.
  • 하지만 ReLU함수도 형태를 보면 문제점을 발견할 수 있는데 이는 아래 2-4에서 확인하겠습니다.
  • ReLU함수는 입력이 0을 넘으면 그 입력을 그대로 출력하고 0 이하이면 0을 출력하는 함수입니다.
  • matplotlib 라이브러리와 numpy 패키지를 사용해서 간단하게 코드 구현을 통해 형태를 알아보겠습니다.
import numpy as np
import matplotlib.pyplot as plt

# ReLU함수 정의
def relu(x):
    return np.maximum(0, x)

x = np.arange(-5.0, 5.0, 0.1) # -5부터 5까지 0.1간격으로 numpy배열 생성
y = relu(x) # ReLU함수 적용
plt.plot(x,y) # 시각화
plt.title('ReLU함수 구현')
plt.show()


2-4. Reaky ReLU 함수 개념 및 구현

  • Reaky ReLU함수는 ReLU함수의 입력값이 0이 되는 순간의 문제점을 보완한 함수입니다.
  • 물론 문제점을 완전히 해결했다고 할 수는 없겠지만 "어느정도" 보완했다는 의미입니다.
  • ReLU함수와 동일하게 입력값이 0을 넘으면 그대로 출력하지만 0이하라면 0으로 출력하는 것이 아니라 일정 가중치를 곱해서 출력합니다.
  • matplotlib 라이브러리와 numpy 패키지를 사용해서 간단하게 코드 구현을 통해 형태를 알아보겠습니다.
import numpy as np
import matplotlib.pyplot as plt

# Leaky ReLU 함수 정의
def leaky_relu(x, alpha=0.1):
    return np.maximum(alpha*x, x)

x = np.arange(-5.0, 5.0, 0.1)  # -5부터 5까지 0.1 간격으로 numpy 배열 생성
y = leaky_relu(x)  # Leaky ReLU 함수 적용
plt.plot(x, y)  # 시각화
plt.title('Leaky ReLU 함수 구현')
plt.show()

이렇게 오늘은 인공신경망 활성화함수에 대해서 알아보았습니다.

다음 포스팅은 인공신경망에서 다차원 배열의 계산과 행렬 곱에 대해서 다룰 예정입니다.

오늘도 좋은 하루 보내세요.

 

 

728x90
반응형