1. рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд░рдирд╛┬а
PPO рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреА рд╣реЛрдВрдЧреА рдФрд░ рдкреЙрд▓рд┐рд╕реА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд╛рддрд╛рд╡рд░рдг рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ред┬а
PyTorch рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛┬а
рд╣рдореЗрдВ рдирд┐рдореНрди рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:┬а
- PyTorch рдФрд░ рдЕрдиреНрдп рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝, рдЬреИрд╕реЗ
numpy(рдЧрдгрд┐рддреАрдп рдФрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП) рдФрд░matplotlib(рдЧреНрд░рд╛рдлрд╝ рдкреНрд▓реЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред - OpenAI рдХрд╛ рдУрдкрди-рд╕реЛрд░реНрд╕ Gym рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкреИрдХреЗрдЬ, рдПрдХ Python рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдФрд░ рдЦреЗрд▓реЛрдВ рдХрд╛ рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд░рддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рд░рд┐рдЗрдирдлреЛрд░реНрд╕рдореЗрдВрдЯ рд▓рд░реНрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Gym API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред┬ардЪреВрдБрдХрд┐
gymрдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрднреА-рдХрднреА рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рджреМрд░рд╛рди рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг0.25.2рдкрд░ рдлреНрд░реАрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд░реНрд╡рд░ рдпрд╛ рд▓реЛрдХрд▓ рдорд╢реАрди рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПрдБ:┬а
$ pip install torch numpy matplotlib gym==0.25.2
Google Colab рдпрд╛ DataLab рдЬреИрд╕реЗ рдиреЛрдЯрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:┬а
!pip install torch numpy matplotlib gym==0.25.2
CartPole рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдирд╛
OpenAI Gym рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ CartPole рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рджреЛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ (рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░реА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП) рдмрдирд╛рдПрдВ:
env_train = gym.make('CartPole-v1')
env_test = gym.make('CartPole-v1')
2. PyTorch рдореЗрдВ PPO рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдЕрдм, рдЖрдЗрдП PyTorch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PPO рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдкреЙрд▓рд┐рд╕реА рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛, PPO рдПрдХ рдПрдХреНрдЯрд░-рдХреНрд░рд┐рдЯрд┐рдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХреНрдЯрд░ рдкреЙрд▓рд┐рд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдЙрд╕рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдорд╛рди рдмрддрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ, рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ, рд╕рдорд╛рди рдЗрдирдкреБрдЯ рд▓реЗрддреЗ рд╣реИрдВтАФрд╣рд░ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдкрд░ рд╕реНрдЯреЗрдЯред рдЗрд╕рд▓рд┐рдП, рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдореЙрдбрд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмреИрдХрдмреЛрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдмреИрдХрдмреЛрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЗрдпрд░реНрд╕ рд╕реЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред┬а
рдмреИрдХрдмреЛрди рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
рдирд┐рдореНрди рдЪрд░рдг рдмреИрдХрдмреЛрди рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
- 3 рд▓реЗрдпрд░ рд╡рд╛рд▓рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯ рдХрд░реЗрдВ - рдПрдХ рдЗрдирдкреБрдЯ, рдПрдХ рд╣рд┐рдбрди рдФрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдпрд░ред┬а
- рдЗрдирдкреБрдЯ рдФрд░ рд╣рд┐рдбрди рд▓реЗрдпрд░ рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдПрдХреНрдЯрд┐рд╡реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо ReLU рдЪреБрдирддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓реА рдХреБрд╢рд▓ рд╣реИред┬а
- рд╣рдо рдПрдХ рдордЬрд╝рдмреВрдд рдиреЗрдЯрд╡рд░реНрдХ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдФрд░ рд╣рд┐рдбрди рд▓реЗрдпрд░ рдХреЗ рдмрд╛рдж рдбреНрд░реЙрдкрдЖрдЙрдЯ рдлрд╝рдВрдХреНрд╢рди рднреА рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдбреНрд░реЙрдкрдЖрдЙрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреНрдпреВрд░реЙрдиреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрдо рд╣реЛрддреА рд╣реИ рдФрд░ рдУрд╡рд░рдлрд╝рд┐рдЯрд┐рдВрдЧ рд░реБрдХрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдзрд┐рдХ рдордЬрд╝рдмреВрдд рдмрдирддрд╛ рд╣реИред┬а
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдХреЛрдб рдмреИрдХрдмреЛрди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
class BackboneNetwork(nn.Module):
def __init__(self, in_features, hidden_dimensions, out_features, dropout):
super().__init__()
self.layer1 = nn.Linear(in_features, hidden_dimensions)
self.layer2 = nn.Linear(hidden_dimensions, hidden_dimensions)
self.layer3 = nn.Linear(hidden_dimensions, out_features)
self.dropout = nn.Dropout(dropout)
def forward(self, x):
x = self.layer1(x)
x = f.relu(x)
x = self.dropout(x)
x = self.layer2(x)
x = f.relu(x)
x = self.dropout(x)
x = self.layer3(x)
return x
рдПрдХреНрдЯрд░-рдХреНрд░рд┐рдЯрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
рдЕрдм рд╣рдо рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ActorCritic рдирд╛рдордХ рдПрдХреНрдЯрд░-рдХреНрд░рд┐рдЯрд┐рдХ рдХреНрд▓рд╛рд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХреНрдЯрд░ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдореЙрдбрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХреНрд╢рди рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХрд░рддрд╛ рд╣реИред рдХреНрд░рд┐рдЯрд┐рдХ рд╡реИрд▓реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореЙрдбрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реИрд▓реНрдпреВ рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХрд░рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╕реНрдЯреЗрдЯ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред┬а
class ActorCritic(nn.Module):
def __init__(self, actor, critic):
super().__init__()
self.actor = actor
self.critic = critic
def forward(self, state):
action_pred = self.actor(state)
value_pred = self.critic(state)
return action_pred, value_pred
рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрд╕реНрдЯреИрдВрд╢рд┐рдПрдЯ рдХрд░реЗрдВ
рд╣рдо рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдХреНрдЯрд░ рдФрд░ рдПрдХ рдХреНрд░рд┐рдЯрд┐рдХ рдмрдирд╛рдПрдБрдЧреЗред рдлрд┐рд░, рд╣рдо рдПрдХ рдПрдЬреЗрдВрдЯ рдмрдирд╛рдПрдБрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред┬а
рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ:
- рд╣рд┐рдбрди рд▓реЗрдпрд░ рдХреЗ рдЖрдпрд╛рдо, H, рдЬреЛ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рд╣рд┐рдбрди рд▓реЗрдпрд░реНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рд╣рдо 64 X 64 рдЖрдпрд╛рдо рд╡рд╛рд▓реА рд╣рд┐рдбрди рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред┬а
- рдЗрдирдкреБрдЯ рдлреАрдЪрд░реНрд╕, N, рдЬрд╣рд╛рдБ N рд╕реНрдЯреЗрдЯ рдРрд░реЗ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред рдЗрдирдкреБрдЯ рд▓реЗрдпрд░ рдХреЗ рдЖрдпрд╛рдо N X H рд╣реИрдВред CartPole рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реНрдЯреЗрдЯ 4-рддрддреНрд╡реЛрдВ рдХрд╛ рдРрд░реЗ рд╣реИред рдЗрд╕рд▓рд┐рдП N = 4ред┬а
- рдПрдХреНрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдлреАрдЪрд░реНрд╕, O, рдЬрд╣рд╛рдБ O рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХреНрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдПрдХреНрдЯрд░ рдХреА рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдпрд░ рдХреЗ рдЖрдпрд╛рдо H x O рд╣реИрдВред CartPole рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ 2 рдПрдХреНрд╢рди рд╣реИрдВред┬а
- рдХреНрд░рд┐рдЯрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдлреАрдЪрд░реНрд╕ред рдЪреВрдБрдХрд┐ рдХреНрд░рд┐рдЯрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗрд╡рд▓ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реИрд▓реНрдпреВ (рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рд╕реНрдЯреЗрдЯ рдкрд░) рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ рдлреАрдЪрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 1 рд╣реИред┬а
- рдбреНрд░реЙрдкрдЖрдЙрдЯ рдХрд╛ рдорд╛рди рдлреНрд░реИрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВред
рдирд┐рдореНрди рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдмреИрдХрдмреЛрди рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
def create_agent(hidden_dimensions, dropout):
INPUT_FEATURES = env_train.observation_space.shape[0]
HIDDEN_DIMENSIONS = hidden_dimensions
ACTOR_OUTPUT_FEATURES = env_train.action_space.n
CRITIC_OUTPUT_FEATURES = 1
DROPOUT = dropout
actor = BackboneNetwork(
INPUT_FEATURES, HIDDEN_DIMENSIONS, ACTOR_OUTPUT_FEATURES, DROPOUT)
critic = BackboneNetwork(
INPUT_FEATURES, HIDDEN_DIMENSIONS, CRITIC_OUTPUT_FEATURES, DROPOUT)
agent = ActorCritic(actor, critic)
return agent
рд░рд┐рдЯрд░реНрди рдХреА рдЧрдгрдирд╛
рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рд░ рд╕реНрдЯреЗрдк рд╕реЗ рдЕрдЧрд▓реЗ рд╕реНрдЯреЗрдк рддрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдПрдХ рд░рд┐рд╡реЙрд░реНрдб рджреЗрддрд╛ рд╣реИред рд░рд┐рд╡реЙрд░реНрдб, R, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рд░рд┐рдЯрд░реНрди рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдХреЗ рд╕рдВрдЪрд┐рдд рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдзрд┐рдХ рджреВрд░ рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рд╕реЗ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рд╡реЙрд░реНрдб рддрддреНрдХрд╛рд▓ рд░рд┐рд╡реЙрд░реНрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд░рд┐рдЯрд░реНрди рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯреЗрдб рд░рд┐рдЯрд░реНрди, G, рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ (рдФрд░ рдХрдИ рдЕрдиреНрдп рд╕рдиреНрджрд░реНрднреЛрдВ) рдореЗрдВ, рд░рд┐рдЯрд░реНрди рдХрд╛ рдорддрд▓рдм рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯреЗрдб рд░рд┐рдЯрд░реНрди рд╕реЗ рд╣реИред┬а
рд░рд┐рдЯрд░реНрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
- рд╕рднреА рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕реНрдЯреЗрдЯреНрд╕ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рд╡реЙрд░реНрдб рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред
- рдкреНрд░рддреНрдпреЗрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдХреЛ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдлрд╝реИрдХреНрдЯрд░ рдХреЗ рдШрд╛рдд рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ, ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2 рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдмрд╛рдж (рд╡рд░реНрддрдорд╛рди рд╕реЗ) рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рд╡реЙрд░реНрдб рдХреЛ 2 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред┬а
- рд╕рднреА рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯреЗрдб рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдХрд╛ рдпреЛрдЧ рд▓реЗрдХрд░ рд░рд┐рдЯрд░реНрди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред┬а
- рд░рд┐рдЯрд░реНрди рдХреЗ рдорд╛рди рдХреЛ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред┬а
рдлрд╝рдВрдХреНрд╢рди calculate_returns() рдпреЗ рдЧрдгрдирд╛рдПрдБ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
def calculate_returns(rewards, discount_factor):
returns = []
cumulative_reward = 0
for r in reversed(rewards):
cumulative_reward = r + cumulative_reward * discount_factor
returns.insert(0, cumulative_reward)
returns = torch.tensor(returns)
# normalize the return
returns = (returns - returns.mean()) / returns.std()
return returns
рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдПрдбрд╡рд╛рдВрдЯреЗрдЬ, рдХреНрд░рд┐рдЯрд┐рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╡реИрд▓реНрдпреВ рдФрд░ рдПрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреЙрд▓рд┐рд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪреБрдиреА рдЧрдИ рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдПрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдордирдорд╛рдиреЗ (рдФрд╕рдд) рдПрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреНрд╢рди рдХреЛ рд▓реЗрдирд╛ рдХрд┐рддрдирд╛ рд▓рд╛рднрдкреНрд░рдж рд╣реИред┬а
рдореВрд▓ PPO рдкреЗрдкрд░ (рд╕рдореАрдХрд░рдг 10) рдореЗрдВ, рдПрдбрд╡рд╛рдВрдЯреЗрдЬ, рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк T рддрдХ рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛрдб рдХрд░рддреЗ рд╕рдордп, рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рддрдХ рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХреА рдмрд╛рдзрд╛ рдХреЛ рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдКрдкрд░ рдХрд╛ рд╕рдореАрдХрд░рдг рд╡реИрд▓реНрдпреВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдХреЗ рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдХреЛ рд╕реНрдЯреЗрдЯ-рдПрдХреНрд╢рди рд╡реИрд▓реНрдпреВ рдлрд╝рдВрдХреНрд╢рди, Q, рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред┬а
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдиреАрдЪреЗ рджрд┐рдпрд╛ рд╕рд░рд▓ рд╕реВрддреНрд░ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪреБрдирдиреЗ рдХрд╛ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ:┬а
- рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╢рди┬а
- рдПрдХ рджрд┐рдП рдЧрдП рд╕реНрдЯреЗрдЯ рдореЗрдВ┬а
- рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреЙрд▓рд┐рд╕реА рдХреЗ рддрд╣рдд┬а
- рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдкрд░┬а
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рд╣реЛрддрд╛ рд╣реИ:┬а
OpenAI рднреА рдЗрд╕ рдлрд╝реЙрд░реНрдореВрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ RL рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдпрд╛ calculate_advantages() рдлрд╝рдВрдХреНрд╢рди рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:
def calculate_advantages(returns, values):
advantages = returns - values
# Normalize the advantage
advantages = (advantages - advantages.mean()) / advantages.std()
return advantages
рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдФрд░ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо
рд╡рд┐рд╢реЗрд╖ рддрдХрдиреАрдХреЛрдВ рдЬреИрд╕реЗ PPO рдХреЗ рдмрд┐рдирд╛, рдкреЙрд▓рд┐рд╕реА рд▓реЙрд╕ рдорд╛рдирдХ рдкреЙрд▓рд┐рд╕реА рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд▓реЙрд╕ рд╣реЛрдЧрд╛ред рдорд╛рдирдХ рдкреЙрд▓рд┐рд╕реА рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдЗрдирдХрд╛ рдЧреБрдгрдирдлрд▓ рд▓реЗрдХрд░ рдХреА рдЬрд╛рддреА рд╣реИ:
- рдкреЙрд▓рд┐рд╕реА рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдПрдБ┬а
- рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рдХреЗ рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддреА рд╣реИ:
- рдкреЙрд▓рд┐рд╕реА рд░рд┐рдЯрд░реНрди┬а
- рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реИрд▓реНрдпреВ
рдорд╛рдирдХ рдкреЙрд▓рд┐рд╕реА рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд▓реЙрд╕ рдЕрдЪрд╛рдирдХ рдкреЙрд▓рд┐рд╕реА рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдорд╛рдирдХ рд▓реЙрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЗрдЯрд░реЗрд╢рди рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдорд╛рддреНрд░рд╛ рд╕реАрдорд┐рдд рд░рд╣реЗред рдпрд╣ рджреЛ рд░рд╛рд╢рд┐рдпреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:
- рдирд┐рдореНрди рдХрд╛ рдЧреБрдгрдирдлрд▓:
- рдкреЙрд▓рд┐рд╕реА рдЕрдиреБрдкрд╛рддред рдпрд╣ рдЕрдиреБрдкрд╛рдд рдкреБрд░рд╛рдиреА рдФрд░ рдирдИ рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред┬а┬а
- рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдлрд╝рдВрдХреНрд╢рди┬а
- рдирд┐рдореНрди рдХрд╛ рдЧреБрдгрдирдлрд▓:
- рдкреЙрд▓рд┐рд╕реА рдЕрдиреБрдкрд╛рдд рдХрд╛ рдХреНрд▓реИрдореНрдкреНрдб рдорд╛рдиред рдпрд╣ рдЕрдиреБрдкрд╛рдд рдЗрд╕ рддрд░рд╣ рдХреНрд▓рд┐рдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдбреЗрдЯреЗрдб рдкреЙрд▓рд┐рд╕реА рдкреБрд░рд╛рдиреА рдкреЙрд▓рд┐рд╕реА рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рддрд┐рд╢рдд рдХреЗ рднреАрддрд░ рд░рд╣реЗред┬а
- рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдлрд╝рдВрдХреНрд╢рди┬а
рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЙрд╕ рдХрд╛ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред┬а
рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо
рдкреЙрд▓рд┐рд╕реА рдЕрдиреБрдкрд╛рдд, R, рдирдИ рдФрд░ рдкреБрд░рд╛рдиреА рдкреЙрд▓рд┐рд╕рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирдИ рддрдерд╛ рдкреБрд░рд╛рдиреА рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░реЛрдВ рдХреЗ рддрд╣рдд рдкреЙрд▓рд┐рд╕реА рдХреЗ рд▓реЙрдЧ рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдХреНрд▓рд┐рдкреНрдб рдкреЙрд▓рд┐рд╕реА рдЕрдиреБрдкрд╛рдд, R', рдЗрд╕ рддрд░рд╣ рдмрд╛рдзрд┐рдд рд╣реИ рдХрд┐:┬а
рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ At рддрдерд╛ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдкреЙрд▓рд┐рд╕реА рдЕрдиреБрдкрд╛рдд рдХреЗ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреА рд╣реИ:
я┐╝рдиреАрдЪреЗ рджрд┐рдпрд╛ рдХреЛрдб рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рдФрд░ рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред┬а
def calculate_surrogate_loss(
actions_log_probability_old,
actions_log_probability_new,
epsilon,
advantages):
advantages = advantages.detach()
policy_ratio = (
actions_log_probability_new - actions_log_probability_old
).exp()
surrogate_loss_1 = policy_ratio * advantages
surrogate_loss_2 = torch.clamp(
policy_ratio, min=1.0-epsilon, max=1.0+epsilon
) * advantages
surrogate_loss = torch.min(surrogate_loss_1, surrogate_loss_2)
return surrogate_loss
3. рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдирд╛
рдЕрдм, рдЖрдЗрдП рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреНрд░реЗрди рдХрд░реЗрдВред
рдкреЙрд▓рд┐рд╕реА рдФрд░ рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛┬а
рдЕрдм рд╣рдо рдкреЙрд▓рд┐рд╕реА рдФрд░ рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:┬а
- рдкреЙрд▓рд┐рд╕реА рд▓реЙрд╕ рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдФрд░ рдПрдВрдЯреНрд░реЙрдкреА рдмреЛрдирд╕ рдХрд╛ рдпреЛрдЧ рд╣реИред┬а
- рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдХреНрд░рд┐рдЯрд┐рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╡реИрд▓реНрдпреВ рдФрд░ рдкреЙрд▓рд┐рд╕реА рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд░рд┐рдЯрд░реНрди (рд╕рдВрдЪрд┐рдд рд░рд┐рд╡реЙрд░реНрдб) рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдореВрдж L1 рд▓реЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд▓реЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдореВрде рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдЙрдЯреНрд▓рд╛рдпрд░ рдХреЗ рдкреНрд░рддрд┐ рдХрдо рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдмрдирд╛рддрд╛ рд╣реИред┬а
рдКрдкрд░ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рджреЛрдиреЛрдВ рд▓реЙрд╕ рдЯреЗрдиреНрд╕рд░ рд╣реЛрддреЗ рд╣реИрдВред рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ рд╕реНрдХреЗрд▓рд░ рдорд╛рдиреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд▓реЙрд╕ рдХрд╛ рдПрдХ рдПрдХрд▓ рд╕реНрдХреЗрд▓рд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .sum() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдиреНрд╕рд░ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рд▓реЗрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:┬а
def calculate_losses(
surrogate_loss, entropy, entropy_coefficient, returns, value_pred):
entropy_bonus = entropy_coefficient * entropy
policy_loss = -(surrogate_loss + entropy_bonus).sum()
value_loss = f.smooth_l1_loss(returns, value_pred).sum()
return policy_loss, value_loss
рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реВрдк рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЦрд╛рд▓реА рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдПрдБред рдЯреНрд░реЗрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрди рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ, рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕реНрдЯреЗрдЯреНрд╕ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдореЗрдВ рд░рд┐рд╡реЙрд░реНрдб рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдЗрди рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ:┬а
def init_training():
states = []
actions = []
actions_log_probability = []
values = []
rewards = []
done = False
episode_reward = 0
return states, actions, actions_log_probability, values, rewards, done, episode_reward
рд╣рд░ рдЯреНрд░реЗрдирд┐рдВрдЧ рдЗрдЯрд░реЗрд╢рди рдЙрд╕ рдЗрдЯрд░реЗрд╢рди рдХреЗ рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдЬреЗрдВрдЯ рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИред рдПрдЬреЗрдВрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд▓реВрдк рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЯрд░реНрдорд┐рдирд▓ рдХрдВрдбреАрд╢рди рддрдХ рди рдкрд╣реБрдБрдЪ рдЬрд╛рдПред┬а
рд╣рд░ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдХреЗ рдмрд╛рдж, рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛, рд░рд┐рд╡реЙрд░реНрдб рдФрд░ рд╡реИрд▓реНрдпреВ рд╕рдВрдмрдВрдзрд┐рдд рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИред рдЬрдм рдПрдкрд┐рд╕реЛрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдбреЗрдЯреЗрдб рдмрдлрд╝рд░реНрд╕ рдХрд╛ рд╕реЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдкрд┐рд╕реЛрдб рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред┬а
рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реВрдк рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ:
- рдореЙрдбрд▓ рдХреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдореЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ
agent.train()рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред┬а - рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдПрдХ рд░реИрдВрдбрдо рд╕реНрдЯреЗрдЯ рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ
env.reset()рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдпрд╣ рдЗрд╕ рдЯреНрд░реЗрдирд┐рдВрдЧ рдЗрдЯрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рд╕реНрдЯреЗрдЯ рд╣реИред┬а
рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реВрдк рдореЗрдВ рд╣рд░ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЪрд░рдг рдмрддрд╛рддреЗ рд╣реИрдВ:┬а
- рд╕реНрдЯреЗрдЯ рдХреЛ рдПрдЬреЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВред┬а
- рдПрдЬреЗрдВрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
- рдкреЙрд▓рд┐рд╕реА (рдПрдХреНрдЯрд░) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдЯреЗрдЯ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рдПрдХреНрд╢рдиред рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рдПрдХреНрд╢рди рдЯреЗрдиреНрд╕рд░ рдХреЛ softmax рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд╛рд░реЗрдВред┬а┬а
- рдХреНрд░рд┐рдЯрд┐рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдЯреЗрдЯ рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд╡реИрд▓реНрдпреВред
- рдПрдЬреЗрдВрдЯ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╢рди рдЪреБрдирддрд╛ рд╣реИ:
- рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдБред┬а
- рдЗрд╕ рд╡рд┐рддрд░рдг рд╕реЗ рдПрдХ рд╕реИрдВрдкрд▓ рдЪреБрдирдХрд░ рд░реИрдВрдбрдорд▓реА рдПрдХреНрд╢рди рдЪреБрдиреЗрдВред
dist.sample()рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдХрд░рддрд╛ рд╣реИред┬а - рдЗрд╕ рдПрдХреНрд╢рди рдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
env.step()рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЗрд╕ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдХреЗ рд▓рд┐рдП рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рд┐рдореБрд▓реЗрд╢рди рд╣реЛ рд╕рдХреЗред рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд╛рддрд╛рд╡рд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ: - рдирдпрд╛ рд╕реНрдЯреЗрдЯ
- рд░рд┐рд╡реЙрд░реНрдб
- рдмреВрд▓рд┐рдпрди рд░рд┐рдЯрд░реНрди рдорд╛рди
done(рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рдЯрд░реНрдорд┐рдирд▓ рд╕реНрдЯреЗрдЯ рддрдХ рдкрд╣реБрдБрдЪрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ) - рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛, рд░рд┐рд╡реЙрд░реНрдб, рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд╡реИрд▓реНрдпреВ рдФрд░ рдирдП рд╕реНрдЯреЗрдЯ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред┬а
рдЯреНрд░реЗрдирд┐рдВрдЧ рдПрдкрд┐рд╕реЛрдб рддрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм env.step() рдлрд╝рдВрдХреНрд╢рди done рдХреЗ рдмреВрд▓рд┐рдпрди рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд▓рд┐рдП true рд▓реМрдЯрд╛рддрд╛ рд╣реИред┬а
рдПрдкрд┐рд╕реЛрдб рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рд╕реЗ рд╕рдВрдЪрд┐рдд рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдПрдкрд┐рд╕реЛрдб рдХреЗ рдХреНрдпреВрдореНрдпреБрд▓реЗрдЯрд┐рд╡ рд░рд┐рдЯрд░реНрди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдХреЛ рдЬреЛрдбрд╝рдХрд░ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╣рд▓реЗ рдмрддрд╛рдИ рдЧрдИ calculate_returns() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдлрд╝реИрдХреНрдЯрд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рд╕реЗ рд░рд┐рд╡реЙрд░реНрдб рд╡рд╛рд▓реЗ рдмрдлрд╝рд░ рд╣реИрдВред рд╣рдо рдЗрди рд░рд┐рдЯрд░реНрди рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рд╕реЗ рд╕рдВрдЪрд┐рдд рд╡реИрд▓реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ calculate_advantages() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред┬а
рдирд┐рдореНрди Python рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
def forward_pass(env, agent, optimizer, discount_factor):
states, actions, actions_log_probability, values, rewards, done, episode_reward = init_training()
state = env.reset()
agent.train()
while not done:
state = torch.FloatTensor(state).unsqueeze(0)
states.append(state)
action_pred, value_pred = agent(state)
action_prob = f.softmax(action_pred, dim=-1)
dist = distributions.Categorical(action_prob)
action = dist.sample()
log_prob_action = dist.log_prob(action)
state, reward, done, _ = env.step(action.item())
actions.append(action)
actions_log_probability.append(log_prob_action)
values.append(value_pred)
rewards.append(reward)
episode_reward += reward
states = torch.cat(states)
actions = torch.cat(actions)
actions_log_probability = torch.cat(actions_log_probability)
values = torch.cat(values).squeeze(-1)
returns = calculate_returns(rewards, discount_factor)
advantages = calculate_advantages(returns, values)
return episode_reward, states, actions, actions_log_probability, advantages, returns
рдореЙрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛
рд╣рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЗрдЯрд░реЗрд╢рди рдореЗрдВ, рдореЙрдбрд▓ рдХреЛ рдХрдИ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк (рдЯрд░реНрдорд┐рдирд▓ рдХрдВрдбреАрд╢рди рддрдХ) рд╡рд╛рд▓реЗ рдПрдХ рдкреВрд░реНрдг рдПрдкрд┐рд╕реЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдк рдореЗрдВ, рд╣рдо рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░, рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛, рд░рд┐рдЯрд░реНрди рдФрд░ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЗрдЯрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕ рдЗрдЯрд░реЗрд╢рди рдХреЗ рд╕рднреА рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред┬а
CartPole рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ 500 рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рд▓рд╛рдЦреЛрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЯреНрд░реЗрдирд┐рдВрдЧ рд░рд┐рдЬрд╝рд▓реНрдЯреНрд╕ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдмреИрдЪреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред┬а
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЙрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рд╣реИрдВ:
- рдЯреНрд░реЗрдирд┐рдВрдЧ рд░рд┐рдЬрд╝рд▓реНрдЯреНрд╕ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдмреИрдЪреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред┬а
- рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдХреЗ рд▓рд┐рдП:
- рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
- рдЗрди рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рдПрдХреНрд╢рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдИ рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред┬а
- рдЗрд╕ рд╡рд┐рддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдВрдЯреНрд░реЙрдкреА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред┬а
- рдЗрд╕ рд╡рд┐рддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреНрд░реЗрдирд┐рдВрдЧ рд░рд┐рдЬрд╝рд▓реНрдЯреНрд╕ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓реЙрдЧ рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред рдпрд╣ рдЙрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирдП рд▓реЙрдЧ рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ рд╣реИред рдЗрди рд╣реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ рд▓реЙрдЧ рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдордЭрд╛рдП рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред┬а
- рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рд╡рд┐рддрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред┬а
- рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕, рдПрдВрдЯреНрд░реЙрдкреА рдФрд░ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЙрд▓рд┐рд╕реА рдФрд░ рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред┬а
- рдкреЙрд▓рд┐рд╕реА рдФрд░ рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ
.backward()рдЪрд▓рд╛рдПрдБред рдпрд╣ рд▓реЙрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред┬а - рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдкрд░
.step()рдЪрд▓рд╛рдХрд░ рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЧрддрд┐ рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд╕рдВрддреБрд▓рди рдХреЗ рд▓рд┐рдП Adam рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред┬а - рдкреЙрд▓рд┐рд╕реА рдФрд░ рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░реЗрдВред┬а
- рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдкрд░ рдмреИрдХрд╡рд░реНрдб рдкрд╛рд╕ (рдКрдкрд░ рдХреЗ рдСрдкрд░реЗрд╢рдВрд╕) рдХреЛ рдХреБрдЫ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдПрдБ, рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░
PPO_STEPSрдХреЗ рдорд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдкрд░ рдмреИрдХрд╡рд░реНрдб рдкрд╛рд╕ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓реА рдХреБрд╢рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реЙрд░рд╡рд░реНрдб рдкрд╛рд╕ рдЪрд▓рд╛рдП рдмрд┐рдирд╛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмреАрдЪ рд╣рд░ рдЕрджрд▓рд╛-рдмрджрд▓реА рдореЗрдВ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕реНрдЯреЗрдкреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдЯрд░реЗрд╢рди рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред┬а - рдФрд╕рдд рдкреЙрд▓рд┐рд╕реА рд▓реЙрд╕ рдФрд░ рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рд▓реМрдЯрд╛рдПрдБред
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдХреЛрдб рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
def update_policy(
agent,
states,
actions,
actions_log_probability_old,
advantages,
returns,
optimizer,
ppo_steps,
epsilon,
entropy_coefficient):
BATCH_SIZE = 128
total_policy_loss = 0
total_value_loss = 0
actions_log_probability_old = actions_log_probability_old.detach()
actions = actions.detach()
training_results_dataset = TensorDataset(
states,
actions,
actions_log_probability_old,
advantages,
returns)
batch_dataset = DataLoader(
training_results_dataset,
batch_size=BATCH_SIZE,
shuffle=False)
for _ in range(ppo_steps):
for batch_idx, (states, actions, actions_log_probability_old, advantages, returns) in enumerate(batch_dataset):
# get new log prob of actions for all input states
action_pred, value_pred = agent(states)
value_pred = value_pred.squeeze(-1)
action_prob = f.softmax(action_pred, dim=-1)
probability_distribution_new = distributions.Categorical(
action_prob)
entropy = probability_distribution_new.entropy()
# estimate new log probabilities using old actions
actions_log_probability_new = probability_distribution_new.log_prob(actions)
surrogate_loss = calculate_surrogate_loss(
actions_log_probability_old,
actions_log_probability_new,
epsilon,
advantages)
policy_loss, value_loss = calculate_losses(
surrogate_loss,
entropy,
entropy_coefficient,
returns,
value_pred)
optimizer.zero_grad()
policy_loss.backward()
value_loss.backward()
optimizer.step()
total_policy_loss += policy_loss.item()
total_value_loss += value_loss.item()
return total_policy_loss / ppo_steps, total_value_loss / ppo_steps4. PPO рдПрдЬреЗрдВрдЯ рдЪрд▓рд╛рдирд╛┬а
рдЖрдЗрдП рдЕрдВрддрддрдГ PPO рдПрдЬреЗрдВрдЯ рдЪрд▓рд╛рдПрдБред
рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди┬а
рдПрдЬреЗрдВрдЯ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕ рдирдП рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдЬреЗрдВрдЯ рдХреЛ рдЪрд▓рд╛рдХрд░ рдХреНрдпреВрдореНрдпреБрд▓реЗрдЯрд┐рд╡ рд░рд┐рд╡реЙрд░реНрдб рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рдЖрдкрдХреЛ .eval() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдореЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪрд░рдг рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реВрдк рдЬреИрд╕реЗ рд╣реА рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:┬а
def evaluate(env, agent):
agent.eval()
rewards = []
done = False
episode_reward = 0
state = env.reset()
while not done:
state = torch.FloatTensor(state).unsqueeze(0)
with torch.no_grad():
action_pred, _ = agent(state)
action_prob = f.softmax(action_pred, dim=-1)
action = torch.argmax(action_prob, dim=-1)
state, reward, done, _ = env.step(action.item())
episode_reward += reward
return episode_reward
рдЯреНрд░реЗрдирд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
рд╣рдо рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Matplotlib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рд▓реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд░рд┐рд╡реЙрд░реНрдбреНрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд▓реЙрдЯ рдХрд░реЗрдВ, рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
def plot_train_rewards(train_rewards, reward_threshold):
plt.figure(figsize=(12, 8))
plt.plot(train_rewards, label='Training Reward')
plt.xlabel('Episode', fontsize=20)
plt.ylabel('Training Reward', fontsize=20)
plt.hlines(reward_threshold, 0, len(train_rewards), color='y')
plt.legend(loc='lower right')
plt.grid()
plt.show()
def plot_test_rewards(test_rewards, reward_threshold):
plt.figure(figsize=(12, 8))
plt.plot(test_rewards, label='Testing Reward')
plt.xlabel('Episode', fontsize=20)
plt.ylabel('Testing Reward', fontsize=20)
plt.hlines(reward_threshold, 0, len(test_rewards), color='y')
plt.legend(loc='lower right')
plt.grid()
plt.show()
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкреНрд▓реЙрдЯреНрд╕ рдореЗрдВ, рд╣рдо рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рд░рд┐рд╡реЙрд░реНрдб рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд░рдорд╢рдГ рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдкрд░ рдЗрди рдкреНрд▓реЙрдЯреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдЕрд▓рдЧ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдРрд╕рд╛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реИрдВрдбрдордиреЗрд╕ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред┬а

рдЯреНрд░реЗрдирд┐рдВрдЧ рд░рд┐рд╡реЙрд░реНрдб (рдЯреНрд░реЗрдирд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд)ред рдЫрд╡рд┐: рд▓реЗрдЦрдХред

рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рд░рд┐рд╡реЙрд░реНрдб (рдЯреЗрд╕реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд)ред рдЫрд╡рд┐: рд▓реЗрдЦрдХред┬а
рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЖрдЙрдЯрдкреБрдЯ рдЧреНрд░рд╛рдлрд╝реНрд╕ рдореЗрдВ, рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдЧрддрд┐ рджреЗрдЦреЗрдВ:
- рд░рд┐рд╡реЙрд░реНрдб рдХрдо рдорд╛рдиреЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдЖрдЧреЗ рдмрдврд╝рддреА рд╣реИ, рд░рд┐рд╡реЙрд░реНрдб рдмрдврд╝рддреЗ рд╣реИрдВред┬а
- рд░рд┐рд╡реЙрд░реНрдб рдмрдврд╝рддреЗ рд╕рдордп рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдЬреЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдкреЙрд▓рд┐рд╕реА рд╕реНрдкреЗрд╕ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред┬а
- рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рд░рд┐рд╡реЙрд░реНрдб рдХрдИ рдЗрдЯрд░реЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб (475) рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред┬а
- рд░рд┐рд╡реЙрд░реНрдб 500 рдкрд░ рдХреИрдкреНрдб рд╣реИрдВред рдпреЗ рд╡рд╛рддрд╛рд╡рд░рдг (Gym CartPole v1) рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред┬а
рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рдЖрдк рдЗрдЯрд░реЗрд╢рдВрд╕ рдХреЗ рджреМрд░рд╛рди рд╡реИрд▓реНрдпреВ рдФрд░ рдкреЙрд▓рд┐рд╕реА рд▓реЙрд╕ рдХреЛ рднреА рдкреНрд▓реЙрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def plot_losses(policy_losses, value_losses):
plt.figure(figsize=(12, 8))
plt.plot(value_losses, label='Value Losses')
plt.plot(policy_losses, label='Policy Losses')
plt.xlabel('Episode', fontsize=20)
plt.ylabel('Loss', fontsize=20)
plt.legend(loc='lower right')
plt.grid()
plt.show()
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд▓реЙрдЯ рдЯреНрд░реЗрдирд┐рдВрдЧ рдПрдкрд┐рд╕реЛрдбреНрд╕ рдХреЗ рджреМрд░рд╛рди рдЯреНрд░реИрдХ рдХрд┐рдП рдЧрдП рд▓реЙрд╕ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╡реИрд▓реНрдпреВ рдФрд░ рдкреЙрд▓рд┐рд╕реА рд▓реЙрд╕ред рдЫрд╡рд┐: рд▓реЗрдЦрдХ
рдкреНрд▓реЙрдЯ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ:
- рд▓реЙрд╕ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗред┬а
- рдпрд╣ RL рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд▓рдХреНрд╖реНрдп рд▓реЙрд╕ рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдирд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд░рд┐рд╡реЙрд░реНрдб рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред┬а
PPO рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓рд╛рдПрдБ
рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ PPO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдШрдЯрдХ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
- рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдлрд╝реИрдХреНрдЯрд░, рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝, рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдЖрджрд┐ рдЬреИрд╕реЗ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред┬а
- рд╣рд░ рдЗрдЯрд░реЗрд╢рди рд╕реЗ рд░рд┐рд╡реЙрд░реНрдб рдФрд░ рд▓реЙрд╕ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░реНрд╕ рдХреЛ null рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрд╕реНрдЯреИрдВрд╢рд┐рдПрдЯ рдХрд░реЗрдВред┬а
create_agent()рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдЬреЗрдВрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдПрдБредforward_pass()рдФрд░update_policy()рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдлрд╝реЙрд░рд╡рд░реНрдб рдФрд░ рдмреИрдХрд╡рд░реНрдб рдкрд╛рд╕ рдЪрд▓рд╛рдПрдБред┬аevaluate()рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЙрд▓рд┐рд╕реА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред┬а- рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреЙрд▓рд┐рд╕реА, рд╡реИрд▓реНрдпреВ рд▓реЙрд╕ рдФрд░ рд░рд┐рд╡реЙрд░реНрдб рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред┬а
- рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдкрд░ рд░рд┐рд╡реЙрд░реНрдб рдФрд░ рд▓реЙрд╕ рдХрд╛ рдФрд╕рдд рдирд┐рдХрд╛рд▓реЗрдВред рдиреАрдЪреЗ рджрд┐рдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд┐рдЫрд▓реЗ 40 рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдкрд░ рдФрд╕рдд рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред┬а
- рд╣рд░ рдХреБрдЫ рд╕реНрдЯреЗрдкреНрд╕ рдкрд░ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣рд░ 10 рд╕реНрдЯреЗрдк рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред┬а
- рдЬрдм рдФрд╕рдд рд░рд┐рд╡реЙрд░реНрдб рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб рдкрд╛рд░ рдХрд░ рдЬрд╛рдП, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред┬а
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ Python рдореЗрдВ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
def run_ppo():
MAX_EPISODES = 500
DISCOUNT_FACTOR = 0.99
REWARD_THRESHOLD = 475
PRINT_INTERVAL = 10
PPO_STEPS = 8
N_TRIALS = 100
EPSILON = 0.2
ENTROPY_COEFFICIENT = 0.01
HIDDEN_DIMENSIONS = 64
DROPOUT = 0.2
LEARNING_RATE = 0.001
train_rewards = []
test_rewards = []
policy_losses = []
value_losses = []
agent = create_agent(HIDDEN_DIMENSIONS, DROPOUT)
optimizer = optim.Adam(agent.parameters(), lr=LEARNING_RATE)
for episode in range(1, MAX_EPISODES+1):
train_reward, states, actions, actions_log_probability, advantages, returns = forward_pass(
env_train,
agent,
optimizer,
DISCOUNT_FACTOR)
policy_loss, value_loss = update_policy(
agent,
states,
actions,
actions_log_probability,
advantages,
returns,
optimizer,
PPO_STEPS,
EPSILON,
ENTROPY_COEFFICIENT)
test_reward = evaluate(env_test, agent)
policy_losses.append(policy_loss)
value_losses.append(value_loss)
train_rewards.append(train_reward)
test_rewards.append(test_reward)
mean_train_rewards = np.mean(train_rewards[-N_TRIALS:])
mean_test_rewards = np.mean(test_rewards[-N_TRIALS:])
mean_abs_policy_loss = np.mean(np.abs(policy_losses[-N_TRIALS:]))
mean_abs_value_loss = np.mean(np.abs(value_losses[-N_TRIALS:]))
if episode % PRINT_INTERVAL == 0:
print(f'Episode: {episode:3} | \
Mean Train Rewards: {mean_train_rewards:3.1f} \
| Mean Test Rewards: {mean_test_rewards:3.1f} \
| Mean Abs Policy Loss: {mean_abs_policy_loss:2.2f} \
| Mean Abs Value Loss: {mean_abs_value_loss:2.2f}')
if mean_test_rewards >= REWARD_THRESHOLD:
print(f'Reached reward threshold in {episode} episodes')
break
plot_train_rewards(train_rewards, REWARD_THRESHOLD)
plot_test_rewards(test_rewards, REWARD_THRESHOLD)
plot_losses(policy_losses, value_losses)
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдБ:┬а
run_ppo()
рдЖрдЙрдЯрдкреБрдЯ рдиреАрдЪреЗ рджрд┐рдП рд╕реИрдВрдкрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:┬а
Episode: 10 | Mean Train Rewards: 22.3 | Mean Test Rewards: 30.4 | Mean Abs Policy Loss: 0.37 | Mean Abs Value Loss: 0.39
Episode: 20 | Mean Train Rewards: 38.6 | Mean Test Rewards: 69.8 | Mean Abs Policy Loss: 0.46 | Mean Abs Value Loss: 0.37
.
.
.
Episode: 100 | Mean Train Rewards: 289.5 | Mean Test Rewards: 427.3 | Mean Abs Policy Loss: 1.73 | Mean Abs Value Loss: 0.21
Episode: 110 | Mean Train Rewards: 357.7 | Mean Test Rewards: 461.4 | Mean Abs Policy Loss: 1.86 | Mean Abs Value Loss: 0.22
Reached reward threshold in 116 episodes
рдЖрдк рдХрд╛рд░реНрдпрд░рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЗрд╕ DataLab рдиреЛрдЯрдмреБрдХ рдкрд░ рджреЗрдЦ рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ!
5. рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди
рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдиреАрдЪреЗ, рдореИрдВ PPO рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБ:┬а
- рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ: рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЗрдЯрд░реЗрд╢рди рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рддрдиреЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдЯреЛрдХреЗрд╕реНрдЯрд┐рдХ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЗрдЯрд░реЗрд╢рди рдореЗрдВ рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рддрдиреА рдорд╛рддреНрд░рд╛ рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рд╡рд╣ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдФрд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреЗ рдЧреБрдгрдирдлрд▓ рд╕реЗ рддрдп рд╣реЛрддреА рд╣реИред┬а
- рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░: рдЗрд╕реЗ рдПрдкреНрд╕рд┐рд▓реЙрди, ╬╡, рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рд╕реА рдЕрдиреБрдкрд╛рдд рдХрд┐рддрдиреА рд╕реАрдорд╛ рддрдХ рдХреНрд▓рд┐рдк рдХрд┐рдпрд╛ рдЬрд╛рдПред рдирдИ рдФрд░ рдкреБрд░рд╛рдиреА рдкреЙрд▓рд┐рд╕реА рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рд╕реАрдорд╛┬а[1-╬╡, 1+╬╡] рдореЗрдВ рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЬрдм рдпрд╣ рдЗрд╕ рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЗрд╕реА рд╕реАрдорд╛ рдореЗрдВ рдХреНрд▓рд┐рдк рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред┬а
- рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝: рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреЗрдкреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред PPO рдореЗрдВ, рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдЙрди рдЯрд╛рдЗрдорд╕реНрдЯреЗрдкреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреЙрд▓рд┐рд╕реА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ 64 рдХреЗ рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред┬а
- рдЗрдЯрд░реЗрд╢рди рд╕реНрдЯреЗрдкреНрд╕: рдпрд╣ рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рддрдиреА рдмрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдмреИрдХрд╡рд░реНрдб рдкрд╛рд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдХреЛрдб рдореЗрдВ рдЗрд╕реЗ
PPO_STEPSрдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред рдЬрдЯрд┐рд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ, рдХрдИ рдмрд╛рд░ рдлрд╝реЙрд░рд╡рд░реНрдб рдкрд╛рд╕ рдЪрд▓рд╛рдирд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓реА рдорд╣рдВрдЧрд╛ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдХреЛ рдХреБрдЫ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ 5 рд╕реЗ 10 рдХреЗ рдмреАрдЪ рдХрд╛ рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред┬а - рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдлрд╝реИрдХреНрдЯрд░: рдЗрд╕реЗ рдЧрд╛рдорд╛, ╬│, рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд░рд┐рд╡реЙрд░реНрдб рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИрдВред рдпрд╣ рдкреИрд╕реЗ рдХреЗ рд╕рдордп рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдмреНрдпрд╛рдЬ рджрд░реЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЬрдм 0 рдХреЗ рдХрд░реАрдм рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдХрдо рдореВрд▓реНрдпрд╡рд╛рди рд╣реИрдВ рдФрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд░рд┐рд╡реЙрд░реНрдб рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдЬрдм 1 рдХреЗ рдХрд░реАрдм рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд╡реЙрд░реНрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред┬а
- рдПрдВрдЯреНрд░реЙрдкреА рдХреЛрдПрдлрд╝рд┐рд╢рд┐рдПрдВрдЯ: рдПрдВрдЯреНрд░реЙрдкреА рдХреЛрдПрдлрд╝рд┐рд╢рд┐рдПрдВрдЯ рдПрдВрдЯреНрд░реЙрдкреА рдмреЛрдирд╕ рддрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдПрдВрдЯреНрд░реЙрдкреА рдХреЛрдПрдлрд╝рд┐рд╢рд┐рдПрдВрдЯ рдФрд░ рд╡рд┐рддрд░рдг рдХреА рдПрдВрдЯреНрд░реЙрдкреА рдХреЗ рдЧреБрдгрдирдлрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддреА рд╣реИред рдПрдВрдЯреНрд░реЙрдкреА рдмреЛрдирд╕ рдХреА рднреВрдорд┐рдХрд╛ рдкреЙрд▓рд┐рд╕реА рдореЗрдВ рдЕрдзрд┐рдХ рд░реИрдВрдбрдордиреЗрд╕ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрд╣ рдПрдЬреЗрдВрдЯ рдХреЛ рдкреЙрд▓рд┐рд╕реА рд╕реНрдкреЗрд╕ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдпрд╣ рд░реИрдВрдбрдордиреЗрд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рддреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХрд┐рд╕реА рдЗрд╖реНрдЯрддрдо рдкреЙрд▓рд┐рд╕реА рдкрд░ рдХрдиреНрд╡рд░реНрдЬ рдирд╣реАрдВ рд╣реЛрддреАред┬а
- рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдкрджрдВрдб: рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдб рд╕реЗрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХрдм рд╕рдлрд▓ рдорд╛рдиреА рдЬрд╛рдПред рдПрдХ рдЖрдо рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╢рд░реНрдд рд░рдЦреЗрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ N рдЯреНрд░рд╛рдпрд▓реНрд╕ (рдПрдкрд┐рд╕реЛрдбреНрд╕) рдкрд░ рдФрд╕рдд рд░рд┐рд╡реЙрд░реНрдб рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб рд╕реЗ рдКрдкрд░ рд╣реЛред рдКрдкрд░ рджрд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╡реИрд░рд┐рдПрдмрд▓
N_TRIALSрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рдЗрд╕реЗ рдЙрдЪреНрдЪ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдЕрдзрд┐рдХ рдПрдкрд┐рд╕реЛрдбреНрд╕ рдореЗрдВ рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб рд░рд┐рд╡реЙрд░реНрдб рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рдордЬрд╝рдмреВрдд рдкреЙрд▓рд┐рд╕реА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓реА рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реЛрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ PPO рдПрдХ рд╕реНрдЯреЛрдХреЗрд╕реНрдЯрд┐рдХ рдкреЙрд▓рд┐рд╕реА рд╣реИ, рдФрд░ рдРрд╕реЗ рдПрдкрд┐рд╕реЛрдб рд╣реЛрдВрдЧреЗ рдЬрдм рдПрдЬреЗрдВрдЯ рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб рдкрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐N_TRIALSрдХрд╛ рдорд╛рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЖрдкрдХреА рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддреАред
PPO рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐рдпрд╛рдБ
PPO рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЯреНрд░рд╛рдпрд▓-рдПрдВрдб-рдПрд░рд░ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдХреБрдЫ рд╡реНрдпрд╛рдкрдХ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ:┬а
- рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдлрд╝реИрдХреНрдЯрд░: рдЬрдм рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд░рд┐рд╡реЙрд░реНрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдВ, рдЬреИрд╕реЗ CartPole рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдЬрд╣рд╛рдБ рдбрдВрдбреЗ рдХреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рд░рд╣рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ 0.99 рдЬреИрд╕реЗ рдордзреНрдпрдо рдЧрд╛рдорд╛ рдорд╛рди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред┬а
- рдПрдВрдЯреНрд░реЙрдкреА рдмреЛрдирд╕: рдЬрдЯрд┐рд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдХреЛ рдЗрд╖реНрдЯрддрдо рдкреЙрд▓рд┐рд╕реА рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╢рди рд╕реНрдкреЗрд╕ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдВрдЯреНрд░реЙрдкреА рдмреЛрдирд╕ рдПрдХреНрд╕рдкреНрд▓реЛрд░реЗрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред рдПрдВрдЯреНрд░реЙрдкреА рдмреЛрдирд╕ рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдВрдЯреНрд░реЙрдкреА рдХреЛрдПрдлрд╝рд┐рд╢рд┐рдПрдВрдЯ рддрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реЛрдЧреЗрдЯ рд▓реЙрд╕ рдФрд░ рд╡рд┐рддрд░рдг рдХреА рдПрдВрдЯреНрд░реЙрдкреА рдХреА рдорд╛рддреНрд░рд╛ рдЬрд╛рдБрдЪреЗрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ 0.01 рдХрд╛ рдПрдВрдЯреНрд░реЙрдкреА рдХреЛрдПрдлрд╝рд┐рд╢рд┐рдПрдВрдЯ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
- рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░: рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдбреЗрдЯреЗрдб рдкреЙрд▓рд┐рд╕реА рд╡рд░реНрддрдорд╛рди рдкреЙрд▓рд┐рд╕реА рд╕реЗ рдХрд┐рддрдиреА рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдмрдбрд╝рд╛ рдорд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдмреЗрд╣рддрд░ рдЕрдиреНрд╡реЗрд╖рдг рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рднреА рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХреНрд░рдорд┐рдХ рдЕрдиреНрд╡реЗрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗ, рдЬрдмрдХрд┐ рдЕрд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдбреЗрдЯреНрд╕ рдХреЛ рд░реЛрдХреЗред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ 0.2 рдХрд╛ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
- рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ: рдЬрдм рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреЙрд▓рд┐рд╕реА рдмрдбрд╝реЗ рдХрджрдореЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рд░ рдЗрдЯрд░реЗрд╢рди рддрдерд╛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЬрдм рдпрд╣ рдмрд╣реБрдд рдХрдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдордиреЗ 0.001 рдХрд╛ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, 1e-5 рдХрд╛ рд▓рд░реНрдирд┐рдВрдЧ рд░реЗрдЯ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред┬а
PPO рдореЗрдВ рдЪреБрдиреМрддрд┐рдпрд╛рдБ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ
PPO рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рдФрд░ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рд╡рд┐рд╡рд░рдг рд╕рдордЭрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдЪреБрдиреМрддрд┐рдпреЛрдВ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред┬а
PPO рдХреЛ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдореЗрдВ рдЖрдо рдЪреБрдиреМрддрд┐рдпрд╛рдБ
рд╣рд╛рд▓рд╛рдБрдХрд┐ PPO рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рдЬрд╛рдЧрд░реВрдХ рд░рд╣рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреБрдЫ рдРрд╕реА рдЪреБрдиреМрддрд┐рдпрд╛рдБ рд╣реИрдВ:
- рдзреАрдореА рдХрдиреНрд╡рд░реНрдЬреЗрдВрд╕: рдЬрдЯрд┐рд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ, PPO рд╕реИрдВрдкрд▓-рдЕрдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╖реНрдЯрддрдо рдкреЙрд▓рд┐рд╕реА рдкрд░ рдХрдиреНрд╡рд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд╕реЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдзреАрдореА рдФрд░ рдорд╣рдБрдЧреА рд╣реЛ рдЬрд╛рддреА рд╣реИред┬а
- рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛: PPO рдкреЙрд▓рд┐рд╕реА рд╕реНрдкреЗрд╕ рдХрд╛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдХрдиреНрд╡рд░реНрдЬреЗрдВрд╕ рдХреА рдЧрддрд┐ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреА рд╣реИред рдЗрди рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЗрд╖реНрдЯрддрдо рдорд╛рди рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдЯреНрд░рд╛рдпрд▓-рдПрдВрдб-рдПрд░рд░ рд╕реЗ рд╣реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред┬а
- рдУрд╡рд░рдлрд╝рд┐рдЯрд┐рдВрдЧ: ┬аRL рд╡рд╛рддрд╛рд╡рд░рдг рдЖрдорддреМрд░ рдкрд░ рд░реИрдВрдбрдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВред PPO рдЯреНрд░реЗрдирд┐рдВрдЧ рдПрдЬреЗрдВрдЯ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╖реНрдЯрддрдо рдкреЙрд▓рд┐рд╕реА рдЦреЛрдЬрдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред рдХрднреА-рдХрднреА, рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕реЗрдЯ рдкрд░ рдХрдиреНрд╡рд░реНрдЬ рдХрд░ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд░реИрдВрдбрдорд╛рдЗрдЬрд╝реНрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рдЗрдЯрд░реЗрд╢рдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реИрдВрдбрдорд╛рдЗрдЬрд╝реНрдб рдЯреНрд░реЗрдирд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред┬а
- рдбрд╛рдпрдиреЗрдорд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг: рд╕рд░рд▓ RL рд╡рд╛рддрд╛рд╡рд░рдг, рдЬреИрд╕реЗ CartPole, рд╕реНрдерд┐рд░ рд╣реЛрддреЗ рд╣реИрдВ - рдирд┐рдпрдо рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░рд╣рддреЗ рд╣реИрдВред рдХрдИ рдЕрдиреНрдп рд╡рд╛рддрд╛рд╡рд░рдг, рдЬреИрд╕реЗ рдЕрд╕реНрдерд┐рд░ рдЧрддрд┐рдорд╛рди рд╕рддрд╣ рдкрд░ рдЪрд▓рдирд╛ рд╕реАрдЦрддрд╛ рд╣реБрдЖ рд░реЛрдмреЛрдЯ, рдбрд╛рдпрдиреЗрдорд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ - рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдирд┐рдпрдо рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВред рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PPO рдХреЛ рдЕрдХреНрд╕рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред┬а
- рдПрдХреНрд╕рдкреНрд▓реЛрд░реЗрд╢рди рдмрдирд╛рдо рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯреЗрд╢рди: PPO рдХрд╛ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рд╕реА рдЕрдкрдбреЗрдЯ рдЯреНрд░рд╕реНрдЯреЗрдб рд░реАрдЬрди рдХреЗ рднреАрддрд░ рд░рд╣реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХреНрд╢рди рд╕реНрдкреЗрд╕ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рдиреЗ рд╕реЗ рднреА рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдЯрд┐рд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдСрдкреНрдЯрд┐рдорд╛ рдкрд░ рдХрдиреНрд╡рд░реНрдЬреЗрдВрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдПрдЬреЗрдВрдЯ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреНрд╡реЗрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рд╡рд╣ рдХрд┐рд╕реА рднреА рдЗрд╖реНрдЯрддрдо рдкреЙрд▓рд┐рд╕реА рдкрд░ рдХрдиреНрд╡рд░реНрдЬ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ред┬а
PPO рдореЙрдбрд▓ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕
PPO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреБрдЫ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ рд╕реБрдЭрд╛рддрд╛ рд╣реВрдБ, рдЬреИрд╕реЗ:
- рдЗрдирдкреБрдЯ рдлреАрдЪрд░реНрд╕ рдХреЛ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ: рд░рд┐рдЯрд░реНрди рдФрд░ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд┐рд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЕрдкрдбреЗрдЯреНрд╕ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╕реЗ рд╕рднреА рдорд╛рди рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реАрдорд╛ рдореЗрдВ рдЖ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдЙрдЯреНрд▓рд╛рдпрд░ рдФрд░ рдЪрд░рдо рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЕрдкрдбреЗрдЯреНрд╕ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдиреНрд╡рд░реНрдЬреЗрдВрд╕ рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред┬а
- рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдЫреЛрдЯреЗ рдмреИрдЪ рддреЗрдЬрд╝ рдЕрдкрдбреЗрдЯ рдФрд░ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдп рдСрдкреНрдЯрд┐рдорд╛ рдкрд░ рдХрдиреНрд╡рд░реНрдЬреЗрдВрд╕ рдФрд░ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдмрдбрд╝реЗ рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рдПрдЬреЗрдВрдЯ рдХреЛ рдордЬрд╝рдмреВрдд рдкреЙрд▓рд┐рд╕реА рд╕реАрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рд░ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмрд╣реБрдд рдмрдбрд╝реЗ рдмреИрдЪ рд╕рд╛рдЗрдЬрд╝ рднреА рдЙрдк-рдЗрд╖реНрдЯрддрдо рд╣реИрдВред рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд▓рд╛рдЧрдд рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдкреЙрд▓рд┐рд╕реА рдЕрдкрдбреЗрдЯреНрд╕ рдХреЛ рд╡реИрд▓реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рддрд┐ рдХрдо рдЙрддреНрддрд░рджрд╛рдпреА рдмрдирд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЕрдкрдбреЗрдЯ рдмрдбрд╝реЗ рдмреИрдЪреЛрдВ рдкрд░ рд▓рд┐рдП рдЧрдП рдФрд╕рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреИрдЪ рдкрд░ рдЕрдкрдбреЗрдЯреНрд╕ рдХреЛ рдУрд╡рд░рдлрд╝рд┐рдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред┬а
- рдЗрдЯрд░реЗрд╢рди рд╕реНрдЯреЗрдкреНрд╕: рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдХрд╛ 5-10 рдЗрдЯрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рд╣реА рдмреИрдЪ рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╛рд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдУрд╡рд░рдлрд╝рд┐рдЯрд┐рдВрдЧ рд╣реЛрддреА рд╣реИред рдХреЛрдб рдореЗрдВ рдЗрд╕ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ
PPO_STEPSрдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред┬а - рдирд┐рдпрдорд┐рдд рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдХрд░реЗрдВ: рдУрд╡рд░рдлрд╝рд┐рдЯрд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЙрд▓рд┐рд╕реА рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреА рд╕рдордп-рд╕рдордп рдкрд░ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рдкреЙрд▓рд┐рд╕реА рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЕрдкреНрд░рднрд╛рд╡реА рд╕рд╛рдмрд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдЧреЗ рдХреА рдЯреНрд░реЗрдирд┐рдВрдЧ рдпрд╛ рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред┬а
- рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрдпреВрди рдХрд░реЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛, PPO рдЯреНрд░реЗрдирд┐рдВрдЧ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдорд╛рдиреЛрдВ рдХрд╛ рд╕реЗрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред┬а
- рд╢реЗрдпрд░реНрдб рдмреИрдХрдмреЛрди рдиреЗрдЯрд╡рд░реНрдХ: рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢реЗрдпрд░реНрдб рдмреИрдХрдмреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрддреБрд▓рди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдПрдХреНрдЯрд░ рдФрд░ рдХреНрд░рд┐рдЯрд┐рдХ рдХреЗ рдмреАрдЪ рдмреИрдХрдмреЛрди рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рд╛рдЭрд╛ рдлреАрдЪрд░ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрд╢рди рдФрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рд╕рдорд╛рди рд╕рдордЭ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдФрд░ рд╕реНрдерд┐рд░ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╕реНрдкреЗрд╕ рдФрд░ рдЯрд╛рдЗрдо рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕рд┐рдЯреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИред┬а
- рд╣рд┐рдбрди рд▓реЗрдпрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЖрдХрд╛рд░: рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд┐рдбрди рд▓реЗрдпрд░реНрд╕ рдФрд░ рдЙрдирдХреЗ рдЖрдпрд╛рдо рдмрдврд╝рд╛рдПрдБред CartPole рдЬреИрд╕реЗ рд╕рд░рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд╣рд┐рдбрди рд▓реЗрдпрд░ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╣рд┐рдбрди рд▓реЗрдпрд░ 64 рдЖрдпрд╛рдо рдХреА рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрдирд╛рдирд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓реА рд╡реНрдпрд░реНрде рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрд╕реНрдерд┐рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред┬а
- рдЕрд░реНрд▓реА рд╕реНрдЯреЙрдкрд┐рдВрдЧ: рдЬрдм рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреВрд░реА рд╣реЛ рдЬрд╛рдПрдБ рддреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЛ рд░реЛрдХ рджреЗрдирд╛ рдУрд╡рд░рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдореЗрдЯреНрд░рд┐рдХ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдЬреЗрдВрдЯ рдкрд┐рдЫрд▓реЗ N рдЗрд╡реЗрдВрдЯреНрд╕ рдореЗрдВ рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб рд░рд┐рд╡реЙрд░реНрдб рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред┬а
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ RL рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдПрдХ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ PPO рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рдлрд┐рд░ рд╣рдордиреЗ PyTorch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PPO рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ред рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ PPO рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдмрдВрдзреА рд╕реБрдЭрд╛рд╡ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ рдкреНрд░рд╕реНрддреБрдд рдХреАрдВред┬а
рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЖрдк рдХреЛрдб рдХреЛ Gym рдХреЗ рдЕрдиреНрдп рдХреНрд▓рд╛рд╕рд┐рдХ рдХрдВрдЯреНрд░реЛрд▓ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Python рдФрд░ OpenAI рдХреЗ Gymnasium рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ RL рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд░реНрд╕ Reinforcement Learning with Gymnasium in Python рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ!

рдЕрд░реБрдг рдПрдХ рдкреВрд░реНрд╡ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдВрд╕реНрдерд╛рдкрдХ рд╣реИрдВ рдЬреЛ рдирдИ рдЪреАрдЬрд╝реЗрдВ рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рдХреА рддрдХрдиреАрдХреА рдФрд░ рдЧрдгрд┐рддреАрдп рдиреАрдВрд╡ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЬреЛ рд╕реАрдЦрд╛ рд╣реИ рдЙрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЗрд╕ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
DataCamp рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд╢рди Medium, Airbyte, рдФрд░ Vultr рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЙрдХреНрд╕рд┐рдорд▓ рдкреЙрд▓рд┐рд╕реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди (PPO) рд░рд┐рдЗрдирдлреЛрд░реНрд╕рдореЗрдВрдЯ рд▓рд░реНрдирд┐рдВрдЧ (RL) рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕реЗ 2017 рдореЗрдВ OpenAI рдХреЗ рд╕рд╣-рд╕рдВрд╕реНрдерд╛рдкрдХ рдЬреЙрди рд╢реБрд▓рдореИрди рдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред┬а
PPO рдХрд╛ OpenAI рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдорд╛рдирд╡-рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЯреНрд░рд╕реНрдЯ рд░реАрдЬрди рдкреЙрд▓рд┐рд╕реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди (TRPO) рдЬреИрд╕реА рдкрд╣рд▓реЗ рдХреА рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдордЬрдмреВрдд рддрдерд╛ рдХреБрд╢рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реБрдЖ рд╣реИред┬а
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо PPO рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВред рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ PyTorch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рдкреНрд░реЙрдХреНрд╕рд┐рдорд▓ рдкреЙрд▓рд┐рд╕реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди (PPO) рдХреЛ рд╕рдордЭрдирд╛
рдкрд░рдВрдкрд░рд╛рдЧрдд рд╕реБрдкрд░рд╡рд╛рдЗрдЬреНрдб рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреИрд░рд╛рдореАрдЯрд░реЛрдВ рдХреЛ рд╕рдмрд╕реЗ рддреАрд╡реНрд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЕрдкрдбреЗрдЯ рдЕрддреНрдпрдзрд┐рдХ рд╣реЛ рдЬрд╛рдП, рддреЛ рдЗрд╕реЗ рдмрд╛рдж рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рд╕реБрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд░рд┐рдЗрдирдлреЛрд░реНрд╕рдореЗрдВрдЯ рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдПрдЬреЗрдВрдЯ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реЗ рдмрдирддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕рд╣-рд╕рдВрдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВред рдПрдЬреЗрдВрдЯ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреЙрд▓рд┐рд╕реА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдореЗрдВ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдореЗрдВ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдЦрд░рд╛рдм рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдлрдВрд╕рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд░рд┐рд╡реЙрд░реНрдб рдЙрдк-рдЗрд╖реНрдЯрддрдо рд╣реЛрддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рдПрдЬреЗрдВрдЯ рдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдкреЙрд▓рд┐рд╕реА рдореЗрдВ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдмрдирд╛ рджреЗрддреЗ рд╣реИрдВред┬а
рдЯреНрд░рд╕реНрдЯ-рд░реАрдЬрди-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрддреА рд╣реИрдВ рдХрд┐ рдкреЙрд▓рд┐рд╕реА рдЕрдкрдбреЗрдЯ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп (рдЯреНрд░рд╕реНрдЯреЗрдб) рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рд░рд╣реЗрдВред рдпрд╣ рдЯреНрд░рд╕реНрдЯреЗрдб рд░реАрдЬрди рдкреЙрд▓рд┐рд╕реА рд╕реНрдкреЗрд╕ рдореЗрдВ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рд╣реА рдЕрдкрдбреЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрддреА рд╣реИред рдЕрдкрдбреЗрдЯреЗрдб рдкреЙрд▓рд┐рд╕реА рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреА рдкреЙрд▓рд┐рд╕реА рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдкреЙрд▓рд┐рд╕реА рдЕрдкрдбреЗрдЯ рдХреНрд░рдорд┐рдХ рд╣реЛрдВ, рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
рдЯреНрд░рд╕реНрдЯ рд░реАрдЬрди рдкреЙрд▓рд┐рд╕реА рдЕрдкрдбреЗрдЯ (TRPO)
рдЯреНрд░рд╕реНрдЯ рд░реАрдЬрди рдкреЙрд▓рд┐рд╕реА рдЕрдкрдбреЗрдЯреНрд╕ (TRPO) рдПрд▓реНрдЧреЛрд░рд┐рджрдо 2015 рдореЗрдВ рдЬреЙрди рд╢реБрд▓рдореИрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ 2017 рдореЗрдВ PPO рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛)ред рдкреБрд░рд╛рдиреА рдФрд░ рдЕрдкрдбреЗрдЯреЗрдб рдкреЙрд▓рд┐рд╕реА рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП TRPO рдХреБрд▓рдмреИрдХ-рд▓рд┐рдмрд▓рд░ (KL) рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред KL рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕ рджреЛ рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рд╡рд┐рддрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреНрд░рд╕реНрдЯ рд░реАрдЬрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ TRPO рдкреНрд░рднрд╛рд╡реА рд╕рд╛рдмрд┐рдд рд╣реБрдЖред┬а
TRPO рдХреА рд╕рдорд╕реНрдпрд╛ KL рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕ рд╕реЗ рдЬреБрдбрд╝реА рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред KL рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЯреЗрд▓рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдЬреИрд╕реА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рджреНрд╡рд┐рддреАрдп рдХреНрд░рдо рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓реА рдорд╣рдВрдЧрд╛ рд╣реИред PPO, TRPO рдХрд╛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред PPO рдкреЙрд▓рд┐рд╕реА рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рдХреНрд▓рд┐рдк рдХрд░рдХреЗ рдЯреНрд░рд╕реНрдЯ рд░реАрдЬрди рдХрд╛ рд╕рдиреНрдирд┐рдХрдЯрди рдХрд░рддрд╛ рд╣реИ, рдмрд┐рдирд╛ KL рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛рдУрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдПред
рдЗрд╕реА рдХрд╛рд░рдг RL рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ PPO, TRPO рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рдЪреБрдХрд╛ рд╣реИред рдЯреНрд░рд╕реНрдЯ рд░реАрдЬрди рдХрд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░рдг, PPO рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмреАрдЪ рдкреНрд░рднрд╛рд╡реА рд╕рдВрддреБрд▓рди рдмрдирд╛рддрд╛ рд╣реИред┬а
рдкреНрд░реЙрдХреНрд╕рд┐рдорд▓ рдкреЙрд▓рд┐рд╕реА рдПрдкреНрд░реЙрдХреНрд╕рд┐рдореЗрд╢рди (PPO)
PPO рдХреЛ рдЕрдХреНрд╕рд░ рдПрдХреНрдЯрд░-рдХреНрд░рд┐рдЯрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡реИрд▓реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреЙрд▓рд┐рд╕реА рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИрдВред рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдПрдХреНрдЯрд░-рдХреНрд░рд┐рдЯрд┐рдХ (A2C) рд╡рд┐рдзрд┐рдпрд╛рдБ рдПрдбрд╡рд╛рдВрдЯреЗрдЬ рдирд╛рдордХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдпрд╣ рдХреНрд░рд┐рдЯрд┐рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд░рд┐рдЯрд░реНрди рдФрд░ рдкреЙрд▓рд┐рд╕реА рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд┐рдЯрд░реНрди рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдорд╛рдкрддрд╛ рд╣реИред┬а
PPO рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рдХреЛ рд╕рдордЭрдирд╛
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкреБрд░рд╛рдиреА рдкреЙрд▓рд┐рд╕реА ╧Аold рдХреЗ рддрд╣рдд рд╕реНрдЯреЗрдЯ s рдореЗрдВ рдПрдХреНрд╢рди a рд▓реЗрдиреЗ рдХреА рдкреНрд░рд╛рдпрд┐рдХрддрд╛ ╧Аold(a|s) рд╣реИред рдирдИ рдкреЙрд▓рд┐рд╕реА рдХреЗ рддрд╣рдд рдЙрд╕реА рд╕реНрдЯреЗрдЯ s рд╕реЗ рдЙрд╕реА рдПрдХреНрд╢рди a рдХреЛ рд▓реЗрдиреЗ рдХреА рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рдЕрдкрдбреЗрдЯ рд╣реЛрдХрд░ ╧Аnew(a|s) рд╣реЛ рдЬрд╛рддреА рд╣реИред рдкреЙрд▓рд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ ╬╕ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдкрд╛рдд r(╬╕) рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдирдИ рдкреЙрд▓рд┐рд╕реА рдЙрд╕реА рд╕реНрдЯреЗрдЯ рдореЗрдВ рдЙрд╕ рдПрдХреНрд╢рди рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡реНрдп рдмрдирд╛рддреА рд╣реИ, рддреЛ рдЕрдиреБрдкрд╛рдд 1 рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред┬а
рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рдЗрд╕ рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рдЕрдиреБрдкрд╛рдд рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирдИ рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдПрдБ рдкреБрд░рд╛рдиреА рдПрдХреНрд╢рди рдкреНрд░рд╛рдпрд┐рдХрддрд╛рдУрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рддрд┐рд╢рдд рдХреЗ рднреАрддрд░ рд░рд╣реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, r(╬╕) рдХреЛ 0.8 рдФрд░ 1.2 рдХреЗ рдмреАрдЪ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрдбрд╝реЗ рдЬрдВрдкреНрд╕ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдЦ рдХреЗ рдЖрдЧреЗ рдХреЗ рднрд╛рдЧ рдореЗрдВ, рдЖрдк PyTorch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PPO рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗред