본문 바로가기
  • 공부한 것들과 여러가지를 기록해요
Python/DL

신경망, 오차역전파법

by 티권 2023. 7. 14.

신경망이란?

- 인간의 뉴런 구조를 본떠 만든 기계학습과정의 유형


활성화 함수

- 입력신호의 총합을 출력신호로 변환하는 함수

- 입력신호의 총합이 활성화를 일으키는지 정하는 역할

 

 

 

입력신호의 총합, a라는 노드가 h(x)라는 활성화함수를 거쳐 y라는 노드로 변환됨

활성화함수로 신호를 변환하고 그 변환된 신호를 다음 뉴런에 전달

: 노드 마다 입력과 출력이 있는데 노드의 입력이 활성화함수를 거쳐 그 노드의 출력이 되고, 다음 뉴런에 그 값이 전달 됨

 

h(x)는 임계값(0)을 경계로 출력이 바뀌는 함수 -> 계단 함수

퍼셉트론은 활성화함수로 계단함수를 이용함 

 

딥러닝에서는 활성화함수로 계단함수를 사용하지 않음. 

역전파과정에서 미분가능해야하기 때문에 계단함수 처럼 불연속이면 안되기 때문

계단 함수가 아닌 다른 함수를 활성화함수로 사용해야함.

 

 

계단함수 - 퍼셉트론에서는 뉴런 사이에 0 혹은 1이 흘렀다면

시그모이드 - 신경망에서는 연속적인 실수가 흐른다고 생각할 수 있음

 

계단함수와 시그모이드 함수는 둘 다 비선형 함수라는 공통점을 확인 할 수 있음

활성화함수는 비선형함수를 사용해야한다!

이유 : 활성화 함수가 선형 함수라면 층을 쌓는 의미가 없어짐.

ex) y(x) = ax 인 활성화함수를 사용했다면 여러 층을 쌓았을 때도 결국 (a^n)x 형태가 되어 선형 함수로 표현이 가능해짐.

 

+ 출력층의 활성화함수는 풀고자하는 문제에 따라 적절히 선택해야함

이진 분류 - 시그모이드

다중 분류 - 소프트맥스

회귀 - 항등함수(입력을 그대로 출력)

 


신경망에서 행렬곱은 위의 사진과 같이 이뤄진다.

 

편향과 활성화함수까지 반영한다면, 신경망의 순전파 과정은 아래 사진과 같다

 


출력층의 뉴런 수는 풀고자하는 문제에 따라 적절히 정함

분류 문제에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반

 

mnist 손글씨 문제에서는 0~9까지 총 10개의 클래스로 분류해야하기 때문에 출력층의 노드 수는 10개

 

 

 Q. 첫번째 노드가 0, 두번째 노드는 1,... 이런식으로 어떻게 딱 맞게 대응이 될까?

train data 에서 label 0은 1,0,0,0,... , label 1은 0,1,0,0,0,.. 이런 식으로 학습을 시킨다면 노드도 라벨과 맞게 대응이 됨

출력층의 첫번째 원소가 가장 높은 확률값을 갖게된다면, 0으로 예측

이러한 추론 과정을 신경망의 순전파(forward propagation) 라고 함

 

이 내용을 데이터 하나에 대해서 생각해보면 아래 그림과 같다. 

데이터 1개는 (1,784) 즉 원소 784개로 구성된 1차원 배열로 입력이 되어 원소 10개로 구성된 1차원배열로 출력이 된다

 

데이터가 하나가 아니고 100개 라면 아래 그림과 같다

이 경우 출력 결과는 100개의 입력 데이터에 대한 결과가 한 번에 나오게 된다

x[1]과 y[1]에는 각각 1번째 이미지와 1번째 이미지에 대한 예측 결과가 함께 저장된다

 

 

이처럼 하나로 묶은 입력 데이터를 배치(batch)라고 함

 

배치처리하는 이유

1. 수치 계산 라이브러리 대부분이 큰 배열을 효율적으로 처리할 수 있도록 최적화 되어 있음

2. 배치처리를 통해 부하를 줄일 수 있음

컴퓨터에서는 큰 배열을 한꺼번에 계산하는 것이 분할된 작은 배열을 여러번 계산하는 것보다 빠름

 


오차역전파법(backpropagation)

- 가중치 매개변수에 대한 손실함수의 기울기를 효율적으로 계산

- 출력층에서 입력층 방향으로 계산하면서 가중치 업데이트

 

 

 

연쇄법칙(chain rule)

- "합성함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다"

 

 

 

 

 

위의 그림을 보면 이해가 쉽다

역전파는 순전파와는 반대 방향으로 앞에서 전해진 미분(여기선 1)에 국소적 미분(자신과 관계된 정보만으로, 편미분)을 곱하여 다음 노드로 전달함

 

덧셉은 위 그림처럼 역전파 시에 그대로 흘려보냄

z = x + y 를 각각 x에대해 y에 대해 미분하면 1이 됨

 

 

 

곱셉

 

z = x*y 일 때

x에 대해 y에 대해 각각 미분하면 y랑 x가 됨

순전파 때의 입력 신호들을 서로 바꾼 값을 곱해서 하류로 보냄

 

 

ReLU

 

 

 

x가 0 보다 크면 역전파는 상류의 값에 1을 곱해서 즉 그대로 하류로 흘림

x가 0 이하면 역전파 때는 하류로 신호를 보내지 않음.

 

 

Sigmoid

 

 

 

y를 1+exp(-x)에 대해서 미분

1 + exp(-x)를 a라고 한다면

y = 1/a, y를 a대해서 미분하면 -1/a^2 즉 -y^2

 

덧셈 계층은 그냥 흘려보냄

 

exp(-x)를 -x에 대해서 미분

즉, exp(-x)를 x에 대해서 미분하고 -

-> exp(-x)

 

곱셉 계층은 순전파 때의 값을 서로 바꿔 곱함

-1 곱해줌

 

 

'Python > DL' 카테고리의 다른 글

CNN 이해하기 (2)  (0) 2023.05.08
CNN 이해하기 (1)  (0) 2023.05.02
딥러닝의 학습 방법  (0) 2023.03.19
활성화 함수, 과적합, 기울기 소실  (0) 2023.03.19
퍼셉트론 , ANN vs DNN  (0) 2023.03.19