이번 포스트에서는 한동안 arxiv-sanity.com 에서 상위권에 머물었던 Kaiming He의 2017년 11월에 공개된 논문, ‘Non-local Neural Networks’를 소개 드리도록 하겠습니다. 간략히 요약하면 이 논문에서는  기존 네트워크에 차용 가능한 Non-local한 연산 방식을 제안했는데, 이 연산을 이미 학습되어있는 네트워크의 중간에 집어 넣어 비디오 분류하기 문제에서 기존 네트워크의 성능을 크게 개선하는 성과를 거두었습니다.
여담이지만 요즘 FAIR 그룹에서 논문을 정말 많이 쏟아내네요. 특히 이번 논문과 같이 대학원생들이 FAIR에서 인턴으로 있는 동안 Kaiming He나 Ross Girshick과 같은 대가의 지도를 받아 제1저자로써 좋은 논문을 발표하는 경우들이 종종 있는데, 상당히 인상적입니다.

스크린샷 2017-12-28 오후 6.05.04.png

1. Introduction

구분을 하자면 우리가 흔히 사용하는 Convolution은 local operator에 속합니다. 연산시 kernel의 크기 만큼만 볼 수 있기 때문이지요.

때문에 Convolutional neural network (CNN)의 경우 넓은 receptive field를 확보하기 위해 (영상의 더 넓은 부분을 보기 위해) Convolution를 여러차례 겹쳐 쌓기도 하고, Pooling layer를 통해 봐야하는 영상의 크기를 줄이기도 합니다. 하지만 이러한 방식은 receptive field를 넓힌다는 측면에서 크게 효율적인 방법은 아닙니다. 충분한 receptive field를 확보하기 위해선 네트워크의 깊이도 상당히 깊어져야하는데, 이는 연산량 대비 효율의 측면에서 그닥 매력적인 방법이 아니기 때문입니다.  이를 극복하고자 이번 논문에서는 기존의 Convolution의 local한 특성을 보완해 줄 수 있는, 한번의 연산이 영상 전체 영역을 대상으로 하는 Non-local한 연산을 제안했습니다. 이 연산의 경우 기존의 CNN에 손쉽게 적용 가능하고, 특히 비디오 분류 문제에서 성능 향상이 두드러졌는데, 구체적으로 어떤 방식으로 동작 하는지 설명하기에 앞서, 이해를 돕기 위해 이 논문의 아이디어에 많은 영향을 준 Non-local Means Filter라는 노이즈 제거 필터에 대해 간단히 알아보도록 하겠습니다.

2. Non-local Means Filter

Computer vision에서 노이즈 제거 문제를 다루어보신 분이라면 Non-local Means Filter (NLM Filter)에 대해 들어보셨을 것입니다.  NLM Filter는 2000년대 초반에 소개된 상당히 좋은 성능을 보여주는 노이즈 제거 필터인데, 논문의 저자는 NLM Filter로 부터 영감을 받아서 새로운 Non-local operation을 제안했다고 합니다. NLM Filter는 주로 speckle 형태의 랜덤 노이즈를 제거하는데 많이 사용됩니다.

Image result for nlm filter lena
NLM Filter to remove random noise on pixel p

