로봇에서 Reward 설계하기
로봇은 보상을 그대로 믿는다
강화학습에서 보상은 로봇에게 주는 점수다. 그런데 이 점수는 단순한 숫자가 아니다. 로봇에게는 거의 유일한 힌트다. 개발자는 마음속으로 "컵을 조심스럽게 집어서 떨어뜨리지 말고 목표 위치에 놓아라"라고 생각하지만, 강화학습 에이전트가 실제로 보는 것은 상태, 행동, 다음 상태, 그리고 보상 숫자뿐이다.
그래서 보상 설계는 로봇 강화학습의 성격을 결정한다. 보상이 목표에 가까워지는 행동을 칭찬하면 로봇은 목표를 향해 움직인다. 보상이 충돌을 강하게 벌하면 로봇은 조심스럽게 움직인다. 보상이 빠른 성공만 지나치게 칭찬하면 로봇은 거칠게 움직일 수 있다. 보상이 애매하면 로봇은 애매하게 배운다.
문제는 로봇이 사람처럼 의도를 읽어 주지 않는다는 점이다. 로봇은 "아, 개발자가 이렇게 말했지만 사실은 안전하게 하라는 뜻이겠지"라고 해석하지 않는다. 주어진 보상을 최대화하는 방향으로 행동할 뿐이다. 만약 컵에 가까워질수록 보상을 주면서 충돌 벌점을 거의 주지 않았다면, 로봇은 컵을 향해 빠르게 돌진하는 정책을 배울 수도 있다. 목표에는 가까워졌으니 점수는 받았기 때문이다.
이것이 보상 설계의 핵심이다.
보상은 우리가 원하는 행동을 숫자로 번역하는 작업이다. 이 번역이 부정확하면 로봇은 우리가 원한 작업이 아니라, 점수를 얻기 쉬운 행동을 배운다. 마치 시험 문제를 잘못 내면 학생이 실력을 키우기보다 출제 허점을 찾는 것과 비슷하다.
이번 장에서는 로봇에서 자주 쓰는 보상 설계 방법을 살펴본다. 먼저 목표에 가까워질수록 보상을 주는 거리 기반 보상부터 시작한다. 그다음 충돌, 낙하, 과도한 힘, 작업 공간 이탈을 막는 안전 보상을 다룬다. 이어서 에너지 사용과 급격한 움직임을 줄이는 부드러움 보상을 설명한다. 마지막으로 잘못된 보상이 어떤 편법 행동과 불안정한 정책을 만드는지 사례로 살펴본다.

