본문 바로가기
ML & DL/책 & 강의

[밑시딥 1] CHAPTER 3 신경망

by 공부하는 무니 2023. 6. 13.
반응형

3.1 퍼셉트론에서 신경망으로

3.1.1 신경망의 예

가장 왼쪽줄을 입력층, 맨 오른쪽 줄을 출력층, 중간 줄을 은닉층이라고 한다.

3.1.2 퍼셉트론 학습

위 그림은 x1, x2를 입력받아 y를 출력하는 퍼셉트론이다. 이를 수식으로 나타내면 다음과 같다.

여기서 b는 편향을, w1, w2는 각 신호의 가중치를 나타내는 매개변수로, 각 신호의 영향력을 제어한다. 그런데 위 그림에서 b가 보이지 않는다. 여기에 편향을 명시한다면 아래 그림과 같이 나타낼 수 있다.

위 식을 더 간결하게 표현해보자.

3.1.3 활성화 함수의 등장

위의 h(x)함수를 활성화함수(activation function)라고 한다. 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할.

위 식을 다시 써보면 아래와 같다.

그림으로 나타내면 아래와 같다.

3.2 활성화 함수

위와 같은 활성화함수는 임계값을 경계로 출력이 바뀌는데, 이러한 함수를 계단함수(step function)라고 한다. 

퍼셉트론에서는 활성화 함수로 계단 함수를 채용하고 있다.

그렇다면 계단 함수 외의 다른 함수를 활성화 함수로 사용하면 어떻게 될까?

3.2.1 시그모이드 함수

자주 사용되는 활성화 함수 중 하나인 시그모이드 함수

3.2.2 계단 함수 구현하기

3.2.3 계단 함수의 그래프

3.2.4 시그모이드 함수 구현하기

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

공통점: 출력이 0-1 사이. 입력이 작을 때 0에 가깝고 커지면 출력이 1에 가까워진다.

차이점: 매끄러움의 차이. 계단 함수는 0과 1 중 하나의 값만 리턴되지만, 시그모이드는 연속적인 실수값이 리턴된다.

3.2.6 비선형 함수

계단 함수와 시그모이드 함수의 또다른 공통점: 비선형 함수라는 것.

선형 함수는 y = ax + b 와 같이 출력이 입력의 상수배인 함수. 비선형은 선형이 아닌 함수.

신경망에서는 선형 함수를 사용하면 안된다. 왜? 신경망의 층을 깊게 하는 의미가 없어지기 때문.

3.2.7 ReLU 함수

최근에는 활성화 함수로 ReLU(Rectified Linear Unit)함수를 많이 사용한다.

구현해보자.

3.3 다차원 배열의 계산

다차원 배열 계산법에 숙달하면 신경망을 효율적으로 구현할 수 있다.

3.3.1 다차원 배열

1차원 배열

2차원 배열

3.3.2 행렬의 곱

np.dot()은 입력이 1차원 배열이면 벡터를, 2차원 배열이면 행렬 곱을 계산한다.

행렬의 곱에서는 대응하는 차원의 원소 수를 일치시켜라.
A가 2차원 행렬, B가 1차언 배열일 때도 대응하는 차원의 원소 수를 일치시켜라.

3.3.3 신경망에서의 행렬 곱

넘파이 행렬로 신경망을 구현해보자. 이 신경망은 편향과 활성화 함수를 생략했다.(가중치만 갖는다)

행렬의 곱으로 신경망의 계산을 수행한다.

코드 구현

X, W, Y의 shape를 잘 맞추어야 한다.



np.dot()이 없었으면 Y의 원소를 하나하나 계산해야 했다. 

3.4 3층 신경망 구현하기

3층 신경망: 입력층(0층)은 2개, 첫 번째 은닉층(1층)은 3개, 두 번째 은닉층(2층)은 2개, 출력층(3층)은 2개의 뉴런으로 구성된다.

3.4.1 표기법 설명

이번 절의 핵심은 신경망에서의 계산을 행렬 계산으로 정의할 수 있다는 것이다.

오른쪽 위의 숫가는 층 수, 오른쪽 아래의 숫자는 다음 층 뉴런과 앞 층의 뉴런의 인덱스 번호이다.

오른쪽 아래 숫자의 경우 순서를 반대로 표기하는 자료도 있으니 순서를 한번씩 확인해야 한다.

3.4.2 각 층의 신호 전달 구현하기

입력층에서 1층으로 신호 전달

여기서 1층의 첫 번째 뉴런을 나타내면 아래와 같다.