랜덤 노이즈는 말그대로 랜덤한 특성을 띄는 노이즈이기 때문에 매번 영상을 촬영할때마다 촬영하고자 하는 대상은 그대로 있지만, 노이즈는 랜덤하게 변합니다. 그래서 랜덤 노이즈가 제거된 영상을 얻고자 할때는 동일한 사진을 여러 차례에 거쳐 촬영하고 이들 사진을 합쳐서 평균을 내주면 랜덤한 특성은 사라지고 우리가 원하는 사물만 깨끗하게 남아있는 영상을 얻을 수 있습니다. 하지만 동일한 영상을 여러차례에 거쳐서 촬영하는 것은 상당히 귀찮은 일이고 때론 불가능 할 수도 있습니다. 이를 극복하고자 NLM Filter는 한 장의 영상만을 가지고 기존의 노이즈 제거 방법과 같은 원리를 이용하여 노이즈를 제거합니다. 자세히 살펴보면 대체로 한 장의 영상 안에도 서로 유사한 영역들이 상당히 많이 존재합니다. 예를 들면 위 사진에서 p 지점의 경우 p의 위 아래에 q1, q2와 같이 p와 유사한 구조의 지점들이 존재합니다. 때문에 한 영상 안에서도 이러한 유사한 영역들을 모아준 후 평균을 취해주면 여러장의 영상을 평균해 준 결과와 유사한 결과를 얻을 수 있습니다. 이러한 원리를 이용하는 NLM Filter는 노이즈를 제거하는데 있어서 여타 다른 필터들에 비해 상당히 좋은 성능을 보여줍니다. NLM이라는 이름에서 드러나듯이 다수의 필터들과 가장 다른 주안점은 영상의 주변부 (local) 만을 이용한 것이 아니라 영상 전체 영역 (non-local)을 활용한 필터라는 것이었습니다. 이러한 특성 덕분에 NLM Filter는 한동안 가장 좋은 성능을 가진 노이즈 제거 필터였고, 현재까지도 가장 좋은 노이즈 제거 필터로 인정되고 있는 BM3D 필터 역시도 NLM의 원리를 차용하고 있습니다.

2. Non-local Neural Networks

NLM Filter의 핵심은 영상 전체 영역, 즉 non-local한 영역에서, 서로간의 유사도를 측정하고 이를 활용하는데 있었습니다. 우리가 많이 사용하는 기존의 CNN의 경우는 엄밀히 보면 local 한 특성 만을 볼 수 있는 구조입니다. CNN에 사용되는 convolution이나 pooling 모두 local operator에 속하기 때문이지요. receptive field 크기의 관점에서 보면 local operator를 여러차례 쌓으면 receptive field의 크기를 키울 수는 있지만 아무리 많이 쌓더라도 결코 한 번에 전체 영역을 살펴보는 non-local operator와 같을 수는 없습니다. 때문에 자연스레 non-local operator를 네트워크에 추가하면, 이전에는 인식하지 못하던 영상의 새로운 특성을 네트워크가 학습할수 있지 않을까? 하는 기대를 할 수 있게 됩니다. 논문의 저자는 NLM Filter의 아이디어를 차용해서 non-local block 이라는 구조를 제안했습니다. 그리고 이를 기존의 CNN에 추가하면 네트워크의 성능을 크게 향상시킬 수 있다는 결론을 얻었습니다. 이제 수식과 그림을 보면서 좀 더 구체적으로 저자가 제안한 구조는 어떤 것인지 알아 보도록 하겠습니다.

스크린샷 2018-01-08 오전 11.32.48.png
CNN 네트워크의 중간에 삽입되는 Non-local block
스크린샷 2018-01-08 오전 11.35.51.png
Non-local block의 수식. x_i 위치에 대한 결과를 만들기 위해 x_i와 그외 각 모든 영역 x_j과의 관계를 계산하고(f(x_i, x_j)) 그 관계에 따라 적절이 x_j의 값을 가져온다. 이때 x_j는 학습 가능한 Weight matrix W_g를 이용해 Embedding한 결과 g(x_j)를 이용한다.

