상태: 초안 (2026-10-18), 실측. 숫자는 노트북(Apple M1 Max, macOS 26.5)의 Python 3.9.6·numpy 2.0.2 로 직접 계산한 시뮬레이션 값입니다. 원자료와 코드: 작업 디렉터리
measure/robot-arm-basics/rl/의ttenv.py(환경),baselines.py,thr.py, 결과out/rl/baselines.json,out/rl/throughput.json. 장난감 문제는 원리를 보이려고 일부러 작게 만든 것이며 실제 로봇 실험은 없습니다(하드웨어 미실측). 공 초기 상태는 DeepMind 데이터셋(CC-BY 4.0)입니다. 참고 자료는 2026-10-18 에 열람했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
1. 직관: 결과는 늦게 온다
1~10편의 방법은 「무엇이 옳은지」를 미리 계산했습니다. 강화학습(reinforcement learning, RL)은 그 계산을 하지 않습니다. 해 보고, 결과를 보고, 결과가 좋았던 쪽으로 행동을 조금씩 옮깁니다. 아이가 공 던지기를 배우는 방식과 같습니다.
탁구에서는 이 「결과」가 늦게 옵니다. 라켓을 뒤로 빼는 순간에는 잘한 것인지 알 수 없고, 0.5초 뒤 공이 상대 탁구대에 떨어져야 비로소 성공이라는 신호가 옵니다. 그사이 팔은 수십 번의 결정을 내렸습니다. 어느 결정이 성공에 기여했는지 나누어 주는 일(신용 할당, credit assignment)이 강화학습의 핵심 어려움이고, 이 글의 할인율과 가치 함수, 12편의 이점 함수가 모두 이 문제를 다루는 장치입니다.
10편에서 「무엇을 학습에 맡길까」를 물었습니다. 11~15편은 그 질문의 학습 쪽을 원리부터 다시 봅니다. 11편이 틀을 세우고, 12편이 PPO 를 직접 구현하고, 13편이 보상과 행동 공간을, 14편이 시뮬레이션에서 실물로 가는 문제를, 15편이 평가 방법을 다룹니다.
2. 그림: 이 시리즈의 장난감 문제
학습을 몇 분 안에 끝내고 시드를 여러 개 돌려 중앙값을 내려면 문제가 작아야 합니다. 그래서 다음처럼 만들었습니다.
- 옆에서 본 2차원. 탁구대 길이 방향(y)과 높이(z)만 남기고 폭(x)은 버렸습니다. 좌표는 1~10편과 같습니다.
- 1자유도 진자 라켓. 회전축이 (y, z) = (−1.95, 0.90) m 에 있고 길이 0.75 m 의 팔이 아래로 매달려 앞뒤로 흔들립니다. 라켓 면의 법선은 팔에 수직이라, 맨 아래를 지난 뒤(φ > 0)에 공을 맞히면 앞·위로 띄웁니다. 관절 한계는 φ ∈ [−0.9, 0.9] rad, 속도 20 rad/s, 가속도 300 rad/s² 입니다(8편의 가정과 같은 크기).
- 공. DeepMind 데이터셋에서 로봇 쪽으로 오는 실제 타구의 y·z 위치·속도와 ω_x 회전을 그대로 썼습니다. 비행은 6편 모델(중력·항력·Magnus, 바운스), 라켓 반발은 7편 모델(e_r = 0.8, 마찰 무시)입니다. 물리는 1 ms 간격으로 적분합니다.
- 성공. 튕긴 공이 네트를 넘어 상대 쪽 탁구대(0 < y < 1.37 m)에 떨어지면 성공입니다.
- 공 나누기. 라켓 원호 근처를 지나는 공 7,315개(로봇 쪽 공 14,703개 가운데) 가운데 1,000개를 평가용으로 떼어 두고 학습에는 쓰지 않습니다(15편).
1자유도라서 라켓 각과 라켓 속도를 따로 고를 수 없습니다. 언제 맞히느냐가 곧 라켓 면의 각입니다. 그래서 일부 공은 어떻게 쳐도 돌려보낼 수 없고, 이 한계를 4절에서 「상한」으로 잽니다.
3. 틀: 마르코프 결정 과정
강화학습 문제는 보통 마르코프 결정 과정(Markov decision process, MDP)으로 적습니다. 다섯 요소를 탁구 팔에 대응시키면 다음과 같습니다.
| 요소 | 뜻 | 장난감 문제 | 실제 탁구 로봇 |
|---|---|---|---|
| 상태 s | 앞으로를 정하는 데 필요한 정보 전부 | φ, φ̇, 공 y·z·v_y·v_z, 시각, 바운스 여부(8개) | 관절 각·속도, 공 위치·속도의 최근 이력, 상대 정보 |
| 행동 a | 매 걸음 고르는 것 | 10 ms 마다 관절 가속도 1개(직접), 또는 타격 파라미터 2개(13편) | 관절 속도·토크 명령, 또는 타격 기술 선택 |
| 전이 P(s′|s, a) | 다음 상태가 정해지는 규칙 | 6·7편의 물리(학습자는 모름) | 현실 |
| 보상 r | 걸음마다 받는 숫자 | 넣으면 1(희소) 또는 형태를 준 보상(13편) | 설계자가 정함 |
| 할인 γ | 미래 보상을 얼마나 깎을지 | 0.99 | 문제마다 |
마르코프 성질. 「지금 상태만 알면 과거는 필요 없다」는 가정입니다. 공의 위치만 주고 속도를 빼면 이 가정이 깨집니다. 같은 위치라도 공이 오는지 가는지 알 수 없기 때문입니다. 지연이 있을 때도 깨집니다. 20 ms 전의 공을 보고 있다면 그사이 내가 보낸 명령도 알아야 지금을 알 수 있습니다. 그래서 실제 시스템은 최근 관측 여러 개를 상태에 넣습니다. D'Ambrosio 외 2024 의 저수준 정책은 공 위치·속도와 관절 상태의 최근 8걸음을 입력으로 받습니다(arXiv:2408.03906 II-C 절).
정책과 가치. 정책(policy) π(a|s) 는 상태에서 행동을 고르는 규칙입니다. 이 시리즈의 정책은 신경망이 평균을 내고 정규분포에서 행동을 뽑는 가우시안 정책입니다. 가치 함수(value function)는 「이 상태에서 이 정책을 따르면 앞으로 받을 보상의 할인 합이 평균 얼마인가」입니다.
되돌림(return): G_t = r_t + γ r_{t+1} + γ² r_{t+2} + …
상태 가치: V(s) = E[ G_t | s_t = s ]
행동 가치: Q(s, a) = E[ G_t | s_t = s, a_t = a ]
이점(advantage): A(s, a) = Q(s, a) − V(s) 「평소보다 얼마나 나은 행동이었나」
이점은 12편의 PPO 가 행동을 고칠 방향을 정하는 데 씁니다. 「좋은 결과」가 아니라 **「평소보다 좋은 결과」**에 상을 주어야 공이 쉬웠는지 행동이 좋았는지를 구분할 수 있습니다.
할인율과 지평. γ 는 미래 보상을 걸음마다 γ 배로 깎습니다. 대략 1/(1 − γ) 걸음 앞까지만 「보인다」고 생각할 수 있습니다.
| γ | 0.9 | 0.95 | 0.99 | 0.999 |
|---|---|---|---|---|
| 유효 지평 1/(1 − γ) | 10걸음(0.1 s) | 20걸음 | 100걸음(1.0 s) | 1,000걸음 |
장난감 문제의 에피소드 길이는 무작위 정책으로 잰 결과 5·50·95백분위가 62·105·137걸음이었습니다(10 ms 걸음). 성공 보상은 에피소드 끝에 한 번 오므로 γ = 0.9 로는 80걸음 전의 스윙 시작에 그 보상이 0.9⁸⁰ ≈ 0.0002 만 남습니다. 그래서 0.99 를 씁니다. 대신 지평이 길수록 되돌림의 분산이 커지는데, 이것을 다루는 것이 12편의 GAE 입니다.
4. 실측: 학습 없이 어디까지 가나
학습을 시작하기 전에 기준선(baseline)을 잽니다. 15편에서 다시 말하겠지만, 기준선 없는 학습 곡선은 아무것도 말해 주지 않습니다. 평가용 공 1,000개 결과입니다.
| 방법 | 성공(돌려보냄) | 라켓에 맞음 |
|---|---|---|
| 무작위 정책(매 걸음 가속도 균등 무작위) | 1.5% | 27.4% |
| 가만히 있기(준비 자세 유지) | 0% | 9.6% |
| 하이브리드 행동 공간의 최선 상수 행동(모든 공에 같은 타격 파라미터) | 45.9% | - |
| 고전 계획기: 회전 모르는 모델로 격자 119개를 시험해 공마다 고름 | 40.0% | - |
| 하이브리드 행동 공간의 상한: 참 결과로 격자에서 공마다 고름 | 85.4% | - |
- 모델이 틀리면 계획이 상수보다 못할 수 있습니다. 회전을 모르는 모델로 공마다 「가장 좋아 보이는」 행동을 고른 계획기(40%)가 모든 공에 같은 행동을 쓴 것(46%)보다 나빴습니다. 틀린 모델이 공마다 다른 방향으로 틀리기 때문입니다. 6편의 「회전을 모르면 5 cm」가 여기서 성공률로 드러난 것입니다.
- 상한 85%. 같은 행동 공간에서 결과를 미리 알고 골라도 15% 는 돌려보낼 수 없었습니다. 1자유도 라켓의 한계입니다. 학습이 이 숫자를 넘으면 행동 공간이 다르다는 뜻입니다(13편에서 직접 제어가 하이브리드와 비교됩니다).
- 미리 말하면, 12편의 PPO 는 같은 공에서 직접 제어로 중앙값 83% 에 닿았습니다.
4.1 환경을 한꺼번에 굴리기
강화학습은 표본을 많이 먹습니다. 12편의 한 번 학습이 환경 걸음 약 140만 개를 씁니다. 그래서 환경 여러 개를 벡터로 묶어 한꺼번에 굴리는 것이 기본입니다. numpy 로 환경 N 개를 같은 배열 연산으로 굴리며 처리량을 쟀습니다(다른 계산이 없을 때, 5회 가운데 첫 회 버리고 중앙값).
| 한꺼번에 굴린 환경 수 | 1 | 16 | 256 | 1,024 | 4,096 |
|---|---|---|---|---|---|
| 환경 걸음/초(중앙값) | 1,103 | 15,742 | 82,200 | 180,870 | 389,283 |
| 환경 하나일 때 대비 | 1배 | 14배 | 75배 | 164배 | 353배 |
환경 하나를 굴릴 때는 파이썬의 한 걸음 비용이 대부분이고, 배열이 커지면 그 비용이 여러 환경에 나뉩니다. Rudin 외 2021 은 같은 생각을 GPU 물리 엔진으로 밀어붙여 수천 대의 로봇을 병렬로 시뮬레이션하고, 평지 보행 정책을 워크스테이션 GPU 한 장에서 4분 안에 학습했다고 보고합니다(arXiv:2109.11978 초록). D'Ambrosio 외 2024 는 기본 정책을 병렬 시뮬레이션 워커 6,000개로 약 24억 걸음 학습했습니다(II-C 절). 14편에서 다시 다룹니다.
5. 한계
- 2차원·1자유도는 실제 탁구 팔과 다릅니다. 공의 좌우 위치, 라켓 면의 좌우 방향, 회전 축의 다른 성분을 모두 버렸습니다.
- 라켓은 명령한 가속도를 오차 없이 냅니다(9편의 제어 문제를 뺐습니다). 14편에서 지연과 잡음만 따로 넣습니다.
- 처리량은 이 장난감 환경의 숫자입니다. MuJoCo 같은 물리 엔진의 처리량은 미실측입니다.
6. 정리
- 강화학습의 틀은 상태·행동·전이·보상·할인 다섯 가지입니다. 탁구 팔에서는 「공과 팔의 상태」, 「관절 명령이나 타격 파라미터」, 「물리」, 「넣었나」, 「얼마나 멀리 보나」입니다.
- 지연이 있으면 마르코프 성질이 깨지므로 관측 이력을 상태에 넣습니다.
- 성공 보상이 1초 뒤에 오므로 γ = 0.99 처럼 긴 지평이 필요합니다.
- 학습 전에 기준선을 잽니다. 장난감 문제에서 무작위 1.5%, 틀린 모델의 계획기 40%, 행동 공간 상한 85% 입니다.
티티 한마디. 공이 떨어지고 나서야 잘했는지 알 수 있어요. 그래서 1초 전의 스윙까지 칭찬이 닿도록 할인율을 0.99 로 크게 잡았어요!
참고
모든 자료는 2026-10-18 에 열람했습니다.
- D'Ambrosio 외, Achieving Human Level Competitive Robot Table Tennis, arXiv:2408.03906, II-C 절(정책 입력).
- Rudin, Hoeller, Reist, Hutter, Learning to Walk in Minutes Using Massively Parallel Deep Reinforcement Learning, arXiv:2109.11978, 초록.
- Google DeepMind, competitive_robot_table_tennis, CC-BY 4.0.