안녕, 세상!

3. 신경망 본문

It공부/Deep learning

3. 신경망

dev_Lumin 2020. 6. 16. 17:10

퍼셉트론은 복잡한 함수를 표현할 수 있지만 가중치 값을 적절히 정하는 작업은 수동적으로 이뤄진다는 한계가 있습니다. 이를 보완하기 위한 것은 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력을 갖추게 하는 시스템을 가진 신경망입니다.

 

(1) 신경망의 구조 

신경망 구조 예시

신경망은 입력층, 은닉층, 출력층으로 구성되어 있습니다.

입력층출력층은 단어 그대로 입력값이 들어가고, 출력값이 나오는 층이고,

은닉층은 입력층이나 출력층과 달리 사람눈에 보이지 않는 층을 말합니다.

이 그림에서 0층이 입력층, 1층이 은닉층, 2층이 출력층이 됩니다.

층 번호를 0층부터 시작하는 이유는 파이썬 배열의 인덱스도 0부터 시작하므로, 나중에 구현할 때 연관시키 편하기 때문입니다.

 

신경망의 구조(틀)는 퍼셉트론과 다름이 없기 때문에 우선 퍼셉트론을 중심으로 설명하겠습니다. 

퍼셉트론의 식은 다음과 같습니다.

퍼셉트론 수식

위의 수식에서 편향 b를 명시해서 그림으로 표현한다면 다음과 같습니다.

 

위의 퍼셉트론 수식을 간결한 형태로 작성해 볼려고 합니다. 

간결하게 하기 위해서 조건분기동작을 하나의 함수로 표현하면 됩니다.

조건분기동작은 Y의 결과값이 0을 넘기면 1을 출력하고 그렇지 않으면 0을 돌려줍니다.

정리하면 다음과 같은 식이 나옵니다.

입력신호값이 가중치 값과 편향 값에 계산된 입력신호의 총합이 h(x)라는 함수를 거쳐 반환되어, 그 값이 0보다 크면 1을 출력하고 그렇지 않으면 0을 출력합니다.

 

 

 

(2) 활성화 함수

방금 전에 설명한 h(x)라는 함수는 활성화 함수입니다.

활성화 함수는 입력 신호의 총합을 출력 신호로 변환하는 함수입니다.

입력 신호의 총합을 a 라고 할 때 활성화 함수를 표현한 퍼셉트론 그림은 아래와 같습니다.

퍼셉트론의 활성화 함수

활성화 함수는 임계값을 경계로 출력이 바뀌는데, 이런 함수를 계단 함수라고 합니다.

위의 활성화 함수 h(x)의 경우도 계단 함수입니다.

퍼셉트론에서는 활성화 함수로 계단 함수를 이용합니다.

하지만 계단함수는 신경망에서 가중치 학습의 정밀함에서 떨어지기 때문에 

신경망에서의 활성화 함수는 계단함수 이외의 함수를 사용합니다.

대표적으로 시그모이드 함수가 있습니다.

 

 

시그모이드 함수

신경망에서 자주 이용하는 활성화 함수이며 식은 다음과 같습니다.

시그모이드 함수 수식

exp(-x)는 e**(-x) 를 뜻하고 e는 자연상수로 2.71...의 값을 갖는 실수입니다.

우선 계단함수와 시그모이드 두 함수를 비교해 보겠습니다.

 

①계단함수

계단함수를 코드로 표현하면 다음과 같습니다.

계단함수

넘파이 배열에 부등호 연산 수행 시

예시

넘파이 배열에 부등호 연산을 수행하면 배열 각각 원소에 대해 부등호 연산의 결과가 bool 자료형으로 bool배열이 생성됩니다.

 

변수.astype() 함수 - 배열 원소의 자료형을 변환 시켜줌

                           형식: 변수.astype(np.변환시킬 자료형)

 

 

계단함수 코드의 결과값의 그래프를 보면 계단모양처럼 값이 표현되기 때문에 계단함수라고 불림을 알 수 있습니다.

 

 

②시그모이드 함수

시그모이드 함수를 파이썬으로 코드를 작성하면 다음과 같습니다.

시그모이드 함수 코드

 

③ 계단 함수와 시그모이드 함수 비교

 

가장 큰 차이는 '매끄러움' 입니다.  즉, 연속성에서 차이가 있습니다.

계단함수가 0과 1중 하나의 값만 돌려주는 반면 시그모이드 함수는 실수(0.352.., 0.783.. 등)를 돌려줍니다.

 

공통점은 둘 다 입력이 작을 때 출력은 0이거나 0에 가깝고, 입력이 커지면 출력이 1이거나 1에 가까워집니다.

또한 입력이 아무리 작거나 커도 출력은 0과 1사이라는 것도 공통점이고

둘 다 비선형 함수입니다.

 

비선형 함수

선형함수가 아닌 함수를 말합니다.

선형함수는 특정 값을 입력했을 때 출력이 입력의 상수배만큼 변하는 함수입니다.

 