일단 g(x_j) 부분의 경우는 기존의 NLM 이었다면 해당 위치의 픽셀 값을 가져오는 부분 이었을 것입니다. 하지만 여기서는 그냥 그 위치의 값을 가져오는 대신 네트워크의 관점에서 좀더 의미있는 정보를 추출하기 위하여 학습 가능한 파라미터 행렬 (W_g)를 곱해주어 Embedding 시켰습니다. f(x_i, x_j) 부의 경우 두 위치의 관계를 계산하는 부분인데, 여기선 두 위치의 관계를 각 위치의 채널축 값 간의 dot product로 정의하였습니다. 단순히 dot product를 이용한 이유는 계산의 용이성 때문입니다. 예를 들어 H\times W\times 512 크기의 텐서가 있을때, 각 모든 위치의 관계를 계산하고자 하면 HW\times 512 의 2D 행렬로 변환 후 자기 자신과 행렬 곱을 수행하면 HW\times HW 의 간단한 형태의 행렬로 결과를 얻을 수 있기 때문입니다. 저자는 여기서 조금 더 나가서, Embedded Gaussian 형태의 f(x_i, x_j) 를 주로 사용하였는데, 이는 아래와 같이 정의됩니다.
스크린샷 2018-01-08 오후 12.06.18
exponential 위에 두개의 벡터를 dot product 한 형태인데, 이때 두 벡터는 그냥 raw 벡터를 사용한 것이 아니라 이전에 g(x_j) 를 사용했던것과 같이 각각 다른 Weight matrix를 이용하여 embedding 한 후 곱해주었습니다.
스크린샷 2018-01-08 오후 1.20.30.png
위는 non-local block을 설명하는 그림입니다. 참고로 논문에서는 비디오 데이터에 적용을 하였기 때문에, 시간축 T가 추가되어있습니다. 전체 구조를 간략히 설명하면 다음과 같습니다. 중앙 부에서 f(x_i, x_j) 를 계산하여 넘겨주고, 이를 g(x_j) 와 곱해줍니다. 그림에서 중간에 있는 Softmax 부분은, Embedded Gaussian 형태로 f(x_i, x_j) 를 계산할때 dot product를 통해 두 벡터 간의 유사도를 계산한 결과에 exponetial을 적용하고 나중에 C(x) 로 normalize를 수행해 주면 결국 Softmax와 동일한 형태가 됩니다. 때문에 그림에는 Softmax로 간략히 표기되어 있습니다. 이후 왼쪽 선을 따라 넘어온 residual connection과 채널 크기를 맞춰주기 위하여 1x1x1 conv를 이용해 채널 크기를 변환시켜주고, residual connection으로 넘어온 값과 합 해줍니다. 위 그림에서는 표현되어 있지 않지만 최종적으로 element-wise sum 하기 전, 1x1x1 convolution 직후에 batch normalization을 배치하였습니다. 이때 Batch normalization의 scaling factor인 gamma 값은 0으로 초기화 해둔 상태로 적용하였습니다. 저자는 이미 학습을 완료한 CNN에 non-local block을 삽입하여 추가적으로 fine-tuning하는 방식을 통해 네트워크를 학습 시켰는데, 이때 gamma를 0으로 설정함으로써, 학습 초기에는 non-local block이 반영되지 않다가, 학습이 진행됨에 따라 서서히 반영될 수 있도록 하기 위해서 이러한 방식을 적용하였습니다.

3. Experiments

논문에서는 Kinetics dataset이라는 2017년 비디오 분류 챌린지에서 사용된 데이터셋을 이용하여 실험하였습니다. Kinetics dataset은 학습용으로 약 24.6만개, 검증용으로 약 2만개의 비디오 데이터로 구성되어 있으며, 각각의 비디오는 한 가지 사람의 동작과 연관되어 있습니다. 비디오를 보고 사람이 어떤 행동을 하고있는지를 맞추면 되는 문제입니다. 여기서는 네트워크를 두 가지를 사용하여 실험 하였습니다.

스크린샷 2018-01-12 오후 5.52.49.png
2D ConvNet baseline (C2D)

