Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save YangSiJun528/a4f656fd37a82fb9872ab8f8bc0c5798 to your computer and use it in GitHub Desktop.

Select an option

Save YangSiJun528/a4f656fd37a82fb9872ab8f8bc0c5798 to your computer and use it in GitHub Desktop.
[Jungle My Note | W13] 밑바닥에서 시작하는 딥러닝 정리.md

밑바닥에서 시작하는 딥러닝 정리

정글 13주차 중 3일동안 진행하는 과제, "밑바닥에서 시작하는 딥러닝 1 - 리마스터 판"의 6장까지 정리

1장 파이썬

  • numpy

    • 수학 및 과학 연산을 위한 파이썬 외부 패키지
    • 배열에 사칙연산이 적용되어 직관적이고 편하게 사용할 수 있음
  • matplotlib

    • 발음: 맷플롯립
    • 데이터 시각화(그래프, 이미지 등) 기능을 제공하는 파이썬 외부 패키지

2장 퍼셉트론

퍼셉트론(perceptron)

  • 퍼셉트론 정의

    • 입력 신호에 가중치를 곱해 합산하고, 그 값이 임계값을 넘으면 1을 출력하는 알고리즘
    • 가중치(weight)는 입력 신호의 중요도를, 편향(bias)은 뉴런이 얼마나 쉽게 활성화되는지를 조절
  • 단순 퍼셉트론

    • 입력과 출력층만 존재하는 단순한 구조 (은닉층, hidden layer가 없음)
    • 결과는 항상 선형적
  • 다층 퍼셉트론

    • 퍼셉트론을 여러 층으로 쌓은 구조
    • 단층 퍼셉트론으로 표현하지 못하는 XOR 같은 비선형 문제를 표현 가능
  • 수식

$$ y = \begin{cases} 0 & (b + w_1 x_1 + w_2 x_2 \le 0) \\ 1 & (b + w_1 x_1 + w_2 x_2 > 0) \end{cases} $$

3장 신경망

신경망(뉴럴 네트워크)

  • 신경망은 입력층, 은닉층, 출력층으로 구성된 네트워크

  • 퍼셉트론과 구조는 비슷하지만, 신호를 변환하는 활성화 함수를 사용한다는 점이 중요

  • 뉴런/노드

    • 입력 신호에 가중치와 편향을 적용한 뒤, 활성화 함수를 거쳐 다음 층으로 신호를 전달하는 단위
    • 이 책에서는 뉴런과 노드를 같은 의미로 사용
  • 수식

$$ y = h(b + w_1 x_1 + w_2 x_2) $$

$$ h(x) = \begin{cases} 0 & (x \le 0) \\ 1 & (x > 0) \end{cases} $$

