밑바닥부터 시작하는 딥러닝 (5~8장)

js43o·2024년 2월 27일
0
post-custom-banner

밑바닥부터 시작하는 딥러닝을 읽고 필기, 요약한 글입니다.

5. 오차역전파법

기존의 수치 미분법보다 더 효율적으로 가중치 매개변수의 기울기를 구할 수 있는 방법이다.

계산 그래프

계산 과정을 그래프 자료구조로 나타낸 것. 노드 안에는 연산 내용을, 에지에는 각 노드의 연산 결과를 표시함.

  • 왼쪽에서 오른쪽으로, 그래프의 출발점에서 종착점으로 진행하는 단계를 순전파(forward propagation)라고 함. (반대는 역전파)
  • 다른 계산들과 독립적으로 분리할 수 있는, '국소적 계산'을 전파함으로써 최종 결과를 얻음.

연쇄법칙과 역전파

계산 그래프의 순전파가 계산 결과를 왼쪽에서 오른쪽으로 전달하는 것처럼, 역전파는 연쇄법칙에 따라 '국소적인 미분'을 오른쪽에서 왼쪽으로 전달함.

  • 각 노드의 국소적 미분은 (순전파 기준으로) 입력에 대한 출력의 미분값임.
  • 역전파는 이 국소적 미분에 (역전파 기준으로) 입력을 곱하여 출력으로 내보냄.

"합성함수의 미분은 합성함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다."

좌측 상단 역전파의 값을 보면 마치 합성함수를 미분했을 때와 비슷한 형태로 나타난다. 실제로 역전파는 연쇄법칙의 원리를 그대로 따른다. 'xx에 대한 zz의 미분'을 'xx에 대한 tt의 미분'과 'tt에 대한 zz의 미분'의 곱으로 표현할 수 있는 것이다.

기본 계층 구현

  • 덧셈 노드의 역전파: 식 z=x+yz = x + y에서 xx, yy에 대한 zz의 편미분은 각각 11임. 즉, 역전파에서는 입력된 값이 그대로 출력으로 보내짐.

  • 곱셈 노드의 역전파: 식 z=xyz = xy에서 xx, yy에 대한 zz의 편미분은 각각 yy, xx임. 즉, 역전파에서는 입력된 값에 '순전파 때의 입력 신호들을 서로 바꾼 값'을 곱해서 출력으로 보냄.

위 두 가지 연산의 경우 수식을 직접 미분해 보지 않고도 역전파의 출력값을 알 수 있다.

활성화 함수 계층 구현

  • ReLU 계층: 입력이 0보다 클 때와 그렇지 않을 때의 출력이 다르므로, 두 가지 버전으로 역전파가 나뉜다. 계산 그래프로 그려보면 이렇다.

  • Sigmoid 계층: 수식 y=11+exp(x)y = \frac{1}{1 + \exp(-x)}xx부터 하나씩 따라가며 계산 그래프를 그려보면 이렇다. exp, / 노드가 추가되었다.

  • 최종 역전파 수식 Lyy2exp(x)\frac{∂L}{∂y}y^{2}\exp(-x)는 원본 시그모이드 수식을 이용하여 Lyy(1y)\frac{∂L}{∂y}y(1-y)으로 정리할 수 있다. (순전파의 출력 yy만으로도 계산 가능!)

