ප්රතිපත්තිප්රශස්තිකරණය - PPO

මෙය PyTorch ක්රියාත්මක කිරීමයි Proximal Policy ප්රශස්තිකරණය - PPO .

PPOයනු ශක්තිමත් කිරීමේ ඉගෙනීම සඳහා ප්රතිපත්තිමය ශ්රේණියේ ක්රමයකි. සරල ප්රතිපත්ති ඵලය අනුක්රමික ක්රම සාම්පලයක් (හෝ සාම්පල මාලාවක්) අනුව තනි ඵලය අනුක්රමික යාවත්කාලීන කරන්න. ප්රතිපත්තිය ඕනෑවට වඩා අපගමනය නිසා එක් සාම්පලයක් සඳහා බහු ඵලය අනුක්රමික පියවර කරන්නේ ප්රශ්න ඇති, නරක ප්රතිපත්තියක් නිෂ්පාදනය. දත්ත සාම්පල කිරීම සඳහා භාවිතා කරන ලද ප්රතිපත්තියට සමීපව ප්රතිපත්තිය තබා ගැනීමට උත්සාහ කිරීමෙන් නියැදියකට බහු ශ්රේණියේ යාවත්කාලීන කිරීම් කිරීමට PPO අපට ඉඩ දෙයි. යාවත්කාලීන කරන ලද ප්රතිපත්තිය දත්ත සාම්පල කිරීම සඳහා භාවිතා කරන ප්රතිපත්තියට සමීප නොවේ නම්, ශ්රේණියේ ප්රවාහය ක්ලිපින් කිරීමෙන් එය එසේ කරයි.

එයභාවිතා කරන අත්හදා බැලීමක් ඔබට සොයාගත හැකිය මෙහි. අත්හදා බැලීම සාමාන්යකරණය කළ වාසි ඇස්තමේන්තුභාවිතා කරයි.

Open In Colab View Run

29import torch
30
31from labml_helpers.module import Module
32from labml_nn.rl.ppo.gae import GAE

PPOපාඩුව

PPOයාවත්කාලීන කිරීමේ රීතිය ව්යුත්පන්න කර ඇති ආකාරය මෙන්න.

ප්රතිපත්තිවිපාකය උපරිම කිරීමට අපට අවශ්ය වන්නේ විපාකය කොතැනද, ප්රතිපත්තිය ද, ප්රතිපත්තියෙන් සම්මාදිට්ඨි වූ ගමන් මාර්ගයකි. අතර වට්ටම් සාධකය වේ.

ඉතින්,

වට්ටම්-අනාගතරාජ්ය ව්යාප්තිය නිර්වචනය කරන්න,

එවිට,

වැදගත්කම නියැදීම ,

එවිටඅපි උපකල්පනය හා සමාන ය. මෙම උපකල්පනය මගින් අප හඳුන්වා දෙන දෝෂය 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()