Deformable DETR 정리

Plato·2024년 3월 26일
0

딥러닝

목록 보기
20/21

이 논문을 선택한 이유

  • 물체의 종류와 상태 그리고 물체 간의 관계를 파악하고 기억할 수 있는 지각 모듈을 개발하고 싶기 때문.
    • 이러한 지각 모듈이 있다면, 오랫동안 수행해야 하는 작업에 대한 계획을 수립할 때 유용할 것.
    • 이 모듈은, 일차적으로 현재 이미지에서 인식된 물체가 이전에 인식된 물체인지 아니면 새로운 물체인지 파악할 수 있어야 한다. 이를 다루기에 앞서 객체를 end to end로 인식하는 방법을 공부하고자 한다.

풀어내는 문제

  • NMS (Non Maximum Suppression)와 같은 후처리 작업이 필요하지 않은, end to end 물체 인식
    • 물체의 경계를 나타내는 경계 상자와 물체의 종류를 출력으로 갖는다
      • 경계 상자는 (x중앙,y중앙,가로,세로)(x_{중앙}, y_{중앙}, 가로, 세로)로 나타낸다.

용어

  • 패치/토큰
    • DETR과 Deformable DETR은 CNN을 백본 네트워크로 갖는다. CNN의 출력 텐서의 한 "픽셀"을 토큰 혹은 패치라 부른다. 만약 출력 텐서의 차원이 (채널, 세로, 가로)(\text{채널, 세로, 가로})라면, 차원이 채널인 토큰이 세로가로세로 * 가로 만큼 존재하게 된다.