Affine/Softmax 계층 구현

  • Affine 계층: 신경망의 순전파에서 수행되는 행렬의 내적 과정(Y=X×W+BY = X × W + B) 또한 역전파를 구할 수 있다.
    이때 노드 사이에 스칼라값이 아닌 '행렬'이 전달된다는 점을 유의하자.

  • 이때 LX=LYWT\frac{∂L}{∂X} = \frac{∂L}{∂Y}·W^{T}이고 LW=XTLY\frac{∂L}{∂W} = X^{T}·\frac{∂L}{∂Y}이다. (행렬 곱에서 형상을 맞추기 위해 전치 행렬이 사용됨)

    • 위 수식의 자세한 유도 과정은 책에서 생략되어 있다. 검색해 본 결과 다른 분들께서 유도 과정을 이해하기 쉽도록 잘 작성해 주신 글을 찾았다. (velog, tistory)
    • 위 글을 보고 직접 유도하며 정리해 보았다.
  • 배치용 Affine 계층: 위 Affine 계층에서의 입력 X가 단일 데이터였다면, 이번에는 여러 개의 데이터를 묶어 보내는 배치 버전이다.

    • 계산 그래프는 위 Affine 계층의 계산 그래프에서 XX, XWX·W, YY의 형상이 (N,M)(N, M) 꼴로 바뀐다는 점을 제외하면 동일하다. (NN은 배치 사이즈)
    • 순전파 때는 XWX·W에 대한 편향이 NN개의 데이터에 각각 더해지며, 역전파 때는 반대로 YY를 이루는 NN개의 데이터의 역전파 값이 편향의 원소에 모여야 함. (dB = np.sum(dY, axis=0))
  • Softmax-with-Loss 계층: 분류 문제의 출력층에서 사용되는 정규화 함수인 소프트맥스와, 손실 함수인 교차 엔트로피 오차 두 개로 이루어진 계층을 만들어 볼 수 있다.

    • 자세한 도출 과정은 생략되었다. 중요한 것은, 소프트맥스 계층의 역전파가 (yktk)(y_{k} - t_{k}) (= 정답 레이블과 현재 출력값의 차분, 즉 '오차')로 말끔하게 나온다는 것이다.
      • 이것은 '소프트맥스'의 역전파가 말끔한 형태를 갖도록 '교차 엔트로피 오차'가 그렇게 설계되었기 때문임.
      • 회귀의 출력층에서 사용되는 '항등 함수'의 손실 함수인 '평균 제곱 오차' 또한 똑같은 역할을 함!
    • 즉, 오차가 커질수록 앞의 계층으로 전달되는 역전파의 값 역시 커지므로 이를 '얼마나 학습해야 하는지'를 결정하는 데에 쓸 수 있음.

참고로 신경망의 추론 작업에서는 보통 소프트맥스 계층을 쓰지 않는다. 어떤 것이 가장 큰 값인지는 이미 마지막 Affine 계층의 출력에서 결정되기 때문이다. (정규화 필요 X)

신경망 구축하기

지금까지 만든 계층들을 조합하면 하나의 신경망을 완성시킬 수 있다.

각 계층마다 forward(x)backward(dout) 메서드를 정의하여 학습 과정에서 순전파와 역전파를 계산하고, 이를 통해 기존의 수치 미분법 대신 역전파로부터 매개변수의 기울기를 계산할 수 있다.

  • 예측 단계에서 각 계층마다 순전파를 구하며 필요한 값들을 기억하도록 하고, 출력까지 완료되면 다시 거꾸로 거슬러 올라가면서 각 계층이 자신이 가진 값과 이전 계층으로부터 흘러온 값을 통해 역전파를 계산해 내도록 한다.

  • 기울기 확인: 오차역전파법으로 구한 기울기와 수치 미분으로 구한 기울기 간의 차이를 비교하여, 오차역전파법을 잘 구현했는지 확인하는 것.

6. 학습 관련 기술들

매개변수 갱신

최적화: 손실 함수의 값을 최대한 낮추는 최적의 매개변수를 찾는 과정. '광활한 산맥에서, 지도 없이 안대를 쓰고, 가장 깊은 골짜기를 찾아야 하는' 상황과 유사함.

  • 확률적 경사 하강법(SGD): '기울어진 방향으로 일정 거리만큼 가겠다'
    • 수식: WWηLWW ← W - η\frac{∂L}{∂W} (ηη는 학습률)
    • 단점: 비등방성 함수(= 방향에 따라 성질(기울기 등)이 달라지는 함수)에서 탐색 경로가 비효율적임.
      ex. 기울어진 방향이 실제 최솟값과 다른 방향을 가리키는 경우
  • 모멘텀(운동량): '공이 그릇의 바닥을 구르는 듯한 움직임'
    • 수식: vαvηLWv ← αv - η\frac{∂L}{∂W}, WW+vW ← W + v
    • vv는 '물체의 속도'를 표현한 항이며, αα는 1보다 낮은 값을 주어 물체가 아무런 힘을 받지 않을 때에도 물체를 서서히 하강시키는 역할을 함.
    • 아주 작은 힘이라도 방향이 변하지 않으면 점차 가속되는 효과가 있음. 반대로 큰 힘이더라도 방향이 자주 바뀐다면 어느 정도 상쇄되는 효과가 생김.
  • AdaGrad: 개별 매개변수에 적응적으로 학습률을 조정하면서 학습을 진행함.
    • 수식: hh+LWLWh ← h + \frac{∂L}{∂W} ⊙ \frac{∂L}{∂W}, WW+η1hLWW ← W + η\frac{1}{\sqrt{h}}\frac{∂L}{∂W} (는 행렬의 원소별 곱셈)
    • hh는 기존 기울기의 제곱에 대한 누적합. 기울기 값이 클수록 역수로 전환되었을 때 작아지므로, 학습률을 작게 만드는 효과를 줌. ('많이 갱신된 원소일수록 앞으로 적게 갱신하겠다')
    • 실제 프로그래밍 시에는 분모가 0이 되는 것을 막기 위해 h+e7\sqrt{h + e^{-7}}으로 작성할 수 있음.
    • 단점: 학습을 진행할수록 갱신 강도가 약해져 만약 0까지 도달한다면 더 이상 갱신이 안 됨.
      => RMSProp: 먼 과거의 기울기일수록 반영 규모를 기하급수적으로 줄이는 지수이동평균 기법을 사용함.
  • Adam: 모멘텀과 AdaGrad 두 기법을 융합한 기법.
    • 모멘텀의 물리 법칙을 사용하면서 동시에 학습률을 적응적으로 조정함.

