이 기사에서는 Unity ML-Agents 툴킷을 사용하여 개발된 Unity 기반 시뮬레이션 프로그램인 Reacher 환경에서 이중 관절 로봇 팔을 제어하기 위한 지능형 에이전트 교육을 소개합니다. 우리의 목표는 높은 정확도로 목표 위치에 도달하는 것입니다. 따라서 여기서는 연속 상태 및 행동 공간을 위해 설계된 최첨단 DDPG(Deep Deterministic Policy Gradient) 알고리즘을 사용할 수 있습니다.
로봇 팔은 제조, 생산 시설, 우주 탐사, 수색 및 구조 작업에서 핵심적인 역할을 합니다. 높은 정밀도와 유연성으로 로봇 팔을 제어하는 것은 매우 중요합니다. 강화 학습 기술을 사용하면 이러한 로봇 시스템이 실시간으로 행동을 학습하고 조정하여 성능과 유연성을 향상시킬 수 있습니다. 강화 학습의 발전은 인공 지능에 대한 이해에 기여할 뿐만 아니라 산업에 혁명을 일으키고 사회에 의미 있는 영향을 미칠 수 있는 잠재력을 가지고 있습니다.
Reacher는 제어 알고리즘의 개발 및 테스트에 자주 사용되는 로봇 팔 시뮬레이터입니다. 로봇 팔의 물리적 특성과 동작 법칙을 시뮬레이션하는 가상 환경을 제공하므로 개발자는 실제 하드웨어 없이도 제어 알고리즘에 대한 연구와 실험을 수행할 수 있습니다.
Reacher의 환경은 주로 다음 부분으로 구성됩니다.
Reacher 시뮬레이터는 개발자가 실제 하드웨어 없이 제어 알고리즘을 빠르게 테스트하고 최적화하는 데 도움이 되는 매우 실용적인 도구입니다.
Reacher는 Unity ML-Agents 툴킷을 사용하여 구축되었으며 에이전트는 이중 관절 로봇 팔을 제어할 수 있습니다. 목표는 팔을 목표 위치쪽으로 유도하고 목표 영역 내에서 가능한 한 오랫동안 위치를 유지하는 것입니다. 이 환경에는 각각 독립적으로 실행되는 20개의 동기화된 에이전트가 있어 훈련 중에 경험을 효율적으로 수집하는 데 도움이 됩니다.
상태 및 동작 공간을 이해하는 것은 효과적인 강화 학습 알고리즘을 설계하는 데 중요합니다. Reacher 환경에서 상태 공간은 위치, 회전, 속도, 각속도 등 로봇 팔에 대한 정보를 제공하는 33개의 연속 변수로 구성됩니다. 동작 공간도 연속적이며 로봇 팔의 두 관절에 가해지는 토크에 해당하는 4개의 변수가 있습니다. 각 작업 변수는 -1과 1 사이의 실수입니다.
Reacher 작업은 각 조각에 고정된 수의 시간 단계가 포함된 에피소드로 간주됩니다. 에이전트의 목표는 이러한 단계에서 총 보상을 최대화하는 것입니다. 팔 엔드 이펙터는 목표 위치를 유지하는 데 걸리는 각 단계에 대해 +0.1 보너스를 받습니다. 에이전트가 100회 이상의 연속 작업에서 평균 점수 30점 이상을 달성하면 성공으로 간주됩니다.
환경을 이해하면서 아래에서는 DDPG 알고리즘, 구현 및 이 환경에서 연속 제어 문제를 효과적으로 해결하는 방법을 살펴보겠습니다.
리처 문제와 같은 연속 제어 작업의 경우 최적의 성능을 달성하려면 알고리즘 선택이 중요합니다. 이 프로젝트에서 우리는 DDPG 알고리즘을 선택했는데, 이는 연속 상태 및 행동 공간을 처리하기 위해 특별히 설계된 배우-비평 방법이기 때문입니다.
DDPG 알고리즘은 두 개의 신경망을 결합하여 정책 기반 방법과 가치 기반 방법의 장점을 결합합니다. 행위자 네트워크는 현재 상태에서 최상의 행동을 결정하고 비판 네트워크는 상태-행동 가치 함수(Q-함수)를 추정합니다. ). 두 가지 유형의 네트워크 모두 업데이트 프로세스 중에 고정된 목표를 제공하여 학습 프로세스를 안정화하는 목표 네트워크를 가지고 있습니다.
DDPG 알고리즘은 q 함수를 추정하기 위해 Critic 네트워크를 사용하고 최적의 행동을 결정하기 위해 Actor 네트워크를 사용함으로써 정책 경사 방법과 DQN의 장점을 효과적으로 결합합니다. 이 하이브리드 접근 방식을 통해 에이전트는 지속적인 제어 환경에서 효율적으로 학습할 수 있습니다.
<code>import random from collections import deque import torch import torch.nn as nn import numpy as np from actor_critic import Actor, Critic class ReplayBuffer: def __init__(self, buffer_size, batch_size): self.memory = deque(maxlen=buffer_size) self.batch_size = batch_size def add(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done)) def sample(self): batch = random.sample(self.memory, self.batch_size) states, actions, rewards, next_states, dones = zip(*batch) return states, actions, rewards, next_states, dones def __len__(self): return len(self.memory) class DDPG: def __init__(self, state_dim, action_dim, hidden_dim, buffer_size, batch_size, actor_lr, critic_lr, tau, gamma): self.actor = Actor(state_dim, hidden_dim, action_dim, actor_lr) self.actor_target = Actor(state_dim, hidden_dim, action_dim, actor_lr) self.critic = Critic(state_dim, action_dim, hidden_dim, critic_lr) self.critic_target = Critic(state_dim, action_dim, hidden_dim, critic_lr) self.memory = ReplayBuffer(buffer_size, batch_size) self.batch_size = batch_size self.tau = tau self.gamma = gamma self._update_target_networks(tau=1)# initialize target networks def act(self, state, noise=0.0): state = torch.tensor(state, dtype=torch.float32).unsqueeze(0) action = self.actor(state).detach().numpy()[0] return np.clip(action + noise, -1, 1) def store_transition(self, state, action, reward, next_state, done): self.memory.add(state, action, reward, next_state, done) def learn(self): if len(self.memory) </code>
위 코드에서도 Replay Buffer를 사용하여 학습 효율성과 안정성을 향상시킬 수 있습니다. 재생 버퍼는 본질적으로 상태, 행동, 보상, 다음 상태 및 완료 정보로 구성된 고정된 수의 과거 경험 또는 전환을 저장하는 메모리 데이터 구조입니다. 이를 사용하는 주요 이점은 에이전트가 연속 경험 간의 상관 관계를 끊을 수 있도록 하여 유해한 시간적 상관 관계의 영향을 줄이는 것입니다.
버퍼에서 임의의 미니 배치 경험을 추출하여 에이전트는 다양한 변환 세트에서 학습할 수 있으며 이는 학습 프로세스를 안정화하고 일반화하는 데 도움이 됩니다. 또한 재생 버퍼를 사용하면 에이전트가 과거 경험을 여러 번 재사용할 수 있으므로 데이터 효율성이 향상되고 환경과의 제한된 상호 작용을 통해 보다 효과적인 학습이 촉진됩니다.
DDPG 알고리즘은 이 환경의 핵심 측면인 연속적인 행동 공간을 효율적으로 처리하는 능력 때문에 좋은 선택입니다. 알고리즘 설계를 통해 여러 에이전트가 수집한 병렬 경험을 효율적으로 활용할 수 있어 더 빠른 학습과 더 나은 수렴이 가능합니다. 위에서 소개한 Reacher처럼 동시에 20개의 에이전트를 실행할 수 있기 때문에 이 20개의 에이전트를 활용하여 경험을 공유하고, 집단적으로 학습하며, 학습 속도를 높일 수 있습니다.
알고리즘이 완성되었습니다. 다음으로 하이퍼파라미터 선택 및 학습 과정을 소개하겠습니다.
환경에서 알고리즘의 효과를 더 잘 이해하려면 학습 프로세스와 관련된 주요 구성 요소와 단계를 자세히 살펴볼 필요가 있습니다.
DDPG 알고리즘은 Actor와 Critic이라는 두 가지 신경망을 사용합니다. 두 네트워크 모두 2개의 숨겨진 레이어를 포함하며 각각 400개의 노드를 포함합니다. 히든 레이어는 ReLU(Rectified Linear Unit) 활성화 함수를 사용하는 반면, Actor 네트워크의 출력 레이어는 tanh 활성화 함수를 사용하여 -1에서 1 사이의 동작을 생성합니다. 비판적 네트워크의 출력 레이어에는 q 함수를 직접 추정하기 때문에 활성화 함수가 없습니다.
다음은 네트워크의 코드입니다.
<code>import numpy as np import torch import torch.nn as nn import torch.optim as optim class Actor(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, learning_rate=1e-4): super(Actor, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, hidden_dim) self.fc3 = nn.Linear(hidden_dim, output_dim) self.tanh = nn.Tanh() self.optimizer = optim.Adam(self.parameters(), lr=learning_rate) def forward(self, state): x = torch.relu(self.fc1(state)) x = torch.relu(self.fc2(x)) x = self.tanh(self.fc3(x)) return x class Critic(nn.Module): def __init__(self, state_dim, action_dim, hidden_dim, learning_rate=1e-4): super(Critic, self).__init__() self.fc1 = nn.Linear(state_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim + action_dim, hidden_dim) self.fc3 = nn.Linear(hidden_dim, 1) self.optimizer = optim.Adam(self.parameters(), lr=learning_rate) def forward(self, state, action): x = torch.relu(self.fc1(state)) x = torch.relu(self.fc2(torch.cat([x, action], dim=1))) x = self.fc3(x) return x</code>
선택된 하이퍼파라미터는 효율적인 학습에 중요합니다. 이 프로젝트에서 재생 버퍼 크기는 200,000이고 배치 크기는 256입니다. Actor의 학습률은 5e-4, Critic의 학습률은 1e-3, 소프트 업데이트 매개변수(tau)는 5e-3, 감마는 0.995입니다. 마지막으로 초기 노이즈 스케일이 0.5이고 노이즈 감쇠율이 0.998인 동작 노이즈가 추가되었습니다.
훈련 과정에는 두 네트워크 간의 지속적인 상호 작용이 포함되며, 동일한 네트워크를 공유하는 20개의 병렬 에이전트를 통해 모델은 모든 에이전트가 수집한 경험을 통해 집합적으로 학습합니다. 이 설정은 학습 과정의 속도를 높이고 효율성을 높입니다.
<code>from collections import deque import numpy as np import torch from ddpg import DDPG def train_ddpg(env, agent, episodes, max_steps, num_agents, noise_scale=0.1, noise_decay=0.99): scores_window = deque(maxlen=100) scores = [] for episode in range(1, episodes + 1): env_info = env.reset(train_mode=True)[brain_name] states = env_info.vector_observations agent_scores = np.zeros(num_agents) for step in range(max_steps): actions = agent.act(states, noise_scale) env_info = env.step(actions)[brain_name] next_states = env_info.vector_observations rewards = env_info.rewards dones = env_info.local_done for i in range(num_agents): agent.store_transition(states[i], actions[i], rewards[i], next_states[i], dones[i]) agent.learn() states = next_states agent_scores += rewards noise_scale *= noise_decay if np.any(dones): break avg_score = np.mean(agent_scores) scores_window.append(avg_score) scores.append(avg_score) if episode % 10 == 0: print(f"Episode: {episode}, Score: {avg_score:.2f}, Avg Score: {np.mean(scores_window):.2f}") # Saving trained Networks torch.save(agent.actor.state_dict(), "actor_final.pth") torch.save(agent.critic.state_dict(), "critic_final.pth") return scores if __name__ == "__main__": env = UnityEnvironment(file_name='Reacher_20.app') brain_name = env.brain_names[0] brain = env.brains[brain_name] state_dim = 33 action_dim = brain.vector_action_space_size num_agents = 20 # Hyperparameter suggestions hidden_dim = 400 batch_size = 256 actor_lr = 5e-4 critic_lr = 1e-3 tau = 5e-3 gamma = 0.995 noise_scale = 0.5 noise_decay = 0.998 agent = DDPG(state_dim, action_dim, hidden_dim=hidden_dim, buffer_size=200000, batch_size=batch_size,actor_lr=actor_lr, critic_lr=critic_lr, tau=tau, gamma=gamma) episodes = 200 max_steps = 1000 scores = train_ddpg(env, agent, episodes, max_steps, num_agents, noise_scale=0.2, noise_decay=0.995)</code>
훈련 과정의 주요 단계는 다음과 같습니다:
네트워크 초기화: 에이전트는 공유된 배우 및 비평가 네트워크와 각각의 대상 네트워크를 무작위 가중치로 초기화합니다. 타겟 네트워크는 업데이트 중에 안정적인 학습 타겟을 제공합니다.
저희 에이전트는 DDPG 알고리즘을 사용하여 Racher 환경에서 이중 관절 로봇 팔을 제어하는 방법을 성공적으로 학습했습니다. 훈련 과정 전반에 걸쳐 에이전트 20명의 평균 점수를 기준으로 에이전트의 성과를 모니터링합니다. 에이전트가 환경을 탐색하고 경험을 수집함에 따라 보상 극대화를 위한 최적의 행동을 예측하는 능력이 크게 향상됩니다.
에이전트의 성능은 훈련 과정 전반에 걸쳐 다양했지만 평균 점수가 환경을 해결하는 데 필요한 임계값(30+)을 초과하는 등 작업에 상당한 숙련도를 보인 것을 볼 수 있습니다. 이는 학습 과정이 성공했음을 나타냅니다.
아래 그래프는 상담원 20명의 평균 점수를 보여줍니다.
우리가 구현한 DDPG 알고리즘이 Racher 환경의 문제를 효과적으로 해결한 것을 확인할 수 있습니다. 에이전트는 자신의 행동을 조정하고 작업에서 예상되는 성과를 달성할 수 있습니다.
이 프로젝트의 하이퍼파라미터는 문헌의 권장 사항과 경험적 테스트를 조합하여 선택되었습니다. 시스템 하이퍼파라미터 튜닝을 통한 추가 최적화로 인해 성능이 향상될 수 있습니다.
다중 에이전트 병렬 교육: 이 프로젝트에서는 20명의 에이전트를 사용하여 동시에 경험을 수집합니다. 전체 학습 프로세스에 더 많은 에이전트를 사용하면 수렴 속도가 빨라지거나 성능이 향상될 수 있습니다.
일괄 정규화: 학습 프로세스를 더욱 향상시키려면 신경망 아키텍처에서 일괄 정규화를 구현하는 것이 좋습니다. 훈련 중에 각 계층의 입력 기능을 정규화함으로써 배치 정규화는 내부 공변량 이동을 줄이고 학습 속도를 높이며 잠재적으로 일반화를 향상시키는 데 도움이 될 수 있습니다. 배우 및 비평가 네트워크에 배치 정규화를 추가하면 보다 안정적이고 효율적인 교육이 가능하지만 이를 위해서는 추가 테스트가 필요합니다.
위 내용은 Actor-Critic의 DDPG 강화 학습 알고리즘을 사용하여 이중 관절 로봇 팔 제어의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!