모델 구조

  • DETR과 동일하게 인코더와 디코더를 갖는 트랜스포머.
  • 디코더의 self attention, 인코더의 self attention 그리고 디코더의 cross attention으로 나눠 정리하겠다.
  • Deformable DETR 디코더의 self attention은 DETR 디코더의 self attention 계층과 동일하다.
  • 인코더의 self attention은 아래와 같다.
    • 한 개의 토큰이 다른 모든 토큰에 attend 하지 않고 N개의 토큰에만 attend 한다.
    • attend할 토큰을 선택하고 가중치를 정하기 위해 쿼리 벡터가 입력이고, (xoffset,yoffset,attention 가중치)(x_{\text{offset}}, y_{\text{offset}}, \text{attention 가중치})가 출력인 완전 연결 계층을 사용한다.
      • 실수 xoffset,yoffsetx_{\text{offset}}, y_{\text{offset}}은 attend 할 패치의 좌표를 나타낸다. 구체적으로 attend할 패치의 좌표는 쿼리 패치의 좌표에 위의 offset을 더한 것이 된다.
      • 패치의 수는 이산적인데 반해, xoffset,yoffsetx_{\text{offset}}, y_{\text{offset}}은 연속적인 실수이다. 실수를 좌표로 갖는 패치는 없기 때문에, 이중선형 보간법을 사용해 실수 좌표에 대응되는 밸류 벡터를 계산한다.
        • 수식: (px,py) where px,pyR(p_x,p_y) \text{ where } p_x,p_y\in \mathbb{R}가 attend할 토큰의 좌표라 하자. 그러면 좌표 (px,py)(p_x,p_y)에 대응되는 밸류 벡터 값은 다음과 같다.
          • vpx,py=qg(qx,px)g(qy,py)vqx,qyv_{p_x,p_y}=\sum_q g(q_x,p_x)*g(q_y,p_y)*v_{q_x,q_y}
            • g(x1,x2)=max(0,1x1x2)g(x_1,x_2) = max(0, 1-|x_1-x_2|)
            • qx,qyq_x, q_y는 정수. 즉 실제로 존재하는 패치의 좌표.
            • vqx,qyv_{q_x,q_y}는 좌표 qx,qyq_x, q_y에 대응되는 밸류 벡터 값.
        • 굳이 이중선형 보간법을 사용하면서까지 xoffset,yoffsetx_{\text{offset}}, y_{\text{offset}}을 실수로 두는 이유:
          • 이 두 값이 이산적이면 미분 불가능하기 때문이다. 다만 이는 이론적인 내용이고, sparse MoE 에서는 이산적으로 전문가 네트워크를 선택해도 학습에 문제가 발생하지 않았음을 고려하면, 꼭 위의 두 offset을 실수로 둬야 하는지 의문이다.
    • attention 가중치
      • 키 벡터를 전혀 고려하지 않고 쿼리 벡터만 고려하여 attention 가중치를 계산한다.
      • 기존의 attention은 key 값을 고려하여 얼마나 attend 할지 정한다. 하지만 Deformable DETR은 attend할 패치의 내용에 대한 고려없이 가중치를 계산하는 특이한 구조.
        • 이미지의 경우, 쿼리 벡터만 고려해도 어디쯤 얼마만큼 attend 할지 정할 수 있다는 게 직관적으로 와닿기는 한다. 예시로 오른쪽을 바라보는 개의 머리가 한 이미지 패치에 위치해 있다고 가정하자. 이 패치를 선형 변환하여 query 벡터를 계산한 뒤, 어디에 attend 할지 정하는 것은 충분히 가능할 것으로 보인다. 개의 머리 크기를 고려하여, 몸통과 다리가 얼마나 클지 짐작할 수 있고 오른쪽을 바라보고 있으니 몸통은 아래 왼쪽에 위치할 것이라 짐작할 수 있다.
        • 다만 비디오의 객체를 인식하기 위해 위의 방법을 사용하면 문제가 생길 수도 있다.
          • 물론 최근 이미지에서 인식한 객체를 현재 이미지에서 다시 인식할 때에는 위 방법이 문제가 될 거라 믿기 어렵다.
            • 이유: 비디오는 "연속적"이기에, 현재 이미지에서 인식한 객체와 동일한 객체는 최근 이미지에서 서로 비슷한 위치에 있을 것이라 기대할 수 있다. 이런 편향을 학습할 수 있다면 최근 이미지의 어느 패치에 얼마만큼 attend 할지 충분히 정할 수 있을 것이다.
          • 하지만 10분 15분 전에 인식했던 객체를 현재 이미지에서 다시 인식할 때, 위의 편향은 전혀 쓸모없다. 쓸모있는 편향이 무엇일지 짐작조차 되지 않는다. 그렇기에 attend 할 토큰의 내용을 고려하여 attention weight를 정하는 것이 합리적일 것이다.
  • 디코더의 cross attention
    • 다른 부분은 인코더의 self attention과 동일한데, 쿼리 패치의 좌표를 계산하는 방법이 다르다.
      • 이유: 인코더의 쿼리 패치의 좌표는 직관적이다. 입력 텐서에서의 좌표를 파악하면 되기 때문이다. 하지만 디코더 쿼리 패치의 좌표를 이렇게 파악할 수 없다.
      • 방법: 쿼리 토큰이 입력이고 쿼리 패치의 좌표가 출력인 완전 연결 계층을 사용한다.
        • 쿼리 패치의 좌표는 0좌표10 \leq \text{좌표} \leq 1로 로지스틱 함수를 통해 normalize 시킨다.
  • Multi-scale deformable attention
    • 바닐라 DETR은 각 토큰이 모든 토큰에 attend 하므로 토큰의 수가 증가함에 따라 요구 연산량이 급격하게 증가함에 주목하자. 여러 scale의 feature map을 사용하면 토큰의 수가 증가하기에, multi-scale attention이 비효율적이다. 하지만 Deformable DETR은 모든 토큰에 attend 하지 않기에 여러 scale의 feature map에 attend 하기 용이하다.
    • Deformable DETR의 한 쿼리 토큰은, 한 scale feature map의 N 개 토큰에 attend 한다. 그렇기에 연산량은 scale feature map 수에 대해 선형적으로 증가함.

0개의 댓글