"모든 문제에서 항상 뛰어난 기법은 없다. 문제의 특성에 맞게 가장 효과적인 학습법을 선택해야 한다."

가중치의 초깃값

신경망 학습에서 가중치의 초깃값을 무엇으로 설정하느냐에 따라 성패가 갈리는 경우가 많다.

  • 가중치 감소 기법: 가중치 매개변수의 값이 작아지도록 학습하여 오버피팅이 일어나지 않도록 하는 기법.
    • 만약 모든 가중치를 처음부터 0으로 (또는 균일한 값으로) 설정한다면?
      • 제대로 된 학습이 불가능함. 순전파 때 모든 뉴런에 같은 값이 입력된다는 것은 곧 역전파 때도 똑같은 값이 돌아온다는 것. 즉, 가중치를 여러 개로 두는 의미가 사라짐.
    • 따라서 가중치의 초깃값은 무작위로 설정되어야 함.
  • 활성화 함수가 S자 모양의 곡선 함수일 때
    • 표준편차 1의 정규분포 사용: 각 층의 활성화 값들이 0과 1에 치우쳐 분포됨. 시그모이드 함수는 출력이 0과 1에 가까워질 때 미분값이 0에 다가감. (기울기 소실 문제)
    • 표준편차 0.01의 정규분포 사용: 활성화 값들이 0.5 부근에 집중되어 표현력이 제한됨. (다수의 뉴런이 거의 비슷한 값을 출력하므로 한 개의 뉴런과 다를 바가 없음)
    • Xavier 초깃값 사용: 앞 계층의 노드가 nn개일 때, 표준편차가 1n\frac{1}{\sqrt{n}}인 정규분포. 활성화값이 가장 광범위하게 분포됨!
  • 활성화 함수가 ReLU일 때
    • He 초깃값: 앞 계층의 노드가 nn개일 때, 표준편차가 2n\sqrt{\frac{2}{n}}인 정규분포. 역시 활성화값이 모든 층에서 가장 균일하게 분포됨.

배치 정규화

각 층이 활성화값을 적당히 퍼뜨리도록 조정하는 것.
배치 정규화를 사용하면 학습이 빨라지며, 가중치 초깃값에 크게 의존하지 않아도 되고, 오버피팅을 억제할 수 있음.

  • 배치 정규화(Batch Norm) 계층: 미니배치를 대상으로 데이터 분포가 평균이 0, 분산이 1이 되도록 정규화하는 계층. 신경망에서 활성화 함수의 앞(또는 뒤)에 삽입함.

  • 또한 배치 정규화 계층마다 정규화된 데이터에 고유한 확대와 이동 변환을 수행함. (yiγxi+βy_{i} ← γx_{i} + β)

오버피팅 억제

오버피팅: 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태. 주로 매개변수가 많고 표현력이 높은 모델이거나, 훈련 데이터가 적은 상황에서 발생함.

  • 가중치 감소(weight decay): 큰 가중치에게 큰 페널티를 부과하여 오버피팅을 억제하는 방법. 모든 가중치 각각의 손실 함수에 12λW2\frac{1}{2}λW^{2}을 더함.
    • λλ는 하이퍼파라미터로, 정규화의 세기를 조절함.
    • 왜 가중치의 제곱(L2 법칙)을 사용할까? ⇒ 더해지는 항을 미분하면 λWλW으로 식이 깔끔하고, 또 큰 가중치일수록 제곱되어 더 큰 페널티를 만들 수 있기 때문.
