MapleStory Finger Point

[밑바닥부터 시작하는 딥러닝] #3 신경망

2021. 6. 17. 17:11Deep Learning

** 신경망

  • 신경망은 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 있어 퍼셉트론에서 사람이 가중치와 편향의 조정을 수동으로 해야 한다는 단점을 해결한다.

 

 

 

** 퍼셉트론과 신경망의 차이

  • 퍼셉트론
  1. 퍼셉트론은 일반적으로 '단층 퍼셉트론'을 의미한다
  2. 퍼셉트론은 계단 함수를 활성화 함수로 사용한다.
  • 신경망
  1. 신경망은 2개 이상의 퍼셉트론이 합쳐진 '다층 퍼셉트론'을 의미한다.
  2. 신경망은 다양한 활성화 함수를 사용할 수 있다.

 

 

** 활성화 함수

  • 입력 신호의 총합을 출력 신호로 변환하는 함수
  • 입력 신호의 총합이 활성화를 일으키는지를 결정하는 역할을 수행한다.

 

 

활성화 함수의 처리 과정

 

 

** 다양한 활성화 함수 - 계단 함수

  • 수식
  • 구현
    Boolean 타입 값인 True를 반환하고 dtype에서 설정한 np.int가 True를 1로 변환
  • 그래프

 

 

** 다양한 활성화 함수 - 시그모이드 함수

  • 수식

 

  • 구현

 

  • 그래프

 

 

** 다양한 활성화 함수 - ReLU 함수

  • 수식
  • 구현
  • 그래프

 

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

 

    • 차이점
      1. 계단 함수는 0을 경계로 출력이 급변하고 시그모이드 함수는 부드러운 곡선으로 입력에 따라 출력이 연속적으로 변환한다.
    • 공통점
      1. 결과값으로 0에서 1 사이의 값을 반환한다.
      2. 비선형 함수이다.
    • 비선형 함수
      • 직선 1개로 그릴 수 없는 함수
      • 신경망에서는 활성화 함수로 비선형 함수를 사용해야 한다. 선형 함수를 사용하면 신경망의 층을 깊게 하는 의미가 없어지기 때문이다.
      • 예를 들면 h(x) = cx일 때, y(x) = h(h(h(x)))라면, y(x) = c^3x와 같다. 선형 함수의 중첩은 활성화 함수 하나로 표현될 수 있다.

 

 

** numpy의 다차원 배열 사용

  • ndim 함수

- numpy내장함수 ndim은 해당 배열의 차원(dimension)을 반환한다.

- 차원이란 하나의 배열에 몇개의 원소가 들어있는지를 의미한다.

 

  • shape 함수

- numpy로 만든 배열의 형상을 반환한다.

 

  • dot 함수

- 입력이 1차원 배열이면 벡터를, 2차원 배열이면 행렬 곱을 계산한다.

- A, B 행렬을 곱한다고 했을 때 A의 행과 B의 열이 일치해야 한다.

 

 

 

** numpy를 이용한 신경망 구현

- 가중치: 1, 2, 3, 4, 5, 6

- 입력: 1, 2

 

 

 

결과

 

 

** numpy를 이용한 3층 신경망 구현

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

수식으로 표현

 

 

2) 1층 활성화 함수 처리

 

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

 

4) 2층 활성화 함수 처리

 

5) 2층에서 출력층으로의 신호 전달: 항등 함수 사용

 

 

 

** 3층 신경망 구현 정리 (순전파)

 

 

** 출력층의 활성화 함수

  • 기계학습 문제는 분류(classification)와 회귀(regression)로 나뉜다.
  • 출력층의 활성화 함수는 풀고자 하는 문제에 따라 달라진다.
    1. 회귀 문제항등 함수
    2. 다중 분류 문제소프트맥스 함수
    3. 이진 분류 문제시그모이드 함수

 

 