보상 함수는 로봇의 성적표다
보상 함수는 현재 상태와 행동, 그리고 행동 후 결과를 보고 점수를 계산하는 함수다. 강화학습 표기에서는 보통 다음처럼 생각할 수 있다.
reward = f(state, action, next_state, info)여기서 state는 행동 전 상황이고, action은 로봇이 선택한 명령이며, next_state는 행동 후 상황이다. info에는 충돌 여부, 성공 여부, 힘 센서 값, 작업 단계 같은 추가 정보가 들어갈 수 있다.
로봇팔 목표 도달 문제를 예로 들어 보자. 현재 엔드 이펙터 위치가 목표에서 20cm 떨어져 있다. 로봇이 한 번 행동한 뒤 목표까지 거리가 15cm가 되었다면 좋은 행동이다. 반대로 25cm가 되었다면 좋지 않은 행동이다. 이 차이를 보상으로 표현할 수 있다.
가장 단순한 보상은 다음과 같다.
reward = - distance_to_goal목표까지 거리가 작을수록 보상이 덜 음수가 된다. 거리가 0에 가까워질수록 보상이 커진다. 예를 들어 거리가 0.20m이면 -0.20, 0.05m이면 -0.05다. 강화학습 에이전트는 보상을 크게 만들고 싶어 하므로 자연스럽게 거리를 줄이는 방향을 찾는다.
하지만 실제 로봇 작업에서는 이 한 줄만으로 충분하지 않다. 목표에 가까워지는 것만 중요하다면 로봇은 빠르게 움직이다가 테이블을 칠 수 있다. 물체를 집는 작업에서는 그리퍼가 물체 옆에 가까이 있기만 하고 실제로 집지 않을 수도 있다. 이동 로봇은 목적지에 가까워지려고 장애물을 스치며 지나갈 수도 있다.
그래서 로봇 보상 함수는 보통 여러 요소의 합으로 만든다.
reward = 목표 보상 + 성공 보상 - 안전 패널티 - 에너지 패널티 - 부드러움 패널티이 구조는 성적표와 비슷하다. 수학 점수만 높다고 좋은 학생이라고 할 수 없듯이, 목표에 가까워지는 점수만 높다고 좋은 로봇 정책이라고 할 수 없다. 로봇의 성적표에는 목표 달성, 안전성, 효율성, 부드러움이 함께 들어가야 한다.
희소 보상과 밀집 보상
보상 설계를 시작할 때 가장 먼저 만나는 선택은 희소 보상과 밀집 보상이다. 희소 보상은 성공했을 때만 큰 점수를 주는 방식이다. 밀집 보상은 성공까지 가는 중간 과정에도 작은 점수를 계속 주는 방식이다.
컵 집기 문제에서 희소 보상은 이렇게 설계할 수 있다.
컵을 성공적으로 들어 올리면 +100
그 외에는 0이 방식은 목표가 아주 명확하다. 로봇이 컵을 들어 올리면 성공이고, 아니면 성공이 아니다. 하지만 학습 초반에는 매우 어렵다. 로봇이 우연히 컵을 제대로 잡아 들어 올릴 확률이 낮기 때문이다. 수천 번 움직였는데 한 번도 성공하지 못하면 에이전트는 어떤 행동이 좋은지 배울 단서가 거의 없다.
반대로 밀집 보상은 중간 과정을 잘게 나누어 힌트를 준다.
그리퍼가 컵에 가까워질수록 보상
그리퍼 방향이 컵과 잘 맞을수록 보상
컵을 잡으면 추가 보상
컵을 들어 올리면 큰 보상이 방식은 로봇에게 길 안내 표지판을 세워 주는 것과 같다. 최종 목적지는 컵을 들어 올리는 것이지만, 그전에도 "이 방향이 맞아", "조금 더 가까이 가", "이제 그리퍼를 닫아"와 같은 힌트를 준다.
두 방식은 장단점이 있다.
| 보상 방식 | 장점 | 단점 |
|---|---|---|
| 희소 보상 | 목표가 명확하고 편법이 상대적으로 적다 | 초반에 성공 경험을 얻기 어려워 학습이 느릴 수 있다 |
| 밀집 보상 | 중간 힌트가 많아 학습이 빠르다 | 보상 설계가 잘못되면 중간 점수만 노리는 행동이 생길 수 있다 |
| 혼합 보상 | 학습 힌트와 최종 성공을 함께 줄 수 있다 | 각 보상 항의 균형을 조정해야 한다 |
실전에서는 두 방식을 섞는 경우가 많다. 목표까지 거리가 줄어들면 작은 보상을 주고, 실제 성공 조건을 만족하면 큰 보상을 준다. 즉 로봇에게 길을 알려 주되, 최종 도착이 가장 중요하다는 사실도 분명히 알려 주는 것이다.
거리 기반 보상: 목표에 가까워질수록 칭찬하기
로봇 강화학습에서 가장 자주 쓰는 보상 중 하나는 거리 기반 보상이다. 목표 위치가 있고, 로봇의 현재 위치가 있다면 두 점 사이의 거리를 계산할 수 있다. 엔드 이펙터가 목표점에 도달하는 문제, 이동 로봇이 목적지로 가는 문제, 물체를 특정 위치로 옮기는 문제 모두 거리 기반 보상으로 시작할 수 있다.
로봇팔 목표 도달 문제를 생각해 보자. 상태에는 엔드 이펙터 위치 p_ee와 목표 위치 p_goal이 들어 있다. 두 위치 사이의 거리는 다음처럼 표현할 수 있다.
distance = ||p_ee - p_goal||
reward_distance = - distance|| ||는 두 점 사이의 거리, 즉 유클리드 거리를 뜻한다. 쉽게 말해 3D 공간에서 자로 잰 직선 거리다. 이 보상은 단순하지만 강력하다. 목표와 가까울수록 점수가 높아지기 때문에 로봇은 목표 쪽으로 움직이는 행동을 배우기 쉽다.
그런데 이 방식에는 작은 문제가 있다. 매 순간 -distance만 주면 로봇은 목표 근처에서 천천히 머물러도 계속 괜찮은 점수를 받을 수 있다. 목표에 정확히 도달하는 것보다 목표 근처에서 어슬렁거리는 행동이 충분히 좋은 행동처럼 보일 수 있다.
이 문제를 줄이기 위해 거리의 변화량을 보상으로 줄 수도 있다.
previous_distance = 행동 전 목표 거리
current_distance = 행동 후 목표 거리
reward_progress = previous_distance - current_distance이 값은 목표에 가까워졌을 때 양수가 된다. 20cm에서 15cm로 줄었다면 +0.05가 된다. 반대로 20cm에서 25cm로 멀어졌다면 -0.05가 된다. 이 방식은 "현재 얼마나 가까운가"보다 "방금 행동이 목표에 가까워지는 데 도움이 되었는가"를 평가한다.
목표 도달 성공 보상도 함께 넣을 수 있다.
if current_distance < success_threshold:
reward_success = +10
else:
reward_success = 0여기서 success_threshold는 성공으로 인정할 거리다. 예를 들어 엔드 이펙터가 목표점 2cm 안에 들어오면 성공으로 볼 수 있다. 실제 로봇에서는 센서 오차와 제어 오차가 있기 때문에 목표와 정확히 같은 좌표에 도달하라고 요구하면 너무 엄격할 수 있다. 따라서 작은 허용 범위를 둔다.
거리 기반 보상을 설계할 때 중요한 점은 "무엇과 무엇 사이의 거리인가"를 정확히 정하는 것이다. 그리퍼와 컵 중심 사이의 거리인지, 그리퍼 손가락 끝과 컵의 잡기 지점 사이의 거리인지, 물체와 목표 위치 사이의 거리인지에 따라 로봇이 배우는 행동이 달라진다.
예를 들어 pick and place 작업에서는 단계별로 거리의 의미가 달라진다. 접근 단계에서는 그리퍼가 물체의 잡기 후보 위치에 가까워지는 것이 중요하다. 파지 후에는 물체가 목표 위치에 가까워지는 것이 중요하다. 만약 처음부터 끝까지 그리퍼와 목표 위치 사이의 거리만 보상으로 주면, 로봇은 물체를 제대로 집지 않은 채 자기 손만 목표 위치로 가져갈 수도 있다.
작업 단계별로 보상을 바꾸기
로봇 작업은 대개 여러 단계로 이루어진다. 컵을 옮기는 작업만 해도 접근, 정렬, 파지, 들어 올리기, 이동, 내려놓기, 그리퍼 열기 단계가 있다. 모든 단계에 같은 보상을 적용하면 정책이 헷갈릴 수 있다.
예를 들어 컵을 집기 전에는 그리퍼가 컵에 가까워져야 한다. 하지만 컵을 집은 후에는 그리퍼와 컵 사이의 거리는 이미 거의 0이다. 이때도 같은 거리 보상을 계속 주면 더 이상 의미 있는 학습 신호가 되지 않는다. 컵을 집은 뒤에는 컵 자체가 목표 위치로 이동해야 한다.
따라서 작업 단계에 따라 보상 항을 바꾸는 것이 자연스럽다.
| 단계 | 중요한 목표 | 보상 예시 |
|---|---|---|
| 접근 | 그리퍼가 물체 잡기 위치에 가까워짐 | 잡기 위치까지 거리 감소 보상 |
| 정렬 | 그리퍼 방향이 물체와 맞음 | 접근 방향, 손목 자세 정렬 보상 |
| 파지 | 물체가 그리퍼 안에 안정적으로 들어옴 | 접촉 성공, 그리퍼 닫힘, 미끄러짐 감소 보상 |
| 들어 올리기 | 물체가 테이블에서 떨어짐 | 물체 높이 증가 보상 |
| 운반 | 물체가 목표 위치로 이동 | 물체와 목표 사이 거리 감소 보상 |
| 놓기 | 물체가 목표 영역에 안정적으로 놓임 | 목표 영역 안착 성공 보상 |
이런 단계별 보상은 로봇에게 작업의 흐름을 알려 준다. 물론 단계 전환 조건을 잘못 만들면 문제가 생길 수 있다. 예를 들어 물체를 실제로 잡지 않았는데 잡았다고 판단하면, 이후 보상이 엉뚱하게 계산된다. 따라서 단계 전환에는 센서 확인이 필요하다. 그리퍼 폭, 힘 센서, 물체 높이, 카메라 검증 등을 함께 사용하면 더 안정적이다.
단계별 보상은 이후 LLM 로봇 에이전트와도 잘 연결된다. LLM은 전체 작업을 detect_object → pick → place 같은 스킬로 나누고, 강화학습 정책은 각 스킬 내부에서 세밀한 행동을 배운다. 이때 각 스킬마다 다른 보상을 설계하면 학습 문제를 훨씬 작고 명확하게 만들 수 있다.
안전 보상: 하지 말아야 할 일을 분명히 알려 주기
로봇에서 보상은 목표 달성만 다루면 안 된다. 실제 로봇은 물리 세계에서 움직이기 때문에 잘못된 행동이 손상, 충돌, 낙하, 사람과의 접촉으로 이어질 수 있다. 게임 속 에이전트는 실패하면 다시 시작하면 되지만, 로봇은 한 번의 충돌로 모터가 망가지거나 주변 물체가 깨질 수 있다.
그래서 안전 보상, 더 정확히는 안전 패널티가 필요하다. 패널티는 나쁜 행동에 주는 음수 보상이다. 로봇에게 "이 행동은 점수를 잃는 행동"이라고 알려 주는 역할을 한다.
로봇에서 자주 사용하는 안전 패널티는 다음과 같다.
| 위험 상황 | 패널티 예시 | 의미 |
|---|---|---|
| 충돌 | -10 또는 에피소드 종료 | 로봇팔, 테이블, 장애물 접촉을 피하게 한다 |
| 물체 낙하 | -20 또는 실패 처리 | 잡은 물체를 떨어뜨리지 않게 한다 |
| 과도한 힘 | 힘 한계 초과 시 -5 | 눌러 부수거나 사람에게 강한 힘을 가하지 않게 한다 |
| 작업 공간 이탈 | 영역 밖으로 나가면 -10 | 허용된 안전 영역 안에서만 움직이게 한다 |
| 관절 제한 접근 | 제한에 가까워질수록 작은 음수 | 무리한 자세와 기구적 한계를 피하게 한다 |
| 속도 초과 | 빠른 속도에 비례한 음수 | 급격하고 위험한 움직임을 줄인다 |
충돌 패널티는 특히 중요하다. 목표에 가까워지는 보상이 아무리 잘 설계되어 있어도 충돌 벌점이 약하면 로봇은 "조금 부딪혀도 빨리 가는 편이 낫다"고 배울 수 있다. 사람은 충돌을 당연히 나쁜 것으로 생각하지만, 로봇은 보상 숫자가 그렇게 말해 주지 않으면 모른다.
충돌을 다룰 때는 두 가지 방식이 있다. 하나는 충돌이 발생하면 큰 음수 보상을 주는 것이다. 다른 하나는 충돌이 발생하는 즉시 에피소드를 종료하는 것이다. 실제 로봇에서는 보통 둘 다 사용한다. 충돌하면 큰 벌점을 주고, 더 이상 위험한 행동을 계속하지 않도록 에피소드를 끝낸다.
if collision_detected:
reward_collision = -50
done = True작업 공간 이탈도 비슷하다. 로봇팔이 움직일 수 있는 전체 영역이 있다고 해서 학습 중 모든 영역을 허용할 필요는 없다. 테이블 위 물체를 집는 작업이라면 안전한 작업 박스를 정의할 수 있다. 엔드 이펙터가 이 박스 밖으로 나가면 패널티를 주고 행동을 제한한다.
if outside_workspace:
reward_workspace = -20
done = True과도한 힘에 대한 패널티도 중요하다. 로봇팔이 물체를 잡을 때 너무 큰 힘을 쓰면 물체가 깨질 수 있다. 사람 근처에서 움직이는 로봇이라면 힘 제한은 더 중요하다. 힘 센서나 토크 추정값을 이용해 한계를 넘으면 패널티를 줄 수 있다.
if contact_force > force_limit:
reward_force = - alpha_force * (contact_force - force_limit)여기서 alpha_force는 힘 초과를 얼마나 강하게 벌할지 정하는 계수다. 계수가 너무 작으면 로봇이 힘 초과를 별로 신경 쓰지 않는다. 너무 크면 로봇이 접촉 자체를 두려워해 물체를 못 잡을 수 있다. 로봇 조작에서는 접촉이 완전히 나쁜 것이 아니다. 잡기, 밀기, 끼우기 같은 작업은 접촉을 필요로 한다. 따라서 "접촉 금지"가 아니라 "위험한 접촉 금지"를 보상으로 표현해야 한다.
안전은 보상만으로 해결하지 않는다
여기서 꼭 짚어야 할 점이 있다. 안전은 보상 함수에 패널티를 넣는 것만으로 충분하지 않다. 강화학습 정책은 학습 중에도 실수를 한다. 아직 배우는 중인 로봇에게 "충돌하면 벌점이야"라고 알려 주는 것은 필요하지만, 벌점을 받기 전에 이미 충돌이 발생할 수 있다.
따라서 실제 로봇에서는 보상 설계와 별도로 안전 제어 계층이 필요하다. 정책이 위험한 행동을 출력하면 실행 전에 막아야 한다. 행동 범위를 제한하고, 속도와 가속도 한계를 적용하며, 충돌 예상 영역으로 가는 명령을 거부해야 한다. 비상 정지 버튼과 사람 감독도 필요하다.
보상은 로봇이 장기적으로 안전한 행동을 배우게 하는 훈련 신호다. 안전 제어는 지금 당장 위험한 행동을 막는 보호 장치다. 두 역할은 다르다.
자동차 운전으로 비유하면 보상은 "안전 운전을 하면 좋은 점수를 받는다"는 교육이고, 안전 제어는 실제 브레이크와 차선 이탈 방지 장치다. 교육이 좋아도 브레이크가 필요하다. 로봇도 마찬가지다.
강화학습을 실제 로봇에 적용할 때는 다음 구조를 권장한다.
정책이 행동 제안
→ 행동 범위 제한
→ 충돌 및 작업 공간 검사
→ 저수준 제어기 실행
→ 센서로 결과 확인
→ 보상 계산이 구조에서 정책은 자유롭게 배울 수 있지만, 자유에는 울타리가 있다. 로봇 강화학습은 무작위로 위험한 행동을 해 보는 방법이 아니라, 안전한 실험 공간 안에서 더 나은 행동을 찾는 방법이어야 한다.
에너지 보상: 힘을 덜 쓰는 로봇 만들기
목표에 도달하고 충돌을 피하는 것만으로 좋은 로봇이라고 하기는 어렵다. 실제 로봇은 에너지를 사용한다. 모터를 세게 돌릴수록 전력을 더 쓰고, 부품에 부담이 커지며, 열이 발생한다. 배터리로 움직이는 이동 로봇이나 드론에서는 에너지 사용이 곧 작업 시간과 연결된다.
에너지 사용을 줄이고 싶다면 행동 크기에 패널티를 줄 수 있다. 강화학습에서 행동이 관절 속도 명령이라면, 큰 속도를 낼수록 작은 음수 보상을 주는 식이다.
reward_energy = - alpha_action * ||action||²여기서 ||action||²는 행동 벡터의 크기를 제곱한 값이다. 쉽게 말하면 로봇이 크게 움직이려고 할수록 벌점을 주는 방식이다. 제곱을 쓰면 작은 움직임은 약하게 벌하고, 큰 움직임은 더 강하게 벌할 수 있다.
관절 토크를 직접 다루는 문제라면 토크에 대한 패널티를 줄 수도 있다.
reward_torque = - alpha_torque * sum(torque²)이런 보상은 로봇이 불필요하게 힘을 많이 쓰지 않도록 돕는다. 같은 목표에 도달하더라도 관절을 크게 휘두르지 않고, 더 효율적인 경로를 찾게 만든다.
하지만 에너지 패널티도 너무 강하면 문제가 된다. 로봇이 움직이는 것 자체를 싫어하게 될 수 있다. 목표에 가야 하는데 행동할 때마다 벌점을 크게 받으니, 차라리 가만히 있는 편이 낫다고 판단할 수 있다. 특히 목표 보상이 약하고 에너지 패널티가 강하면 이런 일이 쉽게 생긴다.
따라서 에너지 보상은 주인공이 아니라 조연이어야 한다. 로봇의 가장 중요한 목표가 작업 성공이라면 성공 보상이 충분히 커야 한다. 에너지 패널티는 "성공하되 가능하면 덜 무리하게 움직여라"라는 정도로 작동해야 한다.
부드러움 보상: 덜 덜컹거리는 정책 만들기
로봇이 목표에 도달했는데 움직임이 덜컹거린다면 실제 시스템에서는 좋은 정책이 아니다. 관절이 갑자기 빨라졌다 느려지고, 엔드 이펙터가 흔들리고, 물체를 집은 상태에서 급격히 방향을 바꾸면 물체가 미끄러질 수 있다. 사람 옆에서 움직이는 로봇이라면 이런 움직임은 불안감을 준다.
부드러운 움직임을 만들기 위해서는 속도, 가속도, 행동 변화량에 패널티를 줄 수 있다.
가장 간단한 방법은 관절 속도에 패널티를 주는 것이다.
reward_velocity = - alpha_velocity * ||joint_velocity||²더 부드럽게 만들고 싶다면 행동 변화량을 벌할 수 있다. 현재 행동이 이전 행동과 크게 다르면 패널티를 주는 방식이다.
reward_smooth = - alpha_smooth * ||action_t - action_t_minus_1||²이 보상은 로봇에게 "방금 전과 너무 다른 명령을 갑자기 내지 말라"고 말한다. 예를 들어 직전에는 오른쪽으로 빠르게 가라고 했다가, 이번에는 왼쪽으로 빠르게 가라고 하면 행동 변화량이 크다. 이런 변화에 벌점을 주면 정책은 더 연속적인 명령을 내려고 한다.
가속도나 저크에 패널티를 주는 방법도 있다. 저크는 가속도의 변화량이다. 쉽게 말해 움직임이 얼마나 갑작스럽게 꺾이는지를 나타낸다. 엘리베이터가 부드럽게 출발하면 몸이 편하지만, 갑자기 덜컹하면 불쾌하다. 그 덜컹거림과 관련된 개념이 저크다.
부드러움 보상은 특히 실제 로봇으로 옮길 때 중요하다. 시뮬레이션에서는 조금 거친 정책도 그럭저럭 성공해 보일 수 있다. 하지만 실제 모터, 감속기, 링크, 물체에는 관성이 있다. 급격한 명령은 진동과 오차를 만들고, 장기적으로는 기계적 마모를 키운다.
다만 부드러움 패널티 역시 너무 강하면 로봇이 필요한 순간에 충분히 빠르게 움직이지 못한다. 떨어지는 물체를 다시 잡아야 하는 상황처럼 빠른 반응이 필요한 작업에서는 적절한 민첩성이 필요하다. 좋은 보상 설계는 부드러움과 반응성 사이의 균형을 찾는 일이다.
시간 보상: 빨리 끝내되 무리하지 않게
로봇 작업은 보통 제한 시간 안에 끝나야 한다. 목표에 언젠가 도달하기만 하면 되는 것이 아니라, 적절한 시간 안에 안정적으로 도달해야 한다. 이를 위해 매 스텝마다 작은 시간 패널티를 줄 수 있다.
reward_time = -0.01이 보상은 로봇에게 "불필요하게 오래 끌지 말라"는 신호를 준다. 매 순간 조금씩 점수를 잃기 때문에, 로봇은 성공할 수 있다면 더 짧은 경로와 빠른 완료를 선호하게 된다.
하지만 시간 패널티가 너무 크면 로봇이 조급해질 수 있다. 빠르게 끝내는 점수가 안전보다 중요해지면, 로봇은 충돌 위험을 감수하거나 물체를 거칠게 다룰 수 있다. 따라서 시간 보상은 안전 패널티, 속도 제한, 부드러움 보상과 함께 조정해야 한다.
작업에 따라 시간 보상의 의미도 달라진다. 공장 자동화에서는 생산성이 중요하므로 시간이 큰 요소가 될 수 있다. 반면 의료 보조나 사람과 가까이 있는 서비스 로봇에서는 빠른 완료보다 안전하고 예측 가능한 움직임이 더 중요하다. 보상 설계는 항상 작업의 목적과 환경을 반영해야 한다.
하나의 보상 함수로 합쳐 보기
이제 여러 보상 항을 하나로 합쳐 보자. 로봇팔이 목표 위치에 도달하는 단순한 작업을 가정한다. 목표는 엔드 이펙터가 목표점에 도달하는 것이다. 동시에 충돌을 피하고, 작업 공간을 벗어나지 않으며, 너무 거칠게 움직이지 않아야 한다.
보상 함수는 다음과 같이 만들 수 있다.
reward = 0
reward += alpha_progress * (previous_distance - current_distance)
if current_distance < success_threshold:
reward += success_bonus
done = True
if collision_detected:
reward -= collision_penalty
done = True
if outside_workspace:
reward -= workspace_penalty
done = True
reward -= alpha_action * ||action||²
reward -= alpha_smooth * ||action_t - action_t_minus_1||²
reward -= time_penalty이 구조는 매우 흔한 형태다. 목표에 가까워지는 행동에는 양수 보상을 준다. 성공하면 큰 보너스를 준다. 충돌이나 작업 공간 이탈은 큰 패널티와 함께 에피소드를 끝낸다. 행동 크기와 행동 변화량에는 작은 패널티를 주어 효율적이고 부드러운 움직임을 유도한다. 매 스텝마다 시간 패널티를 주어 불필요하게 오래 끄는 행동을 줄인다.
각 항의 계수는 보상 설계의 손잡이다. alpha_progress를 키우면 목표를 향한 진행이 더 중요해진다. collision_penalty를 키우면 충돌 회피가 더 중요해진다. alpha_smooth를 키우면 움직임은 부드러워지지만 반응이 둔해질 수 있다.
보상 함수는 한 번에 완벽하게 만들기 어렵다. 보통은 간단한 보상으로 시작해 학습 결과를 보고 조정한다. 로봇이 목표에 가지 않는다면 목표 보상이 약하거나 에너지 패널티가 강할 수 있다. 로봇이 너무 거칠게 움직인다면 속도나 행동 변화량 패널티가 부족할 수 있다. 로봇이 목표 근처에서만 머문다면 성공 보너스나 종료 조건이 약할 수 있다.
보상 설계는 수학 문제이면서 관찰 문제다. 숫자를 쓰는 것만큼, 학습된 로봇이 실제로 어떻게 행동하는지 보는 일이 중요하다.
보상 크기의 균형 맞추기
여러 보상 항을 더할 때 가장 흔한 실수는 크기 균형을 무시하는 것이다. 어떤 항은 값이 0.01 정도인데, 어떤 항은 100이라면 큰 항이 전체 학습을 지배한다. 그러면 작은 항은 사실상 없는 것처럼 작동할 수 있다.
예를 들어 목표에 가까워지는 보상이 매 스텝 +0.02 정도이고, 행동 패널티가 매 스텝 -1.0 정도라면 로봇은 움직일수록 손해라고 느낄 수 있다. 반대로 충돌 패널티가 -1인데 성공 보너스가 +100이라면 로봇은 여러 번 부딪히더라도 성공만 하면 된다고 배울 수 있다.
보상 크기를 맞출 때는 각 항이 실제로 어느 정도 범위의 값을 가지는지 기록해 보는 것이 좋다. 학습 로그에 목표 보상, 성공 보상, 충돌 패널티, 행동 패널티, 부드러움 패널티를 따로 저장하면 원인을 찾기 쉽다.
| 로그 항목 | 확인할 질문 |
|---|---|
| 거리 보상 평균 | 목표에 가까워지는 신호가 충분히 자주 나오고 있는가 |
| 성공 보상 횟수 | 성공 경험이 너무 드물지는 않은가 |
| 충돌 패널티 횟수 | 정책이 위험 행동을 반복하고 있지는 않은가 |
| 행동 패널티 크기 | 움직임을 지나치게 억제하고 있지는 않은가 |
| 부드러움 패널티 크기 | 정책이 덜컹거리는 행동을 내고 있지는 않은가 |
| 에피소드 길이 | 로봇이 불필요하게 시간을 끌고 있지는 않은가 |
보상 항을 따로 기록하면 "누적 보상이 올라갔다"라는 막연한 결과를 더 잘 해석할 수 있다. 누적 보상이 올라갔는데 실제 성공률은 그대로라면, 로봇이 중간 보상만 잘 얻는 방법을 배웠을 수 있다. 성공률은 높아졌지만 충돌도 늘었다면, 목표 보상이 안전 패널티보다 너무 강할 수 있다.
좋은 보상 설계자는 학습 곡선만 보지 않는다. 실패 영상, 충돌 로그, 행동 크기, 성공 조건, 에피소드 종료 이유를 함께 본다.
나쁜 보상은 편법 행동을 만든다
강화학습에서 가장 흥미롭고 무서운 현상은 로봇이 보상의 허점을 찾아낸다는 점이다. 개발자는 좋은 의도로 보상을 만들었지만, 로봇은 그 의도가 아니라 숫자를 따른다. 그래서 보상 설계가 잘못되면 편법 행동이 나타난다.
첫 번째 사례는 "가까이 가기만 하는 로봇"이다. 컵을 집는 작업에서 그리퍼와 컵 중심 사이의 거리가 가까울수록 보상을 준다고 하자. 하지만 물체를 실제로 잡는 보상은 없거나 약하다. 그러면 로봇은 컵 옆에 가까이 가는 법은 배우지만, 그리퍼를 닫고 들어 올리는 행동은 배우지 못할 수 있다. 심하면 컵에 바짝 붙은 채 가만히 있는 정책이 높은 점수를 받는다.
두 번째 사례는 "밀어 버리는 로봇"이다. 물체를 목표 위치로 옮기는 작업에서 물체와 목표 사이의 거리만 보상으로 준다고 하자. 로봇은 물체를 잡아서 옮기는 대신, 세게 밀어 목표 근처로 보내는 방법을 배울 수 있다. 만약 물체가 떨어지거나 뒤집히는 것에 대한 패널티가 없다면, 이 행동은 점수상으로 꽤 좋은 전략이 될 수 있다. 개발자는 pick and place를 원했지만, 로봇은 push and hope를 배운 셈이다.
세 번째 사례는 "흔들어서 점수 얻는 로봇"이다. 거리 변화량 보상을 줄 때 조심해야 한다. 목표에 가까워지면 보상을 주고 멀어지는 것은 약하게 벌하면, 로봇이 목표 근처에서 앞뒤로 흔들며 가까워지는 순간의 보상만 반복적으로 얻으려 할 수 있다. 전체적으로는 제자리에서 떨고 있는데 보상은 계속 들어오는 이상한 행동이 생긴다.
네 번째 사례는 "움직이지 않는 로봇"이다. 에너지 패널티와 충돌 패널티를 너무 크게 주고, 목표 보상을 약하게 주면 로봇은 가만히 있는 것이 최선이라고 배울 수 있다. 움직이면 힘도 쓰고 충돌 위험도 생기니, 아무것도 하지 않는 정책이 가장 안전한 점수 전략이 되는 것이다. 로봇이 조용히 멈춰 있는 것은 겉보기에는 안정적이지만, 작업을 수행하지 못한다면 실패다.
다섯 번째 사례는 "위험하게 빠른 로봇"이다. 성공 보상과 시간 보상을 너무 강하게 주고, 충돌이나 속도 패널티를 약하게 주면 로봇은 목표를 향해 급하게 돌진할 수 있다. 시뮬레이션에서는 성공률이 높아 보일 수 있지만, 실제 로봇에서는 진동, 충돌, 물체 낙하가 늘어난다.
이런 편법 행동은 로봇이 못돼서 생기는 것이 아니다. 오히려 로봇이 보상에 충실했기 때문에 생긴다. 문제는 보상에 우리가 원하는 조건이 빠져 있었던 것이다.
불안정한 정책을 만드는 보상
나쁜 보상은 편법뿐 아니라 불안정한 정책도 만든다. 정책이 불안정하다는 것은 학습이 들쭉날쭉하거나, 조금만 환경이 바뀌어도 행동이 크게 흔들리는 상태를 말한다.
가장 흔한 원인은 보상 신호가 너무 드문 경우다. 성공했을 때만 보상을 주고 중간 힌트가 없으면, 정책은 대부분의 시간에 아무 단서도 받지 못한다. 그러면 학습이 매우 느리거나 우연에 크게 의존한다. 성공을 몇 번 경험하면 갑자기 좋아지는 것처럼 보이다가, 다시 성능이 떨어질 수 있다.
보상이 너무 큰 값으로 튀는 것도 문제다. 평소에는 0에 가까운 보상을 주다가 특정 순간에 +10000 같은 큰 보상을 주면 학습 업데이트가 불안정해질 수 있다. 알고리즘에 따라 보상 정규화나 클리핑을 쓰기도 하지만, 기본적으로 보상 크기는 너무 극단적이지 않게 관리하는 것이 좋다.
서로 충돌하는 보상 항도 정책을 흔든다. 예를 들어 목표에 가까워지려면 앞으로 가야 하는데, 행동 패널티가 너무 강해서 움직이면 손해가 된다면 정책은 갈팡질팡한다. 한쪽 보상은 "가라"고 말하고, 다른 보상은 "가지 말라"고 말하는 셈이다. 물론 실제 보상은 여러 목표의 균형이지만, 핵심 목표와 보조 목표의 우선순위가 분명해야 한다.
센서 노이즈가 큰 값에 직접 보상을 연결하는 것도 위험하다. 예를 들어 깊이 카메라의 물체 위치 추정값이 매 프레임 흔들리는데, 그 거리 변화량을 그대로 보상으로 사용하면 로봇은 실제로 잘 움직였는지보다 센서 노이즈에 따라 보상을 받을 수 있다. 이런 경우에는 위치 추정값을 필터링하거나, 여러 프레임 평균을 사용하거나, 성공 조건을 약간 여유 있게 잡는 것이 좋다.
보상 설계는 디버깅이다
보상 함수는 처음부터 완벽하게 나오지 않는다. 실제 개발에서는 보상 설계가 디버깅의 연속이다. 코드를 실행하고, 학습 곡선을 보고, 로봇의 행동을 영상으로 확인하고, 실패 에피소드를 분석하고, 다시 보상을 수정한다.
좋은 절차는 간단한 작업에서 시작하는 것이다. 처음부터 컵을 인식하고, 접근하고, 집고, 들어 올리고, 목표 위치에 놓는 전체 작업을 강화학습으로 해결하려고 하면 문제 원인을 찾기 어렵다. 먼저 목표 도달만 학습한다. 그다음 장애물을 추가한다. 이후 물체 접촉, 파지, 운반으로 확장한다.
보상 디버깅을 할 때는 다음 질문을 던져 보자.
| 증상 | 의심할 원인 |
|---|---|
| 로봇이 거의 움직이지 않는다 | 행동 패널티가 너무 크거나 목표 보상이 약할 수 있다 |
| 목표 근처에서만 맴돈다 | 성공 보너스나 종료 조건이 약할 수 있다 |
| 빠르지만 자주 충돌한다 | 충돌 패널티와 속도 제한이 약할 수 있다 |
| 물체를 잡지 않고 밀어 버린다 | 파지 성공과 낙하 패널티가 부족할 수 있다 |
| 학습 곡선이 심하게 흔들린다 | 보상이 너무 희소하거나 크기 스케일이 불안정할 수 있다 |
| 시뮬레이션에서는 되지만 현실에서 실패한다 | 보상이 현실의 노이즈와 제약을 충분히 반영하지 못했을 수 있다 |
보상 함수의 각 항을 켜고 끄며 실험하는 것도 도움이 된다. 먼저 거리 보상만으로 목표를 향해 움직이는지 확인한다. 그다음 성공 보너스를 추가한다. 이후 충돌 패널티, 행동 패널티, 부드러움 패널티를 하나씩 넣는다. 한 번에 모든 보상을 넣으면 어떤 항이 문제를 만드는지 알기 어렵다.
또 하나 중요한 방법은 랜덤 정책이나 간단한 규칙 기반 정책으로 보상 값을 먼저 테스트하는 것이다. 아직 학습하지 않은 상태에서도 보상 함수가 상식적으로 작동하는지 확인할 수 있다. 목표에 가까워지는 행동이 실제로 더 높은 보상을 받는지, 충돌하면 충분히 큰 패널티가 들어가는지, 가만히 있는 행동이 이상하게 높은 점수를 받지 않는지 살펴본다.
로봇팔 목표 도달 보상 예시
이제 구체적인 예시를 만들어 보자. 로봇팔의 엔드 이펙터가 3D 목표점에 도달하는 작업이다. 상태에는 현재 엔드 이펙터 위치, 목표 위치, 관절 속도, 이전 행동이 들어 있다. 행동은 엔드 이펙터의 작은 이동량이다.
목표는 다음과 같다.
목표에 가까워질 것
목표 반경 안에 들어오면 성공할 것
충돌하지 않을 것
작업 공간을 벗어나지 않을 것
너무 큰 행동을 하지 않을 것
갑자기 방향을 바꾸지 않을 것이를 보상으로 옮기면 다음과 같다.
progress = previous_distance - current_distance
reward = 2.0 * progress
if current_distance < 0.02:
reward += 10.0
done = True
if collision_detected:
reward -= 20.0
done = True
if outside_workspace:
reward -= 20.0
done = True
reward -= 0.01 * action_norm_squared
reward -= 0.02 * action_change_norm_squared
reward -= 0.001여기서 목표 반경은 2cm다. 충돌과 작업 공간 이탈은 성공 보상보다 더 큰 음수로 설정했다. 이는 위험한 성공보다 안전한 실패가 낫다는 설계 철학을 반영한다. 행동 패널티와 부드러움 패널티는 상대적으로 작게 두었다. 로봇이 움직이지 못할 정도로 강하게 벌하지 않고, 같은 목표를 달성한다면 더 작은 행동과 더 부드러운 행동을 선호하게 만드는 정도다.
이 보상은 완성품이 아니라 출발점이다. 학습 결과 로봇이 너무 느리다면 시간 패널티를 조금 키울 수 있다. 로봇이 덜컹거리면 행동 변화량 패널티를 키울 수 있다. 로봇이 목표 근처에서 멈칫거리면 성공 반경을 조정하거나 성공 보너스를 키울 수 있다. 충돌이 자주 발생하면 충돌 패널티뿐 아니라 행동 제한과 안전 필터를 강화해야 한다.
물체 집기 보상 예시
물체 집기는 목표 도달보다 복잡하다. 단순히 그리퍼가 물체에 가까워지는 것만으로는 부족하다. 물체를 안정적으로 잡고, 들어 올리고, 떨어뜨리지 않아야 한다.
물체 집기 보상은 다음 단계로 나눌 수 있다.
접근: 그리퍼가 물체의 잡기 위치에 가까워짐
정렬: 그리퍼 방향이 물체의 잡기 방향과 맞음
파지: 물체가 그리퍼 안에 있고 접촉이 안정적임
리프트: 물체 높이가 올라감
유지: 들어 올린 뒤 물체를 떨어뜨리지 않음각 단계의 보상은 다음처럼 구성할 수 있다.
reward = 0
reward += 접근 보상
reward += 정렬 보상
if stable_contact:
reward += 파지 보상
if object_height > lift_height:
reward += 리프트 성공 보상
done = True
if object_dropped:
reward -= 낙하 패널티
done = True
if collision_with_table_or_obstacle:
reward -= 충돌 패널티
done = True
reward -= 행동 크기 패널티
reward -= 급격한 움직임 패널티여기서 주의할 점은 "가까움"과 "잡음"을 구분하는 것이다. 그리퍼가 물체에 가까운 것과 물체가 그리퍼에 안정적으로 잡힌 것은 다르다. 따라서 그리퍼 거리 보상만으로는 부족하다. 그리퍼가 닫힌 후 물체 위치가 함께 움직이는지, 물체 높이가 올라가는지, 그리퍼 폭이 예상 범위에 있는지, 힘 센서가 적절한 접촉을 감지하는지 확인해야 한다.
또한 낙하 패널티는 중요하다. 로봇이 물체를 잠깐 들어 올렸다가 바로 떨어뜨려도 리프트 보상만 받는다면 좋은 정책처럼 보일 수 있다. 이를 막기 위해 일정 시간 동안 물체 높이를 유지해야 성공으로 인정할 수 있다.
if object_height > lift_height for hold_steps:
success = True이런 조건은 보상을 더 현실적으로 만든다. 실제 작업에서 중요한 것은 순간적인 성공이 아니라 안정적인 성공이기 때문이다.
보상과 종료 조건은 함께 설계한다
보상 설계에서 자주 놓치는 것이 종료 조건이다. 에피소드가 언제 끝나는지에 따라 로봇이 배우는 행동이 달라진다. 성공하면 에피소드를 끝낼 것인지, 충돌하면 바로 끝낼 것인지, 시간 초과는 어떻게 처리할 것인지가 모두 중요하다.
목표 도달 작업에서는 목표 반경 안에 들어오면 성공으로 종료할 수 있다. 충돌이나 작업 공간 이탈은 실패로 종료한다. 제한 스텝을 넘으면 시간 초과로 종료한다.
성공 종료: 목표 거리 < 허용 반경
실패 종료: 충돌, 낙하, 작업 공간 이탈
시간 종료: 최대 스텝 수 초과종료 조건이 없으면 로봇이 이상한 행동을 할 수 있다. 예를 들어 목표에 도달했는데 에피소드가 끝나지 않으면, 로봇은 목표 근처에 머무르거나 흔들면서 추가 보상을 얻으려 할 수 있다. 성공한 순간 에피소드를 끝내면 "목표에 도달하는 것"이 명확한 끝점이 된다.
반대로 실패 상황에서 에피소드를 계속 진행하면 위험 행동이 반복될 수 있다. 물체를 이미 떨어뜨렸는데도 에피소드가 계속되면, 로봇은 떨어진 물체를 이상한 방식으로 다시 다루려 할 수 있다. 실제 작업에서는 낙하가 발생하면 실패로 종료하고 초기화하는 편이 더 명확하다.
종료 조건은 로봇에게 작업의 경계를 알려 준다. 보상이 "무엇이 좋은가"를 말한다면, 종료 조건은 "언제 한 번의 시도가 끝나는가"를 말한다.
보상 설계의 실전 원칙
로봇 보상 설계에는 정답 공식이 없다. 작업, 로봇 구조, 센서, 시뮬레이션, 안전 요구사항에 따라 달라진다. 그래도 실전에서 도움이 되는 원칙은 있다.
첫째, 가장 중요한 성공 조건을 분명히 한다. 로봇이 최종적으로 무엇을 해야 성공인지 명확해야 한다. 목표 반경, 물체 높이, 목표 영역, 유지 시간처럼 측정 가능한 조건으로 바꾸는 것이 좋다.
둘째, 중간 보상은 힌트로 사용한다. 거리 감소, 정렬, 높이 증가 같은 보상은 학습을 빠르게 만들지만, 최종 성공을 대체해서는 안 된다. 로봇이 중간 점수만 얻고 작업을 끝내지 않는지 확인해야 한다.
셋째, 위험 행동은 강하게 벌하고 가능하면 종료한다. 충돌, 낙하, 작업 공간 이탈, 과도한 힘은 단순히 점수를 조금 깎는 수준으로는 부족할 수 있다. 특히 실제 로봇에서는 보상 이전에 안전 제어로 막아야 한다.
넷째, 효율성과 부드러움은 보조 목표로 둔다. 에너지, 속도, 행동 변화량 패널티는 좋은 움직임을 만드는 데 중요하지만, 너무 강하면 로봇이 움직이지 않거나 과도하게 느려질 수 있다.
다섯째, 보상 항을 따로 로그로 남긴다. 전체 보상만 보면 원인을 알기 어렵다. 거리 보상, 성공 보상, 충돌 패널티, 행동 패널티를 분리해서 기록하면 정책이 어떤 점수에 반응하는지 이해할 수 있다.
여섯째, 영상으로 확인한다. 강화학습 숫자는 종종 그럴듯하게 보인다. 하지만 로봇이 실제로 어떤 편법을 쓰는지는 영상으로 보면 바로 드러난다. 목표에 도달한 것처럼 보였지만 물체를 밀어 버렸는지, 성공 직전에 충돌했는지, 너무 흔들리는지 확인해야 한다.
보상은 목표의 언어다
강화학습에서 로봇은 보상을 통해 세계를 배운다. 목표에 가까워지면 좋은지, 충돌하면 얼마나 나쁜지, 빠른 움직임이 좋은지 위험한지, 물체를 잡는 것이 단순히 가까이 가는 것과 어떻게 다른지 모두 보상에 들어간다.
좋은 보상 함수는 로봇에게 다음 네 가지를 함께 말해 준다.
| 보상 요소 | 로봇에게 주는 메시지 |
|---|---|
| 목표 보상 | 해야 할 일을 향해 나아가라 |
| 안전 패널티 | 위험한 방식으로 성공하지 마라 |
| 효율 보상 | 불필요한 힘과 시간을 낭비하지 마라 |
| 부드러움 보상 | 실제 로봇답게 안정적으로 움직여라 |
보상 설계가 어려운 이유는 이 네 가지가 항상 같은 방향을 가리키지 않기 때문이다. 빠르게 가려면 더 큰 행동이 필요할 수 있고, 부드럽게 움직이려면 시간이 더 걸릴 수 있다. 안전하게 돌아가려면 목표까지 거리가 순간적으로 늘어날 수도 있다. 강화학습은 이 균형을 숫자로 학습하지만, 어떤 균형을 원하는지 정하는 것은 개발자의 몫이다.
나쁜 보상은 로봇을 나쁘게 만드는 것이 아니라, 로봇에게 잘못된 게임을 시키는 것이다. 로봇은 그 게임에서 이기려고 할 뿐이다. 그러므로 보상 설계의 핵심 질문은 "어떻게 점수를 줄까?"가 아니라 "이 점수를 최대화하면 정말 내가 원하는 행동이 나오는가?"다.
다음 장에서는 이 보상 함수를 실제로 실험할 공간인 시뮬레이션을 다룬다. 실제 로봇을 수천 번 부딪히게 할 수는 없다. 그래서 우리는 먼저 가상 환경에서 로봇을 학습시키고, 안전하게 실패를 반복하며, 보상과 정책을 다듬는다. 보상이 로봇의 성적표라면, 시뮬레이션은 그 성적표를 마음껏 시험해 볼 수 있는 연습장이다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.