# https://github.com/WegraLee/deep-learning-from-scratch/blob/master/common/multi_layer_net.py
def loss(self, x, t):
  y = self.predict(x)

  weight_decay = 0
  for idx in range(1, self.hidden_layer_num + 2):
      W = self.params['W' + str(idx)]
      weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)

  return self.last_layer.forward(y, t) + weight_decay
  • 드롭아웃: 훈련 시 은닉층의 뉴런을 무작위로 골라 삭제하여 신호 전달을 차단하는 식으로 뉴런 간의 공동 적응을 줄여 오버피팅을 억제함.
    • 시험 시에는 모든 뉴런에 신호를 전달하되, 각 뉴런의 출력에 훈련 시 삭제했던 비율을 곱하여 출력함.
    • 앙상블 학습: 개별적으로 학습시킨 여러 모델의 출력을 평균 내어 추론하는 방식. 드롭아웃과 비슷한 맥락!
      • 무작위로 뉴런을 삭제하는 것 ≒ 매번 다른 모델을 학습시키는 것
      • 추론 때 뉴런의 출력에 삭제한 비율을 곱하는 것 ≒ 여러 모델의 평균을 내는 것

적절한 하이퍼파라미터 값 찾기

  • 검증 데이터: 하이퍼파라미터의 적절성 평가에 사용되는 전용 데이터. 훈련 데이터의 일부를 떼어내서 검증 데이터로 쓸 수 있다.
    • 시험 데이터는 맨 마지막에 신경망의 범용 성능 평가를 위해서만 사용해야 함. 하이퍼파라미터 평가 용도로 사용 시 오버피팅 발생 가능.

하이퍼파라미터 값을 최적화하는 과정은 다음과 같다. 핵심은 최적값이 존재하는 범위를 조금씩 좁혀나가는 것이다.

  1. 하이퍼파라미터 값 범위 설정
    • 이때 범위는 로그 스케일로 '대략적으로' 잡는 것이 좋음.
  2. 범위 내에서 하이퍼파라미터 값 무작위 추출
  3. 샘플링한 값을 통해 학습 후 검증 데이터로 정확도 평가
    • 이때 에폭을 작게 하여 1회 평가에 걸리는 시간을 단축하자.
  4. 위 단계를 반복하며 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힘
  5. 어느 정도 범위가 좁아졌으면 그 중에서 적절히 값을 선택함

7. 합성곱 신경망 (CNN)

전체 구조

  • 지금까지의 신경망은 인접하는 계층의 모든 뉴런과 결합된 완전연결 계층임.
    • ex. Affine-ReLU → ... (반복) → Affine-Softmax
  • CNN 구조에서는 새로운 합성곱 계층풀링 계층이 추가됨.
    • ex. Conv-ReLU-(Pooling) → ... (반복) → Affine-ReLU → Affine-Softmax

합성곱 계층

  • 기존 완전연결 계층의 문제점은 데이터의 형상이 무시된다는 것. 예를 들면 (가로, 세로, 채널) 3차원 형태의 컬러 이미지 데이터가 들어오더라도 반드시 1차원 데이터로 변환하여 사용해야 했음.
  • 반면, 합성곱 계층은 데이터의 형상을 유지하므로 형상을 통해 의미를 갖는 특징들을 살릴 수 있음!
  • 특징 맵: 합성곱 계층의 입출력 데이터. (입력 특징 맵 & 출력 특징 맵)
  • 합성곱 연산: 입력 데이터에 필터를 적용하는 필터 연산의 일종. 그림은 2차원 데이터에 대한 합성곱 연산의 예시이다.
    • 필터를 입력 데이터 위에 겹쳐놓고 각 원소쌍끼리 곱한 후 그 총합을 상응하는 위치의 출력으로 저장함. (= 단일 곱셈-누산) 이 과정을 필터 윈도우를 일정 간격으로 이동해나가며 반복함.
    • CNN에서는 필터의 매개변수가 그동안의 '가중치'에 해당하며, '편향'은 항상 하나(1×1)만 존재하여 필터를 적용한 모든 원소에 더해짐.
  • 패딩: 필터를 적용할수록 출력의 크기가 계속 줄어드는 것을 막기 위해, 입력 데이터 주변을 특정 값으로 채워 크기를 늘리는 기법.
  • 스트라이드: 필터 적용 과정에서 필터의 이동 간격. 스트라이드가 커질수록 필터가 크게 크게 이동하므로 출력의 크기는 작아짐.
    • 출력 크기 = (입력 크기 + 2*패딩 - 필터 크기)/스트라이드 + 1

