강화학습에서 행동이라는 것은 에이전트가 환경을 다음 상태로 전이시키면서 환경에 변화를 줄때 발생하는 결과물입니다. 이러한 다음 상태도 에이전트가 인지하고 다음 행동을 계획하게 됩니다. 행동의 설계는 에이전트에게 환경을 변화시킬 능력을 주는 것으로 매우 중요합니다. 에이전트의 행동을 어떻게 설계하느냐에 따라 에이전트가 움직여야 할 방향성이 정해지기에 시스템 제어가 쉬울수도 있고 어려울 수도 있습니다. 이러한 행동의 설계가 해결하고자 하는 문제의 난이도를 높일수도 있고 낮출수도 있는데 이 행동의 설계는 한번으로 끝나는 것이 아닌 계속적인 반복 피드백을 통해 수정해 나가야 할 하이퍼 파라미터 같은 개념으로 보셔도 좋습니다. 행동이라 함은 간단히 말해서는 제어인데, 제어 중 사람의 도움이 필요없는 자율제어를 말합니다. 에이전트에게 자율제어의 능력을 줌으로써 스스로 환경을 변화시키고 또 그 변화된 환경에서의 다음 행동을 스스로 결정하도록 하는게 강화학습에서의 행동이라고 할수 있습니다.
강화학습(한글화학습)에서 행동 공간(action space)은 에이전트가 취할 수 있는 모든 가능한 행동의 집합을 의미합니다. 행동 공간의 정의는 강화학습 문제의 중요한 부분으로, 에이전트의 학습 과정과 성능에 큰 영향을 미칩니다. 행동 공간은 주로 두 가지 형태로 나눌 수 있습니다: 이산형(discrete)과 연속형(continuous). 1. 이산형 행동 공간 이산형 행동 공간은 가능한 행동의 개수가 유한한 경우입니다. 예를 들어, 에이전트가 특정 환경에서 선택할 수 있는 행동이 명확하게 구분되고 제한된 경우에 사용됩니다. 예시: 게임: 게임에서 캐릭터가 이동할 수 있는 방향(위, 아래, 왼쪽, 오른쪽). 로봇: 로봇이 특정한 방향으로 이동하거나, 특정한 작업을 수행하는 경우. from gym import spaces # 4개의 행동(위, 아래, 왼쪽, 오른쪽)을 가지는 이산형 행동 공간 action_space = spaces.Discrete(4) 위와 같은 형태로 이산형 액션을 구성할 수 있습니다. 2. 연속형 행동 공간 연속형 행동 공간은 가능한 행동이 연속적인 값을 가질 수 있는 경우입니다. 이는 에이전트가 다양한 행동을 보다 정밀하게 선택할 수 있는 환경에서 사용됩니다. 예시: 로봇 제어: 로봇 팔의 각도를 조정하거나, 차량의 속도를 조절하는 경우. 드론 비행: 드론의 비행 경로와 속도를 연속적으로 조정하는 경우. from gym import spaces import numpy as np # 행동이 [-1.0, 1.0] 범위의 실수 값을 가질 수 있는 연속형 행동 공간 action_space = spaces.Box(low=-1.0, high=1.0, shape=(1,), dtype=np.float32) 위와 같은 형태로 연속형 액션을 구성할 수 있습니다. 행동 공간은 단일 행동에 국한되지 않고, 여러 개의 행동 차원을 가질 수도 있습니다. 예를 들어, 로봇의 팔이 여러 개의 관절을 가지는 경우 각 관절에 대한 움직임이 하나의 행동 차원으로 정의될 수 있습니다. # 두 개의 행동 차원 (예: 로봇의 두 관절에 대한 연속적인 움직임) action_space = spaces.Box(low=-1.0, high=1.0, shape=(2,), dtype=np.float32) 이처럼 액션 즉 행동은 엘리베이터 층수를 나타내는 것처럼 이산적인 정숫값으로 표현할수 있고, 또는 자동차의 가속페달처럼 연속적인 실숫값이 될수 있습니다. 또는 전원 버튼(이산적)과 온도조절 손잡이(연속적)가 있는 온도 전자제어 시스템처럼 이산적인 값과 연속적인 값이 섞여 있을수도 있고, 또한 행동이 2개 이상의 요소(차원0을 가질수도 있으며 각 요소의 제한은 없습니다. 표준적 계산을 위한 라이브러리 호환성과 편의성을 위해 행동도 하나의 유형 즉, int나 float형태를 갖는 텐서로 부호화되고 행동은 임의의 랭크와 모양을 가질수도 있습니다. 행동은 텐서의 조합으로 전원켜는 버튼과 돌려서 온도를 조절하는 다이얼로 제어되기도 하고, 컴퓨터의 키보드를 누르고 마우스를 움직이는 것과 같은 결합된 입력을 필요로 하기도 합니다. 운전에서는 가속페달, 브레이크 페달, 핸들, 기어 전환장치, 주행지시등 같은 많은 자율적 제어가 필요하게 됩니다. 행동이 다양한 모양의 텐서로 표현되면 신경망은 개별적인 출력 layer를 가져야 하고 개별적 텐서는 하위행동으로 간주되며 이 하위 행동이 모여 결합된 행동을 형성하게 됩니다.
1. 문제의 특성 문제의 특성을 이해하고 그에 맞는 행동 공간을 설계하는 것이 중요합니다. 문제의 복잡성, 목표, 환경의 동역학 등을 고려해야 합니다. 이산형 vs 연속형: 문제의 특성에 따라 이산형 행동 공간과 연속형 행동 공간 중 하나를 선택해야 합니다. 예를 들어, 단순한 게임에서는 이산형 행동 공간이 적합할 수 있지만, 로봇 팔 제어와 같은 복잡한 문제에서는 연속형 행동 공간이 더 적합합니다. 2. 행동의 해상도와 세분화 수준 행동 공간의 해상도는 에이전트가 얼마나 정밀하게 행동할 수 있는지를 결정합니다. 해상도가 너무 높으면 학습이 어려워질 수 있고, 너무 낮으면 필요한 행동을 제대로 표현하지 못할 수 있습니다. 이산형 행동 공간: 해상도를 높이는 것은 가능한 행동의 수를 증가시키는 것입니다. 예를 들어, 이동 방향을 4가지에서 8가지로 늘리면 더 정밀한 이동이 가능해집니다. 연속형 행동 공간: 해상도를 높이는 것은 가능한 행동 값을 더 세밀하게 나누는 것입니다. 예를 들어, 로봇 팔의 각도를 더 정밀하게 조정할 수 있습니다. 3. 행동 공간의 크기와 복잡성 행동 공간이 너무 크거나 복잡하면 학습이 비효율적일 수 있습니다. 적절한 크기와 복잡성을 유지하면서도 목표를 달성할 수 있는 행동 공간을 설계해야 합니다. 차원의 수: 행동 공간의 차원이 많아지면 복잡성이 증가합니다. 예를 들어, 로봇의 각 관절에 대한 움직임을 개별적으로 조정하면 차원이 많아집니다. 범위 제한: 행동 값의 범위를 적절히 제한하여 불필요한 행동을 줄이고 학습 효율성을 높일 수 있습니다. 예를 들어, 로봇 팔의 움직임 범위를 물리적 제약에 맞게 설정합니다. 4. 환경과의 상호작용 방식 에이전트가 환경과 상호작용하는 방식에 따라 행동 공간을 설계해야 합니다. 환경의 피드백, 상태 변화, 보상 구조 등을 고려해야 합니다. 환경의 동역학: 환경이 어떻게 변하는지를 이해하고 그에 맞게 행동 공간을 조정합니다. 예를 들어, 환경이 매우 동적이라면 빠르게 적응할 수 있는 행동 공간이 필요합니다. 보상 구조: 에이전트가 특정 행동을 취했을 때 받을 보상을 고려하여 행동 공간을 설계합니다. 보상이 명확하고 일관되게 제공되도록 설계합니다. 5. 일반화와 특수화 행동 공간은 일반화와 특수화 사이에서 균형을 유지해야 합니다. 특정 문제에 너무 특화된 행동 공간은 다른 문제에 적용하기 어렵고, 너무 일반화된 행동 공간은 특정 문제를 효과적으로 해결하지 못할 수 있습니다. 도메인 지식 활용: 특정 문제에 대한 도메인 지식을 활용하여 행동 공간을 설계합니다. 예를 들어, 로봇 제어 문제에서 로봇의 물리적 특성을 반영합니다. 유연성: 다양한 상황에 적용할 수 있도록 유연한 행동 공간을 설계합니다. 예를 들어, 게임 AI에서 다양한 게임 환경에 대응할 수 있도록 합니다. 6. 계산 자원과 시간 강화학습의 학습 과정은 많은 계산 자원과 시간이 필요할 수 있습니다. 행동 공간의 크기와 복잡성은 학습에 필요한 자원과 시간을 직접적으로 영향을 미칩니다. 효율성: 행동 공간을 효율적으로 설계하여 학습 시간을 단축하고 계산 자원을 절약할 수 있도록 합니다. 시뮬레이션 환경: 시뮬레이션 환경에서 행동 공간을 테스트하고 조정하여 실제 환경에서의 성능을 예측할 수 있습니다. 7. 탐색과 활용의 균형 강화학습에서 탐색(exploration)과 활용(exploitation)의 균형을 맞추는 것은 매우 중요합니다. 행동 공간이 너무 제한적이면 탐색이 부족할 수 있고, 너무 넓으면 탐색이 비효율적일 수 있습니다. 탐색 전략: 다양한 탐색 전략(e.g., ε-greedy, softmax)을 사용하여 행동 공간을 효율적으로 탐색합니다. 보상 신호: 초기 학습 단계에서 충분한 탐색을 유도하기 위해 보상 신호를 조정합니다. 행동 공간의 설계는 강화학습 시스템의 성공에 중요한 요소입니다. 문제의 특성과 요구 사항을 잘 이해하고, 적절한 해상도와 복잡성을 유지하며, 환경과의 상호작용을 고려하여 신중하게 설계해야 합니다. 환경과의 상호작용: 에이전트가 환경과 상호작용하는 방식을 고려하여 행동 공간을 설계해야 합니다.
강화학습의 간단환 환경에서의 제어는 보통 단수형으로 카트풀과 같이 에이전트는 왼쪽과 오른쪽만을 선택하게 됩니다. 한 단계더 나아가면 이러한 단수형을 여러개 붙여서 조합을 만들수 있는데, 마우스로 움직이고 키보드로 총과 폭탄 등을 쏠수 있다면 이를 여러개 단수형이 합쳐진 행동이 됩니다. 이러한 단수형 방식은 행동 가능한 조합 전체를 열거하고 정수 리스트와 매핑하면 됩니다. 이러한 설계는 출력 층위가 하나만 있으면 되기에 정책 네트워크를 만들기 더 쉬워지고 모든 time step에서 에이전트는 정수 중 하나만 선택해서 행동을 하게 됩니다. 그러나 조합의 가짓수가 너무 많을 경우 단수형의 조합은 이를 더 어렵게 마들기도 하는데 주로 로보틱스의 다수의 토크와 관절 각도를 동시 제어할 필요가 있을때 이런 변수들은 개별적인 실숫값으로 표현되고 조합 전체를 열거하는게 불필요하게 큰 정수 집합이 필요할때 다른 방법을 사용하는게 효율적입니다. 이 경우 차원을 분리하여 행동을 다수형 하위행동으로 구성되도록 해야 하고, 하위행동 하나가 차원 하나에 해당합니다. 이러한 행동 설계를 할때 제어 방식이 사용자에게 친숙하고 직관적이어야 디버깅이나 액션에 대한 효과도 알수 있기 때문입니다. 이런 특성은 자율조종 장치 시스템에 특히 유용합니다.
행동 공간을 구성할때는 이러한 행동공간이 문제를 해결하기 위한 다양하고 정밀한 제어가 가능한 환경인지를 검토해야 하고, 행동공간은 주어진 환경에서 원하는 모든 것을 제어할수 있는지가 중요합니다. 제어에서 사람의 제어형식으로부터 영감을 받아 모방학습으로도 할수 있지만, 에이전트를 기준으로 어떻게 시스템을 제어하는게 가장 효율적일지를 비교할수도 있습니다. 오히려 에이전트의 제어방식이 사람은 생각하지도 못한 더 효율적인 방식일 수도 있으므로 이 가능성을 배제하지말고 모든 가능성을 열어놓고 살펴보아야 합니다. 기계는 다수의 작업을 동시에 지어하면서 매우 정교하게 제어할수 있으므로, 사람으로 치면 오랜시간 그 작업을 몰두하면서 전문성을 갖춘 사람과 비슷하거나 혹은 그보다 더 좋은 방식을 사용할 수 있습니다. 사람은 그 전문성을 갖추기위해 오랜시간 종사해야 하고 그래야만 반자율적으로 어떤 상태든 액션이 자동으로 나올수 있는데, 효율적인 면에서 보자면 몇시간 혹은 몇십 몇백시간 학습한 에이전트가 전문가와 같거나 훨씬 효율적으로 자율제어를 한다면 이를 사요하지 않을 이유는 없습니다. 그래서 이러한 강화학습이 필요한 것이고 전문성 있는 사람의 작업을 대신해줄 프로그래밍 방식이 될것으로 미래가 유망하다고 보고 있습니다. 에이전트는 목적을 달성하기위해 제어해야 할 요소를 식별해야 하고 식별된 요소와 의도된 행동이 맞는지를 최소한 이론적으로 확인하기위해 온전성 검사를 수행하며 행동이 완전이 명시되었는지 확인하게 됩니다. 제어설계가 실현 가능하다면 직관성과 효율성을 고려해야 하고 이러한 제어설계의 행동 제어 설계 자체가 잘못되었다면 에이전트는 적절한 행동을 하지 못하게 되고, 이것은 지속적인 테스트와 실험, 피드백을 기준으로 계속적으로 수정해서 최적의 행동을 찾아나가야 합니다. 간결함과 다양성 사이에 균형을 맞춰야 하고 적절한 간결과 다양을 테스트해보며 최적의 행동을 찾아야 합니다. 무엇보다 이러한 에이전트의 액션을 설계하고자 한다면 설계자가 해당 도메인을 전문적인 지식 수준으로 알고 있는 것이 가장 중요한데, 전문적 도메인 지식을 갖고 있는 것과 강화학습 액션을 설계하는 전문지식 또한 균형과 다양성과 같이 중간지점에서 적절히 합의와 조율이 필요한 상태입니다. 가장 좋은 것은 도메인 지식이 기본적으로 있으면서 이 지식에 강화학습 액션 설계 지식을 갖고 있다면 이러한 액션 설계가 가장 최적의 결과를 낼수 있을 것입니다. 에이전트 행동 설계할때 여러가지를 생각해 볼수 있습니다. 환경이 주어졌을때 에이전트에게 무엇을 기대하는가? 에이전트가 환경에 어떻게 영향을 미치는가? 에이전트가 제어해야 할 요소는 무엇인가? 에이전트가 제어할 수 없는 요소는 무엇인가? 에이전트는 요소들을 어떻게 제어하는가? 이런 고민들을 하게되고 이에 도메인 지식과 강화학습 지식이 이러한 질문들에 대한 답을 내는데 도움을 줄 것입니다. 무엇보다 가장 중요한 것은 행동 설계할때 설계자가 그 액션의 범위를 지정하고 각 액션들이 무슨 행동을 하고 그 이후 상태는 어떠할 것인지를 고려하여 환경 변화까지도 생각하여 액션을 설계해야 한다는 점입니다. 이처럼 구체적으로 잘 표현된 환경과 에이전트의 액션이 있어야지만 제대로 된 에이전트의 훈련이 가능한 상태가 되고 이것이 강화학습에서 매우 중요한 부분입니다. 행동 제어설계에서 행동의 복잡함을 다루는 전략에는 행동을 결합하거나 분리하는 전략, 상대적 행동을 사용하는 전략, 연속적 행동을 이산화하는 전략, 환경의 불변성이라는 장점을 활용하는 전략이 있을 수 있습니다. 사람이 복잡한 제어를 다루는 한가지 방법은 낮은 수준의 행동들을 결합하여 높은 수준의 행동 하나를 만드는 것입니다. 이는 메타제어라고도 하는데 어느 하나의 행동 수준에 머무는 것이 아닌 행동을 하나의 복잡한 행동으로 표현하는 대신 다수의 하위행동을 조합하여 더 간단히 표현할수도 있습니다. 차원의 수가 너무 많으면 에이전트는 하나의 행동을 하기위해 다수의 하위 행동을 탐험하고 학습해야 할 것으로, 이로 인해 제어 복잡도가 증가하게 됩니다. 하지만 행동을 다수의 하위 차원으로 나누면 행동공간이 감소하므로 이를 활용할 수 있습니다. 일반적으로 키 조합과 같은 딕셔너리를 잘 활용하여 개별적인 행동으로 부호화하는게 좋습니다. 행동의 복잡성을 감소시키기 위해서 제어를 설계할때 유닛을 선택하고 그 해당 유닛의 현재위치를 파악한 후 제한된 크기의 상대적 변화를 주도록 유도하는 것이 좀 더 좋은 설계가 될것입니다. 새로운 문제를 접하면 가장 간단한 행동설계부터 시작하고, 그 다음 행동설계는 제한된 조건에서 수행하는 것이 도움이 됩니다. 그래야 문제의 가장 단순한 측면에 초점을 맞출수 있고 문제를 단순화하면 솔루션을 점진적으로 도출해가는데 있어 매우 도움이 될수 있습니다. 초기의 설계가 괜찮아 보이고 에이전트가 단순화된 버전의 문제 해결을 학습할 수 있다면, 그 이후로는 점진적으로 복잡성을 증가시켜서 문제를 좀더 현실화하고 완전한 버전의 문제에 더 가까워지도록 만들수 있습니다. 간단한 것에서부터 시작하는게 정석입니다.