전체 보기
3️⃣

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

작성일자
2022/11/13
태그
SUB PAGE
프로젝트
밑바닥 딥러닝
책 종류
1 more property

1. 퍼셉트론에서 신경망으로

1) 신경망

정의) 여러 층으로 구성되고, 시그모이드 함수 등 매끈한 활성화 함수를 사용하는 네트워크
특징)
가중치 매개변수의 적절한 값을 데이터로부터 자동 학습하는 능력 있음
비교) 퍼셉트론: 가중치 설정은 사람이 수동으로 해야 함
다층 퍼셉트론이 신경망 가리킴
비교) 단순 퍼셉트론: 계단 함수를 활성화 함수로 사용한 모델
비교) 퍼셉트론과 다른 점: 구조 & 신호 전달 방식은 같음. 활성화 함수가 다름
신경망
신경망 구조: ex) 2층 신경망
퍼셉트론
퍼셉트론 구조
퍼셉트론 수식
퍼셉트론 수식 간결하게 변형 → 중간에 활성화 함수 사용

3) 활성화 함수의 등장

정의) h(x)와 같이 입력 신호의 총합을 출력 신호로 변환하는 함수
입력 신호의 총합이 활성화를 일으키는지(1 또는 0) 정함
특징)
그림: 퍼셉트론에서 편향과 활성화 함수 처리 과정을 명시함
퍼셉트론에서 신경망으로 가기 위한 길잡이

2. 활성화 함수

1) 계단 함수 → 단순 퍼셉트론

정의) 임계값을 경계로 출력이 바뀌는 함수
입력이 0을 넘으면 1출력, 0 안 넘으면 0 출력
특징)
그래프가 계단 형태임
퍼셉트론에서는 활성화 함수로 계단 함수를 이용함
계단 함수말고 다른 함수 쓰면 신경망이 될 수 있음
구현)
코드: x가 실수(부동소수점)만 받아들임. 넘파이 못 받아들임.
코드: 넘파이 지원하도록 수정함
그래프)
코드: plotting
실행 결과(그림)

2) 시그모이드 함수 → 신경망(다층 퍼셉트론)

정의)
h(x)=11+exp(x)h(x)=\frac{1}{1+exp(-x)}
특징)
그래프가 s자 모양임
신경망에선 활성화 함수로 시그모이드 함수를 자주 이용함
시그모이드 함수로 변환한 신호를 다음 뉴런에 전달
구현)
코드
그래프)
코드: plotting
실행 결과(그림)

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

공통점
크게 보면 같은 모양임 (구조)
입력이 작을 때 출력이 0에 가깝고 (입력이 중요치 않으면 작은 값 출력)
입력이 클 때 출력이 1에 가까움 (입력이 중요하면 큰 값 출력)
출력이 0에서 1사이임
비선형 함수임
직선 1개로는 그릴 수 없는 함수
신경망은 비선형 함수만 사용함(선형이면 층 나누는 의미 없어져서)
자세히는 책보고 더쓰기(p73)
차이점
시그모이드 함수
실수 반환
뉴런 사이에 연속적인 실수가 흐름
매끄러움. 부드러운 곡선 형태
입력에 따라 출력이 연속적으로 변화함
계단 함수
0 또는 1 반환
뉴런 사이에 0 또는 1이 흐름 (흐르거나 흐르지 않거나)
매끄럽지 않음. 계단(구부러진 직선) 형태
경계에서 출력이 갑자기 바뀜

3. 다차원 배열의 계산

1) 다차원 배열

정의) 숫자를 N차원으로 나열한 것. 한 줄로 나열이 아니라 여러 줄로 나열.
구현)
코드: 1차원 배열
코드: 다차원 배열 (2차원 배열)

2) 2차원 배열(행렬)의 곱

