در آخرین مقاله خود درباره Deep Q Learning با Tensorflow، عاملی را پیاده سازی کردیم که یاد می گیرد یک نسخه ساده از Doom را بازی کند. در نسخه ویدیویی، ما یک عامل DQN را آموزش دادیم که مهاجمان فضایی را بازی می کند.
با این حال در طول آموزش دیدیم که تنوع زیادی وجود دارد.
Deep Q-Learning در سال 2014 معرفی شد. از آن زمان تاکنون، پیشرفت های زیادی انجام شده است. بنابراین، امروز ما چهار استراتژی را خواهیم دید که آموزش و نتایج عوامل DQN را به طور چشمگیری بهبود می بخشد:
- اهداف Q ثابت
- دو DQN
- دوئل DQN (معروف به DDQN)
- تکرار تجربه اولویتدار (معروف به PER)
ما ماموری را اجرا خواهیم کرد که بازی Doom Deadly را یاد می گیرد. هوش مصنوعی ما باید به سمت هدف اساسی (جلیقه) حرکت کند و مطمئن شود که آنها همزمان با کشتن دشمنان زنده می مانند.
اهداف Q ثابت شد
تئوری
در مقاله Deep Q Learning دیدیم که وقتی میخواهیم خطای TD (معروف به ضرر) را محاسبه کنیم، تفاوت بین هدف TD (Q_target) و مقدار Q فعلی (تخمین Q) را محاسبه میکنیم.
اما ما هیچ ایده ای از هدف واقعی TD نداریم. باید تخمین بزنیمبا استفاده از معادله بلمن، دیدیم که هدف TD فقط پاداش انجام آن عمل در آن حالت به اضافه بالاترین مقدار Q تخفیفخورده برای حالت بعدی است.
با این حال، مشکل این است که ما از همان پارامترها (وزن) برای تخمین هدف و مقدار Q استفاده می کنیم. در نتیجه، همبستگی زیادی بین هدف TD و پارامترهای (w) که در حال تغییر هستیم وجود دارد.
بنابراین، به این معنی است که در هر مرحله از آموزش، مقادیر Q ما تغییر می کند، اما مقدار هدف نیز تغییر می کند. بنابراین، ما به هدف خود نزدیک می شویم، اما هدف نیز در حال حرکت است. مثل تعقیب یک هدف متحرک است! این منجر به نوسان بزرگ در تمرین می شود.
مثل این است که اگر یک گاوچران بودید (تخمین Q) و می خواهید گاو را بگیرید (هدف Q) باید نزدیکتر شوید (خطا را کاهش دهید).
در هر مرحله زمانی، شما سعی می کنید به گاو نزدیک شوید، که در هر مرحله زمانی حرکت می کند (چون از پارامترهای یکسانی استفاده می کنید).
این منجر به یک مسیر بسیار عجیب تعقیب (نوسان بزرگ در تمرین) می شود.
در عوض، میتوانیم از ایده Q-هدفهای ثابت معرفی شده توسط DeepMind استفاده کنیم:
- استفاده از یک شبکه جداگانه با یک پارامتر ثابت (بیایید آن را w- بنامیم) برای تخمین هدف TD.
- در هر مرحله Tau، پارامترها را از شبکه DQN خود کپی می کنیم تا شبکه هدف را به روز کنیم.
به لطف این روش، یادگیری پایدارتری خواهیم داشت زیرا تابع هدف برای مدتی ثابت می ماند.
پیاده سازی
پیاده سازی Q-targets ثابت بسیار ساده است:
- ابتدا دو شبکه ایجاد می کنیم (DQNetwork، TargetNetwork)
- سپس، ما یک تابع ایجاد می کنیم که پارامترهای DQNetwork ما را می گیرد و آنها را در TargetNetwork ما کپی می کند
- در نهایت در طول آموزش، هدف TD را با استفاده از شبکه هدف خود محاسبه می کنیم. ما شبکه هدف را با DQNetwork در هر مرحله tau به روز می کنیم (tau یک پارامتر فوق العاده است که ما تعریف می کنیم).
DQN های دوگانه
تئوری
Double DQN یا Double Learning توسط Hado van Hasselt معرفی شد. این روش مشکل برآورد بیش از حد مقادیر Q را حل می کند.
برای درک این مشکل، نحوه محاسبه TD Target را به خاطر بسپارید:
با محاسبه هدف TD، با یک مشکل ساده روبرو هستیم: چگونه مطمئن هستیم که بهترین اقدام برای حالت بعدی، اقدامی است که بالاترین مقدار Q را دارد؟
ما می دانیم که دقت مقادیر q بستگی به این دارد که چه اقدامی را امتحان کرده ایم و چه کشورهای همسایه را بررسی کرده ایم.
در نتیجه، در ابتدای آموزش اطلاعات کافی در مورد بهترین اقدام برای انجام دادن نداریم. بنابراین، در نظر گرفتن حداکثر مقدار q (که نویزدار است) به عنوان بهترین اقدام می تواند منجر به مثبت کاذب شود. اگر به اقدامات غیربهینه به طور منظم مقدار Q بالاتر از بهترین اقدام بهینه داده شود، یادگیری پیچیده خواهد شد.
راه حل این است: هنگامی که هدف Q را محاسبه می کنیم، از دو شبکه برای جدا کردن انتخاب عمل از تولید ارزش Q هدف استفاده می کنیم. ما:
- از شبکه DQN خود برای انتخاب بهترین اقدام برای حالت بعدی (عملی با بالاترین مقدار Q) استفاده کنید.
- از شبکه هدف خود برای محاسبه مقدار Q هدف انجام آن عمل در حالت بعدی استفاده کنید.
بنابراین، Double DQN به ما کمک می کند تا برآورد بیش از حد مقادیر q را کاهش دهیم و در نتیجه به ما کمک می کند سریع تر تمرین کنیم و یادگیری پایدارتری داشته باشیم.
پیاده سازی
Dueling DQN (معروف به DDQN)
تئوری
به یاد داشته باشید که مقادیر Q با میزان خوب بودن در آن وضعیت و انجام یک عمل در آن حالت Q(s, a) مطابقت دارد.
بنابراین می توانیم Q(s, a) را به صورت مجموع تجزیه کنیم:
با DDQN، میخواهیم برآوردگر این دو عنصر را با استفاده از دو جریان جدید جدا کنیم:
و سپس این دو جریان را از طریق یک لایه تجمع ویژه ترکیب می کنیم تا تخمینی از Q(s, a) بدست آوریم.
صبر کن؟اما چرا باید این دو عنصر را جداگانه محاسبه کنیم، اگر آنها را ترکیب کنیم؟
با جداشدن برآورد ، به طور شهودی DDQN ما می تواند یاد بگیرد که ایالت ها بدون نیاز به یادگیری تأثیر هر عمل در هر ایالت ، کدام حالت ها هستند (یا نیستند).
با DQN معمولی ما ، باید مقدار هر عمل را در آن حالت محاسبه کنیم. اما اگر ارزش دولت بد باشد چیست؟وقتی همه این اقدامات منجر به مرگ می شوند ، همه اقدامات در یک کشور را محاسبه می کنیم؟
به عنوان یک نتیجه ، با جدا کردن ما می توانیم V (ها) را محاسبه کنیم. این امر به ویژه برای کشورهایی مفید است که اقدامات آنها به روشی مربوط به محیط زیست تأثیر نمی گذارد. در این حالت ، محاسبه مقدار هر عمل ضروری نیست. به عنوان مثال ، حرکت به راست یا چپ فقط در صورتی که خطر برخورد وجود داشته باشد اهمیت دارد. و در بیشتر ایالت ها ، انتخاب عمل هیچ تاثیری در آنچه اتفاق می افتد ندارد.
اگر نمونه ای را در معماری های شبکه دوئل مقاله برای یادگیری عمیق تقویت کنیم ، واضح تر خواهد بود.
ما می بینیم که جریان های Value Network به جاده و به ویژه به افق ای که اتومبیل ها در آن تخم ریزی می شوند ، توجه می کنند (تاری نارنجی). همچنین به نمره توجه می کند.
از طرف دیگر ، جریان مزیت در قاب اول در سمت راست توجه زیادی به جاده نمی کند ، زیرا هیچ اتومبیل در جلو وجود ندارد (بنابراین انتخاب عمل عملاً بی ربط است). اما ، در قاب دوم توجه خود را جلب می کند ، زیرا یک ماشین بلافاصله در مقابل آن وجود دارد ، و انتخاب عمل بسیار مهم و بسیار مرتبط است.
در مورد لایه جمع آوری ، ما می خواهیم مقادیر Q را برای هر عمل در آن حالت تولید کنیم. ما ممکن است وسوسه شویم که جریان ها را به شرح زیر ترکیب کنیم:
اما اگر این کار را انجام دهیم ، ما در مسئله شناسایی قرار می گیریم ، یعنی با توجه به Q (S ، A) ما قادر به یافتن A (S ، A) و V (S) نیستیم.
و عدم یافتن V (ها) و A (S ، A) با توجه به Q (S ، A) مشکلی برای انتشار پشت ما خواهد بود. برای جلوگیری از این مشکل ، می توانیم برآوردگر عملکرد مزیت خود را وادار کنیم که در عمل انتخاب شده 0 مزیت داشته باشد.
برای انجام این کار ، ما میانگین مزیت کلیه اقدامات ممکن دولت را کم می کنیم.
بنابراین ، این معماری به ما کمک می کند تا آموزش را تسریع کنیم. ما می توانیم مقدار یک حالت را بدون محاسبه Q (S ، A) برای هر عمل در آن حالت محاسبه کنیم. و این می تواند به ما کمک کند تا با جدا کردن تخمین بین دو جریان ، مقادیر Q بسیار مطمئن تری را برای هر عمل پیدا کنیم.
پیاده سازی
تنها کاری که باید انجام دهید اصلاح معماری DQN با اضافه کردن این جریان های جدید است:
پخش مجدد تجربه اولویت بندی شده
تئوری
پخش مجدد تجربه اولویت بندی شده (PER) در سال 2015 توسط تام شول معرفی شد. ایده این است که برخی از تجربیات ممکن است برای آموزش ما مهمتر از سایرین باشد ، اما ممکن است کمتر اتفاق بیفتد.
از آنجا که ما دسته ای را به طور یکنواخت (انتخاب تجربیات به طور تصادفی) از این تجربیات غنی که به ندرت اتفاق می افتد ، تقریباً هیچ فرصتی برای انتخاب ندارند.
به همین دلیل ، با PER ، ما سعی می کنیم توزیع نمونه برداری را با استفاده از یک معیار تغییر دهیم تا اولویت هر یک از تجربه های تجربه را تعریف کنیم.
ما می خواهیم تجربه اولویت را در جایی بدست آوریم که تفاوت زیادی بین پیش بینی ما و هدف TD وجود داشته باشد ، زیرا این بدان معنی است که ما چیزهای زیادی برای یادگیری در مورد آن داریم.
ما از مقدار مطلق بزرگی خطای TD خود استفاده می کنیم:
و ما این اولویت را در تجربه هر بافر پخش قرار می دهیم.
اما ما فقط نمی توانیم اولویت بندی حریص را انجام دهیم ، زیرا این امر منجر به آموزش همیشه همان تجربیات (که اولویت بزرگی دارند) و در نتیجه بیش از حد مناسب خواهد بود.
بنابراین ما اولویت بندی تصادفی را معرفی می کنیم ، که احتمال انتخاب برای پخش مجدد را ایجاد می کند.
در نتیجه ، در هر مرحله زمانی ، نمونه ای از نمونه ها را با این توزیع احتمال دریافت می کنیم و شبکه خود را روی آن آموزش می دهیم.
اما ، ما هنوز در اینجا مشکلی داریم. به یاد داشته باشید که با پخش مجدد تجربه عادی ، ما از یک قانون به روزرسانی تصادفی استفاده می کنیم. در نتیجه ، نحوه نمونه برداری از تجربیات باید با توزیع اساسی که از آنها به وجود آمده مطابقت داشته باشد.
وقتی تجربه عادی داریم ، تجربیات خود را در یک توزیع عادی انتخاب می کنیم - به عبارت ساده ، ما تجربیات خود را به طور تصادفی انتخاب می کنیم. هیچ تعصب وجود ندارد ، زیرا هر تجربه شانس یکسانی را دارد که می توان از آن استفاده کرد ، بنابراین می توانیم وزن خود را به طور عادی به روز کنیم.
اما ، از آنجا که ما از نمونه گیری اولویت استفاده می کنیم ، نمونه گیری کاملاً تصادفی رها می شود. در نتیجه ، ما تعصب را نسبت به نمونه های اولویت بالا معرفی می کنیم (شانس بیشتری برای انتخاب).
و اگر وزنهای خود را به طور عادی به روز کنیم ، خطر بیش از حد مناسب را در پیش می گیریم. نمونه هایی که از اولویت بالایی برخوردار هستند احتمالاً در مقایسه با تجربیات اولویت پایین (= تعصب) بارها برای آموزش استفاده می شوند. در نتیجه ، ما فقط با بخش کمی از تجربیات که واقعاً جالب هستند ، وزن خود را به روز خواهیم کرد.
برای تصحیح این تعصب ، ما از وزن نمونه برداری از اهمیت (IS) استفاده می کنیم که با کاهش وزن نمونه های اغلب دیده شده ، به روزرسانی را تنظیم می کند.
وزنهای مربوط به نمونههای با اولویت بالا تنظیم بسیار کمی دارند (زیرا شبکه بارها این تجربیات را مشاهده خواهد کرد)، در حالی که وزنهای مربوط به نمونههای با اولویت پایین بهروزرسانی کامل خواهند داشت.
نقش b کنترل این است که این وزنهای نمونهگیری چقدر بر یادگیری تأثیر میگذارند. در عمل، پارامتر b در طول مدت تمرین تا 1 آنیل می شود، زیرا این وزن ها در پایان یادگیری زمانی که مقادیر q ما شروع به همگرا شدن می کنند، اهمیت بیشتری دارند. همانطور که در این مقاله توضیح داده شد، ماهیت بیطرفانه بهروزرسانیها، نزدیک به همگرایی بسیار مهم است.
پیاده سازی
این بار، اجرا کمی شیک تر خواهد بود.
اول از همه، ما نمیتوانیم PER را فقط با مرتبسازی تمام بافرهای Experience Replay بر اساس اولویتهایشان پیادهسازی کنیم. این به دلیل O(nlogn) برای درج و O(n) برای نمونه گیری به هیچ وجه کارآمد نخواهد بود.
همانطور که در این مقاله واقعا خوب توضیح داده شد، ما باید به جای مرتب کردن یک آرایه از ساختار داده دیگری استفاده کنیم - یک sumtree مرتب نشده.
یک sumtree یک درخت باینری است، یعنی درختی است که برای هر گره حداکثر دو فرزند دارد. برگ ها (عمیق ترین گره ها) حاوی مقادیر اولویت هستند و آرایه داده ای که به برگ ها اشاره می کند حاوی تجربیات است.
به روز رسانی درخت و نمونه برداری واقعا کارآمد خواهد بود (O(log n)).
سپس، یک شی حافظه ایجاد می کنیم که شامل sumtree و داده های ما باشد.
در مرحله بعد، برای نمونه برداری از یک بسته کوچک با اندازه k، محدوده [0، اولویت_کل] به k محدوده تقسیم می شود. یک مقدار به طور یکنواخت از هر محدوده نمونه برداری می شود.
در نهایت، انتقالها (تجربهها) که با هر یک از این مقادیر نمونهگیری شده مطابقت دارند، از sumtree بازیابی میشوند.
وقتی جزئیات کامل را در نوت بوک بررسی کنیم، بسیار واضح تر خواهد بود.
مامور Doom Deathmatch
این عامل یک Dueling Double Deep Q Learning با PER و q-targets ثابت است.
همین! شما به تازگی یک عامل باهوش تر ساخته اید که بازی Doom را یاد می گیرد. عالی! به یاد داشته باشید که اگر می خواهید یک نماینده با عملکرد واقعا خوب داشته باشید، به ساعت های GPU بیشتری (حدود دو روز آموزش) نیاز دارید!
با این حال، تنها با 2 تا 3 ساعت آموزش روی CPU (بله CPU)، عامل ما متوجه شد که آنها باید قبل از اینکه بتوانند به جلو حرکت کنند، دشمنان را بکشند. اگر بدون کشتن دشمنان به جلو حرکت کنند، قبل از گرفتن جلیقه کشته خواهند شد.
فراموش نکنید که هر قسمت از کد را توسط خودتان پیاده سازی کنید. این بسیار مهم است که سعی کنید کدی را که به شما داده ام تغییر دهید. سعی کنید دوره ها را اضافه کنید ، معماری را تغییر دهید ، مقادیر Q ثابت اضافه کنید ، میزان یادگیری را تغییر دهید ، از یک محیط سخت تر استفاده کنید ... و غیره. آزمایش ، لذت ببرید!
به یاد داشته باشید که این یک مقاله بزرگ بود ، بنابراین حتما واقعاً درک کنید که چرا ما از این استراتژی های جدید ، نحوه کار آنها و مزایای استفاده از آنها استفاده می کنیم.
در مقاله بعدی ، ما در مورد یک روش ترکیبی عالی بین الگوریتم های یادگیری مبتنی بر ارزش و مبتنی بر سیاست ، یاد خواهیم گرفت. این یک مبنای اصلی برای الگوریتم های هنر است: منتقد بازیگر مزیت (A2C). شما یک عامل را اجرا خواهید کرد که یاد می گیرد Outrun را بازی کند!
اگر مقاله من را دوست داشتید ، لطفا روی روی کلیک کنید؟در زیر زمان که مقاله را دوست داشتید ، بنابراین افراد دیگر این موضوع را در اینجا مشاهده می کنند. و فراموش نکنید که مرا دنبال کنید!
اگر افکار ، نظرات ، سؤال دارید ، در صورت تمایل به اظهار نظر در زیر یا برای من ایمیل ارسال کنید: [email protected]. com ، یا توییت من thomassimonini.