컬러 이미지와 같은 3차원 데이터에 대한 합성곱 연산의 경우, 입력 데이터의 채널 수만큼 필터의 채널 수 역시 늘어남. (ex. 3채널 이미지 ⇒ 필터 3장)

  • 필터 자체의 크기는 자유롭게 정할 수 있지만 모든 채널의 필터는 같은 크기여야 함.
  • 이때 출력은 하나이며, 그 값은 각 채널끼리 수행된 합성곱 연산 결과의 총합임.

만약 출력 데이터를 한 장이 아닌 여러 장의 특징 맵으로 만들고 싶다면, 그만큼 필터를 여러 개 사용하면 됨. (⇔ 필터 하나를 구성하는 채널 수와 구분!)

  • 이때 합성곱 연산에서도 배치 처리를 위해 각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터 (데이터 수, 채널 수, 높이, 너비) 형태로 저장할 수도 있음. (데이터 N개에 대한 합성곱 연산 수행)

풀링 계층

세로 및 가로 방향의 공간을 줄이는 연산을 수행하는 계층. 이미지 인식 분야에서는 주로 최대 풀링(주어진 영역에서 최댓값을 구하는 연산)을 사용함.

  • 풀링 계층의 특징: 따로 학습해야 할 매개변수가 없음, 입력 데이터의 채널 수를 그대로 유지함, 입력의 변화에 영향을 적게 받음 (강건함)

합성곱 계층 구현하기

합성곱 연산을 원래 데이터 형태 그대로 수행하려면 복잡한 중첩 for 문이 필요하다. 하지만 만약 (배치 차원을 포함한) 4차원 입력 데이터를 필터가 적용되는 영역마다 한 줄로 전개하여 2차원 행렬 형태로 변환한다면 연산이 훨씬 용이해진다.

  • 이때 필터가 적용되는 영역은 겹칠 수도 있으므로 전개 후의 원소 수가 원래 블록의 것보다 더 많아질 수 있음.
  • 책에서는 해당 변환 과정을 im2col() 함수로 정의하여 사용한다. 역전파 단계를 위한 역변환 함수인 col2im()도 존재한다. (GitHub)
    • im2col의 정확한 동작 방식에 대한 이해는 이 게시글을 참고하자. 핵심은 필터의 각 원소(위치)를 순회하면서, 해당 위치의 연산에 관여되는 입력 데이터 원소들을 인덱싱을 통해 가져오는 것이다.

이후 각 필터 역시 세로로 한 열씩 전개하여 2차원 행렬로 변환한 후 입력 데이터와 내적을 수행하고, 그렇게 계산된 출력 행렬을 다시 4차원 데이터로 변형(reshape)하면 된다.

  • np.reshape(): 인자로 -1을 지정하면 다차원 배열의 원소 수가 변환 후에도 똑같이 유지되도록 적절히 묶어줌.
  • np.transpose(): 인자로 주어진 인덱스에 맞게 다차원 배열의 축 순서를 바꿔줌.

풀링 계층 구현하기

마찬가지로 입력 데이터를 2차원 행렬로 전개하는 것은 같으나, 이때는 각 채널별로 독립적으로 전개한 후 쭉 이어붙인다는 점이 다르다.

  • 풀링 영역마다 한 줄로 만들고, 이후 행별 최댓값을 구하여 적절한 형상으로 변환한다.
  • np.max(): 인자로 축(axis)을 지정하면 해당 축마다 최댓값을 구할 수 있음.

합성곱/풀링 계층의 실제 구현 코드는 본 책의 GitHub을 참고하고, 전체 과정을 그림으로 요약하면 이렇다.

그래서 CNN은?

CNN 구조에서 '가중치'의 역할을 하는 것은 필터다. 필터가 무엇을 학습했는지가 궁금하다면 이를 이미지로 시각화해보면 된다.

