이번 논문은 로봇 작업을 위한 정책 코드를 생성하는 방법론으로 최근 로보틱스 분야가 LLM과 함께 왜 각광 받는지를 보여주는 연구 내용으로 이해하시면 좋을 것 같습니다.
Intro
로봇이 자연어를 사용하기 위해서는 언어를 물리적 세계와 연계하고 단어, 인지 및 행동 사이의 연결을 구축할 수 있어야 합니다. 기존의 방법들은 어휘 분석을 통해 정책을 안내하는 의미 표현을 추출하여 언어를 기반으로 하는 경우가 많았지만, 이러한 방법들은 새로운 명령을 처리하는 데 어려움을 겪었습니다. 더 최근의 방법들은 언어에서 행동으로의 종단 간 학습을 시도하고 있지만, 이러한 접근법은 실제 로봇에서 데이터를 수집하는 데 많은 비용이 소요됩니다.
한편, 자연어 처리 분야의 최근 발전은 인터넷 규모의 데이터로 사전 학습된 대규모 언어 모델(LLMs)이 추가적인 모델 미세 조정 없이도 자연어 명령으로부터 일련의 단계를 계획하는 능력을 갖추고 있음을 보여줍니다. 이러한 단계들은 모방 학습 또는 강화 학습으로 사전 학습된 정책들로부터 실제 로봇의 행동 가능성(affordances)에 기반하여 구체화될 수 있습니다. 그러나 이러한 추상화는 LLM이 인지-행동 피드백 루프에 직접적으로 영향을 미치지 못하게 하며, 언어를 다양한 피드백 모드에 일반화하는 것, 상식적인 제어를 표현하는 것, 공간 관계를 이해하는 것 등의 어려움을 발생시킵니다. 결과적으로 새로운 기술을 통합할 때마다 추가적인 데이터와 재학습이 필요하게 되며, 데이터 부담이 여전히 존재하게 됩니다.
이에 따라 저자는 LLM이 단순히 기술의 시퀀스를 계획하는 것을 넘어, 더 복잡한 정책 논리와 제어를 조정할 수 있는지에 대한 가능성을 탐구하게 됩니다. 해당 기법에서는 코드 작성이 가능한 LLM이 자연어 명령에 따라 로봇 정책 코드를 작성하고, 이를 통해 로봇의 행동을 제어할 수 있음을 보입니다. 이러한 정책 코드는 perception outputs (e.g. OVOD)를 처리하고, control primitive를 매개변수화하며, 정의되지 않은 기능을 재귀적으로 생성하여 새로운 정책 코드를 작성하는 등 다양한 기능을 수행할 수 있습니다 (fig 1에서 볼 수 있음). 이를 통해 새로운 명령어에 대한 일반화와 공간-기하학적 추론, 행동 상식을 기반으로 한 정확한 값을 지정할 수 있습니다.
구체적인 예시를 들자면 사전에 #명령어와 이에 대응되는 정책 코드들을 제시(via few-shot prompting, in gray)하고 LLMs은 새로운 명령어(in green)를 주면, 알아서 API를 재구성하여 정책 코드를 생성 (파란색 highlight)하게 됩니다.
더 나아가, 코드 작성 모델은 언어에 기반한 피드백 루프 뿐만 아니라 다양한 산술 연산을 표현할 수 있습니다. 새로운 명령어로 일반화할 뿐만 아니라 수십억 줄의 코드와 주석으로 학습되어 문맥에 따라 모호한 설명(“더 빠르게”, “왼쪽으로”)에 정확한 값(예: 속도)을 지정하여 행동 상식을 이끌어낼 수도 있습니다.
또한 “say(text)”를 사용하여 human-robot dialogue and Q&A 기능 등을 쉽게 사용 가능하여 LLM의 여러 장점을 그대로 이어받을 수 있습니다.
이 논문은 Code as Policies (CaP)라는 실제 세계에서 작동 가능한 로봇 중심의 language model generated programs (LMPs) 생성 방식을 제안하며, 이 접근법이 로봇이 언어 명령을 해석하고, 정책 코드를 생성하며, 다양한 로봇 시스템에서 실제로 실행될 수 있음을 보여줍니다. 또한, 계층적 코드 생성 방법을 통해 더 복잡한 코드를 작성할 수 있으며, 이는 HumanEval 벤치마크에서의 성능을 향상시키는 데 기여함을 증명합니다.
+ 이전 방법론과 차이점은 아래 예시와 같습니다. 이전 기법들은 언어 명령을 LLM에 전달해 계획을 수립하거나, 사전 정의된 로봇 정책 코드를 사용합니다. 허나, 해당 기법은 low-level의 정책 코드까지 LLM이 직접 생성 가능함을 보여주는 점에서 차이를 가집니다.
++ 요약해서 정리하면, 언어 명령과 시각 인지 정보를 가지고 추가 학습 없이 LLM으로부터 로봇을 움직이게 하는 액션 정책 코드를 계층적으로 low-level 까지 가능함을 보인 연구로 해석하시면 됩니다. 또한 시뮬레이터를 통해 실험이 가능한 벤치마크를 제시하고 실제 여러 로봇 환경에서 동작 가능함을 보입니다.
Method
해당 섹션에서는 사전 학습된 LLMs으로부터 LMP로서 code as polices의 프롬프트될 수 있는 정도를 특성화합니다. LMP는 언어 모델에 의해 생성되고 시스템에 의해 실행되는 모든 프로그램들을 지칭하는데에 사용됩니다. CoP에서는 언어 지시에 따른 LMP를 i) 시각 인지 혹은 기타 센서의 인지, ii) control primitive APIs, iii) 직접 로봇에서 컴파일 되고 실행되는 결과로 나눠집니다. 예시는 다음과 같습니다.
입력 명령어 (green)는 사용자 혹은 또 다른 LMP로부터 제공 받습니다. LLM이 예측한 결과물(파란 하이라이팅)은 자동 회귀 방식으로 생성된 파이썬 코드입니다. 해당 예시의 LMP는 객체 감지 결과를 처리하거나 궤적을 생성하거나 sequence control primitives를 생성할 수 있는 다양한 하위 프로그램을 생성하는 또다른 LMP들이 생성된 결과입니다.
LMP는 known functions(예: 인식 모듈을 사용하는 get_obj_names()와 같은)를 조합하거나 다른 LMP를 호출하여 undefined functions를 정의함으로써 계층적으로 생성할 수 있습니다.
여기서 put_first_on_second()는 기존에 존재했던 open vocabulary pick and place primitive (e.g. CLIPort) 입니다. 이와 같이 계층적인 구조를 가진 코드 생성 기법은 CoT (Chain of Thought)의 변형으로 볼 수 있습니다. 이러한 방식은 시간에 따라 새로운 정책 코드들을 적응적으로 누적 시킬 수 있으며, 더 나아가 이전에 구성된 기능을 참조하여 보다 넓은 정책 논리로 확장 가능합니다.
LMP를 실행하기 위해서는 두 가지 단계를 수행합니다.
i) 안전성 검사. 먼저, 코드에 ‘import’ 문이 있는지 확인합니다. 이는 외부 라이브러리를 임의로 불러와서 예기치 못한 동작을 방지하기 위함 입니다. 또한, 특별한 변수 (e.g. ‘__’로 시작하는 변수)나 ‘exec’, ‘eval’과 같은 함수 호출이 포함되어 있는지 확인합니다. 이들은 코드 내에서 잠재적으로 위험한 동작을 수행할 수 있는 요소들이기 때문에, 이러한 요소들이 없음을 확인합니다.
ii) 코드 실행. 안정성 검사가 끝난 후, LMP 코드를 실제로 실행하기 위해 python의 ‘exec’ 함수를 사용하여 코드를 실행합니다. 이때, 두 개의 dictionary 인자를 제공합니다. – globals: 코드 실행 중에 호출 될 수 있는 모든 API가 포함됩니다. 예를 들어, 로봇의 제어 프리미티브 함수나 데이터 처리 함수등이 포함됩니다. – locals: 처음에는 빈 사전으로 전달됩니다. ‘exec’ 함수가 실행되는 동안 코들 실행 중에 정듸된 변수나 새로운 함수들로 채워지게 됩니다.
만약 LMP가 실행된 후 결과 값을 반환해야 한다면, 해당 값은 ‘locals’에 있는 values로부터 가져옵니다.
A. Prompting Language Model Programs
LMP 생성 프로픔트는 2가지 요소를 가집니다.
1. Hints. LLM이 사용할 수 있는 API와 그 사용 방법을 나타내는 타입 힌트를 포함합니다. 예를 들어, import numpy as np
와 같은 코드로 LLM이 특정 라이브러리를 사용할 수 있도록 안내합니다.
2. Examples. 프롬프트의 또 다른 요소로, 자연어 명령을 코드로 변환하는 예시가 포함됩니다. 예를 들어, “빈 그릇에 블록을 쌓으시오”라는 명령은 다음과 같은 코드로 변환될 수 있습니다. 이러한 instruction-to-code는 few-shot으로 주석으로 작성되어 제공되어 집니다.
B. Example Language Model Programs (Low-Level)
해당 섹션에서는 low-level의 코드를 생성하는 방법에 대해서 설명합니다. 해당 논문의 모든 실험은 OpenAI Codex code-davinci-002 with temperature 0로 진행됨 (현재 지원 종료)
먼저 해당 섹션에 대한 이해를 위해 가장 간단한 예시를 보면 먼저, 파이썬으로 작성된 Hint인 instruction-to-code (gray) 시작하는 것을 볼 수 있습니다. 여기서는 ret_val이라는 변수에 할당된 반환 값의 형식을 지정하는 하나의 예시를 줍니다. 여기서 Input instructions (green), generated output (blue highlighting)입니다.
Third-party libraries. Python code-writing LLMs는 유명한 라이브러리에 대한 지식들을 저장하고 있습니다. 이러한 점을 이용해 LMP는 예시 없이 복잡한 명령을 수행하도록 요청 가능합니다.
여기서는 import로 numpy에 대한 Hints를 주어 특정 좌표로 공간 추론을 유도하는 방법에 대한 예시를 제시합니다.
First-party libraries. LMP는 함수에 의미있는 이름이 있고 Hint/example가 제공되는 경우에는 학습 데이터에 없는 first-party 라이브러리 (perception or control primitive APIs ~ e.g. 최신 기법)를 알아서 사용 가능합니다.
Hints는 두 가지 함수를 가져옵니다. 하나는 이름으로 물체의 2D 위치를 구하는 함수(get_pos(); OVOD)이고 다른 하나는 물체 이름 또는 2D 위치가 될 수 있는 두 번째 목표에 첫 번째 물체를 배치하는 함수(put_first_on_second())입니다. 첫 번째는 “a bit,”을 사용하여 이동 크기를 수정하고, 두 번째는 물체를 “the same color”과 연관시키는 등 새로운 명령에 적응하는 LMP의 결과에 보시면 됩니다.
Language reasoning. Language reasoning은 LLM을 사용하여 객체 이름을 natural language descriptions (“sea-colored block”), categories (“bowls”) 또는 과거 문맥(“other block”)과 연관시키는 등 몇 번의 프롬프트를 통해 수행할 수 있습니다.
C. Example Language Model Programs (High-Level)
Control flows. 프로그래밍 언어에서 사용하는 if-else, for-loops, while-loop와 같이 제어 구조를 통해 복잡한 작업을 정의할 수 있습니다. 예를 들어, 예시에서는 while 루프를 사용하여 피드백 정책을 구현한 결과를 보여줍니다.
LMPs can be composed. LMP는 여러 작업을 조합하여 복잡한 작업을 수행할 수 있습니다. 예를 들어, 두 개의 개별 작업을 결합하여 더 복잡한 작업을 수행할 수 있습니다. 해당 예시에서는 또다른 LMP인 parse_obj를 호출합니다.
parse_obj LMP
LMPs can hierarchically generate functions. LMP는 계층적으로 함수를 생성하여 복잡한 작업을 단계별로 수행할 수 있습니다. Function generation은 생성된 코드를 분석하여 아직 정의되지 않은 함수를 찾고, 함수 생성에 특화된 LMP를 호출하여 해당 함수를 생성하는 방식으로 구현됩니다.
여기서 get_obj_bbox_area는 제공되는 API가 아닙니다. 함수 생성이 필요합니다.
위 hints에서 get_obj_bbox_xyxy에 대한 예시가 명확하지 않더라도 함수의이름으로부터 추론을 통해 올바른 함수 생성이 가능함을 보입니다.
Combining control flows, LMP composition, and hierarchical function generation. LMP는 제어 흐름, 조합 및 계층적 함수 생성을 결합하여 매우 복잡한 작업을 수행할 수 있습니다. 이러한 방법을 통해 LMP는 복잡한 로봇 작업을 유연하고 효율적으로 처리할 수 있습니다. 다음 예시에서는 테이블 조작 영역에서의 작업을 수행할 수 있는 방법을 보여줍니다. high-level LMP는 상위 수준 정책 동작을 생성하고 다음과 같이 언어 설명에 따라 객체 이름을 가져오기 위해 parse_obj를 사용합니다.
그런 다음 parse_obj는 get_objs_bigger_than_area_th(아직 정의되지 않은 함수)를 사용하여 쿼리를 완료합니다. 이 함수는 parse_obj 프롬프트의 힌트에서 import 문을 통해 제공되지만 구현되지는 않습니다. hierarchical function generation은 위에서 설명한 대로 이 함수를 생성합니다.
+ 해당 내용은 Appendix A에 해당 합니다.
D. Language Model Programs as Policies
로봇 정책의 맥락에서 LMP는 자연어 명령을 기반으로 인지에서 제어까지의 피드백 논리를 구성할 수 있습니다. 여기서 인지 모델 (state)은 프로그래밍 방식으로 조작되어 low-level control APIs의 매개변수 (action)를 결정하는데에 사용됩니다. 사용 가능한 인지 및 제어 API에 대한 사전 정보는 Hints와 Examples로부터 정보를 취득 할 수 있습니다.
LMP 기반 정책의 이점은 다음 3가지로 요약됩니다. i) 이전에 보지 못한 자연어 명령에따라 정책 코드와 매개변수를 새로운 작업과 행동에 맞게 적응 가능. ii) 시각 인지 모델 (OVOD)을 활용해 새로운 객체와 환경에 일반화 가능. iii) 추가적인 데이터 수집이나 모델 훈련이 필요 없음. LLM으로 생성된 계획과 정책은 코드로 표현되기 때문에 해석 가능하며, 쉽게 수정하고 재사용 할 수 있습니다.
+ 해당 섹션은 큰 그림에서 어떻게 활용 가능한지를 설명한 섹션 정도로… 받아들이면 될 것 같아요.
Experiments
실험의 목표는 세 가지입니다. (i) hierarchical code generation. 다양한 언어 모델의 영향을 평가하고 일반화 정도를 분석하며, (ii) 시뮬레이션에서의 language-instructed manipulation tasks의 베이스라인과 CaP 비교하고, (iii) 다양한 로봇 시스템에서 CaP를 시연하여 유연성과 사용 편의성을 보여주기 위한 것입니다.
A. Hierarchical LMPs on Code-Generation Benchmarks
먼저, 저자는 코드 생성 능력을 분석하기 위해서 2가지 코드 생성 벤치마크 i) a robotics-themed RoboCodeGen와 ii) HumanEval에서 평가를 진행합니다.
RoboCodeGen: 저자가 새롭게 제안하는 벤치마크로 37 가지 함수 생성 벤치마크입니다. 특징은 다음과 같습니다. (i) 로봇을 위한 공간 추론에 대한 질의로 구성. (ii) third-party libraries 사용 권장. (iii) 함수 헤더에 명시적인 유형 힌트가 없음. (iv) 정의되지 않은 함수 사용 가능.
실험 결과인 tab 1을 통해 계층적 구조의 정책 코드 생성 기법이 더 나은 개선 보여줍니다.
HumanEval.은 계층적 구조의 정책 코드 생성 기법이 일반적인 코드 생성 능력에도 개선을 보여줌을 보이는 결과 (tab 2) 입니다.
B. CaP: Drawing Shapes via Generated Waypoints
해당 실험에서는 실제 UR5e robot arm이 2d waypoints에 따라 그림을 그리는 실험을 보여줍니다. Fig 2-c에 해당하며, 해당 기법이 제시하는 코드 생성 기법이 실제 로봇에서도 작동함을 보여줍니다. 자세한 결과는 영상으로 확인하시길 권장 드립니다.
C. CaP: Pick & Place Policies for Table-Top Manipulation
table-top manipulation domain tasks로 UR5e robot arm으로 테이블 위 다양한 플라스틱 장난감을 pick and places에 대한 성공 여부를 실험한 결과로, suction gripper와 Intel Realsense D435를 활용합니다. perception APIs로 MDETR를 이용합니다. fig 2-a-b에 해당하며, 명시적이지 않은 자연어 명령과 상대적인 기하학적인 명령에도 잘 작동하는 결과를 보여줍니다.
D. CaP: Table-Top Manipulation Simulation Evaluations
해당 실험에서는 기존 시뮬레이터 기반의 table-top manipulation environment에서의 베이스라인과 비교 실험 (50회 작업 성공률)으로 tab 3에 해당합니다. 여기서는 task를 instructions (I)과 attributes (A)로 나누고 “seen” (SI, SA)과 “unseen” (UI, UA)로 구분하여 평가를 진행합니다. 여기서 “seen”은 학습이 가능하거나 프롬프트로 제시할 수 있음을 의미합니다. 또 각 task는 여러 단계의 추론이 필요한 “long-horizon” (e.g. “put the blocks in matching bowls”)과 공간-기학적인 능력을 평가하기 위한 “Spatial-Geometric” (e.g., “place the blocks in a diagonal line”)로 구분하여 실험을 진행합니다. 실험 결과, CaP이 “unseen”에서는 압도적인 능력을 보여주고 있으며, “seen”에서 조차 여러 단계의 추론이 필요한 “long-horizon”에서는 높은 격차를 보여주며, “Spatial-Geometric”에서도 유사한 결과를 보여줍니다.