logo
Published on

딥러닝

Authors
  • avatar
    Name
    valery
    Twitter

1. 딥러닝의 개념

  • 신경망을 이용한 기계학습
  • 그냥 신경망이라고 부르지 않고 따로 딥러닝이라고 부르는 이유는 층이 깊어졌기 때문
  • 딥러닝 신경망은 은닉층을 여러 개 쌓아서 더 복잡한 패턴을 학습
  • 딥러닝의 은닉층이 신경망의 은닉층보다 크다
  • 모델이 데이터 안에서 필요한 특징을 스스로 학습하게 만든다
  • 층이 많아지면서 특징 추출 자체를 학습 과정 안에 포함할 수 있다
  • 일반 신경망 모델은 특징(귀, 코, 눈)추출을 사람이 직접 입력하지만 딥러닝 모델은 원본이미지를 주면 특징을 알아서 추출한다

2. 기울기 소멸 문제

1. 기울기 소멸 문제의 개념

은닉층이 많은 다층 퍼셉트론에서, 출력층에서 아래 층으로 갈 수록 전달되는 오차가 크게 줄어들어, 학습이 되지 않는 현상

왜 이런 일이 발생하냐

  1. 다층 퍼셉트론: 입력층 - 은닉층 - 출력층 으로 이루어진 MLP에서 기본적인 형태의 신경망

  2. 전달되는 오차: 신경망은 먼저 예측을 한다. 정답에서 실제 예측치 만큼의 차이가 오차이다. 그래서 이 오차를 줄이는 방향으로 가중치를 조정한다. 이 가중치를 고치려면 각 가중치가 얼마나 이 오차에 대해 책임이 있는지를 물어야한다. 출력층에서 그 앞 은닉층으로 또 그 앞 은닉층으로. 이게 역전파 이다. 그래서 전달되는 오차는 출력에서 생긴 오차를 줄이기 위해 앞쪽 가중치들에게 전달되는 수정신호를 말한다.(gradient)

  3. 왜 이 오차가 줄어드는지: 출력 오차 → 활성화 함수의 미분값 곱하기 → 가중치 영향 곱하기 → 이전 층으로 전달. sigmoid나 tanh 같은 활성화 함수의 미분값이 대부분 1보다 작다. sigmoid는 미분값이 최대여도 0.25 정도. 그러면 뒤로 갈 때마다 0.25 같은 작은 값이 계속 곱해진다. 예를 들면 처음 gradient가 1이었다고 해도, 한 층 지나면서 0.25가 되고, 두 층 지나면 0.0625가 되고, 세 층 지나면 0.0156이 된다. 더 깊어지면 거의 0에 가까워진다. 이게 소멸이다. 없어지는 게 아니라 너무 작아져서 의미가 없어지는 거.

  4. 왜 학습이 안되는지: 학습은 가중치를 업데이트 하는 것이다. 가중치 = 기존 가중치 - 학습률 × gradient 근데 이 gradient가 앞으로 갈 수록 0에 가까워지니까 학습이 안되는 거.

2. 기울기 소멸 문제 해결방법

1. sigmoid나 tanh대신 Relu함수 사용

  • ReLU는 입력이 양수일 때 기울기가 1이라서, 양수 구간에서는 gradient가 지나치게 작아지지 않는다.
ReLU(x) = max(0, x)

입력이 0보다 작으면 0으로 만들고 0보다 크면 그대로 통과시킨다
  • sigmoid는 미분값이 최대여도 0.25 정도라서 여러 층을 지나면 gradient가 계속 작아졌지만 ReLU는 양수 구간에서 미분값이 1이다. 즉, 입력이 양수인 뉴런에서는 역전파 신호가 지나갈 때 작게 눌리지 않는다.
  • ReLU도 음수 구간에선 미분값이 0이어서 그 뉴런은 업데이트가 잘 안될 수 있다.

ReLU를 쓰면 신경망이 복잡한 함수를 어떻게 표현하느냐

ReLU 신경망은 입력에 가중치를 곱해서 선형식 Wx+b를 만든 뒤, 그 값이 양수인 뉴런만 살리고 음수인 뉴런은 0으로 꺼버린다.

이렇게 켜진 뉴런들의 선형 조합을 이용하면, 복잡한 함수를 여러 개의 직선/평면 조각으로 나눈 것처럼 근사할 수 있다.

ReLU 변형

  1. ReLu
  2. Leacky ReLU
  3. ELU(Exponential Linear Unit)
  4. Maxout
  5. PReLU(Parameteric ReLU)
  6. Swish

