강화학습은 에이전트가 시행착오를 통해 환경과 상호작용하며 최적의 정책을 찾아가는 머신러닝 방법이다. ( 온폴리시와 오프폴리시, 몬테카를로와 TD 학습 등 다양한 접근 방식) 이는 인간의 학습 방식과 유사하게, 행동에 따른 결과(보상)을 바탕으로 점진적으로 더 나은 선택을 하도록 학습한다.
실제 응용에서는 강화학습이 2가지 방식으로 활용된다. 첫째 실시간으로 학습하며 업데이트하는 온라인 강화학습과 둘째, 미리 수집된 데이터로 학습 후 고정된 정책을 사용하는 오프라인(배치)강화학습이다.
실시간으로 업데이트하지 않아도 되는 경우는 batch reinforcement learning=offline reinforcement learning 이라고 부른다. 오프라인강화학습의 특정은 환경과의 추가 상호작용이 없다. 즉 배포후 모델이 고정되는 경우다. 데이터 수집이 비싸거나, 배포후 계산 자원에 제약이 있는 경우 또는 추천시스템과 같이 상호작용한 로그로 학습한후 정기적으로 업데이트가 이뤄지는 경우를 들수 있다.
예를 들어, 자율주행차는 시뮬레이션에서 기본 주행 정책을 학습한 후, 실제 도로에서는 특정 도로 조건이나 날씨에 대한 정책 파라미터, 운전자 스타일에 적응하기 위한 보상 함수 가중치 등을 실시간으로 업데이트한다. 로봇 팔 제어 시스템은 물체의 무게나 마찰에 관한 모델 파라미터, 특정 동작의 성공/실패에 따른 Q값 등을 지속적으로 조정한다.
반면, 의료 의사결정 시스템이나 금융 분석 도구와 같이 안전이 중요하거나 실패 비용이 높은 응용에서는 오프라인 강화학습이 선호된다. 이러한 시스템은 충분한 데이터로 학습한 후 배포되며, 실시간 업데이트 없이 정기적인 재학습을 통해 갱신된다.
이 글에서는 일상적인 카페 챗봇 예시를 통해 강화학습의 핵심 개념인 상태, 행동, 보상의 관계와 벨만 방정식, TD 학습의 원리를 쉽게 설명하고자 한다. 코드 구현보다는 개념적 이해에 중점을 두어, 강화학습의 기본 메커니즘을 직관적으로 파악할 수 있도록 정리한다.
다음은 강화학습에 들어가기 앞서 필요한 개념이다.
상태(State, S):
- 환경의 현재 상황이나 에이전트가 처한 상황을 나타내는 표현
- 예: 바둑판의 현재 배치, 게임 캐릭터의 위치, 로봇의 관절 각도 등
행동(Action, A):
- 에이전트가 취할 수 있는 모든 가능한 선택
- 예: 바둑에서 돌을 놓는 위치, 로봇이 움직이는 방향 등
보상(Reward, R):
- 행동 후 환경으로부터 받는 피드백 신호(숫자)
- 에이전트의 학습 목표를 정의함
- 예: 게임에서 점수 획득, 로봇이 목표에 도달했을 때 양수 보상
로봇제어를 예를 들어보면 상태, 행동, 보상은 아래처럼 정의할수있다.
상태(State):
- 로봇 관절 각도들
- 목표 물체의 위치와 방향
- 그리퍼(집게)의 현재 상태
- 주변 장애물 정보
행동(Action):
- 각 관절의 각도 변화량 (연속적 값)
- 그리퍼 열기/닫기 명령
보상(Reward):
- 물체에 가까워짐: 거리에 비례한 작은 양수
- 물체를 성공적으로 집음: +100
- 물체를 떨어뜨림: -20
- 과도한 힘 사용: -1 (에너지 효율성 촉진)
사용자가 아메리카노를 주문하는 상황이 있다고 가정해보자.
1단계
상태(s₁):
사용자가 "아메리카노 주문할래요"라고 말한 상태
현재까지의 정보: 아메리카노 주문 의향
가능한 챗봇 행동들:
a₁: "사이즈를 선택해주세요. (S/M/L)"
a₂: "몇 잔 필요하신가요?"
a₃: "아메리카노 가격은 4,000원입니다. 주문하시겠어요?"
챗봇의 선택 행동(a₁): "사이즈를 선택해주세요. (S/M/L)"
보상(r₁):
초기 보상 +1 (적절한 질문이지만 아직 주문 완료는 아님)
2단계
사용자: "M 사이즈로 주세요"
상태(s₂):
이전 대화 내용 + "M 사이즈로 주세요"
현재까지의 정보: 아메리카노 M 사이즈 주문 의향
가능한 챗봇 행동들:
a₁: "몇 잔 필요하신가요?"
a₂: "아메리카노 M 사이즈는 4,500원입니다. 주문하시겠어요?"
a₃: "매장에서 드실건가요, 포장인가요?"
챗봇의 선택 행동(a₂): "아메리카노 M 사이즈는 4,500원입니다. 주문하시겠어요?"
보상(r₂):
중간 보상 +2 (정보 제공과 함께 주문 결정을 유도)
3단계
사용자: "네, 주문할게요"
상태(s₃):
전체 대화 내용 + "네, 주문할게요"
현재까지의 정보: 아메리카노 M 사이즈 주문 확정
챗봇의 선택 행동(a₃): "주문이 완료되었습니다. 결제는 카운터에서 해주세요."
보상(r₃):
높은 보상 +10 (주문 성공)
가치함수 Q함수가 하는것은 "각 상태에서 어떤 행동이 장기적으로 가장 큰 보상을 가져올지 예측한다"
Q(s1, "사이즈를 선택해주세요?) = 13(할인된 미래 보상 포함)
Q(s1, "몇 잔 필요하신가요?") = 10
학습과정은 처음에는 Q값들이 랜덤하게 초기화된다. 대화 경험을 통해 점차 정확한 Q값을 학습한다. 여러 대화 후에는 Q(s1,a1)이 다른 행동들 보다 높은 값을 가지게 된다.
실제 적용을 한다면 만약 많은 고객이 사이즈를 먼저 물었을때 주문으로 이어진다면, 챗봇은 점차 '아메리카노 주문'상태에서 '사이즈 질문'행동의 Q값을 높게 학습 할것이다. 또는 바로 가격을 언급했을때 고객이 주문을 취소하는 경우가 많다면 그 행동의 Q값은 낮아진다. 이런식으로 챗봇은 어떤 대화 상태에서 어떤 응답이 궁극적으로 높은 보상으로 이어질지를 학습하게 된다. (주문완료, 고객만족)
위 예시는 온라인 학습방식의 예시이다. 실시간으로 사용자와 상호작용하며 Q값을 업데이트 하는 과정이다.
이 경우 TD(시간차)학습이 더 적합하다.
- 실시간 적응 필요성:
- 챗봇은 계속해서 새로운 사용자와 대화하며 즉각적으로 적응해야 함
- TD는 매 단계마다 업데이트하므로 빠른 적응 가능
- 완전한 에피소드 기다림 불필요:
- 주문 완료까지 기다리지 않고도 중간 단계에서 학습 가능
- 예: "사이즈를 물었더니 고객이 긍정적으로 반응" → 바로 해당 행동의 가치 상향 조정
- 부트스트래핑 효과:
- 다음 상태의 가치 추정치를 활용해 현재 행동 가치 업데이트
- 식으로는: Q(s,a) ← Q(s,a) + α[r + γ * max_a' Q(s',a') - Q(s,a)]
- 효율성:
- 대화는 여러 턴이 필요할 수 있으며, MC처럼 모든 대화가 끝날 때까지 기다리면 비효율적
- 특히 중간에 사용자가 대화를 중단할 가능성 있음
MC(몬테카를로) 방식의 한계:
- 완료된 에피소드 필요:
- 주문 완료 또는 대화 종료까지 기다려야 함
- 중간에 포기한 사용자의 데이터는 학습에 즉시 활용 어려움
- 지연된 학습:
- 실시간 대화 환경에서는 즉각적인 적응이 중요한데, MC는 지연됨
- 모든 대화가 끝날 때까지 Q값 업데이트 없음
- 희소 보상 문제:
- 최종 보상(주문 완료)만 의미 있고 중간 보상이 적은 경우 학습 어려움
실제 챗봇 시스템에서는 주로 TD 기반 방법(특히 DQN, A2C 등 딥러닝 결합)을 사용하거나, 경우에 따라 MC와 TD를 혼합한 방법(예: TD(λ))을 사용한다.
실제 강화학습 알고리즘에서 벨만방정식이 위 예시에서 어떻게 적용되는지 살펴본다.
우선 벨만방정식이란? 현재 상태의 가치는 즉각적인 보상과 다음 상태의 가치에 의존한다. 는 재귀적 관계를 수립함으로써, 상화학습이 순차적 의사결정 문제를 효율적으로 풀수 있게 해준다는 개념이다. 즉 현재 행동의 가치가 즉각적인 보상과 다음 상태에서 얻을수 있는 최대 가치의 합으로 표현된다는 아이디어이다. 즉 당장의 응답만이 아니라, 그 응답이 미래 대화 흐름에 어떤 영향을 미칠지까지 고려하여 최적의 응답을 선택하게 된다. 즉 벨만방정식 자체는 "어떤 상태나 행동의 진정한 가치가 무엇인가? 를 정의하는 수학적 관계식이다.
Q(s,a) = r + γ * max_a' Q(s',a')
위는 이상적인 Q값이 무엇인지 수학적으로 정의하는 식이다.
TD학습 업데이트 식은
Q(s,a) ← Q(s,a) + α[r + γ * max_a' Q(s',a') - Q(s,a)]
벨만 방정식을 기반으로 만들어진 실제 학습 알고리즘이다.
r + γ * max_a' Q(s',a') : 벨만 방정식을 통해 계산한 Target값이다.
현재 추정값 Q(s,a)와 이 목표값의 차이(오차)를 구한다.
이 오차의 일부(알파만큼)를 현재 추정값에 더해 업데이트 한다.
벨만방정식은 "이 상태에서 이 행동의 진짜 가치는 무엇인가?"를 정의하고 TD학습은 "그럼 현재 추정값을 그 방향으로 얼마나 조정할까?"를 결정한다.
카페 챗봇 예시에서 벨만 방정식이 어떻게 적용되는지 구체적으로 예시를 보고 글을 마무리 한다.
첫 번째 상태(s₁): 사용자가 "아메리카노 주문할래요"라고 말한 상태
선택된 행동(a₁): "사이즈를 선택해주세요"
즉각적 보상(r₁): +1
다음 상태(s₂): 사용자가 "M 사이즈로 주세요"라고 응답한 상태
이때 Q(s₁,a₁), 즉 "아메리카노 주문" 상태에서 "사이즈 물어보기" 행동의 가치를 정의해보자.
Q(s₁,a₁) = r₁ + γ * max_a' Q(s₂,a')
여기서:
r₁ = +1 (사이즈를 물어봤을 때의 즉각적인 보상)
γ = 0.9 (가정, 할인 계수)
max_a' Q(s₂,a') = 15 (다음 상태에서 가능한 행동 중 최대 Q값, "가격 확인" 행동의 Q값)
즉
Q(s₁,a₁) = 1 + 0.9 * 15 = 1 + 13.5 = 14.5
TD학습 업데이트
Q(s₁,a₁) ← Q(s₁,a₁) + α[r₁ + γ * max_a' Q(s₂,a') - Q(s₁,a₁)]
여기서:
α = 0.1 (가정, 학습률)
현재 Q(s₁,a₁) = 13 (다이어그램에서 보이는 값)
따라서:
Q(s₁,a₁) ← 13 + 0.1 * (1 + 0.9 * 15 - 13)
Q(s₁,a₁) ← 13 + 0.1 * (1 + 13.5 - 13)
Q(s₁,a₁) ← 13 + 0.1 * 1.5
Q(s₁,a₁) ← 13 + 0.15
Q(s₁,a₁) ← 13.15
즉, "아메리카노 주문" 상태에서 "사이즈 물어보기" 행동의 Q값이 13에서 13.15로 약간 증가합니다.
이런 업데이트가 여러 대화에 걸쳐 반복되면서 Q값은 점차 실제 가치에 수렴하게 됩니다.
벨만 방정식은 현재 행동의 가치가 즉각적인 보상과 다음 상태에서 얻을 수 있는 최대 가치의 합으로 표현된다는 강력한 아이디어이다.
위 예시에서 보면 챗봇은 점차 "아메리카노 주문" 상태에서 "사이즈 질문" 행동의 Q값을 높게 학습하게 된다.