2021. 6. 17. 17:11ㆍDeep Learning
** 신경망
- 신경망은 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 있어 퍼셉트론에서 사람이 가중치와 편향의 조정을 수동으로 해야 한다는 단점을 해결한다.
** 퍼셉트론과 신경망의 차이
- 퍼셉트론
- 퍼셉트론은 일반적으로 '단층 퍼셉트론'을 의미한다
- 퍼셉트론은 계단 함수를 활성화 함수로 사용한다.
- 신경망
- 신경망은 2개 이상의 퍼셉트론이 합쳐진 '다층 퍼셉트론'을 의미한다.
- 신경망은 다양한 활성화 함수를 사용할 수 있다.
** 활성화 함수
- 입력 신호의 총합을 출력 신호로 변환하는 함수
- 입력 신호의 총합이 활성화를 일으키는지를 결정하는 역할을 수행한다.
** 다양한 활성화 함수 - 계단 함수
- 수식
- 구현
Boolean 타입 값인 True를 반환하고 dtype에서 설정한 np.int가 True를 1로 변환 - 그래프
** 다양한 활성화 함수 - 시그모이드 함수
- 수식
- 구현
- 그래프
** 다양한 활성화 함수 - ReLU 함수
- 수식
- 구현
- 그래프
** 시그모이드 함수와 계단 함수 비교
- 차이점
- 계단 함수는 0을 경계로 출력이 급변하고 시그모이드 함수는 부드러운 곡선으로 입력에 따라 출력이 연속적으로 변환한다.
- 공통점
- 결과값으로 0에서 1 사이의 값을 반환한다.
- 비선형 함수이다.
- 비선형 함수
- 직선 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)로 나뉜다.
- 출력층의 활성화 함수는 풀고자 하는 문제에 따라 달라진다.
- 회귀 문제: 항등 함수
- 다중 분류 문제: 소프트맥스 함수
- 이진 분류 문제: 시그모이드 함수
** 소프트맥스 함수
- 수식
- 그림
항등 함수와 달리 모든 출력에 영향을 미침
** 개선된 소프트맥스 함수
- 기존 소프트맥스 함수의 문제점
- 지수 함수를 사용하기 때문에 컴퓨터로 계산시 오버플로 문제가 발생할 수 있다.
- 오버플로(overflow) : 표현할 수 있는 수의 범위가 한정되어 범위 이상의 큰 값은 표현할 수 없는 문제
- 개선된 수식
- 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더하거나 빼도 결과는 바뀌지 않는다.
- C′에 어떤 값을 대입해도 상관없지만 오버플로를 막기 위해 입력 신호 중 최댓값을 이용하는 것이 일반적이다.
- 기존 소프트맥스 함수 코드
- 개선된 소프트맥스 함수 코드
** 소프트맥스 함수의 특징
- 출력값은 0에서 1.0 사이의 실수이다.
- 출력의 총합은 1이다. -> ‘확률’로 해석 가능
- 지수 함수가 단조 증가 함수이기 때문에 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다. 결과적으로 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 된다.
** 출력층의 뉴런 수 정하기
- 출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 한다. 분류 문제에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반적이다.
** MNIST 손글씨 숫자 인식
- 신경망의 문제 해결 단계
- 학습 : 훈련 데이터(학습 데이터)를 사용해 가중치 매개변수를 학습한다.
- 추론 : 학습한 매개변수를 사용하여 입력 데이터를 분류한다.
- 신경망의 순전파(forward propagation): 이미 학습된 매개변수를 사용하여 입력 데이터를 분류하는 추론 과정
- MNIST 데이터셋
- 28*28 크기의 회색조 이미지(1채널)
- 각 픽셀은 0~255까지의 값을 취한다.
- 각 이미지에 실제 의미하는 숫자가 레이블로 붙어 있다.
- MNIST 데이터셋 이미지를 불러와서 보여주는 코드
- 상세 코드
- numpy로 구성된 숫자로 된 배열들을 PIL 라이브러리가 읽을 수 있도록 해주는 함수
- 이미지를 일정한 형식을 가진 numpy 배열로 변환할 수 있고, 일정한 형식을 가진 numpy array는 이미지로 변할 수 있다는 것을 알 수 있다.
- flatten은 이미지를 1차원 배열로 가져올 것이냐에 대한 옵션으로 28x28의 2차원 배열로 이루어진 이미지는 784개의 1차원 배열로 표현될 수 있다.
- normalize는 입력 이미지의 픽셀 값을 기존의 0~255 값에서 0.0~1.0 사이의 값으로 정규화 할지 결정한다.
- one_hot_label은 레이블(정답)을 원핫 인코딩 형태로 저장할지 결정한다.
- flatten 옵션에 의해 불러와진 784개의 1차원 배열로 이루어진 이미지를 다시 28x28로 돌려놓는 함수
- 배열로 이루어진 이미지 정보를 PIL 라이브러리를 통해 실제로 어떤 이미지인지 우리에게 시각적으로 보여주는 코드
** 신경망의 추론 처리
- 상세 코드
- sample_weight.pkl 파일에 저장되어 있는 학습된 매개변수를 읽는다.
- 가중치와 편향 매개변수가 딕셔너리 변수로 저장되어 있다.
- 신경망의 정확도(분류가 얼마나 올바른가)를 평가
** 배치 처리
- 배치(batch): 하나로 묶은 입력 데이터
- 추론 처리를 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.
'Deep Learning' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝] #2 퍼셉트론 (0) | 2021.06.17 |
---|