학습 전엔 무작위 노이즈에 가까웠던 모습이 학습 후에는 흰색에서 검은색으로 점차 변화하는 픽셀(에지)과 이들이 모여 덩어리진 형태(블롭)를 이루는 등 특정한 패턴을 띠게 되며, 이렇게 학습된 필터를 입력 이미지에 합성곱 처리하면 해당 필터가 '무엇을 보고 있는지'를 알 수 있다. (원본 이미지에 대해 필터가 반응하는 부분이 높은 값으로 나옴)

  • 또한 깊은 계층으로 들어갈수록 필터는 점차 복잡하고 추상화된 정보를 학습하게 된다고 한다. (ex. 단순한 에지/블롭 → 텍스처 → 사물의 일부)

책에서는 대표적인 CNN으로 다음 두 가지를 소개한다. 네트워크 구성 면에서 둘은 크게 다르지 않으나, 빅 데이터와 GPU가 딥러닝 발전의 큰 원동력이었음을 강조하고 있다.

  • LeNet (1998)
    • 합성곱 계층과 풀링 계층을 반복하고 마지막으로 완전연결 계층을 거쳐 결과를 출력
    • 활성화 함수로 시그모이드 함수 사용
    • 서브샘플링을 통해 중간 데이터의 크기를 줄임
  • AlexNet (2012)
    • 활성화 함수로 ReLU 이용
    • 국소적 정규화(LRN, Local Response Normalization) 계층 이용
    • 드롭아웃 사용

8. 딥러닝

기존 신경망에서 정확도를 높이는 기법들로는 앙상블 학습, 학습률 감소, 데이터 확장 등이 유명하다.

  • 데이터 확장: 훈련용 이미지를 알고리즘을 통해 인위적으로 확장하여 개수를 늘리는 것. (ex. 크롭, 좌우반전 등등)

한편, 층을 깊게 한 '심층 신경망'을 딥러닝이라고 하며, 그 이점은 다음과 같다.

  • 층이 얕은 신경망보다 더 적은 매개변수로 그 이상의 표현력을 달성할 수 있음. (넓은 수용 영역)
  • 정보를 계층적으로 분해하여 각 층이 학습해야 할 문제를 더 단순한 문제로 대체할 수 있음.
  • 즉, 학습에 필요한 데이터의 양을 줄여 더 고속으로 학습을 수행할 수 있음.

대강 직관적으로 이해해 보자면, '얕은 층에서 한꺼번에' 학습하는 것보단 '깊은 층에 걸쳐 나눠서' 학습하는 것이 더 효율적이면서 높은 성능을 보인다는 뜻 같다.

딥러닝의 초기 역사

다음은 100만 장이 넘는 이미지를 담고 있는 데이터셋인 이미지넷을 활용한 대회 'ILSVRC'에서 우수한 성적을 거둔 3개의 유명한 신경망이다.

  • VGG: 합성곱 계층과 풀링 계층으로 구성되는 기본적인 CNN.
    • 합성곱 계층 및 완전연결 계층을 총 16층(VGG16) 또는 19층(VGG19)으로 심화함.
    • 3×3의 작은 필터를 사용한 합성곱 계층을 2~4회 연속으로 거치며 크기를 절반으로 줄이는 처리를 반복함.
  • GoogLeNet: '인셉션 구조'를 하나의 빌딩 블록(구성요소)으로 사용함.
    • 인셉션 구조: 하나의 계층에 대해 크기가 다른 필터와 풀링을 여러 개 적용하여 결과를 결합함.
    • 1×1 필터를 이용한 합성곱 연산을 통해 채널 쪽으로 크기를 줄여 매개변수 제거와 고속 처리에 기여함.
  • ResNet: VGG 기반에 '스킵 연결'을 도입하여 층의 깊이에 비례해 성능을 향상시킴.
    • 스킵 연결: 입력 데이터를 합성곱 계층을 건너뛰어 출력에 바로 더하는 (그대로 흘리는) 구조.
    • 역전파 때도 상류의 기울기에 아무런 수정을 가하지 않고 그대로 하류로 보내므로 기울기 소실 문제를 줄여줌.

전이 학습: 학습된 가중치 전체 또는 일부를 다른 신경망에 복사한 후, 그 상태로 새로운 데이터셋에 대하여 재학습(fine tuning)을 수행하는 것. 보유한 데이터셋이 적을 때 유용한 방법이다.

딥러닝 고속화

