import numpy as np
import matplotlib.pyplot as plt
Vanishing Gradient:
층이 많아 질수록 오차역전파 수행시 미분값이 0에 다다르게 되어서 update해야되는 Gradient가 소실되어 가중치가 갱신이 되지 않아 학습이 중단되게 되는것
def sigmoid(x):
return 1/(1+np.exp(-x))
sigmoid함수
sigmoid미분 함수
그래프의 미분계수를 보면 최댓값은 0.25이다. backpropagation과정에 화성화함수의 미분값을 곱하는 과정이 있기 때문에 0.25의 매우작은 값으로 인해 vanishing gradient의 문제가 생기는 것이다.
def relu(x):
return np.maximum(0, x)
ReLU함수 그래프
def softmax(x):
exp_x = np.exp(x)
sum_exp = np.sum(exp_x)
y = exp_x/sum_exp
return y
import pandas as pd
x = np.array([2, 10, 1, 4])
y = softmax(x)
df = pd.DataFrame({"sotfmax 전 값": x, "sofmax 값": y,
"멀티분류": ["개", "고양이", "강아지", "사람"]})
df.set_index("멀티분류")
sotfmax 전 값 | sofmax 값 | |
---|---|---|
개 | 2 | 0.000334 |
고양이 | 10 | 0.997071 |
강아지 | 1 | 0.000123 |
사람 | 4 | 0.002471 |
위의 표를 보게되면 이모델로 평가된 데이터는 softmax값들 중 제일큰 고양이이다.
numpy로 소프트 맥스 함수 구현시 주의점:
소프트 맥스 함수는 지수 함수를 사용하는데 지수 함수는 큰 값을 return한다. 컴퓨터는 수를 4바이트나 8바이트와 같이 크기가 유한한 데이터를 다룬다. 다시 말해 표현 할 수 있는 수의 범위가 한정되어 너무 큰 값은 표현할 수 없다는 문제가 발생한다. 이것을 오버플로우라고 한다.
최대값을 빼줌으로서 해결하기:
{: width="60%" height="60%"}
위의 식은 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더하거나 빼도 결과는 바뀌지 않는다는것을 보여준다. 따라서 어떤값을 빼주든지 상관없지만 오버플로를 막을 목적으로는 입력 신호 중 최대값을 빼주는것이 일반적이다.
def softmax(x):
x -= np.max(x)
x = np.exp(x)
exp_sum = np.sum(x)
return x/exp_sum
a = np.array([1010, 1000, 990])
softmax(a)
array([9.99954600e-01, 4.53978686e-05, 2.06106005e-09])