정글 13주차 중 3일동안 진행하는 과제, "밑바닥에서 시작하는 딥러닝 1 - 리마스터 판"의 6장까지 정리
-
numpy
- 수학 및 과학 연산을 위한 파이썬 외부 패키지
- 배열에 사칙연산이 적용되어 직관적이고 편하게 사용할 수 있음
-
matplotlib
- 발음: 맷플롯립
- 데이터 시각화(그래프, 이미지 등) 기능을 제공하는 파이썬 외부 패키지
퍼셉트론(perceptron)
-
퍼셉트론 정의
- 입력 신호에 가중치를 곱해 합산하고, 그 값이 임계값을 넘으면 1을 출력하는 알고리즘
- 가중치(weight)는 입력 신호의 중요도를, 편향(bias)은 뉴런이 얼마나 쉽게 활성화되는지를 조절
-
단순 퍼셉트론
- 입력과 출력층만 존재하는 단순한 구조 (은닉층, hidden layer가 없음)
- 결과는 항상 선형적
-
다층 퍼셉트론
- 퍼셉트론을 여러 층으로 쌓은 구조
- 단층 퍼셉트론으로 표현하지 못하는 XOR 같은 비선형 문제를 표현 가능
-
수식
신경망(뉴럴 네트워크)
-
신경망은 입력층, 은닉층, 출력층으로 구성된 네트워크
-
퍼셉트론과 구조는 비슷하지만, 신호를 변환하는 활성화 함수를 사용한다는 점이 중요
-
뉴런/노드
- 입력 신호에 가중치와 편향을 적용한 뒤, 활성화 함수를 거쳐 다음 층으로 신호를 전달하는 단위
- 이 책에서는 뉴런과 노드를 같은 의미로 사용
-
수식
- 활성화 함수는 입력 신호의 총합을 출력 신호로 변환하는 함수
- 신경망에서는 층을 쌓는 의미를 살리기 위해 활성화 함수로 비선형 함수를 사용해야 함 (p.75, pp.119-120)
활성화 함수 종류
-
계단 함수
- 임계값을 기준으로 0 또는 1을 출력하는 함수
- 퍼셉트론에서 사용하는 활성화 함수
-
시그모이드 함수
- 시그모이드(sigmoid)
- 입력에 따라 0에서 1 사이의 실수를 연속적으로 출력하는 함수
- 계단 함수보다 매끄럽게 변화한다는 점이 신경망 학습에서 중요
-
ReLU 함수
- ReLU(Rectified Linear Unit, 렐루)
- 입력이 0보다 크면 그대로 출력하고, 0 이하면 0을 출력하는 함수
-
신경망 각 층의 계산은 행렬 곱으로 정리할 수 있음
-
입력을
X, 가중치를W, 편향을B라고 하면 다음 층으로 전달되는 값은A = XW + B -
코드에서는
np.dot(X, W) + B형태로 구현 -
코드 예시
X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
print(W1.shape) # (2, 3)
print(X.shape) # (2,)
print(B1.shape) # (3,)
A1 = np.dot(X, W1) + B1- 추가 정보
- 예시에서
X,W,B,A는 넘파이 배열이며, 특히W는 행렬로 표현됨 - 행렬 곱에서는 앞 행렬의 열 수와 뒤 행렬의 행 수가 일치해야 함
- 더 구체적인 수식은 "3.4 3층 신경망 구현하기 (pp.83-90)" 부분을 참고
- 예시에서
-
출력층의 역할
- 신경망의 마지막 층으로, 문제에 맞는 형태의 값을 출력
- 분류 문제에서는 출력층의 뉴런 수를 분류하려는 클래스 수와 같게 설정
-
항등 함수
- 항등 함수(identity function)
- 입력을 그대로 출력하는 함수
- 값을 변환하지 않는다는 의미로 사용
- 실제 구현에서는 생략해도 결과가 같음
-
소프트맥스 함수
- 소프트맥스 함수(softmax function)
- 출력값의 총합이 1이 되도록 변환하는 함수
- 출력값을 확률처럼 해석할 수 있음
- 적용해도 각 원소의 대소 관계는 변하지 않음
-
언제 사용하는가
- 회귀 문제에서는 항등 함수를 사용
- 분류 문제에서는 소프트맥스 함수를 사용
-
추론과 학습
- 추론에서는 출력층의 활성화 함수 계산을 생략할 수 있음
- 항등 함수는 값을 그대로 출력하므로 계산해도 결과가 바뀌지 않음
- 소프트맥스 함수는 대소 관계를 바꾸지 않으므로 가장 큰 점수만 선택하면 됨
- 즉, 추론에서는 확률처럼 해석하기 위한 비율 변환까지 할 필요가 없음
- 학습에서는 출력과 정답을 비교해 평가해야 하므로 분류 문제에서 소프트맥스 함수를 사용
총 처리량이 같을 때, 하나의 입력 * 많은 횟수, 많은 입력 * 적은 횟수 일 때, 컴퓨터는 후자가 더욱 빠름.
이유
- 수치 계산 라이브러리가 큰 데이터 처리에 최적화되어 있음
- 컴퓨터의 I/O 횟수가 줄어서 CPU/GPU 연산 효율이 증가함
따라서 신경망 학습에서 배치 처리가 많이 사용됨.
신경망 학습: 훈련 데이터로부터 가중치와 편향의 최적값을 자동으로 찾아내는 과정
학습 종류
-
기존 방식
- 사람이 규칙을 직접 만듦
-
기계학습
- 사람이 특징을 정하고, 기계가 판단함
-
딥러닝
- 기계가 특징과 판단을 모두 스스로 학습함
- 종단간 기계학습(end-to-end machine learning)이라고도 부름
추가 설명
- 학습을 통해 기계가 조정하는 값을 파라미터, 사람이 설정하는 값을 하이퍼파라미터라고 부름
- 데이터를 기반으로 스스로 학습하므로, 데이터가 중요함
- 범용성을 위해 훈련 데이터(training data), 시험 데이터(test data)를 분리함
- 오버피팅(overfitting, 과적합): 특정 데이터셋에만 지나치게 최적화된 상태
- 손실 함수는 신경망의 성능이 얼마나 나쁜지를 나타내는 지표
- 학습의 목표는 손실 함수의 값을 줄이는 것
- 손실 함수
L을 작게 만드는 가중치W와 편향b를 찾는 것
- 손실 함수
- 정확도는 값이 불연속적으로 변하므로 학습 지표로 쓰기 어렵고, 손실 함수는 연속적으로 변해서 미분 가능 (pp.119-120)
손실 함수 종류
- 오차제곱합
- 신경망 출력과 정답 레이블의 차이를 제곱해서 더한 값
- 교차 엔트로피 오차
- 정답에 해당하는 출력값이 클수록 손실이 작아지는 함수
- 분류 문제에서 자주 사용
- 훈련 데이터 전체가 아니라 일부 데이터를 무작위로 뽑아 학습하는 방식
- 전체 데이터를 매번 계산하기 어렵기 때문에 일부 데이터를 전체의 근사치로 사용
- 미니배치의 손실 함수 값을 줄이는 방향으로 학습함
-
미분
- 입력값을 아주 조금 바꿨을 때 출력값이 얼마나 변하는지 나타내는 값
- 신경망에서는 가중치나 편향을 조금 바꿨을 때 손실 값이 어떻게 변하는지 확인하는 데 사용
-
편미분
- 손실 함수는 수많은 가중치와 편향에 의해 결정되는 다변수 함수
- 특정 매개변수 하나의 영향을 보려면, 나머지는 고정하고 그 매개변수만 조금 바꿔 미분함
- 예를 들어
∂L/∂w1은w1만 바꿨을 때 손실L이 얼마나 변하는지를 의미
-
기울기
- 각 가중치와 편향의 편미분을 모두 모은 것
- 전체 매개변수 공간에서 손실이 어느 방향으로 변하는지 알려줌
- 가중치가 10만 개라면, 각 가중치마다 편미분이 필요함
-
수치 미분
- 실제로 값을 아주 조금 바꿔보면서 미분 값을 근사하는 방법
- 구현은 쉽지만, 가중치가 많으면 계산이 오래 걸림
- "5장 오차역전파법"에서 이 방식보다 빠른 방식을 소개
추가 정리
- 편미분 = 특정 가중치 방향에서의 손실 변화량
- 기울기 = 모든 편미분을 모은 전체 이동 방향
- 경사 하강법 = 그 전체 방향의 반대로 조금 이동
- 따라서 각 가중치마다 따로 최적의 방향을 고르는 것이 아니라, 전체 손실이 줄어들 가능성이 가장 큰 방향으로 함께 이동
- 경사 하강법은 기울기를 이용해 손실 함수가 작아지는 방향으로 매개변수를 갱신하는 방법
- 기울기 자체는 손실이 증가하는 방향을 나타내므로, 손실을 줄이려면 반대 방향으로 이동함
- 학습률(learning rate)은 한 번에 얼마나 갱신할지 정하는 값
- 학습률이 너무 크면 발산하고, 너무 작으면 학습이 거의 진행되지 않음
신경망 학습은 다음 과정을 반복함.
- 미니배치를 무작위로 가져옴
- 손실 함수의 기울기를 구함
- 가중치와 편향을 기울기의 반대 방향으로 조금 갱신함
- 위 과정을 반복함
미니배치를 무작위로 뽑아 경사 하강법을 수행하는 방식을 확률적 경사 하강법(SGD, Stochastic Gradient Descent)이라고 함
에폭(epoch)
- 훈련 데이터 전체를 한 번 모두 사용한 학습 단위
- 미니배치 학습에서는 여러 번의 반복이 모여 1에폭이 됨
- 예: 훈련 데이터 60,000개, 미니배치 100개면 600번 갱신 = 1에폭
- 보통 에폭 단위로 훈련 정확도와 시험 정확도를 기록해 학습 상태와 오버피팅 여부를 확인함
(메모: 5장은 수식은 이해 못할거 같아서 뺌. 개념만 이해하기)
-
오차역전파법(backpropagation)
- 손실 함수의 기울기를 효율적으로 계산하는 방법
- 4장의 수치 미분은 구현은 쉽지만, 가중치가 많아지면 계산이 오래 걸림
- 오차역전파법은 역방향 계산으로 각 가중치와 편향의 기울기
dW,db를 빠르게 구함
-
계산 그래프
- 계산 과정을 노드와 화살표로 표현한 것
- 각 노드는 자신과 직접 관련된 작은 계산만 수행함
- 이런 방식을 국소적 계산이라고 함
- 국소적 계산을 조합해서 전체 계산을 구성함
-
순전파와 역전파
- 순전파(forward): 입력에서 출력 방향으로 계산
- 예측값과 손실 값을 구함
- 역전파(backward): 출력에서 입력 방향으로 거꾸로 계산
- 각 노드의 미분을 구해 앞쪽으로 전달함
- 결과적으로 각 가중치와 편향의 기울기를 구할 수 있음
- 순전파(forward): 입력에서 출력 방향으로 계산
-
연쇄법칙
- 역전파는 연쇄법칙을 이용해 기울기를 뒤로 전달함
- 뒤에서 전달된 기울기에 현재 노드의 국소적 미분을 곱해 앞쪽으로 넘김
- 즉, 전체 미분을 한 번에 구하는 것이 아니라 작은 미분들을 연결해서 구함
- 정의: 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있음
- 5장에서는 신경망의 계산을 계층(layer) 단위로 나누어 구현함
- 각 계층은 자기 계산의 순전파와 역전파를 담당함
- 모든 계층은 보통 두 메서드를 가짐
forward(): 값을 순방향으로 전달backward(): 기울기를 역방향으로 전달
- 순전파는 계층 순서대로 실행하고, 역전파는 계층의 역순으로 실행함
- 계층으로 모듈화하면 원하는 신경망을 조합하기 쉬움
주요 계층
-
Affine 계층
- 가중치
W와 편향b를 사용하는 완전연결층 np.dot(x, W) + b계산을 담당
- 가중치
-
ReLU 계층
- 활성화 함수 계층
- 순전파에서 0 이하의 값은 0으로 막음
- 역전파에서도 순전파 때 막힌 값은 기울기를 전달하지 않음
-
Softmax-with-Loss 계층
- 소프트맥스 함수와 교차 엔트로피 오차를 합친 계층
- 예측값과 정답을 비교해 손실을 계산
- 역전파에서는 예측값과 정답의 차이를 앞 계층으로 전달
- 기울기 확인
- 수치 미분과 오차역전파법의 결과를 비교해 구현이 맞는지 확인하는 작업
- 수치 미분은 느리지만 구현이 단순해서 검증용으로 사용
- 두 결과가 거의 같으면 오차역전파법이 제대로 구현된 것으로 볼 수 있음
6장은 신경망 학습을 더 빠르고 안정적으로 만드는 방법들을 다룸.
- 신경망 학습은 손실 함수가 작아지는 방향으로 매개변수를 갱신하는 과정
- 역전파는
dW,db를 구하고, 갱신 방법은 그 값을 이용해W,b를 바꿈 - 기본 방식은 SGD지만, 상황에 따라 더 효율적인 갱신 방법을 사용할 수 있음
갱신 방법 종류
-
SGD
- 기울기의 반대 방향으로 일정하게 이동하는 기본 방식
-
Momentum
- 이전 이동 방향을 반영해 지그재그 움직임을 줄이는 방식
-
AdaGrad
- 매개변수마다 학습률을 다르게 조정하는 방식
-
Adam
- Momentum과 AdaGrad의 장점을 합친 방식
- 가중치 초깃값은 학습 성공에 큰 영향을 줌
- 모든 가중치를 0으로 하면 같은 층의 가중치가 똑같이 갱신되어 학습이 제대로 되지 않음
- 활성화 함수에 따라 적절한 초깃값을 사용해야 함
- 시그모이드 함수: Xavier 초깃값
- ReLU 함수: He 초깃값
- 배치 정규화(batch normalization)
- 각 층의 활성화값 분포를 적절하게 조정하는 방법
- 학습을 빠르고 안정적으로 만드는 데 도움을 줌
- 가중치 초깃값의 영향을 줄이고, 오버피팅 억제 효과도 있음
- 오버피팅은 훈련 데이터에만 지나치게 맞춰져 처음 보는 데이터에는 약해지는 상태
- 매개변수가 많거나 훈련 데이터가 적을 때 발생하기 쉬움
오버피팅 방지 방법
-
가중치 감소
- 큰 가중치에 패널티를 줘서 가중치가 너무 커지는 것을 막음
-
드롭아웃
- 학습 중 일부 뉴런을 무작위로 제외해 특정 뉴런에 과하게 의존하지 않도록 함
- 하이퍼파라미터는 사람이 직접 정해야 하는 값
- 예: 학습률, 배치 크기, 은닉층 뉴런 수, 가중치 감소 계수
- 시험 데이터가 아니라 검증 데이터를 사용해 적절한 값을 찾음
- 미니배치를 가져옴
- 순전파로 예측값과 손실을 구함
- 역전파로
dW,db를 구함 - 갱신 방법이
dW,db를 이용해W,b를 갱신함 - 이 과정을 반복하면서 손실을 줄임
왜 손실함수가 필요한가?
https://youtu.be/rpHuwa-dbbI