3. 가중치 초기화

  • 신경망의 성능에 큰 영향을 주는 요소
  • 보통 가중치의 초기값으로 0에 가까운 무작위 값 사용

개선된 가중치 초기화 방법

1. 균등 분포 초기화

입력/출력 노드 수를 고려한 균등분포 범위에서 가중치를 선택함

WU(6ni+ni+1,6ni+ni+1)W \sim U\left( -\sqrt{\frac{6}{n_i+n_{i+1}}}, \sqrt{\frac{6}{n_i+n_{i+1}}} \right)
  • variables:
    • W: 가중치
    • n_i: 입력 노드 수
    • n_{i+1}: 출력 노드 수

2. xavier 초기화

표준 정규분포에서 뽑은 값을 입력 노드 수에 맞게 조정하여 초기화

  • sigmoid, tanh 계열에 자주 사용
W=Z1ni,ZN(0,1)W = Z \cdot \sqrt{\frac{1}{n_i}}, \quad Z \sim N(0,1)

variables:

  • W: 가중치
  • Z: 표준 정규분포에서 뽑은 값
  • n_i: 입력 노드 수
  • N(0,1): 평균 0, 분산 1의 표준 정규분포

3. He 초기화

ReLU 계열 활성화 함수에 맞게 표준 정규분포 값을 더 큰 분산으로 조정하여 초기화

  • ReLU 계열에 자주 사용
W=Z2ni,ZN(0,1)W = Z \cdot \sqrt{\frac{2}{n_i}}, \quad Z \sim N(0,1)

variables:

  • W: 가중치
  • Z: 표준 정규분포에서 뽑은 값
  • n_i: 입력 노드 수
  • N(0,1): 평균 0, 분산 1의 표준 정규분포

4. 과적합 문제

과적합 문제 완화법

1. 규제화

  • 가중치가 클수록 복잡하다. > 절대값이 큰 가중치에게 벌점을 준다
  • J = Error + 알파 * Model complexity

최종 오차함수 = 예측이 틀린 정도 + 모델이 복잡한 정도에 대한 벌점

알파가 클수록 단순해지고 작을수록 과적합 위험이 증가하므로 적당한 조절이 필요

  • L1 규제화:

    • 가중치 절댓값 합을 벌점으로 사용
    • 일부 가중치를 0으로 만들기 쉬움
    • 불필요한 특징 제거에 유리
  • L2 규제화:

    • 가중치 제곱합을 벌점으로 사용
    • 큰 가중치를 강하게 억제
    • 전체 가중치를 작고 안정적으로 유지

L1 → |w| → Lasso → 일부 가중치 0 → 특성 선택

L2 → w² → Ridge → 큰 가중치 억제 → 부드러운 모델

2. 드롭아웃

  1. 학습할 때 무작위로 노드를 선택하여 선택된 노드의 앞뒤로 연결된 가중치 연결선 제거
  2. 미니배치나 학습주기(epoch)마다 드롭아웃 할 노드들을 새롭게 선택하여 학습
  3. 추론을 할 때는 드롭아웃을 하지 않음
  • 1000개의 데이터를 10개로 나누면
    • 미니배치: 100개의 데이터 묶음,
    • epoch: 미니배치 10번 다 돌면 epoch 1번,
    • iteration: epoch한 번 다 돌 때까지 몇번 반복하는지: 10번

3. 배치 정규화

  1. 문제 원인 내부 공변량 이동: 앞쪽 층들이 학습되면서 가중치가 변해, 현재 층에 전달되는 데이터가 변하는 현상. 이로 인해 학습 속도가 저하된다.

  2. 개념 앞 층 때문에 제멋대로 흔들린 분포를 일단 표준화함, 그다음 이 층에 정말 필요한 평균과 스케일은 γ, β로 다시 학습함

배치 정규화는 미니배치 안의 중간 계산값 x_i들을 평균 0, 표준편차 1로 한 번 맞춘 뒤,
γ와 β를 이용해 모델이 원하는 크기와 위치로 다시 조정해서 y_i를 만드는 과정

x_i = 정규화 전 값
x̂_i = 평균 0, 표준편차 1로 맞춘 값
y_i = γ, β까지 적용한 최종 값

γ = 크기 조정
β = 위치 이동

5. 가중치 학습기법

  1. 경사하강법
  2. 모멘텀 사용 경사 하강법
  3. NAG(Nesterov accelerated gradient)
  4. Adagrad (Adaptive Gradient Algorithm)
  5. Adadelta
  6. RMSprop
  7. ADAM (Adaptive Moment Estimation)