신경망에서는 활성화 함수로 비선형 함수를 사용해야 합니다.

선형함수의 문제는 층을 아무리 깊게 해도 은닉층이 없는 네트워크로도 똑같은 기능을 할 수 있습니다.

예시로 h(x)=ax를 활성화 함수로 사용한 4층 네트워크는 y(x)=h(h(h(h(x))))인데 이 계산 식은 

y(x)=a*a*a*a*x 처럼 네번의 곱셈을 수행하지만 y(x)=bx와 똑같은 식입니다. (b를 a**4라고 하면 그만)

따라서 여러 층으로 구성하는 이점을 얻기 위해서 활성화 함수는 반드시 비선형 함수를 사용해야 합니다.

 

정리하자면 활성화함수를 사용하는 이유데이터를 비선형으로 바꾸기 위해서 사용합니다.

 

ReLU 함수

시그모이드 함수는 신경망 분야에서 오래전부터 이용했왔으나 최근에는 ReLU(Rectified Linear Unit) 함수를 주로 이용합니다.

 

ReLU함수 식은 다음과 같습니다

ReLU 수식

코드로 표현하면 다음과 같습니다.

 

 

 

 

(3) 다차원 배열 신경망 응용

다차원 배열로 행렬을 표현함으로써 신경망에 퍼셉트론 수식을 적용시킬 수 있습니다.

 

행렬의 곱은 다음코드와 같이 합니다.

np.dot() 함수 -  행렬의 곱을 해주는 함수

                      형식: np.dot(넘파이행렬변수1,넘파이행렬변수2)

                      조건: 행렬의 곱을 행하는데 앞행렬의 열의 수와 뒷행렬의 행의 수가 같아야 함(조건 부성립 시 오류)

 

신경망의 퍼셉트론 수식 계산은 다음그림과 같이 표현됩니다. 

신경망 

위 그림을 행렬 식으로 표현하면 다음과 같습니다.

이를 통해 신경망의 퍼셉트론을 행렬곱으로 계산할 수 있습니다. 

 

 

 

 

 

(4) 출력층 설계

기계학습 문제는 분류(classification)회귀(regression)로 나뉩니다.

분류는 입력 데이터가 어느 클래스에 소속하냐는 문제입니다. 

 예시로 애완동물의 종을 분류하는 문제( 고양이냐 강아지냐)가 있습니다.

회귀는 입력 데이터에 대한 수치를 예측하는 문제입니다.

 예시로 물건의 무게의 수치가 얼마인지 예측하는 문제가 있습니다.

 

신경망의 출력층은 분류냐 회귀냐에 따라 사용하는 활성화 함수가 달라집니다.

일반적으로 회귀에는 항등함수를, 분류에는 소프트맥스 함수를 사용합니다.

 

① 항등함수

항등 함수는 입력을 그대로 출력합니다. 입출력이 항상 같습니다.

 

② 소프트맥스 함수

소프트맥수의 함수 식은 다음과 같습니다.

소프트맥스 함수 수식

n은 출력층의 뉴런 수, k는 출력층의 뉴런의 k번째 출력임을 그리고 a는 소프트맥스 함수의 입력신호를 뜻합니다.

 

소프트맥스 함수를 수식 그대로 코드를 표현하면 다음과 같은데

컴퓨터로 계산할 때는 버퍼 오버플로 문제가 있습니다.

지수함수는 쉽게 큰 값을 내뱉는데 ((ex) e**1000) 값이 커서 무한대로 값이 되돌아오고 이런 큰 값끼리 나눗셈을 하면 결과 수치가 불안정해집니다.

이 문제를 해결하기 위해서 소프트맥스 함수 수식을 다음과 같이 개선할 수 있습니다.

소프트맥스 함수 개선식

따라서 C에 어떤 값을 대입해도 상관 없으므로 버퍼 오버플로를 막기위해서 입력신호 중 최대값을 C에 이용합니다.

 

개선된 소프트맥스함수를 코드로 표현하면 다음과 같습니다.

소프트맥스 함수의 중요한 특징은 출력 원소들 합의 총합은 1 이라는 점입니다.

이 특징을 이용해서 출력을 '확률'로 해석할 수 있습니다.

소프트맥스 함수를 적용해도 y=exp(x)는 단조 증가 함수인 지수함수이기 때문에 소프트맥스 함수를 적용하기 이전의 각 원소의 대소 관계는 변하지 않습니다.

다음 코드를 통해서 소프트맥스 함수의 특징을 확인할 수 있습니다.

소프트맥스 함수에 임의의 넘파이 행렬을 대입했더니 나온 결과값들의 합이 1임을 확인할 수 있습니다.

 

 

 

'It공부 > Deep learning' 카테고리의 다른 글

5. 오차역전파법  (0) 2020.06.19
4. 신경망 학습  (0) 2020.06.17
3-(1) 손글씨 숫자 인식 분석  (1) 2020.06.16
2. 퍼셉트론  (0) 2020.06.15
1. Python 심화( Numpy, Matplotlib)  (1) 2020.06.13
Comments