딥러닝에서는 합성곱 계층에서 단일 곱셈-누산(또는 큰 행렬의 내적)을 수행하는 데에 대부분의 시간을 소요한다. 이 연산 과정을 최대한 빠르게, 효율적으로 해내는 것이 중요하다.

  • GPU 컴퓨팅: 기존 CPU 대신 대량의 병렬 작업을 고속으로 처리할 수 있는 GPU에게 범용 수치 연산을 수행시키는 것.
  • 분산 학습: 수많은 시험 반복을 위해서는 1회 학습에 걸리는 시간을 단축해야 함. → 수평 확장! 프레임워크의 힘을 빌려 다수의 GPU와 기기로 계산을 분산시킬 수 있음.
  • 연산 정밀도와 비트 줄이기: 메모리 용량을 줄이고 버스 대역폭 병목을 막기 위해 중간 데이터의 크기를 최소화해야 함. 딥러닝은 높은 수치 정밀도를 필요로 하지 않으므로 16비트 반정밀도면 충분.

딥러닝의 활용

딥러닝은 이미지, 음성, 자연어 등 수많은 분야에서 뛰어난 성능을 발휘한다. 컴퓨터 비전 분야를 중심으로 몇 가지 소개된 활용 예시는 다음과 같다.

  • 사물 검출: 이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 것. '이미지 어딘가에 있을 사물의 위치'까지 알아내야 하므로 일반적인 사물 인식 문제보다 어려움.
    • R-CNN(Regions with CNN): 이미지에서 먼저 사물이 위치한 '후보 영역'을 찾아내고, 추출한 각 영역에 CNN을 적용하여 클래스를 분류하는 기법.
  • 분할: 이미지를 픽셀 단위로 식별하여 분류하는 문제. 픽셀 위로 객체마다 채색된 지도 데이터를 사용해 학습하며, 추론 시 입력 이미지의 모든 픽셀을 분류함.
    • FCN(Fully Convolutional Network): 기존 CNN에서의 완전연결 계층을 같은 기능을 하는 합성곱 계층으로 바꾼 버전. 모든 픽셀 각각을 추론하는 대신 단 한 번의 순전파 처리로 모든 픽셀을 분류할 수 있음.
  • 사진 캡션 생성: 사진을 주면 사진을 설명하는 글을 자동으로 생성함.
    • NIC: 심층 CNN으로 사진에서 특징을 추출하고, 자연어를 다루는 순환 신경망(RNN)에 특징을 넘겨 텍스트를 생성하게 함. (⇒ 멀티모달 처리)

딥러닝의 미래

  • 이미지 화풍 변환: 스타일 이미지와 콘텐츠 이미지를 받아 둘을 조합해 새로운 이미지를 생성함. 네트워크의 중간 데이터가 콘텐츠 이미지의 중간 데이터와 비슷해지도록 학습하는 식으로 동작.
  • 이미지 생성: 먼저 대량의 이미지를 사용해 학습한 후, 아무런 입력 이미지 없이도 새로운 그림을 그려냄. 생성자와 식별자로 불리는 2개의 신경망을 서로 무한 경쟁시키는 GAN 기술 이용. (⇒ 자율 학습)
  • 자율 주행: CNN 기반 신경망 SegNet은 입력 이미지를 분할(픽셀 수준에서 판정)하여 주변 환경을 정확하게 인식할 수 있음.
  • Deep Q-Network: 딥러닝을 사용한 강화학습 방법 중 하나. 'Q학습'이라는 강화학습 알고리즘을 기초로 함.

정리

이번 5~8장에서는 신경망의 학습 원리 중 핵심적인 부분인 오차역전파법을 알아보고, 그동안 나온 각 계층들과 순전파/역전파 과정을 실제 작성된 코드를 통해 이해하는 시간을 가졌다.

또한 매개변수 갱신이나 가중치 초깃값 설정 등 여러 학습 관련 기술들과, 컴퓨터 비전 분야에서 매우 중요하게 다뤄지는 CNN의 개념도 배울 수 있었다.

프레임워크를 사용하지 않고 낮은 수준의 코드부터 실제 동작하는 간단한 신경망까지를 차근차근 구현해 보면서 딥러닝에 대한 이해를 높일 수 있었던 좋은 책이었다. 다시 한번 내용을 복습하면서 이해가 부족한 부분을 중심으로 더 공부해 봐야겠다.

profile
공부용 블로그
post-custom-banner

0개의 댓글