논문

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

Speeding-up Convolutional Neural Networks Using Fine-Tuned CP-Decomposition

1 Introduction

다른 신경망과 구별되는 CNN의 가장 큰 특징은 컨볼루션 연산입니다. 이 연산은 CNN의 대부분의 연산을 차지하는데 새롭게 제안되는 구조에서는 점점 더 많은 층을 추가하고 있는 경향이 있습니다. 때문에 컨볼루셔널 연산의 효율적인 구현이 CNN 패키지에서 가장 중요한 요소가 되었습니다.

최근 CNN 컨볼루션의 속도를 올리기 위한 방법으로 텐서 분해(tensor decompositions) 방법이 제안되었습니다. Denton과 Jaderberg는 기존 컴퓨터 비전에서 사용된 것과 같이 2D 필터를 이용한 근사화 방법을 커널 텐서에 적용하여 텐서 분해를 구현하였습니다.

이 논문에서는 여기에서 더 나아가 기존의 텐서 대수의 표준 low-rank CP-decomposition과 non-linear least square 방법을 이용하여 전체 커널 텐서를 분해하고자 합니다.

커널 텐서에서 CP-decomposition를 적용하면 아래와 같은 장점이 있습니다.

  • 분해 구현이 쉽다. Cp-decomposition은 텐서 선형 대수에서 표준적으로 쓰이는 방법으로 오래 연구되어왔습니다. NLS와 같은 알려진 알고리즘이 존재합니다.
  • CNN 구현이 쉽다. 4D 텐서 컨볼루션 연산을 4개의 작은 2D 커널 텐서 연산으로 근사화합니다. 따라서 그 결과 또한 표준적인 CNN 레이어로 구ㅜ현됩니다. 즉 기존 패키지에서 따로 구현할 것이 없습니다.
  • Fine-tuning이 쉽다. 앞의 것과 동일한 이유로 역전파를 통하여 전체 네트워크를 파인튜닝할 수 있습니다.
  • 효율적이다. CP-decomposition을 적용하여 전체 파인튜닝을 하면 기존의 방법들보다 더 나은 속도대비 정확도 트레이드오프를 얻을 수 있었습니다.

이렇게 얻어진 네트워크는 적은 파라미터 수를 사용하면서도 놀라운 정확도를 보입니다. 즉 적은 파라미터는 계산 시간 뿐 아니라 메모리 또한 적게 사용한다는 것을 의미합니다.

이론적인 면에서는, 기존의 CNN들이 과하게 파라미터를 사용(over-parameterized)하고 있다는 것을 생각할 수 있습니다. 다시 말하면 CNN이 사용하는 것들 중 대부분의 파라미터는 분류 태스크에 필요한 정보를 저장하는데 필요가 없습니다.

2 Related Work

컨볼루션 분해 Rigamonti는 Low-rank 분해를 통해 컨볼루션을 가속화하였습니다. 그의 연구는 2D 혹은 3D 필터 뱅크 X를 분해하여 분해가능한 공유 뱅크 필터 Y의 선형 조합으로 분해하였습니다.

Jaderberg는 여기에서 더 나아가 4D 커널 텐서를 3D 텐서의 곱으로 근사화하였습니다. 분해가 완료되면 부분 파닝튜닝을 통해 학습 데이터에 최적화 하였습니다.

Denton은 biclustering으로 얻어진 커널 텐서 일부의 CP-decomposition에 기반한 방법을 제안하였습니다. Biclustering은 지역 차원을 제외한 입력 채널 차원과 출력 채널 차원을 서브그룹으로 분리하고, CP-decomposition으로 랭크를 줄이도록 하였습니다. Denton은 커널 텐서의 CP-decomposition을 greeedy approach를 이용하여 계산하였습니다.

이 논문에서는 biclustering을 이용하지 않고 CP-decomposition을 직접 전체 커널 텐서에 적용하였습니다. 또한 greedy approach보다는 non-linear least square를 사용하였습니다. 최종적으로 Denton이 한 레이어만 파인튜닝한 것과는 달리 전체 네트워크를 파인튜닝하도록 하였습니다.

3 Method

전체 과정은 2개의 단계로 나누어 이루어 집니다. (1) 한 컨볼루셔널 레이어를 CP-decomposition을 이용하여 분해합니다. (2) 전체 네트워크를 파인튜닝합니다. 필요하다면 다른 레이어에 대해서도 이를 수행합니다.

3.1 CP-decomposition review

텐서 분해는 low-rank 방법을 다차원 경우로 일반화한 것입니다. 크기 $n \times m$의 행렬 $A$를 rank $R$을 가지도록 Low-rank 분해하면 다음과 같습니다.

$$ A(i, j) = \sum_{i=1}^R A_1(i, r) A_2(j, r), \ i = \overline{1, n}, j=\overline{1, m} $$

이렇게 다차원의 변수를 분리하는 가장 단순한 방법으로는 canonical polyadic decomposition (CP-decomposition, CANDECOMP/PARAFAC model)이 사용됩니다. d차원의 크기 $n_1 \times \cdots \times n_d$를 갖는 배열 $A$의 CP-decomposition은 다음과 같습니다.

$$ A(i_1, \cdots, i_d) = \sum_{r=1}^R A_1(i_1, r) \cdots A_d(i_d, r)$$

여기서 가능한 최소값 $R$을 canonical rank라고 부릅니다. 이 분해법의 장점은 전체 텐서 대신 $(n_1 + \cdots n_d) R$개의 요소만 저장하면 된다는 것입니다.

2차원에서는 low-rank 근사치를 singular value decompositino (SVD)를 통해 안정적으로 구할 수 있으며, 행렬이 큰 경우는 rank-revealing 알고리즘을 이용할 수 있습니다. 하지만 컨볼루셔널 연산은 $d \gt 2$인 경우이기 때문에 canonical rank를 구할 수 있는 적당한 알고리즘이 없고, 대부분이 방법들이 오차가 적어질 때 까지 여러 $R$을 이용하여 시도하는 법을 사용합니다. 이것은 좋은 CP-decomposition의 결과를 얻는 트릭을 사용할 수 있게 해 줍니다. 이 부분은 Tomasi&Bro의 연구를 참조하면 됩니다. 여기에서는 non-linear least sqaures (NLS) 방법으로 오차의 L2-norm을 최소화하도록 Gauss-Newton 최적화 이용할 것입니다.

3.2 Kernel tensor approximation

CNN에서 가장 시간을 많이 쏟는 부분은 컨볼루션 연산을 크기 $X \times Y \times S$의 입력 텐서 $U$를 크기 $(X-d+1) \times (Y-d+1) \times T$의 출력 텐서 $V$로 계산하는 과정입니다.

$$ V(x, y, t) = \sum_{i=x-\delta}^{x+delta} \sum_{j=y-\delta}^{y+delta} \sum_{s=1}^{S} K(i-x+\delta, j-y+\delta, s, t) U(i, j s)$$

여기서 $K$는 4D 커널 텐서로 $d \times d \times S \times T$의 크기를 갖습니다. 커널의 지역 크기는 $d$이고, $\delta$는 $(d-1)/2$입니다.

위 식의 rank-R CP-decomposition은 다음과 같습니다.

$$ K(i, j, s, t) = \sum_{r=1}^R K^x(i-x+\delta, r) K^y(j - y + \delta, r) K^s(s, r) K^t(t, r)$$

여기서 $K^x, K^y, K^s, K^t$는 분해된 2D 텐서로 크기 $d \times R$, $d \times R$, $S \times R$, $T \times R$을 갖습니다.

이 식을 원래 시작에 대입해보면 다음과 같이 됩니다.

$$ V(x, y, t) = \sum_{r=1}^R K^t(t, r) \big( \sum_{i=x-\delta}^{x+\delta} K^x (i -x+\delta, r) \big( \sum_{j=y-\delta}^{y + \delta} K^y(j-y + \delta, r) \big( \sum_{s=1}^{S} K^s(s, r) U(i, j, s) \big)\big)\big) $$

이제 출력 텐서 $V$는 4개의 작은 커널로 이루어진 컨볼루션의 순서로 분해할 수 있습니다.

$$ U^s(i, j, r) = \sum_{s=1}^S K^s(s, r) U(i, j, s)$$

$$ U^{sy}(i, y, r) = \sum_{j = y-\delta}^{y+\delta} K^y(j-y + \delta, r) U^s (i, j, r)$$

$$ U^{syx} (x, y, r) = \sum_{i=x-\delta}^{x+\delta} k^x(i-x+\delta, r) U^{sy}(i, y, r)$$

$$ V(x, y, t) = \sum_{r=1}^R K^t(t, r) U^{syx}(x, y, r)$$

3.3 Implementation and Fine-tuning

$U$로부터 $U^s$를 계산하는 것과 $U^{syx}$에서 $V$를 계산하는 것은 1x1 컨볼루션으로 network-in-network와 같은 것으로 입력 채널을 선형 재조합(linear re-combination)을 하는 것과 같습니다. $U^s$에서 $U^{sy}$를 계산하는 것과 $U^{sy}$에서 $U^{syx}$를 계산하는 것은 표준 2D 컨볼루셔널입니다.

구현은 caffe를 이용하여 하였으며, 파인튜닝또한 표준 역전파 알고리즘을 이용하여 하였습니다. 파인튜잉은 분해된 레이어를 포함한 모든 레이어에 대해 적용하였습니다. 하지만 분해된 레이어들의 그래디언트가 발산하기 쉬웠기에 학습률을 적게 유지하거나, 분해된 레이어 중 어떤 것들은 고정하는 등의 방법을 사용하였습니다.

3.4 Complexity analysis

4 Experiments

5 Discussion


Add a Comment Trackback