Кодування вводу / виводу для нейронної мережі для вивчення гри на основі сітки


13

Я пишу просту гру з іграшками з наміром навчити поверх неї глибоку нейронну мережу. Правила гри приблизно такі:

  • У грі є дошка, складена з шестикутних клітин.
  • Обидва гравці мають однакову колекцію творів, яку вони можуть вибрати для вільного розташування на дошці.
  • Розміщення різних типів очок за присвоєння фігур (або зменшення очок противника) залежно від їх положення та конфігурації.
  • У кого більше очок, той і виграє.

Існують додаткові правила (про повороти, кількість та типи творів тощо), але вони не важливі в контексті цього питання. Я хочу розробити глибоку нейронну мережу, якій можна ітеративно вчитися, граючи проти себе. Мої запитання стосуються представлення вводу та виводу. Зокрема:

  • Оскільки візерунок шматочків має значення, я думав мати хоча б кілька звивистих шарів. Дошка може бути різного розміру, але в принципі дуже мала (6х10 на моїх тестах, щоб розширити на кілька комірок). Чи є сенс? Який пул я можу використовувати?
  • Як представляти обидві сторони? У цій роботі про ходу автори використовують дві вхідні матриці, одну для білих каменів та одну для чорних каменів. Чи може це працювати і в цьому випадку? Але пам’ятайте, у мене є різні типи фігур, скажімо, A, B, C і D. Чи слід використовувати 2x4 вхідні матриці? Мені це здається дуже рідким і малоефективним. Я побоююсь, що конволюційні шари зможуть працювати надто рідко.
  • Я подумав, що результатом може бути розподіл ймовірностей по матриці, що представляє позиції дошки, плюс окремий масив ймовірностей, що вказує, яку частину грати. Однак мені також потрібно представляти здатність пройти поворот, що дуже важливо. Як я можу це зробити, не розбиваючи його значення серед інших ймовірностей?
  • І найголовніше , чи я виконую лише виграшні ходи чи теж програють ходи? Забезпечити перемогу в ходах легко, оскільки я просто встановив бажані ймовірності до 1. Однак, коли програю, що я можу зробити? Встановити ймовірність переміщення на 0, а всі інші на одне значення? Крім того, чи є сенс застосовувати рухи за різницею різниці балів, навіть якщо це буде суперечити змісту результатів, які є приблизно ймовірними?

Також я розробив ігровий движок в node.js, думаючи використовувати Synaptic як фреймворк, але я не впевнений, що він може працювати з конволюційними мережами (я сумніваюся, є спосіб виправити ваги, пов'язані з локальними сприйнятливими полями). Будь-які поради щодо інших бібліотек, сумісних із вузлом?


Чи припустимо, що ви хочете, щоб машина вивчила невідому гру, а потім навчилася її вигравати? (На відміну від навчання, як виграти гру, правила якої доступні програмісту до написання програмного забезпечення машинного навчання)
FauChristian

Відповіді:


1
  • Щоб представити шматки, ви повинні мати можливість використовувати одну вхідну матрицю. Просто позначте ціле число для різних типів фігур. Білі камені можуть бути натуральними цілими, а чорні - негативними.

  • Ви можете використовувати сигмоїд для впевненості положення плати та лінійну активацію для ідентифікатора шматка. пропуск буде ще одним сигмоподібним виходом. Я не думаю, що вам доведеться турбуватися про те, щоб розпуск пройшов . Оскільки це така цінна дія, оцінка буде багато залежати від виходу пропуску і матиме великий градієнт. Якщо вам потрібно вибрати дію пропуску з високою частотою для навчальних цілей підкріплення, тоді просто припишіть більшу ймовірність дії проходу у вашій функції випадкового вибору.

  • Кінцева різниця балів має великий вплив на бажаність рухів. Велика різниця балів повинна спричинити великий вплив на функцію. Тому ви можете включити величину різниці балів у функцію втрат.

Це тип роботи, який виконує Deep Q Learning. Можливо, ви захочете заглянути і в це.


1

Вам не потрібні шари conv, оскільки ви не подаєте зображення як вхідні дані (див. Нижче). Крім того, ви можете спробувати використовувати зображення дошки (з різними фігурами, що мають різну форму). Це теж може працювати. Тоді я б перейшов на 2 шари conv, крок 1, розмір ядра, рівний половині розміру. Я б спробував це з єдиним максимальним об'єднанням.

На відміну від іншої відповіді, я б запропонував використовувати 3D-тензор як вхідний, при цьому кількість каналів дорівнює різним фрагментам. Інші два розміри, що відповідають рівню, відповідали б кількості комірок на дошці. Різне перетворення у вас NN не зможе дуже добре розрізнити декілька цілих чисел. Ось чому краще мати одне гаряче кодування типів штук.

Я використовував би лише вектор з n + 1 компонентами для виведення: n для всіх можливих рухів і 1 для проходу. Це кодуватиме очікувану винагороду за кожен хід, а не ймовірність.

Не впевнений, що ви маєте на увазі, виконуючи рухи. Але коли ви збираєтесь тренувати це щось на кшталт Q-навчання, було б доцільно робити раз і раз абсолютно випадковий хід з певною вірогідністю (скажімо, 10% разів). Знайдіть https://en.wikipedia.org/wiki/Reinforcement_learning


Тензори надмірні.
Fauhhristian
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.