sequential data를 처리하려면 과거 정보를 기억해 현재 input과 조합하여 output을 도출해야 한다.
vanilla RNN에서는 과거 정보를 요약하는 hidden state를 이용해 sequential data를 처리했다. 짧은 문장의 경우 좋은 성능을 보였지만, 한번에 한 neighbor만 처리하는 RNN 특성상 문장의 길이가 길어져 고려해야할 input들의 거리가 멀어질수록 거쳐야 하는 Layer수가 증가하므로 정보의 손실이 많이 일어났다.
이러한 long range dependency를 잡는 문제는 중요한 problem이다.
LSTM은 hidden state외에도 추가로 cell state를 두어 과거 정보의 손실을 방지했다.
sequential data 처리의 Long range dependency의 주 해결책인 LSTM 역시 한번에 한 neighbor만 처리하므로 긴 문장을 위해서는 여러 Layer를 쌓아야 한다는 불편함이 있다.
image 데이터의 경우 Convolutional layer를 깊게 쌓아 receptive field를 크게 만듦으로써 long ragne dependency를 잡는것이 주 해결책이다.
이 두 방법 모두 local layer를 반복적으로 여러번 수행해 long range dependency를 해결한다고 볼 수 있는데, 이런 방식들에는 아래와 같은 한계가 존재한다.
1. 계산상 비효율적임
2. 조심스럽게 배치해야하므로 최적화 어려움
3. multi-hop dependency modeling(일정 거리 떨어진 지점에서 메시지를 주고받아야 하는)을 어렵게 만듦.
==> 새로운 방법 non-local operation 제안 !
non-local mean을 generalization한 방법이다,
non-local mean 이란?
영상처리에서 box 필터링을 진행해보자.
기존 방법은 흔히 우리가 아는 2D convolution을 이용해서 local하게 진행하는 것이다.
평균을 내주는 box filter로 2D convolution을 수행해보자.
putput 픽셀의 값은 해당 input 픽셀의 neighbor들의 평균인 것을 알 수 있다.
이미지 전체를 순회하면 ?
output 픽셀은 해당 인덱스의 픽셀 주변 픽셀들의 평균값이 되므로 위와 같이 흐려지는 결과가 나온다.
이 필터링을 진행하면 노이즈가 제거되고 이미지가 매끄러워 진다는 장점이 있지만, 이미지가 지나치게 흐려질 수 있다.
그럼 이번엔 단순히 옆에 있는 픽셀들 끼리의 평균을 구하지 말고, 비슷한 패턴을 갖는 픽셀들끼리의 평균을 구하는 non-local mean 방식을 사용해 보자.
위와 같이 빨간 점이 있을때, 단순히 빨간 점 옆의 local 픽셀들을 평균내는게 아니라 이미지를 순회하면서 p와 비슷한 특성을 갖는 q같은 점들을 찾아 평균을 내는 것이다.
차례로 원본, local, non-local이다.
확실히 blur효과 없이 noise가 제거된 것을 확인할 수 있다.
non-local operation
위에서 설명한 non-local mean을 차용한 operation 이다.
$$y_i = \frac{1}{C(\textbf{x})}\sum_{\forall j}^{}f(x_i,x_j)g(x_i)$$
f : xi와 xj의 similarity를 계산하는 함수이다. 얼마나 연관성이 있는지 scalar 값으로 나오게 된다. 논문에서는 f의 예로 Gaussian, Embedded Gaussian, dot product, Concatenation등을 제안했으며 f를 통해 similarity를 계산하는 것 자체가 중요하지 f가 어떤 함수인지는 모델 성능에 크게 관련이 없다고 한다.
g : position j 의 입력을 나타내는 단항함수이다.
C(x) : normalize factor
즉 index i 의 output y_i를 결정하기 위해서는 가능한 모든 position j의 input x_j를 고려하는데, 그 반영 비율을 x_i와 x_j의 similarity를 통해 결정한다.
non-local block
$$z_i = W_zy_i+x_i$$
yi : non-local operation의 결과
xi를 더해 residual block 구현. Wz의 값이 모두 zero일 경우 기존 pretrained model의 initial behavior를 해치지 않는다.
similarity function f로 embedded gaussian을 선택했을 때의 non-local block이다.
Embedded Gaussian
$$f(x_i,x_j)=e^{\theta (x_i)\phi (x_j)}$$
$$\theta(x_i)=W_\theta x_i, \phi(x_j)=W_\phi x_j$$
Embedded gaussian 에서 사용되는 두 weight Wθ와 W∅의 channel 수는 input channel의 1/2로 설정해 연산량을 줄인다. (bottleneck)
Wz의 channel 수는 input과 동일한 1024로 두어 output channel이 input channel과 동일한 size로 유지될 수 있게 한다.