Path: blob/master/site/ko/agents/tutorials/bandits_tutorial.ipynb
25118 views
Copyright 2023 The TF-Agents Authors.
TF-Agents의 다중 슬롯머신(Multi Armed Bandits)에 대한 튜토리얼
설치
다음과 같은 종속성을 설치하지 않은 경우, 다음을 실행합니다.
가져오기
소개
다중 슬롯머신 문제(MAB)는 특별한 강화 훈련의 사례입니다. 에이전트는 환경의 일부 상태를 관찰하며 몇 가지 행동을 수행한 후 환경에서 보상을 수집합니다. 일반 RL과 MAB의 주요 차이점은 MAB에서는 에이전트가 수행한 행동이 환경의 다음 상태에 영향을 미치지 않는다고 가정하는 것입니다. 이에 에이전트는 상태 전환을 모델링하거나 과거 행동에 대한 보상을 제공하거나 보상이 풍부한 상태에 도달하기 위해 "미리 계획"하지 않습니다.
다른 RL 도메인과 마찬가지로 MAB 에이전트의 목표는 최대한 많은 보상을 수집하는 정책을 찾는 것입니다. 그러나, 항상 가장 높은 보상을 약속하는 행동만 활용하려고 하는 것은 오히려 실수일 수 있습니다. 왜냐하면 충분히 탐색하지 않으면 더 나은 행동을 하지 못하게 될 가능성이 있기 때문입니다. 이것이 (MAB)에서 해결해야 하는 주요 문제이며 이는 종종 탐사-활용 딜레마라고 불립니다.
MAB용 슬롯머신 환경, 정책, 에이전트는 tf_agents/bandits의 하위 디렉토리에서 확인할 수 있습니다.
환경
TF-Agents에서 환경 클래스는 현재 상태에 대한 정보를 제공하는 역할을 수행하며(이를 일컬어 관찰 또는 맥락이라고 함), 이때 입력으로 행동을 받아들이고 상태 전환을 수행하고 보상을 출력합니다. 또한 이러한 클래스는 에피소드가 종료될 때 재설정을 처리하며 이를 통해 새 에피소드를 시작할 수 있습니다. 이는 상태가 에피소드의 "마지막"으로 레이블링 될 때 reset
함수를 호출함으로써 실현됩니다.
자세한 내용은 TF-Agents 환경 튜토리얼을 참조합니다.
위에서 언급했듯이 MAB는 행동이 다음 관찰에 영향을 미치지 않는다는 점에서 일반 RL과 다릅니다. 또 다른 차이점은 슬롯머신(Bandits)에는 "에피소드"가 없다는 것입니다. 매 시간의 단계는 이전 시간의 단계와 관련 없는 독립적인 새로운 관찰로 시작됩니다.
관찰이 독립적인지 확인하고 RL 에피소드의 개념을 추상화하기 위해 PyEnvironment
및 TFEnvironment
의 하위 클래스의 하위 클래스인 BanditPyEnvironment와 BanditTFEnvironment를 도입합니다. 이러한 클래스들은 사용자가 구현해야 하는 두 개의 비공개 멤버 함수를 노출합니다.
그리고
_observe
함수는 관찰을 반환합니다. 그런 다음 정책은 이 관찰을 기반으로 행동을 선택합니다. _apply_action
은 해당 행동을 입력으로 수신하고 그에 해당하는 보상을 반환합니다. 이러한 비공개 멤버 함수는 각각 reset
및 step
함수에 의해 호출됩니다.
위의 임시 추상 클래스는 PyEnvironment
의 _reset
과 _step
함수를 구현하고 추상 함수 _observe
와 _apply_action
을 노출하여 서브 클래스로 구현되도록 합니다.
간단한 예시 환경 클래스
다음 클래스는 관찰이 -2와 2 사이의 임의의 정수이고, 3가지 가능한 행동(0, 1, 2)이 있고, 보상이 행동과 관찰의 곱인 매우 간단한 환경을 제공합니다.
이제 우리는 이 환경을 사용하여 관찰 결과를 가져오고 우리의 행동에 대한 보상을 받을 수 있습니다.
TF 환경
BanditTFEnvironment
를 하위 클래스화하여 슬롯머신(Bandit) 환경을 정의하거나 RL 환경과 유사하게 정의하거나, BanditPyEnvironment
를 정의하고 TFPyEnvironment
로 래핑할 수 있습니다. 간단하게 보여주기 위해 이 튜토리얼에서는 후자 옵션을 사용합니다.
정책
슬롯머신(bandit) 문제의 정책은 RL 문제와 동일한 방식으로 작동합니다. 즉, 입력으로 관찰이 주어지면 행동(또는 행동 분포)을 제공합니다.
자세한 내용은 TF-Agents 정책 튜토리얼을 참조합니다.
환경과 마찬가지로 정책을 구성하는 두 가지 방법이 있습니다. 하나는 PyPolicy
를 생성하고 이를 TFPyPolicy
로 래핑하거나 직접 TFPolicy
를 생성하는 것입니다. 여기서는 직접 수행하는 방법으로 진행합니다.
이 예시는 매우 간단하기 때문에 최적의 정책을 수동으로 정의할 수 있습니다. 행동은 관찰 대상의 부호에만 의존하며, 음수일 경우에는 0이고 양수일 경우에는 2입니다.
이제 환경에서 관찰을 요청할 수 있으며, 정책을 호출하여 행동을 선택하면 다음과 같이 환경에서 보상을 출력합니다.
슬롯머신(bandit) 환경이 구현되는 방식은 우리가 단계를 밟아갈 때마다 수행한 행동에 대한 보상뿐만 아니라 다음 관찰에 대한 보상도 받을 수 있도록 합니다.
에이전트
이제 슬롯머신 환경과 정책이 있으므로 훈련 샘플을 기반으로 정책 변경을 처리하는 슬롯머신 에이전트도 정의해야 합니다.
슬롯머신 에이전트용 API는 RL 에이전트의 API와 다르지 않습니다. 에이전트에 대해 _initialize
및 _train
메서드를 구현하고 policy
와 collect_policy
를 정의하기만 하면 됩니다.
더 복잡한 환경의 경우
슬롯머신 에이전트를 작성하기 전에 이해하기 조금 더 어려운 환경이 필요합니다. 약간의 재미를 주기 위해 다음 환경은 항상 reward = Observation * action
또는 reward = -observation * action
을 제공합니다. 이는 환경이 초기화될 때 결정됩니다.
더 복잡한 정책의 경우
더 복잡한 환경은 더 복잡한 정책을 요구합니다. 우리는 기본 환경의 동작을 감지하는 정책이 필요합니다. 이 정책에서 처리해야 하는 세 가지 상황은 다음과 같습니다.
에이전트가 실행중인 환경의 버전을 아직 감지하지 못했습니다.
에이전트가 원래 버전의 환경이 실행중임을 감지했습니다.
에이전트가 반전된 버전의 환경이 실행중임을 감지했습니다.
우리는 _situation
이라는 이름으로 tf_variable
을 정의하여 이 정보를 [0, 2]
값으로 인코딩하여 저장한 후 이에 따라 정책이 작동하도록 합니다.
에이전트
이제 환경의 부호를 감지하고 정책을 적절하게 설정하는 에이전트를 정의할 차례입니다.
위의 코드에서 에이전트는 정책을 정의하며, 에이전트와 정책은 변수 situation
을 공유합니다.
또한 _train
함수의 매개변수 experience
는 궤적입니다.
궤적
TF-Agents에서 trajectories
는 이전 단계에서 수행한 샘플을 포함하는 명명된 튜플(named tuples)입니다. 에이전트는 이러한 샘플을 사용하여 정책을 훈련하고 업데이트합니다. RL의 궤적은 현재 상태, 다음 상태, 현재 에피소드의 종료 여부에 대한 정보를 포함해야 합니다. 슬롯머신(bandit) 세계에서는 이런 정보가 필요하지 않기 때문에 우리는 궤적을 생성하는 도우미 함수를 설정합니다.
에이전트 훈련하기
이제 우리의 슬롯머신(bandit) 에이전트를 훈련할 모든 준비가 완료되었습니다.
출력에서, 두 번째 단계 이후(첫 번째 단계에서 관찰 결과가 0이 아닌 한) 정책이 올바른 방식으로 행동을 선택하므로 수집된 보상이 항상 음수가 아닌 것을 확인할 수 있습니다.
실제 상황별 슬롯머신 예시
선형보수함수가 있는 정상확률 환경
이 예시에서 사용하는 환경은 StationaryStochasticPyEnvironment입니다. 이 환경은 매개변수로 (일반적으로 노이즈가 있는) 함수를 취합니다. 이는 주어진 관찰 환경(맥락)과, 주어진 관찰을 기반으로 보상을 계산하는 (추가 노이즈) 함수를 취하는 모든 슬롯머신 손잡이를 대상으로 합니다. 이 예시에서는 d차원 큐브의 맥락(context)를 균일하게 샘플링하며, 보상 함수는 맥락의 선형 함수에 가우시안 노이즈를 더한 것입니다.
LinUCB 에이전트
아래의 에이전트는 LinUCB 알고리즘을 구현합니다.
기회손실 메트릭(Regret Metric)
슬롯머신에서 가장 중요한 메트릭은 에이전트가 수집한 보상과 환경의 보상 기능에 액세스하는 예측 시스템 정책의 예상 보상 간의 차이로 계산되는 후회(regret)입니다. 따라서 RegretMetric은 관찰을 제공 받았을 때 달성 가능한 최대 보상을 계산하여 예상하는 baseline_reward_fn 함수를 필요로 합니다. 우리의 예시에서는 환경에 대해 이미 정의한 보상 함수 중 노이즈가 없는 최대 보상을 취해야 합니다.
훈련하기
이제 위에서 소개한 모든 구성 요소인 환경, 정책, 에이전트를 한곳에 모았습니다. 우리는 드라이버를 사용하여 환경 정책을 실행하고 훈련 데이터를 출력하고, 에이전트로 하여금 데이터를 학습시킵니다.
수행한 단계 수를 함께 지정하는 두 개의 매개변수가 있습니다. num_iterations
는 훈련 루프를 실행하는 횟수를 지정하고 드라이버는 반복할 때마다 steps_per_loop
단계를 수행합니다. 일부 작업은 반복 작업을 통해 수행하고 일부 작업은 드라이버를 통해 모든 단계마다 수행하기 때문에 이러한 매개변수를 모두 유지해야 합니다. 예를 들어 에이전트의 train
함수는 반복당 한 번만 호출됩니다. 더 자주 훈련하면 정책이 "신선"할 수 있지만 반면에 더 큰 배치로 훈련할 경우 더 시간 효율적일 수 있기에 우리는 균형을 잘 유지해야 합니다.
마지막 코드 스니펫을 실행한 후 결과 플롯(희망적으로)은 에이전트 훈련이 진행됨에 따라 평균 후회 횟수가 줄어들고, 관찰이 제공되는 경우 올바른 행동이 무엇인지 파악하는 정책이 향상되는 모습을 보여줍니다.
다음은?
더 많은 작업 예시를 보려면 여러 에이전트와 환경을 바로 실행할 수 있는 예제가 있는 bandits/agents/examples를 참조해 주시길 바랍니다.
TF-Agents 라이브러리는 독립적인 슬롯머신 손잡이(per-arm) 특성을 지닌 다중 슬롯머신(Multi-Armed Bandits)도 처리할 수 있습니다. 해당 내용은 독립적인 슬롯머신 손잡이 튜토리얼을 참조합니다.