** 소프트맥스 함수

  • 수식
  • 그림
    항등 함수와 달리 모든 출력에 영향을 미침

cf) 항등 함수

 

 

** 개선된 소프트맥스 함수

  • 기존 소프트맥스 함수의 문제점
    • 지수 함수를 사용하기 때문에 컴퓨터로 계산시 오버플로 문제가 발생할 수 있다.
    • 오버플로(overflow) : 표현할 수 있는 수의 범위가 한정되어 범위 이상의 큰 값은 표현할 수 없는 문제

 

  • 개선된 수식
    • 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더하거나 빼도 결과는 바뀌지 않는다.
    • C에 어떤 값을 대입해도 상관없지만 오버플로를 막기 위해 입력 신호 중 최댓값을 이용하는 것이 일반적이다.

 

  • 기존 소프트맥스 함수 코드

 

 

  • 개선된 소프트맥스 함수 코드

 

 

** 소프트맥스 함수의 특징

  • 출력값은 0에서 1.0 사이의 실수이다.
  • 출력의 총합은 1이다. -> ‘확률’로 해석 가능
  • 지수 함수가 단조 증가 함수이기 때문에 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다. 결과적으로 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 된다.

 

 

** 출력층의 뉴런 수 정하기

  • 출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 한다. 분류 문제에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반적이다.

 

 

** MNIST 손글씨 숫자 인식

  • 신경망의 문제 해결 단계
    1. 학습 : 훈련 데이터(학습 데이터)를 사용해 가중치 매개변수를 학습한다.
    2. 추론 : 학습한 매개변수를 사용하여 입력 데이터를 분류한다.

 

  • 신경망의 순전파(forward propagation): 이미 학습된 매개변수를 사용하여 입력 데이터를 분류하는 추론 과정

 

  • MNIST 데이터셋
    • 28*28 크기의 회색조 이미지(1채널)
    • 각 픽셀은 0~255까지의 값을 취한다.
    • 각 이미지에 실제 의미하는 숫자가 레이블로 붙어 있다.

 

 

  • MNIST 데이터셋 이미지를 불러와서 보여주는 코드
  • 상세 코드

- numpy로 구성된 숫자로 된 배열들을 PIL 라이브러리가 읽을 수 있도록 해주는 함수

- 이미지를 일정한 형식을 가진 numpy 배열로 변환할 수 있고, 일정한 형식을 가진 numpy array는 이미지로 변할 수 있다는 것을 알 수 있다.

 

- flatten은 이미지를 1차원 배열로 가져올 것이냐에 대한 옵션으로 28x282차원 배열로 이루어진 이미지는 784개의 1차원 배열로 표현될 수 있다.

- normalize는 입력 이미지의 픽셀 값을 기존의 0~255 값에서 0.0~1.0 사이의 값으로 정규화 할지 결정한다.

- one_hot_label은 레이블(정답)원핫 인코딩 형태로 저장할지 결정한다.

 

- flatten 옵션에 의해 불러와진 784개의 1차원 배열로 이루어진 이미지를 다시 28x28로 돌려놓는 함수

 

- 배열로 이루어진 이미지 정보를 PIL 라이브러리를 통해 실제로 어떤 이미지인지 우리에게 시각적으로 보여주는 코드

 

 

** 신경망의 추론 처리

 

  • 상세 코드

- sample_weight.pkl 파일에 저장되어 있는 학습된 매개변수를 읽는다.

- 가중치와 편향 매개변수가 딕셔너리 변수로 저장되어 있다.

 

- 신경망의 정확도(분류가 얼마나 올바른가)를 평가

 

 

** 배치 처리

  • 배치(batch): 하나로 묶은 입력 데이터
  • 추론 처리를 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.

 

배치로 이미지 100개씩 처리

 

 

 

'Deep Learning' 카테고리의 다른 글

[밑바닥부터 시작하는 딥러닝] #2 퍼셉트론  (0) 2021.06.17