가치를 겪어 보며 배우는 방법은 이미 있다. 시간차 학습은 한 스텝 가서 받은 보상과 다음 상태의 가치 예측을 더한 값 쪽으로 지금 상태의 예측을 조금 옮긴다. 에피소드가 끝날 때까지 기다리지 않아도 되고, 세상이 다음 상태를 뽑는 확률인 전이 확률을 몰라도 된다. 그렇게 해서 상태마다의 가치를 다 배웠다고 하자. 이제 어느 쪽으로 갈지 고를 수 있을까?
안개 낀 강가 산책로에 선 사람을 떠올려 보자. 그는 산책로의 칸마다 「여기서 정자까지 몇 걸음쯤 남았나」를 외우고 있지만, 안개 때문에 앞이 보이지 않는다. 오른쪽으로 한 걸음 내디디면 어느 칸에 닿는지, 혹시 강물에 발이 빠지지는 않는지 모른다. 칸마다의 값을 알아도 「이쪽으로 가면 어느 칸에 닿는가」를 모르면, 값이 높은 칸으로 가는 방향을 고를 수 없다. 상태의 가치로 행동을 고르려면 결국 전이 확률이 다시 필요하다.
다음 칸이 어디인지 모르는 채로, 겪어 본 것만으로 갈 방향을 고르려면 무엇을 배워야 할까?
배우는 동안에는 이것저것 시험해 봐야 하는데, 시험 삼아 걸은 스텝으로 배운 값은 누구의 값일까?
이 장은 상태 대신 (상태, 행동) 짝의 값을 직접 배우는 두 방법, 시험 삼아 걷는 스텝을 얼마나 섞을지 정하는 규칙, 그리고 「가장 좋아 보이는 값」을 목표로 삼을 때 생기는 편향을 다룬다.
SARSA: 내가 실제로 둘 수로 배운다
길을 고르는 데 필요한 것은 칸의 값보다 「이 칸에서 이 방향으로 걸으면 앞으로 얼마를 받는가」다. 칸과 방향의 짝마다 매기는 이 기댓값이 행동 가치 Q(s,a), 곧 상태 s에서 첫 행동을 a로 정하고 그 뒤로 정해진 규칙(정책, 상태마다 행동을 고르는 규칙)을 따를 때 받을 리턴(앞으로 받을 보상의 합)의 기댓값이다. 행동 가치를 알면 지도가 없어도 지금 칸의 네 방향 가운데 값이 가장 큰 쪽으로 걸으면 그만이다. 그러면 행동 가치도 시간차 학습처럼 한 스텝씩 배울 수 있을까?
걸리는 것이 하나 있다. 배우는 동안 늘 가장 커 보이는 방향만 고르면, 처음에 운 나쁘게 낮게 매긴 방향은 다시 시험할 기회가 없다. 그래서 가끔은 아무 방향으로나 걸어 본다. 그렇게 걸으며 모은 경험으로 배운 값은 「가끔 아무 방향으로나 걷는 나」의 값일까, 「늘 가장 좋아 보이는 방향으로만 걷는 나」의 값일까?
역사: 로봇의 신경망에서 다섯 글자 이름으로
1994년 9월, 케임브리지 대학 공학과의 개빈 러머리(Gavin Rummery)와 마헤산 니란잔(Mahesan Niranjan)이 기술 보고서 「On-line Q-learning using connectionist systems」를 냈다. 두 사람이 다룬 문제는 장애물 사이를 지나 목표 지점까지 가야 하는 모의 로봇이었다. 로봇이 아는 것은 주변을 더듬는 센서 값 몇 개뿐이고, 센서 값은 칸 몇 개로 끊어지지 않는 연속된 숫자다. 그래서 행동 가치를 표에 적는 대신 역전파로 학습하는 신경망으로 어림했다. 그때 흔히 쓰던 방법은 한 판이 끝난 뒤에야 지난 스텝들을 되짚으며 값을 고쳤는데, 보고서는 걷는 도중에 스텝마다 고치는 방법들을 견줬다. 그 가운데 새로 내놓은 업데이트 규칙에 붙인 이름이 「Modified Connectionist Q-Learning」(MCQ-L)이다. 보고서는 모의실험에서 걷는 도중에 고치는 방법이 판이 끝난 뒤 되짚는 방법보다 학습 설정을 덜 타고, 새 규칙이 표준 Q-러닝 업데이트보다 튼튼하다(robust)고 적었다.
오늘 이 방법을 부르는 이름 SARSA는 리처드 서튼(Richard Sutton)이 붙였다. 서튼과 앤드루 바토(Andrew Barto)의 교과서 『Reinforcement Learning: An Introduction』 2판은 이 알고리즘을 러머리와 니란잔이 처음 내놓았고 「Sarsa」라는 이름은 서튼의 1996년 글에서 왔다고 적는다. 1994년 보고서에도 이미 「리치 서튼은 SARSA라는 이름을 제안한다. 업데이트하기 전에 상태·행동·보상·상태·행동을 알아야 하기 때문이다.」라는 각주가 있다. 이름은 업데이트 한 번에 쓰는 다섯 가지, 곧 상태(State)·행동(Action)·보상(Reward)·다음 상태(State)·다음 행동(Action)의 머리글자다.
강가 산책로
이 장 내내 쓸 예제를 정하자. 왜 하필 강가일까? 짧지만 위험한 길과 길지만 안전한 길이 함께 있어야 「무작위 스텝을 셈에 넣느냐」가 답을 바꾸는지 볼 수 있다. 강물 옆을 지나는 지름길은 그런 갈림을 만드는 가장 작은 꼴이고, 칸이 마흔 개라 표 하나에 다 적힌다.
산책로는 4줄 × 10칸 격자다. 줄 0이 강에서 가장 먼 둑길이고 줄 3이 물가다.
출발점 S는 물가 줄의 맨 왼쪽 칸, 정자 G는 물가 줄의 맨 오른쪽 칸이다. 그 사이 물가 줄의 여덟 칸은 강물이다.
칸마다 위·아래·왼쪽·오른쪽 가운데 한 방향으로 한 칸 걷는다. 격자 밖으로 나가려 하면 제자리에 선다.
한 스텝마다 보상 −1을 받는다(빨리 닿을수록 좋다). 강물 칸으로 걸어 들어가면 −50을 받고 출발점으로 돌아가 다시 걷는다. 정자에 닿으면 에피소드가 끝나고, 할인은 하지 않는다(γ(감마, 할인율) = 1).
배우는 사람은 처음에 아무것도 모르므로 행동 가치 표의 160칸(칸 40개 × 방향 4개)을 모두 0으로 두고 출발한다. 걸을 때는 열 스텝에 한 번꼴로, 곧 확률 0.1로 네 방향 가운데 아무 쪽으로나 걷고, 나머지는 표에서 값이 가장 큰 쪽으로 걷는다. 이 확률을 ε(엡실론)이라 적자. 이렇게 고르는 규칙의 이름과 0.1이라는 숫자를 고르는 법은 뒤에서 따로 다룬다.
한 스텝을 갈 때마다 다섯 가지가 생긴다. 지금 칸 st, 고른 방향 at, 받은 보상 rt, 닿은 칸 st+1, 그리고 닿은 칸에서 실제로 고른 다음 방향 at+1이다. 시간차 학습이 「받은 보상 + 다음 상태의 가치」를 목표로 삼았듯, 여기서는 「받은 보상 + 다음 칸에서 실제로 고른 방향의 행동 가치」를 목표로 삼는다.
괄호 안의 차이는 시간차 학습의 TD 오차(목표와 지금 예측의 차이)와 같은 꼴이다. 정자에 닿은 스텝이면 다음 칸이 없으므로 목표는 rt 하나다. 이 규칙으로 행동 가치를 배우는 방법을 SARSA (실제로 고른 다음 행동으로 배우는 시간차 학습 / state-action-reward-state-action)라 한다.
ε = 0.1, α = 0.1로 에피소드 500번씩, 처음부터 따로 100번 학습시켰다(난수 씨앗 20261023). 표가 비어 있으니 처음에는 이리저리 헤매다 강물에 몇 번씩 빠져서, 처음 10 에피소드의 리턴은 평균 −298.6이었다. 마지막 100 에피소드의 리턴은 평균 −17.51(학습 100번 사이의 표준오차 0.13)이었고, 에피소드 하나에 강물에 빠진 횟수는 평균 0.045번이었다. 학습이 끝난 표에서 탐색 없이 값이 가장 큰 칸만 따라가 보면, 100번 가운데 94번이 13스텝 길이었다. 그 가운데 80번은 아래 그림의 길처럼 출발점에서 두 칸 올라가 물가에서 두 줄 떨어진 줄 1만 따라 걷고, 14번은 스텝 수는 같되 줄 2를 잠깐 지났다. 다섯 번은 표가 덜 다듬어져 길이 같은 두 칸 사이를 맴돌았고, 한 번은 15스텝 길이었다.
강물 바로 위 줄 2를 따라가면 11스텝이면 닿는데, SARSA는 왜 두 스텝을 더 쓰는 길을 골랐을까? 목표에 들어간 at+1이 답의 실마리다. 줄 2에 서 있으면 열 스텝에 한 번꼴로 아무 방향으로나 걷고, 네 방향 가운데 하나가 아래, 곧 강물이다. SARSA의 목표는 그 무작위 스텝까지 실제로 일어난 그대로 담는다. 그래서 줄 2 칸들의 값은 가끔 빠지는 −50에 끌려 내려가고, 표는 그 줄을 피하는 길을 가장 좋게 읽는다. 한 번의 업데이트에서 이 일이 어떻게 생기는지는 아래 문제 2에서 손으로 셈한다.
ML에서: 비평가가 배우는 값은 누구의 값인가
SARSA는 경험을 모은 규칙과 값을 배우는 규칙이 같다. 무작위 스텝까지 포함한 「지금 걷는 나」가 경험을 모으고, 그 「지금 걷는 나」의 값을 배운다. 데이터를 뽑은 정책과 학습하는 정책이 같은 이런 학습을 온폴리시(on-policy)라 부른다.
언어 모델을 강화학습으로 다듬을 때 쓰는 PPO의 비평가(상태마다 앞으로 받을 보상을 예측하는 모델)도 같은 처지다. 비평가는 정책이 샘플링 온도(로짓을 나눠 분포를 넓히거나 좁히는 값) 1로 뽑은 응답들로 학습한다. 그러니 비평가가 배운 값은 「가끔 덜 그럴듯한 토큰도 뽑는 정책」의 값이다. 같은 모델을 늘 가장 확률이 높은 토큰만 고르는 그리디 디코딩으로 쓸 때의 값과는 다를 수 있다. 얼마나 다른지는 아래 문제 3에서 본다.
문제 1. 비 오는 날의 출근길
민준은 집에서 버스로 환승역까지 간 뒤, 환승역에서 마을버스를 타거나 걸어서 회사에 간다. 걸리는 시간(분)에 −를 붙인 것을 보상으로 치고, 민준이 지금까지 어림한 값은 Q(집, 버스) = −40, Q(환승역, 마을버스) = −30, Q(환승역, 걷기) = −20이다. 오늘 버스는 환승역까지 15분 걸렸고, 비가 와서 민준은 환승역에서 마을버스를 골랐다. 학습률은 0.5다. (가) SARSA로 Q(집, 버스)를 고친 값은? (나) 비가 와서 고른 마을버스를 목표에 넣는 것이 옳은가?
선생님
민준 학생, (가)는 얼마가 나왔어요?
김민준
목표는 버스 15분에 그다음 값이니까, 환승역에서 더 좋은 쪽인 걷기 −20 을 붙여서 −15 − 20 = −35 요. 그럼 −40 + 0.5 × (−35 + 40) = −37.5 예요.
선생님
오늘 환승역에서 실제로 무엇을 탔죠?
김민준
마을버스요. SARSA 는 다음 칸에서 실제로 고른 행동을 쓰니까 −30 을 붙여야 하네요. 목표 −45, 고친 값은 −40 + 0.5 × (−45 + 40) = −42.5 예요.
이서연
(나)는 「민준이가 앞으로도 비 오는 날이면 마을버스를 탄다」면 옳아. 그게 민준이의 출근 방식이니까, 그 방식으로 다닐 때 집에서 버스를 타는 값이 −42.5 쪽이라는 거지.
선생님
그래요. SARSA 가 배우는 것은 내가 실제로 다니는 방식의 값이에요.
김민준
조별 과제 일정 짤 때 「내가 마음먹으면 하루 만에 끝낸다」로 잡으면 늘 밀리고, 실제로 내가 일하던 속도로 잡아야 맞는 거랑 같네요.
정리 (가) 목표 = −15 + (−30) = −45, Q(집, 버스) = −40 + 0.5 × (−45 + 40) = −42.5. 더 좋은 쪽(걷기 −20)을 붙이면 −37.5가 되지만, 그것은 SARSA가 아니다. (나) SARSA의 목표에는 다음 칸에서 실제로 고른 행동이 들어가므로, 배운 값은 실제로 다니는 방식(비 오면 마을버스)의 값이다.
문제 2. 물가 옆의 한 스텝
강가 산책로에서 줄 2의 한 칸에 서 있고, 그 칸에서 오른쪽으로 걷는 행동 가치는 지금 Q = −9다. 오른쪽으로 걸어 보상 −1을 받고 다음 칸에 닿았다. 다음 칸의 행동 가치는 오른쪽 −8, 아래(강물) −55, 위 −10, 왼쪽 −10이다. 학습률 α = 0.5, γ = 1. (가) 다음 칸에서 오른쪽을 골랐다면 SARSA로 고친 값은? (나) 다음 칸에서 아무 쪽으로나 걷는 차례가 와서 아래를 골랐다면? (다) 다음 칸에서 ε = 0.1로 방향을 고른다면, 목표의 기댓값은 얼마인가?
선생님
서연 학생, (가)부터요.
이서연
목표가 −1 + (−8) = −9 라서 지금 값과 같아요. 고친 값도 −9 그대로예요.
선생님
(나)는요?
이서연
목표가 −1 + (−55) = −56. 그런데 이건 아무 쪽으로나 걸은 차례에 우연히 나온 거니까, 학습에는 빼는 게 맞지 않을까요? 운이 나빴던 한 번이잖아요.
선생님
이 칸에서 열 스텝에 한 번꼴로 아무 쪽으로나 걷는 버릇이 있다면, 그 버릇은 학습이 끝날 때까지 계속되나요?
이서연
계속돼요. 그러면 다음 칸에서 아래로 가는 일은 운이 아니라 제 걷는 방식에 늘 들어 있는 일이네요.
선생님
그 스텝을 빼고 배우면 무엇의 값을 배우게 되죠?
이서연
제가 실제로 걷는 것보다 조심스러운 방식의 값이요. 제 방식의 값을 너무 좋게 읽게 돼요. 넣고 고치면 −9 + 0.5 × (−56 + 9) = −32.5 예요.
김민준
(다)는 제가 해 볼게요. 오른쪽은 0.9 + 0.1/4 = 0.925 확률이고 나머지 셋은 0.025 씩이에요.
−9 보다 낮은 쪽으로요. 다음 칸에서 오른쪽만 가면 −9 인데, 무작위 스텝이 섞이니까 평균이 −10.275 쪽으로 내려가요. 물가 옆 칸들은 다 이렇게 깎이겠네요.
이서연
그래서 SARSA 의 표가 물가 줄을 피하는 길을 고르는구나. 확률론에서 기댓값을 셀 때 드문 경우도 빠짐없이 더해야 하는 것과 같아요. 드물어도 −55 처럼 크면 평균을 끌어내리니까요.
정리 (가) 목표 −9, 고친 값 −9. (나) 목표 −56, 고친 값 −9 + 0.5 × (−47) = −32.5. 무작위 스텝은 걷는 방식의 일부이므로 SARSA가 그것을 뺄 이유는 없다. (다) 0.925 × (−8) + 0.025 × (−55) + 0.05 × (−10) = −9.275, 목표의 기댓값 −10.275. 물가 옆 칸의 값은 무작위 스텝의 위험만큼 깎이고, 그래서 SARSA는 물가에서 떨어진 길을 고른다.
문제 3. 비평가는 어느 디코딩의 값을 배웠나
언어 모델이 수학 문제를 풀다가 어느 자리까지 썼다(상태 s). 샘플링 온도 1로 뽑으면 모델은 0.7의 확률로 좋은 이어 쓰기를, 0.3의 확률로 엇나간 이어 쓰기를 한다. 좋은 이어 쓰기 뒤에는 결국 0.9의 확률로, 엇나간 뒤에는 0.3의 확률로 정답에 닿는다(정답 1점, 오답 0점). 그리디 디코딩은 늘 좋은 이어 쓰기를 고른다. (가) 샘플링 온도 1로 모은 롤아웃(정책을 끝까지 돌려 본 응답)으로 학습한 비평가는 이 상태의 값을 얼마로 배우는가? (나) 이 모델을 그리디 디코딩으로 배포하면 이 상태에서 실제로 정답에 닿을 확률은? (다) 비평가의 값과 배포했을 때의 값이 다른 것은 잘못인가?
선생님
민준 학생, 비평가가 배우는 값은요?
김민준
좋은 이어 쓰기를 주로 하니까 0.9 요.
선생님
비평가가 보는 롤아웃 열 개 가운데 엇나간 이어 쓰기는 몇 개쯤이고, 그 롤아웃의 점수는 평균 얼마죠?
김민준
세 개쯤이고 평균 0.3 이요. 그럼 0.7 × 0.9 + 0.3 × 0.3 = 0.72 예요.
선생님
비평가는 그 열 개로 무엇을 배우죠?
김민준
뽑힌 롤아웃의 평균이요. 그러니까 0.72 가 되네요. 아까 출근길에서 실제로 탄 마을버스를 넣은 거랑 같아요.
선생님
(나)와 (다)는요? 서연 학생.
이서연
(나)는 0.9 예요. 그리디 디코딩은 엇나가는 쪽을 안 고르니까요.
선생님
그럼 비평가의 0.72 는 틀린 값인가요?
이서연
음… 틀린 값은 아닌 것 같아요. 학습하는 동안 정책은 샘플링으로 응답을 뽑고, 비평가는 그 정책이 이 상태에서 앞으로 받을 점수를 예측하는 거잖아요.
선생님
그래요. 비평가는 경험을 모은 정책, 곧 샘플링 온도 1의 정책을 평가해요. 온폴리시니까요. 배포 때 디코딩 방식을 바꾸면 그 값은 배포한 정책의 값이 아니게 돼요.
이서연
해석학에서 수열의 극한을 물을 때, 어느 수열의 극한인지부터 정해야 답이 하나로 정해지는 거랑 비슷해요.
정리 (가) 0.7 × 0.9 + 0.3 × 0.3 = 0.72. (나) 0.9. (다) 잘못이 아니다. 온폴리시 학습의 비평가는 롤아웃을 뽑은 정책(샘플링 온도 1)의 값을 배우므로, 배포 때 그리디 디코딩으로 바꾸면 그 정책은 다른 정책이고, 값도 다르다.