Replicated

DNN 본문

학부/딥러닝

DNN

라구넹 2025. 10. 18. 21:31

https://lagooneng.tistory.com/561

 

오차 역전파법 (Backward Propagation)

신경망 학습 과정1. 순전파 (Forward Propagation)2. 손실함수 계산3. 역전파 (Backward Propagation)4. 파라미터 업데이트 수치 미분 vs 오차 역전파법수치미분- 단순하고 구현하기 쉽지만 계산 시간이 오래 걸

lagooneng.tistory.com

 

싱글 레이어 퍼셉트론은 선형 분리 문제만 풀 수 있음

XOR 같은 문제 해결 불가

-> 멀티 레이어 뉴럴 네트워크

 

역전파 알고리즘 (Back propagation)

- 에러를 정의하고, 뒤로 전파시킴

 

에러 -> 뒤쪽에서 썼던 가중치랑 δ (기울기랑 e 곱한 거)를 곱하면 됨

 

단, 기울기 소실 문제가 있어 활성화 함수를 잘 골라야 함


 

ReLU

- 활성화 함수의 하나

- 시그모이드보다 계산이 빠르기도 하고, 더 빠르게 수렴함

- 하지만 ReLU는 음수를 모두 0으로 처리, 한 번 음수가 나오면 더이상 그 노드는 학습하지 않음

- 이를 보완한 것이 Leaky ReLU

 

ReLU

- f(x) = max(0, x)

 

Leaky ReLU

- f(x)

    - x, if > 0

    - 0.01x, otherwise

 


https://lagooneng.tistory.com/562

 

신경망 학습 관련 기술들

확률적 경사하강법 단점- 비등방성 함수에서는 탐색 경로가 비효율적임* 비등방성 함수: 방향에 따라 성질(여기선 기울기)이 달라지는 함수 f(x, y) = 1/20x^2 + y^2- 기울기를 그려보면 y축 방향은 크

lagooneng.tistory.com

 

Momentum

- 트레이닝 속도를 올리는데 진동의 리스크는 줄이는 목적

- 관성처럼 과거의 기울기 값을 일정한 비율만큼 반영

 

Δw = αex

m = Δw + β_m

w <- w + m

_m = m

 

* _m: 이전 모멘텀, 초기값 0

 

모멘텀은 가중치 갱신값을 새로 계산할 때 델타 룰 외에 모멘텀을 추가로 더해서 가중치를 변경하는 방식

가중치 갱신값이 바로 바뀌지 않고 어느정도 일정한 방향을 유지하면서 움직이게 됨

관성을 가진 물체가 움직일 때 외부의 힘에 의해 쉽게 휘둘리지 않는 것과 유사

현재 모멘텀은 과거 모멘텀 값이 계속 추가됨으로서 가중치 갱신값이 계속 커지게 됨

β값이 너무 크면 오히려 학습이 안됨

 


 

가중치 감쇠 (weight decay)

- 신경망을 학습하는 과정에서 주어진 데이터에 딱 맞게 가중치 조절시 과적합

- 가중치 w를 갱신할 때마다 0~1 가중치 ε를 곱함

W <- ( W + ΔW ) * (1 -  ε)

 

 

드롭 아웃

- 오버피팅을 막기 위한 방법

- 가중치 감쇠보다 더 좋은데, 학습이 좀 느려짐

- 데이터가 평균보다 좀 많은 경우 효과적인데, 이미 데이터가 충분하면 별 도움 안됨

 

훈련시

- 각 뉴런은 확률 p에 따라 유지, 비활성화. 일부 뉴런이 꺼진 상태로 학습하게 됨

테스트시

- 전체 네트워크를 모두 활성화

- 학습 때 뉴런이 일부만 켜진 것을 보정하기 위해 가중치를 p 만큼 스케일 다운

 

드롭아웃 비율 p의 효과

너무 높으면(p<0.3): 학습이 제대로 안됨 (언더피팅)

적당한 비율 : 약 0.5

드롭아웃 안하면(1.0): 오버피팅

 

데이터셋 크기에 따른 드롭아웃 효과

매우 작으면: 오히려 오류
중간~큰 데이터셋: 개선 효과가 큼

매우 큰 데이터셋: 그냥 별 효과가 없음


 

Initialize W

가중치 초기화는 성능에 큰 영향

랜덤은 좋지 않음

 

Xavier initialize

초기값의 표준편차가 1/√n 이 되도록 설정 (n은 앞 층의 노드 수)

import numpy as np
fan_in, fan_out = 3, 4
mn, sd = 0, 0.01 # mean, standard deviation
np.random.seed(123)
W_val = np.random.normal(mn, sd, fan_in*fan_out)/np.sqrt(fan_in)
W = W_val.reshape(fan_in,fan_out)

np.random.normal은 정규 분포로 만들어줌

입력 노드 수에 따라 분산이 너무 커지지 않게 조정

-> 입력과 출력의 분산이 균형

 

He initialize

- ReLU 그래디언트 소실 문제 완화.. 비선형 활성화 함수에 적합

import numpy as np
fan_in, fan_out = 3, 4
mn, sd = 0, 0.01 # mean, standard deviation
np.random.seed(123)
W_val = np.random.normal(mn, sd, fan_in*fan_out)/np.sqrt(fan_in/2)
W = W_val.reshape(fan_in,fan_out)

 

ReLU는 He 초기화가

시그모이드나 tanh는 Xavier 초기화가 좋음

'학부 > 딥러닝' 카테고리의 다른 글

Keras - MNIST  (0) 2025.10.25
Keras 개요  (0) 2025.10.18
신경망 학습  (0) 2025.10.18
인공신경망 개요  (0) 2025.10.18
Feature Selection, Model Stacking  (0) 2025.10.18