AI바라기의 인공지능
VLM : 논문리뷰 : ViperGPT: Visual Inference via Python Execution for Reasoning 본문
VLM : 논문리뷰 : ViperGPT: Visual Inference via Python Execution for Reasoning
AI바라기 2024. 10. 12. 13:16Abstract
visual query에 대한 답변을 하는 것은 visual processing과 reasoning 모두를 요구하는 복잡한 작업입니다. 이 작업에 대한 지배적인 접근 방식인 end-to-end models는 이 둘을 명시적으로 구분하지 않아 interpretability와 generalization을 제한합니다. modular programs를 학습하는 것은 유망한 대안을 제시하지만, programs와 modules를 동시에 학습하는 데 어려움이 있어 까다로운 것으로 입증되었습니다.
본 논문에서는 code-generation models를 활용하여 vision-and-language models를 서브루틴으로 구성하여 모든 query에 대한 결과를 생성하는 프레임워크인 ViperGPT를 소개합니다. ViperGPT는 제공된 API를 사용하여 사용 가능한 modules에 접근하고, 나중에 실행될 Python code를 생성하여 이를 구성합니다. 이 간단한 접근 방식은 추가 training이 필요하지 않으며, 다양한 복잡한 visual tasks에서 state-of-the-art 결과를 달성합니다.
Introduction
그림 1 (상단)에서 각 아이가 공평하게 먹을 수 있는 머핀은 몇 개일까요? 이 질문에 답하기 위해
1) 이미지에서 아이들과 머핀을 찾고,
2) 각각의 개수를 세고,
3) '공평'이 균등한 분배를 의미한다는 것을 추론하여 나누는 과정을 거칠 수 있습니다.
사람들은 visual world를 이해하기 위해 개별적인 단계들을 자연스럽게 조합합니다.
하지만 컴퓨터 비전 분야의 지배적인 접근 방식은 여전히 end-to-end models이며, 이는 본질적으로 이러한 compositional reasoning을 활용하지 않습니다. 비록 이 분야가 object recognition 및 depth estimation과 같은 개별적인 tasks에서 큰 진전을 이루었지만, 복잡한 tasks에 대한 end-to-end 접근 방식은 neural network의 forward pass 내에서 모든 tasks를 암묵적으로 수행하는 법을 배워야 합니다. 이는 서로 다른 단계에서 기본적인 vision tasks의 발전을 활용하지 못할 뿐만 아니라, 컴퓨터가 machine learning 없이도 수학적 연산 (예: 나눗셈)을 쉽게 수행할 수 있다는 사실을 활용하지 못합니다. 머핀이나 아이의 수가 다르면 neural models가 체계적으로 일반화될 것이라고 신뢰할 수 없습니다. 또한 end-to-end models는 근본적으로 interpretable할 수 없는 결정을 생성합니다. 즉, 실패를 진단하기 위해 각 단계의 결과를 감사할 방법이 없습니다. models가 점점 더 많은 데이터와 컴퓨팅 성능을 요구하게 됨에 따라 이러한 접근 방식은 점점 더 유지하기 어려워집니다.
우리는 기존 models를 새로운 방식으로 재결합하여 추가 training 없이 새로운 tasks를 수행하고 싶습니다.
무엇이 우리가 더 복잡한 tasks를 위한 이러한 modular systems를 만드는 것을 제한할까요? 이전 연구에서 Neural Module Networks는 tasks를 더 간단한 modules로 분해하려고 시도했습니다. 서로 다른 문제에 대해 서로 다른 방식으로 재배열된 modules로 end-to-end training함으로써, 각 module이 적절한 기능을 학습하고 재사용 가능하게 되기를 바랐습니다. 그러나 여러 가지 문제로 인해 이 접근 방식을 실제 환경으로 확장하기가 어려웠습니다. 특히 program generation은 hand-tuned natural language parsers에 의존하거나, reinforcement learning을 처음부터 다시 해야 했기 때문에 최적화하기 어려웠습니다. 각 경우에서 program generation은 도메인이 매우 제한적이었습니다. 또한 perceptual models를 program generator와 함께 학습하면 training이 훨씬 더 어려워져 종종 의도한 modular structure를 생성하지 못했습니다.
이 연구에서 우리는 task를 정의하는 텍스트 쿼리에 따라 vision models를 유연하게 구성하기 위해 code generating large language models (예: GPT-3 Codex [9])을 활용하여 이러한 병목 현상을 극복하는 프레임워크인 ViperGPT를 제시합니다. ViperGPT는 이미지 또는 비디오를 인수로 받아 해당 이미지 또는 비디오에 대한 쿼리 결과를 반환하는 각 쿼리에 대한 맞춤형 programs를 생성합니다.
마치 엔지니어에게 제공하듯이 Codex에 다양한 visual capabilities (예: find, compute_depth)를 노출하는 API를 제공하는 것만으로도 이러한 programs를 만드는 데 충분하다는 것을 보여줍니다. model의 code에 대한 사전 training을 통해 이러한 함수를 사용하고 관련 logic을 구현하는 방법을 추론할 수 있습니다. 우리의 결과는 이 간단한 접근 방식이 놀라운 zero-shot 성능 (즉, task별 이미지에 대해 전혀 training하지 않고)을 제공한다는 것을 보여줍니다.
이러한 간단한 접근 방식은 다음과 같은 많은 이점을 제공합니다.
1) 모든 단계가 검사 가능한 중간 값을 가진 code 함수 호출로 명시되어 interpretable합니다.
2) 내장된 Python 논리 및 수학 연산자를 명시적으로 사용하기 때문에 logical합니다.
3) 관련 module에 대한 설명만 API에 추가하면 되므로 모든 vision 또는 language module을 쉽게 통합할 수 있어 flexible합니다.
4) tasks를 단계별로 수행되는 더 작은 하위 tasks로 분해하여 compositional합니다.
5) 사용된 modules의 개선 사항이 우리 접근 방식의 성능을 직접적으로 향상시키므로, 이 분야의 발전에 adaptable합니다. 6) 모든 새로운 task에 대해 새로운 model을 재 training (또는 finetune)할 필요가 없으므로 training-free입니다. 마지막으로
7) 모든 tasks를 하나의 시스템으로 통합하므로 general합니다.
요약하면, 우리의 contribution은 다음과 같습니다.
- 위의 이점을 가진 API 및 Python interpreter를 사용하여 code-generation models를 vision에 통합하여 복잡한 visual queries를 해결하기 위한 간단한 프레임워크를 제안합니다.
- visual grounding, image question answering 및 video question-answering tasks에서 state-of-the-art zero-shot 결과를 달성하여 이러한 interpretability가 성능을 저해하기보다는 오히려 도움이 된다는 것을 보여줍니다.
- 이러한 방향의 연구를 촉진하기 위해 visual tasks를 위한 program synthesis의 빠른 개발을 가능하게 하는 Python library를 개발하고 있으며, 이는 출판 시 open-source화될 예정입니다.
Related Work
Modular Vision.
이 연구는 복잡한 vision tasks가 근본적으로 compositional하다고 주장하고, 이를 atomic perceptual units로 나누는 것을 제안한 Neural Module Networks에서 영감을 받았습니다. 이러한 visual reasoning 절차는 다양한 연구에서 탐구되었습니다. 이후 연구들은 neuro-symbolic methods와의 연결을 통해 perception과 reasoning을 분리하여 composition에 대해 명시적으로 추론하는 데 중점을 두었습니다. 이러한 접근 방식은 우리의 접근 방식과 유사하지만, programs 형태의 값비싼 supervision이 필요하고 perception modules를 end-to-end로 training하기 때문에 다른 도메인으로 일반화할 수 없습니다.
이러한 방법을 사용하는 데 따른 실질적인 어려움으로 인해, 이 분야는 주로 end-to-end all-in-one models로 이동했습니다. 이러한 models는 현재 state-of-the-art 결과를 얻고 있으며, 4장에서 이를 비교합니다.
다른 최근 연구에서는 large pretrained models를 함께 사용하면 큰 효과를 볼 수 있음을 보여주지만, models를 결합하는 특정 방식을 직접 지정합니다.
이 프로젝트를 진행하는 동안 이 분야에 대한 관심이 급증하여 large language models (LLMs)을 사용하여 자동으로 module을 통합하는 관련 원고가 arXiv에 많이 등장했습니다. 자연어 처리 분야에서는 외부 도구를 사용하는 것을 목표로 하거나, Codex를 사용하여 structured reasoning을 수행하는 것을 목표로 했습니다. 여러 동시 연구에서 vision tasks에 대한 유사한 솔루션을 제안합니다. Visual ChatGPT는 pretrained models를 chat agent의 도구로 사용하지만, programs를 생성하지 않고 visual generation에 중점을 둡니다. VisProg은 의사 코드 명령어 목록을 생성하고 이를 'visual program'으로 해석하여 제공된 예제에서 in-context learning에 의존합니다.
이들과 달리 우리는 제한 없는 Python code를 직접 생성하는데, 이는 훨씬 더 유연하며 control flow 및 수학과 같은 더 발전된 emergent abilities를 보여줄 수 있게 해줍니다. 결정적으로 Python을 사용하면 Codex가 인터넷에서 대규모로 training하여 학습하는 강력한 사전 지식을 활용할 수 있습니다. 또한 visual understanding을 측정하는 많은 기존 벤치마크에서 평가하고 최고 성능의 zero-shot 결과를 달성합니다. 마지막으로 CodeVQA [51]와 달리 ViperGPT는 in-context examples 없이 작동할 수 있습니다.
Interpretability
vision에서 복잡한 쿼리에 대한 interpretability 분야는 광범위합니다. 많은 접근 방식이 GradCAM과 같은 pixel importance 형태로 설명을 제공하며, 일부는 텍스트 설명도 제공합니다. 이러한 설명은 종종 구성에 의한 것이 아니라 사후 설명이며, image crops 및 텍스트를 포함한 단계별 추론을 제공하지 않습니다. 캡션에서 Hard attention 은 우리의 find module과 유사하게 중간 image crops와 관련하여 유사한 목표를 목표로 하지만, learning algorithms에 통합하기 어려운 것으로 입증되었습니다. 전체 개요는 He et al. 를 참조하십시오.
Pretrained models
ViperGPT에서 사용하는 perception 및 외부 지식 modules는 object detection을 위한 GLIP , text-image similarity를 위한 X-VLM [(attribute detection 에서 CLIP 를 능가하기 때문에), depth estimation을 위한 MiDaS , 외부 지식을 위한 GPT-3 , 간단한 visual queries를 위한 BLIP-2 입니다.
Method
visual input x와 그 내용에 대한 textual query q가 주어지면, 먼저 query가 주어진 program generator π를 사용하여 program z = π(q)를 synthesize합니다. 그런 다음 execution engine r = ϕ(x, z)를 적용하여 input x에서 program z를 실행하고 result r을 생성합니다. 이 프레임워크는 flexible하여 image 또는 video를 input x로, question 또는 description을 query q로, 모든 유형 (예: text 또는 image crops)을 output r로 지원합니다.
이전 연구에서는 syntax trees 또는 dependency graphs와 같은 graphs로 programs를 나타내지만, Python code를 통해 직접 programs의 클래스 z ∈ Z를 나타내어 programs가 최신 프로그래밍 언어에서 제공하는 표현력과 기능을 활용할 수 있도록 합니다.
3.1. Program Generation
Johnson et al. 및 이 방향의 다른 연구들은 일반적으로 query에서 programs를 추정하기 위해 supervised 또는 reinforcement learning으로 학습된 neural network를 사용하여 π를 구현합니다. 그러나 이러한 접근 방식은
a) programs 형태의 supervision을 대규모로 수집할 수 없거나
b) computational graph를 찾는 데 필요한 최적화가 엄청나기 때문에 실제 환경에 적용할 수 없었습니다.
이 접근 방식에서는 vision 및 language modules를 함께 구성하는 program generator π를 인스턴스화하기 위해 code generation을 위한 LLMs를 활용합니다. LLMs는 tokenized code sequence (“prompt”)를 input으로 받아 autoregressively하게 후속 token을 예측합니다. code generation tasks에서 놀라운 성공을 보여준 Codex 를 사용합니다.
π의 최적화를 LLM으로 대체하기 때문에, 이 접근 방식은 program generation을 위한 task별 training이 필요하지 않습니다. Codex를 program generator로 사용하고 Python에서 직접 code를 생성하면 Python code가 풍부한 인터넷에서 대규모로 training한 결과를 활용할 수 있습니다.
이러한 방식으로 LLMs를 활용하려면 필요에 따라 이러한 modules를 구성하고 호출하는 programs z를 샘플링하는 prompt를 정의해야 합니다. prompt는 다음 섹션에서 자세히 설명하는 application programming interface (API)로 구성되며, 이는 input context의 일부로 LLM에 제공됩니다. LLM에 대한 최종 input은 API specification 다음에 고려 중인 샘플에 대한 query로 구성된 code text sequence입니다. 예상 output은 string으로 된 Python 함수 정의이며, 이를 compile하고 실행합니다.
3.2. Modules and Their API
부록에 포함된 prompt는 object detection, depth estimation 또는 language model 쿼리와 같은 다양한 perceptual 및 knowledge modules에 대한 API를 제공합니다. 이 prompt에서 LLMs가 query q에서 올바른 programs z를 유도할 수 있음을 발견했습니다.
제공하는 API는 image patch를 나타내는 ImagePatch와 video segment를 나타내는 VideoSegment라는 두 개의 global classes를 정의합니다. 각 module은 class method로 구현되며, 내부적으로 pretrained model을 호출하여 결과를 계산합니다. 예를 들어, ImagePatch의 compute_depth method는 image patch에 있는 픽셀의 중앙값 (상대적) 깊이 추정치를 반환합니다. 이는 MiDaS 와 같은 최첨단 대규모 models를 사용하여 구현합니다. 사용된 modules에 대한 자세한 내용은 4장에서 제공합니다.
API는 정의하는 각 method에 대한 input 및 output 유형과 자연어로 이러한 함수의 목적을 설명하는 docstring을 지정합니다. 대부분의 API와 마찬가지로 in-context learning 과 유사하게 query-code 쌍 형태로 지정된 이러한 classes와 함수를 사용하는 방법을 보여주는 예제도 제공합니다.
Codex에 대한 input에는 API의 전체 구현이 포함되어 있지 않습니다. 대신 함수 signature 및 docstring을 포함한 API에 대한 specification이 제공됩니다. 구현 세부 정보를 추상화하면 두 가지 이유로 유익합니다. 첫째, LLM context window의 크기가 제한되어 전체 구현을 포함하는 것이 불가능합니다. 또한 추상화를 통해 module 구현에 대한 변경 사항과 관계없이 code generation이 이루어집니다.
end-to-end perception modules는 올바른 위치에서 사용하면 탁월하며 ViperGPT는 이에 크게 의존합니다. 인지 과학의 dual-system models 와 유사하게 생성된 programs (System 2 - 분석)은 여러 단계의 추론이 필요한 tasks를 end-to-end perception modules (System 1 - 패턴 인식)이 가장 효과적인 접근 방식인 더 간단한 구성 요소로 분해하는 데 사용해야 한다고 주장합니다. end-to-end modules를 programs로 구성함으로써 ViperGPT는 deep learning에 sequential processing의 System 2 기능을 제공합니다.
3.3. Program Execution
실행 시간에 생성된 program z는 image 또는 video를 input으로 받아 LLM에 제공된 query에 해당하는 result r을 출력합니다. 이 program을 실행하기 위해 이전 연구 (예: [28])는 neural module network로 execution engine ϕ를 학습하여 neural network로 구현된 다양한 modules를 구성합니다. modules는 find와 같은 perceptual functions뿐만 아니라 compare와 같은 logical functions도 담당합니다. 모든 neural modules를 동시에 end-to-end로 학습하는데, 이는 체계적인 일반화를 가능하게 하지 못하고 modules가 의도된 tasks에 충실하지 않아 model의 interpretability를 손상시킵니다.
large pretrained models로 구현된 modules와 함께 Python interpreter를 사용하여 간단하고 성능이 뛰어난 대안을 제공합니다. Python interpreter는 logical operations을 가능하게 하는 반면 pretrained models는 perceptual operations을 가능하게 합니다. 이 접근 방식은 구성에 따라 faithfulness를 보장합니다.
program은 Python interpreter를 사용하여 실행됩니다. 따라서 실행은 간단한 Python 호출입니다. 즉, sort와 같은 모든 내장 Python 함수, for 또는 if/else와 같은 control flow 도구, datetime 또는 math와 같은 modules를 활용할 수 있습니다. 특히 이전 접근 방식 과 달리 custom interpreter가 필요하지 않습니다. 완전한 Python 구현의 또 다른 이점은 PyTorch JIT 와 같은 광범위한 기존 도구와의 호환성입니다.
구현에서 생성된 batch의 각 program은 multiprocessing을 사용하여 동시에 실행됩니다. producer-consumer design 은 효율적인 GPU batching을 가능하게 하여 memory 및 computation 비용을 절감합니다. code는 viper.cs.columbia.edu/에서 제공됩니다.
요약본 올립니다.
1. 연구 목적
- 연구 목적: 연구의 목적은 시각적 처리와 논리적 추론을 결합하여 복잡한 시각적 질문에 답할 수 있는 시스템을 개발하는 것입니다. ViperGPT는 Python 코드 생성을 통해 시각 및 언어 모델을 결합한 프로그램을 만들어 이를 실행함으로써, 새로운 과제를 추가 학습 없이 해결하는 프레임워크를 제시합니다.
2. 학문적 및 산업적 기여
- 학문적 기여: ViperGPT는 기존의 엔드-투-엔드 시각 모델이 가지는 해석 불가능성과 일반화 한계를 극복하며, 모듈을 조합해 새로운 문제에 유연하게 대응할 수 있는 방법을 제시하여 시각 처리 및 추론 분야의 발전에 기여합니다.
- 산업적 기여: 학습 없이 복잡한 시각적 과제를 처리할 수 있는 기술로, 다양한 응용 프로그램에서 비용 절감과 효율성을 높일 수 있습니다. 특히 컴퓨터 비전 기반 자동화 시스템의 개발에 유용할 수 있습니다.
3. 사용된 방법론
- 모듈 조합: 기존에 학습된 시각 및 언어 모델을 API로 노출하여 Python 코드를 생성, 실행해 모듈을 조합합니다.
- 코드 생성 모델: GPT-3 Codex를 사용하여 시각적 질문을 해결할 Python 코드를 생성합니다.
- 모듈 실행: 생성된 Python 코드를 실행해 입력 이미지를 분석하고 결과를 도출합니다.
- 제로샷 학습: 추가 학습 없이 다양한 시각적 질문에 대한 성능을 평가합니다.
4. 연구의 독창성
- 코드 생성을 통한 시각적 추론: 시각적 질문을 Python 코드로 변환해 해결하는 독창적인 접근을 제시.
- 학습 없이 새로운 과제 해결: 기존의 모델 학습 없이 모듈의 조합을 통해 복잡한 문제 해결.
- 프로그램의 해석 가능성: 모든 처리 과정을 Python 코드로 명시해 중간 값을 확인하고 분석할 수 있는 투명성 제공.
3줄 요약
전문가 모듈을 위한 코드 생성 (디텍션, 깊이추정, 외부지식, 간단한 쿼리 등)
생성된 코드를 통해 한줄씩 필요한 모듈을 사용해서 실제 데이터 처리
결과 도출