정의) 앞 행렬의 행과 뒷 행렬의 열을 원소 별로 곱한 후 이를 더한 값을 원소로 하여 새로운 배열 만듦
구현)
코드 (2*2행렬과 2*2행렬의 곱)
코드 (2*3행렬과 3*2행렬의 곱)
코드 (2*2행렬과 2*3행렬의 곱) → 에러
코드 (3*2행렬과 1차원 배열의 곱)
특징)
앞 행렬의 열 수(1번째 차원의 원소 수)와 뒷 행렬의 행 수(0번째 차원의 원소 수)가 같아야 함. 형상이 서로 반대.
ex) 2*3 행렬과 3*2 행렬 곱 가능
대응하는 차원의 원소 수 일치해야 함.

3) 신경망에서의 행렬 곱

정의) 행렬의 곱으로 신경망 계산을 수행함
구현) 편향과 활성화 함수 생략하고 가중치만 갖는 신경망
코드
그림

4. 3층 신경망 구현

3층 신경망
정의) 입력층(0층), 첫 번째 은닉층(1층), 두 번째 은닉층(2층), 출력층(3층)
그림
표기법
정의) 은닉층 뉴런과 가중치의 표기법
가중치
위: 층 (ex. 1 → 1층의 가중치)
밑: 다음 층 번호, 앞 층 번호 (ex. 3 2 → 0층의 2번째 누런에서 1층의 3번째 누런으로 감)
뉴런
위: 층 (ex. 1 → 1층의 뉴런)
밑: 해당 층에서 번호 (ex. 3 → 3번째 뉴런)
그림) 입력층 → 은닉층
각 층의 신호 전달 구현
예시) 입력층에서 1층으로의 신호 전달. 편향 추가.
특징
1층의 첫 번째 뉴런으로의 가는 경우
편향은 한 층에 하나라서 앞 층 번호 표시 안 하고 다음 층 번호만 표시
입력 신호, 가중치, 편향은 적당한 값으로 설정함
그림
수식) 행렬 곱으로 간소화
코드
예시) 1층에서 2층으로의 신호 전달. 활성화 함수 추가.
특징
2층의 두 번째 뉴런으로 가는 경우
활성화 함수로 시그모이드 함수 사용함
그림
코드
예시) 2층에서 출력층으로의 신호 전달
특징
출력층의 첫 번째 뉴런으로 감
출력층의 활성화함수는 항등 함수를 사용함
항등함수: 입력을 그대로 출력하는 함수. σ()\sigma() (시그마라고 읽음)
그림
코드
3층 신경망 구현 정리
출력층의 활성화 함수
회귀 → 항등 함수
2클래스 분류 → 시그모이드 함수
다중 클래스 분류 → 소프트맥스 함수
코드

5. 출력층 설계

1) 분류와 회귀

분류
정의) 데이터가 어느 클래스에 속하느냐의 문제
예시) 사진 속 인물의 성별 분류 문제
특징) 소프트맥스 함수 사용
??: logistic regression
회귀
정의) 입력 데이터에서 (연속적인) 수치를 예측하는 문제
예시) 사진 속 인물의 몸무게(55.5kg?)를 예측하는 문제
특징) 항등 함수 사용

2) 항등 함수

정의) 입력을 그대로 출력하는 함수
특징) 회귀에서 사용
그림

3) 소프트맥스 함수

