밑바닥부터 시작하는 딥러닝
딥러닝 분야 부동의 베스트셀러!머리로 이해하고 손으로 익히는 가장 쉬운 딥러닝 입문서 이 책은 딥러닝의 핵심 개념을 ‘밑바닥부터’ 구현해보며 기초를 한 걸음씩 탄탄하게 다질 수 있도
www.google.com
-------------------------------------------------------------------
퍼셉트론 복습
b는 편향을 나타내는 매개변수로 뉴런이 얼마나 쉽게 활성화되는지를 제어한다. 한편 w는 각 신호의 가중치를 나타내는 매개변수로, 각 신호의 영향력을 제어한다.
아래는 위 식을 더 간결한 형태로 작성한 것이다. 이를 위해서 조건 분기의 동작(0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력)을 하나의 함수로 나타낸다. 그리고 밑에서 볼 계단함수와도 동일한 형태의 식이다.
y의 출력은 입력 신호의 총합이 h(x)라는 함수를 거쳐 변환되어 보여지고, h(x)함수는 입력이 0을 넘으면 1을 돌려주고 그렇지 않으면 0을 돌려줌으로써 상단의 식과 동일한 일을 한다.
활성화 함수
앞서 본 h(x)함수처럼 입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성화 함수라고 한다.
'활성화' 라는 이름이 말해주듯 활성화 함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 한다.
활성화 함수는 임계값을 경계로 출력이 바뀌는데 이를 계단 함수라고 한다. 그러므로 퍼셉트론에서 활성화 함수로 계단 함수를 이용한다라고 할 수 있다. 활성화 함수로 쓸 수 있는 여러 후보 중 퍼셉트론은 계단 함수를 채택하고 있다.
사실, 활성화 함수를 계단함수에서 다른 함수로 변경하는 것이 신경망의 세계로 나아가는 열쇠이다. 그렇다면 계단함수를 포함해서 여러 활성화 함수를 살펴보기로 하자. 그전에 계단함수에 대해서 먼저 살펴보면 좋을 것 같다.
계단 함수 구현하기
계단 함수는 0을 경계로 출력이 0에서 1(또는 1에서 0)로 바뀐다. 이것이 바로 계단 함수라고 불리는 이유이다.아래 그림처럼 값이 바뀌는 형태가 계단 형식이다.
def step_function(x):
y>0
return y.astype(np.int)
넘파이 배열의 자료형을 변환할 때 astype() 메서드를 이용한다. 파이썬에서는 bool을 int로 변환하면 True는 1로
False는 0으로 변환된다.
x=np.arange(-5.0, 5.0, 0.1)
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()
np.arrange(-5.0, 5.0, 0.1) 은 -5.0에서 5.0전 까지 0.1 간격의 넘파이 배열을 생성한다.
즉, [-5.0, -4.9, .... 4.9]를 생성한다. 이를 그래프로 그리면 아래와 같다.
위 그래프에 보이듯 계단 함수는 0을 경계로 출력이 0에서 1(또는 1에서 0)로 바뀐다. 이것이 '계단' 함수로 불리는 이유이다. 값이 바뀌는 형태가 마치 계단처럼 생겼기 때문이다.
시그모이드 함수 구현하기
지금까지 구현한 퍼셉트론과 달리 신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고, 그 변환된 신호를 다음 뉴런에 전달한다. 퍼셉트론과 신경망의 주된 차이는 이 활성화 함수뿐이다.
그 외에 뉴런이 여러 층으로 이어지는 구조와 신호를 전달하는 방법은 기본적으로 퍼셉트론과 동일하다.
def sigmoid(x):
return 1/(1+np.exp(-x))
이 구현의 특징은 인수 x가 넘파이 배열이어도 올바른 결과가 나온다는 것이다.
x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)
시그모이드로 동일한 출력
x=np.arange(-5.0, 5.0, 0.1)
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()
시그모이드 함수와 계단 함수 비교
Sigmoid 함수 | 계단 함수 | |
그래프형태 | 매끄러움의 차이(부드러운 곡선,연속적으로 출력이 변화) | 임계값(0)을 경계로 출력이 바뀜 |
리턴값 | 0~1사이의 실수를 리턴 | 임계값을 기준으로 0과 1을 리턴 |
물레방아 | 시시오도시 |
*공통점 -> 입력이 아무리 크거나 작아도 0~1 사이, 비선형 함수
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def step_function(x):
return np.array(x > 0, dtype=np.int_)
x = np.arange(-5.0, 5.0, 0.1)
y_sigmoid = sigmoid(x)
y_step = step_function(x)
plt.plot(x, y_sigmoid, label="Sigmoid", linestyle="-") # 실선
plt.plot(x, y_step, label="Step Function", linestyle="--") # 점선
plt.ylim(-0.1, 1.1)
plt.legend()
plt.grid()
plt.show()
비선형 함수
계단 함수와 시그모이드 함수는 둘 다 비선형 함수이다.선형 함수의 문제는 아무리 층을 깊게 해도 '은닉층이 없는 네트워크' 로도 똑같은 기능을 할 수 있다는데 있다.
선형 함수를 이용하면 신경망 층을 깊게 하는 의미가 사라지므로 신경망에서는 활성화 함수로 비선형 함수를 사용해야 함
선형 함수의 일반적인 형태는 h(x)=c⋅x 와 같은데 여기서 c는 입력 x에 어떤 상수를 곱하는 단순한 함수이다.
h(x)=c⋅x 를 사용한 3층 네트워크로 나타내면 y(x)=h(h(h(x)))이고 이는 곱셈을 세번 수행하지만 결국 y(x)=a⋅x와 동일한 식이 되고 a = c로 표현할 수 있게 되면서 은닉층이 없는 네트워크로 표현할 수 있게 된다. 즉, 선형 함수로는 여러 층으로 구성하는 이점을 살릴 수 없게 된다.
*시그모이드 함수의 한계 - 기울기 소실 문제
시그모이드 함수에서 ReLU함수로 발전된 과정이 교재에 생략되어 그 이유를 찾아보니 기울기 소실 문제가 주된 이유였다.
시그모이드 함수의 기울기는 최대가 0.25이다.
만약 신경망이 깊어지면, 역전파 과정에서 기울기가 계속 곱해지면서 아주 작아지게 되고 초기 층(입력층 근처)으로 갈수록 기울기가 거의 0이 되어 학습이 되지 않는 문제가 발생한다.
*기울기 소실 문제의 영향
가중치 업데이트가 잘 안 됨
앞쪽(입력층 쪽) 레이어는 거의 학습이 안 됨
신경망이 깊어질수록 문제가 심각해짐
ReLU 함수
최근에는 ReLU함수를 신경망 분야에서 주로 이용, 시그모이드 함수의 기울기 소실 문제를 개선한다.
ReLU는 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0이하이면 0을 출력하는 함수이다.
기울기가 0이 되지 않아서 깊은 신경망에서도 학습이 가능하다.
def relu(x):
return np.maximum(0, x)
-------------------------------------------------------------------
퀴즈
<1. 다음 활성화 함수에 대한 설명으로 옳지 않은 것은?>
1. 시그모이드 함수는 연속적이고 부드러운 곡선 형태의 그래프를 가진다.
2. 시그모이드 함수의 출력 범위는 0과 1 사이의 실수값이다.
3. 시그모이드 함수는 임계값을 기준으로 출력이 급격히 바뀐다.
4. ReLU 함수는 음수 값을 0으로 변환하고, 양수는 그대로 출력한다.
<2. 다음 중 시그모이드 함수의 기울기 소실 문제에 대한 설명으로 가장 옳지 않은 것은?>
1. 시그모이드 함수의 기울기는 최대 0.25이다.
2. 신경망이 깊어질수록 기울기가 커지면서 학습 속도가 빨라진다.
3. 시그모이드 활성화 함수를 사용하면 역전파 과정에서 기울기가 점점 작아질 수 있다.
4. 기울기 소실 문제를 해결하기 위해 ReLU 활성화 함수가 많이 사용된다.
'Miscellaneous' 카테고리의 다른 글
[2025-1] 주서영 - Deep Reinforcement Learning from Human Preferences (0) | 2025.03.06 |
---|---|
[2025-1] 장인영 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.4) 3층 신경망 구현하기 (0) | 2025.03.05 |
[2025-1] 박경태 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.3) 다차원 배열의 계산 (0) | 2025.03.05 |
[2025-1] 윤선우 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.5) 출력층 설계하기 (0) | 2025.03.05 |
[2025-1] 윤선우 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 2.1, 2.2) 퍼셉트론과 단순한 논리 회로 (0) | 2025.03.04 |