활성화 함수

  • 활성화 함수는 입력 신호의 총합을 출력 신호로 변환하는 함수
  • 신경망에서는 층을 쌓는 의미를 살리기 위해 활성화 함수로 비선형 함수를 사용해야 함 (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이 되도록 변환하는 함수
    • 출력값을 확률처럼 해석할 수 있음
    • 적용해도 각 원소의 대소 관계는 변하지 않음
  • 언제 사용하는가

    • 회귀 문제에서는 항등 함수를 사용
    • 분류 문제에서는 소프트맥스 함수를 사용
  • 추론과 학습

    • 추론에서는 출력층의 활성화 함수 계산을 생략할 수 있음
    • 항등 함수는 값을 그대로 출력하므로 계산해도 결과가 바뀌지 않음
    • 소프트맥스 함수는 대소 관계를 바꾸지 않으므로 가장 큰 점수만 선택하면 됨
    • 즉, 추론에서는 확률처럼 해석하기 위한 비율 변환까지 할 필요가 없음
    • 학습에서는 출력과 정답을 비교해 평가해야 하므로 분류 문제에서 소프트맥스 함수를 사용

배치 처리

총 처리량이 같을 때, 하나의 입력 * 많은 횟수, 많은 입력 * 적은 횟수 일 때, 컴퓨터는 후자가 더욱 빠름.

이유

  1. 수치 계산 라이브러리가 큰 데이터 처리에 최적화되어 있음
  2. 컴퓨터의 I/O 횟수가 줄어서 CPU/GPU 연산 효율이 증가함

따라서 신경망 학습에서 배치 처리가 많이 사용됨.

4장 신경망 학습

기계학습

신경망 학습: 훈련 데이터로부터 가중치와 편향의 최적값을 자동으로 찾아내는 과정

학습 종류

  • 기존 방식

    • 사람이 규칙을 직접 만듦
  • 기계학습

    • 사람이 특징을 정하고, 기계가 판단함
  • 딥러닝

    • 기계가 특징과 판단을 모두 스스로 학습함
    • 종단간 기계학습(end-to-end machine learning)이라고도 부름

추가 설명

  • 학습을 통해 기계가 조정하는 값을 파라미터, 사람이 설정하는 값을 하이퍼파라미터라고 부름
  • 데이터를 기반으로 스스로 학습하므로, 데이터가 중요함
  • 범용성을 위해 훈련 데이터(training data), 시험 데이터(test data)를 분리함
  • 오버피팅(overfitting, 과적합): 특정 데이터셋에만 지나치게 최적화된 상태

손실 함수

  • 손실 함수는 신경망의 성능이 얼마나 나쁜지를 나타내는 지표
  • 학습의 목표는 손실 함수의 값을 줄이는 것
    • 손실 함수 L을 작게 만드는 가중치 W와 편향 b를 찾는 것
  • 정확도는 값이 불연속적으로 변하므로 학습 지표로 쓰기 어렵고, 손실 함수는 연속적으로 변해서 미분 가능 (pp.119-120)

손실 함수 종류

  • 오차제곱합
    • 신경망 출력과 정답 레이블의 차이를 제곱해서 더한 값

$$ E = \frac{1}{2}\sum_k (y_k - t_k)^2 $$

  • 교차 엔트로피 오차
    • 정답에 해당하는 출력값이 클수록 손실이 작아지는 함수
    • 분류 문제에서 자주 사용

$$ E = -\sum_k t_k \log y_k $$

미니배치

  • 훈련 데이터 전체가 아니라 일부 데이터를 무작위로 뽑아 학습하는 방식
  • 전체 데이터를 매번 계산하기 어렵기 때문에 일부 데이터를 전체의 근사치로 사용
  • 미니배치의 손실 함수 값을 줄이는 방향으로 학습함

미분과 기울기

  • 미분

    • 입력값을 아주 조금 바꿨을 때 출력값이 얼마나 변하는지 나타내는 값
    • 신경망에서는 가중치나 편향을 조금 바꿨을 때 손실 값이 어떻게 변하는지 확인하는 데 사용
  • 편미분

    • 손실 함수는 수많은 가중치와 편향에 의해 결정되는 다변수 함수
    • 특정 매개변수 하나의 영향을 보려면, 나머지는 고정하고 그 매개변수만 조금 바꿔 미분함
    • 예를 들어 ∂L/∂w1w1만 바꿨을 때 손실 L이 얼마나 변하는지를 의미
  • 기울기

    • 각 가중치와 편향의 편미분을 모두 모은 것
    • 전체 매개변수 공간에서 손실이 어느 방향으로 변하는지 알려줌
    • 가중치가 10만 개라면, 각 가중치마다 편미분이 필요함
  • 수치 미분

    • 실제로 값을 아주 조금 바꿔보면서 미분 값을 근사하는 방법
    • 구현은 쉽지만, 가중치가 많으면 계산이 오래 걸림
    • "5장 오차역전파법"에서 이 방식보다 빠른 방식을 소개

추가 정리

  • 편미분 = 특정 가중치 방향에서의 손실 변화량
  • 기울기 = 모든 편미분을 모은 전체 이동 방향
  • 경사 하강법 = 그 전체 방향의 반대로 조금 이동
  • 따라서 각 가중치마다 따로 최적의 방향을 고르는 것이 아니라, 전체 손실이 줄어들 가능성이 가장 큰 방향으로 함께 이동

경사 하강법

  • 경사 하강법은 기울기를 이용해 손실 함수가 작아지는 방향으로 매개변수를 갱신하는 방법
  • 기울기 자체는 손실이 증가하는 방향을 나타내므로, 손실을 줄이려면 반대 방향으로 이동함
  • 학습률(learning rate)은 한 번에 얼마나 갱신할지 정하는 값
    • 학습률이 너무 크면 발산하고, 너무 작으면 학습이 거의 진행되지 않음

학습 알고리즘

신경망 학습은 다음 과정을 반복함.

  1. 미니배치를 무작위로 가져옴
  2. 손실 함수의 기울기를 구함
  3. 가중치와 편향을 기울기의 반대 방향으로 조금 갱신함
  4. 위 과정을 반복함

미니배치를 무작위로 뽑아 경사 하강법을 수행하는 방식을 확률적 경사 하강법(SGD, Stochastic Gradient Descent)이라고 함

에폭(epoch)

  • 훈련 데이터 전체를 한 번 모두 사용한 학습 단위
  • 미니배치 학습에서는 여러 번의 반복이 모여 1에폭이 됨
  • 예: 훈련 데이터 60,000개, 미니배치 100개면 600번 갱신 = 1에폭
  • 보통 에폭 단위로 훈련 정확도와 시험 정확도를 기록해 학습 상태와 오버피팅 여부를 확인함

5장 오차역전파법

(메모: 5장은 수식은 이해 못할거 같아서 뺌. 개념만 이해하기)

개념

  • 오차역전파법(backpropagation)

    • 손실 함수의 기울기를 효율적으로 계산하는 방법
    • 4장의 수치 미분은 구현은 쉽지만, 가중치가 많아지면 계산이 오래 걸림
    • 오차역전파법은 역방향 계산으로 각 가중치와 편향의 기울기 dW, db를 빠르게 구함
  • 계산 그래프

    • 계산 과정을 노드와 화살표로 표현한 것
    • 각 노드는 자신과 직접 관련된 작은 계산만 수행함
    • 이런 방식을 국소적 계산이라고 함
    • 국소적 계산을 조합해서 전체 계산을 구성함
  • 순전파와 역전파

    • 순전파(forward): 입력에서 출력 방향으로 계산
      • 예측값과 손실 값을 구함
    • 역전파(backward): 출력에서 입력 방향으로 거꾸로 계산
      • 각 노드의 미분을 구해 앞쪽으로 전달함
      • 결과적으로 각 가중치와 편향의 기울기를 구할 수 있음
  • 연쇄법칙

    • 역전파는 연쇄법칙을 이용해 기울기를 뒤로 전달함
    • 뒤에서 전달된 기울기에 현재 노드의 국소적 미분을 곱해 앞쪽으로 넘김
    • 즉, 전체 미분을 한 번에 구하는 것이 아니라 작은 미분들을 연결해서 구함
    • 정의: 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있음

신경망 구현

  • 5장에서는 신경망의 계산을 계층(layer) 단위로 나누어 구현함
  • 각 계층은 자기 계산의 순전파와 역전파를 담당함
  • 모든 계층은 보통 두 메서드를 가짐
    • forward(): 값을 순방향으로 전달
    • backward(): 기울기를 역방향으로 전달
  • 순전파는 계층 순서대로 실행하고, 역전파는 계층의 역순으로 실행함
  • 계층으로 모듈화하면 원하는 신경망을 조합하기 쉬움

주요 계층

  • Affine 계층

    • 가중치 W와 편향 b를 사용하는 완전연결층
    • np.dot(x, W) + b 계산을 담당
  • ReLU 계층

    • 활성화 함수 계층
    • 순전파에서 0 이하의 값은 0으로 막음
    • 역전파에서도 순전파 때 막힌 값은 기울기를 전달하지 않음
  • Softmax-with-Loss 계층

    • 소프트맥스 함수와 교차 엔트로피 오차를 합친 계층
    • 예측값과 정답을 비교해 손실을 계산
    • 역전파에서는 예측값과 정답의 차이를 앞 계층으로 전달

추가 내용

  • 기울기 확인
    • 수치 미분과 오차역전파법의 결과를 비교해 구현이 맞는지 확인하는 작업
    • 수치 미분은 느리지만 구현이 단순해서 검증용으로 사용
    • 두 결과가 거의 같으면 오차역전파법이 제대로 구현된 것으로 볼 수 있음

6장 학습 관련 기술들

6장은 신경망 학습을 더 빠르고 안정적으로 만드는 방법들을 다룸.

매개변수 갱신

  • 신경망 학습은 손실 함수가 작아지는 방향으로 매개변수를 갱신하는 과정
  • 역전파는 dW, db를 구하고, 갱신 방법은 그 값을 이용해 W, b를 바꿈
  • 기본 방식은 SGD지만, 상황에 따라 더 효율적인 갱신 방법을 사용할 수 있음

갱신 방법 종류

  • SGD

    • 기울기의 반대 방향으로 일정하게 이동하는 기본 방식
  • Momentum

    • 이전 이동 방향을 반영해 지그재그 움직임을 줄이는 방식
  • AdaGrad

    • 매개변수마다 학습률을 다르게 조정하는 방식
  • Adam

    • Momentum과 AdaGrad의 장점을 합친 방식

가중치 초깃값

  • 가중치 초깃값은 학습 성공에 큰 영향을 줌
  • 모든 가중치를 0으로 하면 같은 층의 가중치가 똑같이 갱신되어 학습이 제대로 되지 않음
  • 활성화 함수에 따라 적절한 초깃값을 사용해야 함
    • 시그모이드 함수: Xavier 초깃값
    • ReLU 함수: He 초깃값

배치 정규화

  • 배치 정규화(batch normalization)
  • 각 층의 활성화값 분포를 적절하게 조정하는 방법
  • 학습을 빠르고 안정적으로 만드는 데 도움을 줌
  • 가중치 초깃값의 영향을 줄이고, 오버피팅 억제 효과도 있음

오버피팅

  • 오버피팅은 훈련 데이터에만 지나치게 맞춰져 처음 보는 데이터에는 약해지는 상태
  • 매개변수가 많거나 훈련 데이터가 적을 때 발생하기 쉬움

오버피팅 방지 방법

  • 가중치 감소

    • 큰 가중치에 패널티를 줘서 가중치가 너무 커지는 것을 막음
  • 드롭아웃

    • 학습 중 일부 뉴런을 무작위로 제외해 특정 뉴런에 과하게 의존하지 않도록 함

하이퍼파라미터

  • 하이퍼파라미터는 사람이 직접 정해야 하는 값
  • 예: 학습률, 배치 크기, 은닉층 뉴런 수, 가중치 감소 계수
  • 시험 데이터가 아니라 검증 데이터를 사용해 적절한 값을 찾음

신경망 학습 과정

  1. 미니배치를 가져옴
  2. 순전파로 예측값과 손실을 구함
  3. 역전파로 dW, db를 구함
  4. 갱신 방법이 dW, db를 이용해 W, b를 갱신함
  5. 이 과정을 반복하면서 손실을 줄임
@YangSiJun528
Copy link
Copy Markdown
Author

왜 손실함수가 필요한가?

https://youtu.be/rpHuwa-dbbI

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment