728x90
이번에 소개할 내용은 단층 퍼셉트론의 한계를 해결한 인공신경망과 활성화함수에 대한 이야기입니다.
저번 포스팅 내용은 퍼셉트론의 한계 및 다중 퍼셉트론에 대해서였습니다.
2024.01.24 - [Deep Learning] - [딥러닝] 밑바닥부터 시작하는 딥러닝 공부 2-1 : 퍼셉트론의 한계 및 다중 퍼셉트론
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
'Deep Learning' 카테고리의 다른 글
[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 3-2 : MNIST 손글씨 숫자 인식 및 구현 (0) | 2024.02.17 |
---|---|
[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 3-2 : 행렬 곱연산과 신경망 구현 (2) | 2024.02.11 |
[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 2-2 : 퍼셉트론의 한계 및 다중 퍼셉트론 (0) | 2024.01.24 |
[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 2-1 : 퍼셉트론이란? (0) | 2024.01.19 |
[딥러닝] 밑바닥부터 시작하는 딥러닝 공부 1-2 : 시각화 (1) | 2024.01.12 |