여기에서 행렬의 곱을 이용하면 아래 처럼 간소화할 수 있다.

넘파이를 사용하여 위 식을 구현해보자.

이어서 1층의 활성화 함수 처리를 살펴보자

입력층에서 1층으로의 신호 전달

은닉층에어싀 가중치 합을 a로 표기하고, 활성화 함수 h()로 변환된 신호를 z로 표기한다. 여기에서는 활성화 함수로 시그모이드 함수를 사용하자

1층에서 2층으로 가는 신호 전달 과정은 아래와 같다.

1층에서 2층으로의 신호 전달

마지막으로 2층에서 출력층으로의 신호 전달

2층에서 출력층으로의 신호 전달

여기에서 활성화 함수로 항등함수를 정의해서 사용했다. 출력층의 활성화 함수는 풀고자 하는 문제의 성질에 맞게 정한다. 

예를 들어 회귀에는 항등 함수를, 2클래스 분류에는 시그모이드 함수를, 다중 클래스 분류에는 소프트맥스 함수를 사용하는 것이 일반적이다. 

3.4.3 구현 정리

3.5 출력층 설계하기

기계학습 문제는 크게 분류와 회귀로 나뉜다. 일반적으로 활성화함수로 사용하는 함수는 회귀에는 항등 함수를, 분류에는 소프트맥스 함수를 사용한다.

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

항등 함수

분류에서 사용되는 소프트맥스의 식은 다음과 같다.

소프트맥스 함수

이제 파이썬 함수로 정의해서 필요할 때 사용할 수 있도록 하자.

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

앞에서 구현한 소프트맥스는 문제점이 있는데 바로 오버플로 문제이다. 소프트맥스에 쓰인 지수 함수는 아주 쉽게 큰 값을 내뱉는다. 이런 큰 값끼리 나눗셈을 하면 결과가 불안정해진다. 

함수 구현을 개선해보자.

여기서 C'에 어떤 값을 대입해도 상관없지만, 오버플로우를 막을 목적이라면 입력 신호 중 최댓값을 이용하는 것(빼주는 것)이 일반적이다.

아래 예시를 보자.

아까 만들어둔 함수를 개선하자.

3.5.3 소프트맥스 함수의 특징

소프트맥스 함수의 출력은 0에서 1.0 사이의 실수

소프트맥스 함수의 출력의 총합은 1

-> 이 성질 덕분에 소프트맥스 함수의 출력을 '확률'로 해석할 수 있다.

 

또한 지수 함수가 단조 증가 함수이기 때문에 소프트맥스 함수를 적용하나 안하나 각 원소의 대소 관계는 변하지 않는다.

-> 따라서 일반적으로 추론할 때는 출력층의 소프트맥스 함수를 생략한다.

3.5.4 출력층의 뉴런 수 정하기

출력층의 뉴런 수는 푸려는 문제에 맞게 적절히 정해야 한다. 

분류에서는 분류 클래스 수로 정한다.

3.6 손글씨 숫자 인식

이번에는 학습 과정은 생략하고, 추론 과정만 구현할 것이다.

3.6.1 MNIST 데이터셋

MNIST 이미지 데이터셋의 예

3.6.2 신경망의 추론 처리

위 함수들을 사용해서 신경망에 의한 추론을 수행해보고 정확도도 평가해보자.

3.6.3 배치 처리

앞서 구현한 신경망 각 층의 가중치 shape를 출력해보자

신경망 각 층의 배열 형상의 추이
배치 처리를 위한 배열들의 형상 추이

이처럼 하나로 묶은 입력 데이터를 배치라고 한다. 배치 처리는 컴퓨터 계산 속도를 올리는데, I/O 읽는 횟수가 줄어서 CPU나 GPU로 순수하게 계산하는 비율이 높아진다. 

3.7 정리

  • 신경망에서는 활성화 함수로 시그모이드 함수와 ReLU 함수 같은 매끄럽게 변화하는 함수를 이용한다.
  • 넘파이의 다차원 배열을 잘 사용하면 신경망을 효율적으로 구현할 수 있다.
  • 기계학습 문제는 크게 회귀와 분류로 나눌 수 있다.
  • 출력층의 활성화 함수로는 회귀에서는 주로 항등 함수를, 분류에서는 주로 소프트맥스 함수를 이용한다.
  • 분류에서는 출력층의 뉴런 수를 분류하려는 클래스 수와 같게 설정한다.
  • 입력 데이터를 묶은 것을 배치라 하며, 추론 처리를 이 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.
반응형

댓글