신경망

Amps93·2024년 3월 13일
0

밑바닥 딥러닝

목록 보기
3/11

여러 개의 퍼셉트론이 연결된 구조로 구성되어 있는 것을 신경망이라고 함

활성화 함수

입력 신호의 총합을 출력 신호로 변환하는 함수
a = 입력 총합
h() = 활성화 함수
y = 출력값

시그모이드 함수

x의 값이 커질수록 1보다 아주 작은값만큼의 큰 값이 분모의 값이 됨. 즉, 전체 값이 1에 가까워짐 /  반대의 경우도 마찬가지로 전체 값이 0에 가까워짐

계단함수와 비교

  • 매끄러움의 차이
  • 계단함수는 0과 1을 반환, 시그모이드 함수는 실수를 반환
  • 공통점으로는 입력이 중요하면 큰 값, 중요하지 않으면 작은 값 출력
  • 출력이 0에서 1 사이

비선형 함수

계단 함수와 시그모이드 함수의 중요한 공통점은 비선형 함수라는 점

신경망에서는 활성화 함수로 반드시 비선형 함수를 사용해야 함 > 선형 함수를 이용하면 신경망의 층을 깊게 하는 의미가 없어짐

ReLU 함수

입력이 0을 넘으면 입력을 그대로 출력, 0 이하이면 0을 출력

3층 신경망 구성하기

1 : 편향을 뜻하는 뉴런
h() : 활성화 함수
sigma() : 활성화 함수 → 책에서 h()는 시그모이드 sigma()는 항등함수(입력값 그대로 출력)이라 둘이 다르게 표현

출력층 설계하기

신경망은 분류와 회귀 두가지 모두 사용 가능

  • 분류 : 소프트맥스 함수
  • 회귀 : 항등 함수 - 입력을 그대로 출력

주로 위 두가지 사용

항등 함수와 소프트맥스 함수 구현

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

소프트맥스 함수 구현 시 주의점

지수함수를 사용하는 소프트맥스 함수는 '오버플로'의 문제가 발생해 수치가 '불안정'해질 수 있는 문제점이 있다.

  • 지수함수는 쉽게 아주 큰 값을 뱉음
    - ex) exp^10은 20,000이 넘고 exp^100은 0이 40개가 넘음
    - 이런 큰 값끼리 나눗셈을 하면 결과 수치가 ‘불안정’해짐
  • 오버플로(overflow) : 표현할 수 있는 수의 범위가 한정되어 너무 큰 값은 표현할 수 없다.
  • 소프트맥스 함수 구현 개선
  • C라는 임의의 정수를 분자, 분모에 곱
  • C를 exp() 안으로 옮겨 logC로 만듦
  • logC를 logC' 이라는 새로운 기호로 바꿈
  • 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더해도(혹은 빼도) 결과는 바뀌지 않는다.
  • C' 에 어떤 값을 대입해도 상관없지만 오버플로를 막기 위해 입력 신호 중 최댓값을 이용하는 것이 일반적이다.
  • 개선된 소프트맥스 함수
def softmax(a):
  c = np.max(a)
  exp_a = np.exp(a-c)
  sum_exp_a = np.sum(exp_a)
  y = exp_a / sum_exp_a
  
  return y

소프트맥스 함수의 특징

소프트맥스 함수의 출력은 0~1 사이이며 출력의 총합은 1이다.

출력층의 뉴런 수 정하기

문제에 맞춘 적절한 뉴런 수 설정 필요

분류에서는 분류하고 싶은 클래스 수로 하는 것이 일반적임

profile
머신러닝 개발자

0개의 댓글