මෙය PyTorch ක්රියාත්මක කිරීමයි Proximal Policy ප්රශස්තිකරණය - PPO .
PPOයනු ශක්තිමත් කිරීමේ ඉගෙනීම සඳහා ප්රතිපත්තිමය ශ්රේණියේ ක්රමයකි. සරල ප්රතිපත්ති ඵලය අනුක්රමික ක්රම සාම්පලයක් (හෝ සාම්පල මාලාවක්) අනුව තනි ඵලය අනුක්රමික යාවත්කාලීන කරන්න. ප්රතිපත්තිය ඕනෑවට වඩා අපගමනය නිසා එක් සාම්පලයක් සඳහා බහු ඵලය අනුක්රමික පියවර කරන්නේ ප්රශ්න ඇති, නරක ප්රතිපත්තියක් නිෂ්පාදනය. දත්ත සාම්පල කිරීම සඳහා භාවිතා කරන ලද ප්රතිපත්තියට සමීපව ප්රතිපත්තිය තබා ගැනීමට උත්සාහ කිරීමෙන් නියැදියකට බහු ශ්රේණියේ යාවත්කාලීන කිරීම් කිරීමට PPO අපට ඉඩ දෙයි. යාවත්කාලීන කරන ලද ප්රතිපත්තිය දත්ත සාම්පල කිරීම සඳහා භාවිතා කරන ප්රතිපත්තියට සමීප නොවේ නම්, ශ්රේණියේ ප්රවාහය ක්ලිපින් කිරීමෙන් එය එසේ කරයි.
එයභාවිතා කරන අත්හදා බැලීමක් ඔබට සොයාගත හැකිය මෙහි. අත්හදා බැලීම සාමාන්යකරණය කළ වාසි ඇස්තමේන්තුභාවිතා කරයි.
29import torch
30
31from labml_helpers.module import Module
32from labml_nn.rl.ppo.gae import GAEPPOයාවත්කාලීන කිරීමේ රීතිය ව්යුත්පන්න කර ඇති ආකාරය මෙන්න.
ප්රතිපත්තිවිපාකය උපරිම කිරීමට අපට අවශ්ය වන්නේ විපාකය කොතැනද, ප්රතිපත්තිය ද, ප්රතිපත්තියෙන් සම්මාදිට්ඨි වූ ගමන් මාර්ගයකි. අතර වට්ටම් සාධකය වේ.
ඉතින්,
වට්ටම්-අනාගතරාජ්ය ව්යාප්තිය නිර්වචනය කරන්න,
එවිට,
වැදගත්කම නියැදීම ,
එවිටඅපි උපකල්පනය හා සමාන ය. මෙම උපකල්පනය මගින් අප හඳුන්වා දෙන දෝෂය KL අපසරනය හා අතර බැඳී ඇත. සීමා සහිත ප්රතිපත්ති ප්රශස්තිකරණය මේ සඳහා සාක්ෂි පෙන්වයි. මම එය කියවා නැත.
35class ClippedPPOLoss(Module):137 def __init__(self):
138 super().__init__()140 def forward(self, log_pi: torch.Tensor, sampled_log_pi: torch.Tensor,
141 advantage: torch.Tensor, clip: float) -> torch.Tensor:අනුපාතය ; මෙය ත්යාගවලට වඩා වෙනස් ය.
144 ratio = torch.exp(log_pi - sampled_log_pi)අනුපාතය1 ට ආසන්න වන පරිදි ක්ලිප් කර ඇත. අපි අවම වශයෙන් ගන්නා අතර එමඟින් අනුපාතය අතර නොවේ නම් සහ ශ්රේණිය දෙසට ඇද දමනු ඇත . මෙය KL අපසරනය අතර හා සීමා කර තබා ගනී. විශාල අපගමනය කාර්ය සාධනය බිඳවැටීමට හේතු විය හැක; එහිදී ප්රතිපත්ති කාර්ය සාධනය පහත වැටී අප නරක ප්රතිපත්තියකින් නියැදීම් නිසා යථා තත්ත්වයට පත් නොවේ.
සාමාන්යකරණයකරන ලද වාසිය භාවිතා කරමින් ප්රතිපත්ති ශ්රේණියේ තක්සේරුකරු වෙත නැඹුරුවක් හඳුන්වා දෙයි, නමුත් එය විචලතාව ගොඩක් අඩු කරයි.
173 clipped_ratio = ratio.clamp(min=1.0 - clip,
174 max=1.0 + clip)
175 policy_reward = torch.min(ratio * advantage,
176 clipped_ratio * advantage)
177
178 self.clip_fraction = (abs((ratio - 1.0)) > clip).to(torch.float).mean()
179
180 return -policy_reward.mean()ඒහා සමානව අපි අගය ශ්රිතය යාවත්කාලීන කිරීම ද ක්ලිප් කරමු
ක්ලිපින්අගය ශ්රිතය සැලකිය යුතු ලෙස බැහැර නොවන බවට වග බලා ගනී .
183class ClippedValueFunctionLoss(Module):205 def forward(self, value: torch.Tensor, sampled_value: torch.Tensor, sampled_return: torch.Tensor, clip: float):
206 clipped_value = sampled_value + (value - sampled_value).clamp(min=-clip, max=clip)
207 vf_loss = torch.max((value - sampled_return) ** 2, (clipped_value - sampled_return) ** 2)
208 return 0.5 * vf_loss.mean()