C2D 모델의 경우 기존의 ImageNet으로 pre-trained 되어있는 ResNet-50을 그대로 가져온 모델입니다. 기존의 ResNet-50의 경우 2D 이미지를 대상으로한 모델인데, 여기서는 Time 축이 추가되어 3D 형태의 영상을 봐야 하기 때문에, 중간에 pooling하는 부분에서 Time축으로도 pooling을 수행해 줍니다.
다음으로 사용한 모델은 Inflated 3D ConvNet (I3D)라고 명명한 모델입니다. 이 모델은 또 두 가지 버전으로 나뉘는데 두 버전 모두  C2D와 형태는 거의 동일하고 중간에 res-block 내부에서 최초의 1×1 conv 대신에 3x1x1 conv를 사용하는 버전 하나와 (I3D_{3\times 1 \times 1}) 중간의 3×3 conv대신에 3x3x3 conv를 사용하는 버전 하나 ((I3D_{3\times 3 \times 3}) 가 존재합니다. 이 모델역시 ImageNet으로 pre-trained되어있는 모델을 가져와서 사용하는데, Time축으로 커널의 크기가 확장된 conv의 경우에는 그대로 파라미터를 가져오면 파라미터양이 다르므로, 시간으로 파라미터를 그래도 복사해서 집어 넣되, 양이 3배 늘어난 만큼 파라미터의 값은 1/3하여 집어 넣었습니다. 논문의 결과를 보면 이 모델의 경우 non-local block을 적용하지 않더라도 2017년에 있었던 두 번의 비디오 분류 챌린지에서의 결과들과 비교했을때(Kinetics challenge, Charades challenge), 이 모델이 현재 비디오 분류 문제에서 가장 뛰어난 성능을 내는 모델임을 알 수 있습니다. 이렇게 좋은 성능을 보일 수 있었던것은 비디오 데이터에도 ImageNet으로 pre-trained되어있는 모델을 적용할 수 있는 형태를 제안하여 사용한것이 주효하지 않았나 생각해 봅니다. 이제 C2D 모델과 I3D모델에 non-local block을 사용한 결과들을 살펴보면서 non-local block을 어떻게 사용하는것이 가장 좋은 선택일지 알아 보도록 하겠습니다.

4.1 Instantiations

위에서는 한 가지 형태의 f(x_i, x_j) 만을 소개 했었는데, 저자는 실험을 통해 다른 형태의  f(x_i, x_j) 에 대해서도 검증해 보았습니다. 여기선 ResNet-50을 기반으로한 C2D모델에서 res_4에서 가장 마지막 residual block 바로 이전에 non-local block 1개를 삽입하였습니다.
스크린샷 2018-01-15 오후 2.27.15.png
간략히 설명을 하면 Gaussian, embed는 위에서 설명한 형태이고, Gaussian과 Dot-product는 Gaussian, embed와 유사한 형태인데, Gaussian은 Embeding을 하지 않고 Dot-product한 결과에 SoftMax를 취해준 결과이고, Dot-product는 Embedding시킨 벡터에 Dot-product만을 취해준 결과입니다. Contatenation은 Embedding된 두 벡터간를 channel축에 이어 붙이고 학습가능한 Wegith vector를 곱해준 결과입니다. 결과를 살펴보면 결국 어떤 형태의  f(x_i, x_j)를 사용하건 결과에는 큰 영향을 미치지않는것을 볼 수 있습니다. 이를 통해 볼때 non-local block을 구성할때 딱히 우리가 어떤 형태의 관계를 정의하는지는 큰 의미가 없고, 각 위치간에 어떤 형태로든 관계를 정의내려주기만 하면 성능 향상에 도움이 되는 것을 확인할 수 있습니다.

4.2 Which stage to add non-local blocks

그렇다면 non-local block은 네트워크의 어느 위치에 삽입되는것이 가장 적절할까요? 실험 결과를 살펴보면 너무 네트워크가 끝나가는 위치에 배치하는것 보다는 그보다 좀 더 앞에 배치하는 것이 더 적절한것을 확인 할 수 있습니다.
스크린샷 2018-01-15 오후 2.27.05.png

4.3 Going deeper with non-local blocks

지금까지는 non-local block을 하나씩만 삽입하였는데, 더 많이 삽입하면 어떻게될까요?
스크린샷 2018-01-15 오후 2.30.59.png
여기선 non-local block을 여러개 이용할때는 res_3와 res_4에 적절히 배치하여 구성했습니다. 결과를 보면 non-local block을 더 많이 넣을 수록 더 좋은 성능을 보여주는 경향을 띄는것을 확인할 수 있습니다. 하지만 ResNet-101의 경우에는 5개나 10개나 비슷한 성능을 보여주는 것으로 보아, 우리가 non-local block을 사용할때는 무조건 많이 넣기 보다는 사용할 적정 개수를 찾아내는 과정이 필요할 것으로 보입니다.

4.4 Non-local network vs. 3D network

지금까지 사용한 C2D 모델은 시간축으로는 제한적으로만 볼 수 있었기 때문에 사실 non-local block을 사용하면 당연히 더 좋은 성능을 낼 것이라는 것을 기대할 수 있습니다. non-local block이 이전에는 제한적으로 볼 수 밖에 없었던 시간축 정보를 볼 수 있게 해주기 때문이지요. 그렇다면 이번에는C2D에 non-local block을 적용한 모델과, 적극적으로 시간축 정보까지 살펴보는 앞서 소개한 I3D모델의 성능을 비교해 보겠습니다.
스크린샷 2018-01-15 오후 6.27.35.png
이를 살펴보면 놀랍게도 C2D 모델에 non-local block을 사용한 모델이 I3D모델에 비하여 파라미터 수, 연산량 측면에서 더 적은 자원을 요구하면서도 성능은 더 우수한 것을 확인할 수 있습니다.
마지막으로 이번에는 I3D모델에 non-local block을 적용한 결과를 살펴보도록 하겠습니다.
스크린샷 2018-01-15 오후 6.30.43.png
I3D모델에 non-local block을 적용할 경우 기존에 비해서 확연한 성능 향상을 관찰할 수 있습니다.

4.5 Overall results

이 결과를 바탕으로 2017년에 있었던 Kinetics competition의 결과와 비교를 해보면 아래와 같습니다.스크린샷 2018-01-15 오후 6.36.10.png
위 테이블에서 회색으로 표현된 3-stream 모델들이 해당 competition에서 우승한 모델들인데, 위 모델들의 경우 Non-local blocks + I3D 모델 (NL I3D)과 비교했을때, RGB값 만을 이용한 경우에는 성능이 한참 뒤쳐쪄있고, optical flow와 audio정보까지 이용해야 비로소 NL I3D모델과 비슷한 성능을 보이는 것을 확인할 수 있습니다.
그리고 끝으로 non-local block의 연산 결과를 시각화한 결과를 살펴보도록 하겠습니다.
스크린샷 2018-01-15 오후 6.36.23.png

5. Summary

이 논문에서는 non-local block이라는 상대적으로 구현하기 용이한 구조를 이용하여 기존 네트워크의 성능을 크게 향상시켰습니다. 사실 non-local block의 경우 특히나 비디오 데이터에서 좋은 성능을 보일것이라고 쉽게 예상할 수 있었습니다. 이는 비디오 데이터의 경우 특성상 시간 축 상으로 비슷한 영상들이 연속되어 배치되어있는 형태를 띄는데, non-local block은 이것들 간의 관계를 직접적으로 사용하도록 만드는 구조를 띄고 있기 때문입니다. 앞으로 비디오 데이터를 다룰때 네트워크의 성능향상을 원한다면 non-local block을 한번쯤은 사용해 보는것이 좋겠다는 생각이 듭니다.
재미있는 점은 논문에서는 비디오가 아닌 사진과 같은 2D 영상에 대하여서도 non-local block을 적용하여 성능 개선이 얼마나 이뤄질 수 있는지 실험을 해보았는데, 2D 영상에서도 non-local block을 사용하면 성능향상이 이뤄지는 것을 확인할 수 있습니다. 자세한 사항은 논문을 참고 바랍니다. 이와 더불어 이 포스트에서는 담지 못한 더 자세한 내용들이 논문에 있으니 non-local block에 흥미를 느끼신 분이나, 본인의 네트워크에 적용해보고 싶으신 분들은 한번쯤은 논문을 직접 읽어보시는 것을 추천드립니다.

Posted by:brianjaum

2 replies on “Non-local Neural Networks

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s