정의) 확률값 출력하는 함수
입력 신호의 지수함수 ÷\div 모든 입력 신호의 지수함수의 합
yk=exp(ak)i=1nexp(ai)=eaki=1neaiy_k=\frac{\exp(a_k)}{\sum^n_{i=1}\exp(a_i)}=\frac{e^{a_k}}{\sum^n_{i=1}e^{a_i}}
n: 출력층의 뉴런 수
yky_k: k번째 출력
특징)
분류에서 사용
출력은 확률임
출력이 0에서 1.0사이의 실수임. 출력의 총합은 1임
ex) y[0]의 확률 0.018(1.8%), y[1]의 확률 0.245(24.5%), y[2]의 확률 0.737(73%_
2번째 원소의 확률이 가장 높으니, 답은 2번째 클래스
소프트맥스 함수 적용해도 원소의 대소관계는 변함 없음
이유) 지수함수가 단조 증가함수라서
신경망을 이용한 분류는 가장 큰 출력 내는 뉴런에 해당하는 클래스로 인식함
결론) 신경망으로 분류할 때는 출력층의 소프트맥스 함수 생략해도 됨
정확히는 추론 단계에선 생략하고, 학습 단계에선 사용함
학습과 추론
학습: 모델을 학습
추론: 앞서 학습한 모델로 미지의 데이터에 대해 추론(분류) 수행
그림) 출력이 모든 입력 신호로부터 영향 받음
구현
코드
구현 시 주의점
오버플로우 문제
정의) 지수 함수 값이 너무 큰데, 너무 큰 값은 표현할 수 없음
지수함수 그래프
코드(오버플로우 문제 발생)
해결)
수식
코드(오버플로우 문제 해결)

4) 출력층의 뉴런 수 정하기

정의) 출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정함
분류에선 분류하고 싶은 클래스 수로 설정
ex. 0~9 숫자 중 하나로 분류 → 출력층 뉴런 10개
그림

6. 손글씨 숫자 인식

신경망의 문제 해결 과정
1.
학습) 훈련 데이터(학습 데이터) 사용해 가중치 매개변수를 학습
2.
추론) 앞서 학습한 매개변수 사용해 입력 데이터를 분류

1) MNIST data set

정의) 손글씨 숫자 분류의 데이터
특징)
0~9까지의 숫자 이미지 데이터
훈련 이미지 60000장
훈련 이미지 사용해 모델 학습
시험 이미지 10000장
학습한 모델로 시험 이미지들 분류
각 이미지는 28*28 크기. 각 픽셀에서 0~255까지의 값 취함
실제 의미하는 숫자가 각 이미지에 레이블로 붙어있음
사용
MNIST 데이터 셋 내려받아 이미지를 넘파이 배열로 변환한 파이썬 파일 mnist.py를 임포트해 사용
mnist.py의 load_mnist()함수 사용하면 MNIST 데이터 쉽게 가져올 수 있음
코드) MNIST 데이터 가져옴
load_mnist()함수의 인자
normalize : 입력 이미지의 픽셀 값을 0.0~1.0 사이 값으로 정규화할지 결정
False → 입력 이미지 픽셀을 원래 값 그대로 0~255 사이 값으로 유지
flatten : 입력 이미지를 평탄하게, 즉 1차원 배열로 만들지 결정
False → 입력 이미지를 1*28*28의 3차원 배열로 저장
True → 입력 이미지를 784개 원소로 이뤄진 1차원 배열로 저장
one_hot_label : 원-핫 인코딩 형태로 저장할지 결정
원-핫 인코딩: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 처럼 정답 뜻하는 원소만 1이고, 나머진 0인 배열
False → 7, 2 와 같이 숫자 형태의 레이블 저장
True → 레이블을 원-핫 인코딩하여 저장
코드) MNIST 데이터 이미지 보기 → 첫 번째 훈련 이미지 보기

2) 신경망의 추론 처리

정의) MNIST 데이터셋으로 추론 수행하는 신경망 구현
특징)
입력층 뉴런: 784개
출력층 뉴런: 10개
은닉층: 2개
첫 번째 은닉층: 50개 뉴런 배치 (50,100은 임의로 정함)
두 번째 은닉층: 100개 뉴런 배치
구현
코드) 신경망에 의한 추론, 정확도 평가

3) 배치 처리

정의) 하나로 묶은 입력 데이터
예시) 이미지 100개를 한번에 묶어 predict()함수에 한번에 넘김
이미지 1개씩 넘길 때 형상
이미지 100개씩 넘길 때 형상
구현)
코드