논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

Dynamic Network Surgery for Efficient DNNs

1 Introduction

  • 최근 디자인된 신경망들은 층을 더 쌓고 있는 추세입니다.
  • 더 많은 파라미터는 곧 더 많은 저장 공간의 필요성을 위미하고, 더 많은 부동소수점 연산을 의미합니다.
  • DNN 모델이 많은 파라티머들을 필요로 하기는 하지만, 파라미터화에는 중복된 것들이 존재한다고 알려져 있으며, 따라서 그 성능을 잃지 않으면서도 모델을 압축하는 것이 가능합니다.
  • 최근 Han의 연구에서는 마치 수술을 하는 과정처럼 중요하지 않은 파라미터를 제거하고 남은 것들을 재학습시켜 DNN을 압축을 하고 있습니다.
  • 하지만 복잡한 망에서 파라미터의 중요도는 신경망 수술이 시작되고 나서는 갑작스럽게 변할 수 있고, 이런 부분에서 두가지 문제가 발생합니다.
  • 첫번째는 되돌릴 수 없는 망의 손상이고, 다른 것은 학습의 비효율성입니다.
  • 이 논문에서는 계속적인 망 유지보수를 하여 중복된 연결을 제거하는 방법을 제안합니다.
  • 이 방법은 두가지 동작이 있는데, 가지치기(pruning)과 잇기(splicing)입니다.
  • 기존의 가지치기 동작에 잇기 동작을 추가함으로써, 이미 가지치기된 연결 중 다시 중요해진 연결을 복구할 수 있게 되었습니다.
  • 이 두 동작이 제안하는 알고리즘이 동적으로 동작할 수 있도록 만들어줍니다.

2 Related Works

3 Dynamic Network Surgery

3.1 Notations

  • DNN의 각 층의 가중치 행렬을 $W_k$라고 합니다.
  • 가지치기 된 이후의 스파스 모델을 나타내기 위해서 $W_k$와 동일한 크기의 $T_k$ 행렬을 사용합니다.
  • 이 행렬은 바이너리 행렬로 신경망의 연결되었는지 여부를 나타내는 행렬입니다. 일종의 마스크로 생각할 수 있습니다.

3.2 Pruning and Splicing

  • 가지치기를 위해 중요하지 않은 파라미터를 잘라내야 하지만, 파라미터의 중요도를 측정하기는 어렵습니다.
  • 어떤 한 연결은 다른 것들이 함께 있을 때 중복일 수 있으나, 그것들이 사라지고 나면 중요한 것으로 바뀌게 됩니다.
  • 따라서 적절한 학습 과정을 통해야 하고 계속적으로 신경망 구조를 관리해야 합니다.
  • k번째 층을 예로 들면, 다음의 최적화 문제를 푸는 것으로 문제를 해결하려 합니다.

$$ \min_{W_k, T_k} L(W_k \odot T_k ) \text{ s.t. } T_k^{(i, j)} = h_k (W_j^{(i, j)}), \forall (i, j) \in I $$

  • $ L( \cdot )$는 신경망의 손실 함수 입니다. $\odot$는 Hadamard product 입니다. $I$는 행렬 $W_k$의 모든 인덱스입니다. $h_k$는 분별 함수로 1이면 해당 층에서 중요한 파라미터임을, 0이면 그렇지 않음을 나타냅니다.
  • 이 식을 stochastic gradient descent (SGD) 방법으로 풀 수 있습니다.
  • 바이너리 행렬 $T_k$는 위의 신에서 이미 결정되어져 있으므로, 학습 단계에서는 $W_k$만 갱신하면 됩니다.
  • Lagrange Multiplier와 gradient descent의 영감을 받아 다음과 같은 식을 사용하였습니다.

$$ W_k^{(i, j)} \leftarrow W_k^{(i, j)} - \beta \frac{\partial} {\partial (W_k^{(i, j)} T_k^{(i, j)})} L(W_k \odot T_k), \forall(i, j) \in I $$

  • $\beta$는 학습률을 나타냅니다.
  • 학습 시에는 $T_k$의 값과는 상관없이 덜 중요한 파라미터라도 갱신하도록 합니다.
  • 이러한 방법으로 이미 가지치기된 연결을 다시 붙이는 것이 가능한 것입니다.
  • 위 식을 랜덤으로 선택된 미니배치에 대해서 적용한 뒤, $W_k$와 $T_k$가 갱신되고 나면 전체 신경망에 대해서 활성값(activation)과 손실 함수 그래디언트를 다시 계산합니다.
  • 이러한 과정을 반복적으로 수행하면 정확도는 유지하면서도 스파스한 모델을 얻을 수 있습니다.
  • 이 알고리즘의 동적인 성질은 두 부분에서 보여집니다.
  • 기존의 연결이 중요하지 않게 되었을 때 가지치기 연산을 적용하고, 실수로 가지치기된 연결이 중요하게 되었을 경우 다시 연결짓게 합니다.

3.3 Parameter Importance

  • 파라미터의 중요도를 측정할 함수 $h_k(\cdot)$가 필요합니다.
  • 여러가지 방법을 테스트해보았지만, 결국 입력의 절대값을 사용하는 것이 최선이었습니다.
  • 두개의 스레스홀드를 사용하여, 두 스레스홀드 구간 밖으로 넘어가면 가지치기 하거나 다시 복구하도록 하고, 그 사이에 존재하면 그대로 현재 상태를 유지하도록 합니다.

3.4 Convergence Acceleration

  • 수렴을 빨리 하기 위한 방법으로 $T_k$의 갱신을 확률 $p = \sigma(\text{iter}) $ 로 수행하는 방법이 있습니다. $\sigma() $는 monotonically non-increasing 한 함수로 $\sigma(0) = 1$이면 됩니다.
  • $p$가 0이 되면 더 이상의 가지치기, 잇기 작업은 하지 않게 됩니다.
  • 다른 한가지는 그래디언트 배니싱 문제를 풀기 위해서 가지치기를 컨볼루셔널 층과 완전 연결 층을 별도로 수행하는 것으로 해결하였습니다.

4 Experimental Results

5 Conclusions


Add a Comment Trackback