Saat ini saya mencoba mendapatkan ANN untuk memainkan permainan video dan saya berharap mendapatkan bantuan dari komunitas yang luar biasa di sini.
Saya telah memilih Diablo 2. Dengan demikian, permainan game dilakukan secara real-time dan dari sudut pandang isometrik, dengan pemain yang mengontrol satu avatar yang dipusatkan kamera.
Untuk membuat segalanya menjadi konkret, tugasnya adalah mendapatkan karakter x poin pengalaman tanpa kesehatannya turun ke 0, di mana poin pengalaman diperoleh melalui membunuh monster. Berikut adalah contoh gameplay:
Sekarang, karena saya ingin internet beroperasi hanya berdasarkan informasi yang didapat dari piksel di layar, ia harus mempelajari representasi yang sangat kaya agar bisa bermain secara efisien, karena ini mungkin memerlukannya untuk mengetahui (setidaknya secara implisit) bagaimana bagi dunia game menjadi objek dan cara berinteraksi dengannya.
Dan semua informasi ini harus diajarkan ke internet. Saya tidak bisa seumur hidup saya memikirkan bagaimana melatih hal ini. Satu-satunya ide saya adalah memiliki program terpisah yang secara visual mengekstrak sesuatu yang baik / buruk dalam game (misalnya kesehatan, emas, pengalaman) dari layar, dan kemudian menggunakan stat itu dalam prosedur pembelajaran penguatan. Saya pikir itu akan menjadi bagian dari jawabannya, tetapi menurut saya itu tidak akan cukup; ada terlalu banyak level abstraksi dari input visual mentah ke perilaku berorientasi tujuan untuk umpan balik terbatas seperti itu untuk melatih jaring dalam hidup saya.
Jadi, pertanyaan saya: cara lain apa yang dapat Anda pikirkan untuk melatih jaring untuk melakukan setidaknya sebagian dari tugas ini? sebaiknya tanpa membuat ribuan contoh berlabel.
Hanya untuk sedikit lebih banyak arahan: Saya mencari beberapa sumber pembelajaran penguatan dan / atau metode tanpa pengawasan untuk mengekstraksi informasi yang berguna dalam pengaturan ini. Atau algoritme yang diawasi jika Anda dapat memikirkan cara untuk mendapatkan data berlabel dari dunia game tanpa harus memberi label secara manual.
PEMBARUAN (04/27/12):
Anehnya, saya masih mengerjakan ini dan sepertinya membuat kemajuan. Rahasia terbesar agar pengontrol JST berfungsi adalah menggunakan arsitektur JST paling canggih yang sesuai untuk tugas tersebut. Oleh karena itu saya telah menggunakan jaring keyakinan dalam yang terdiri dari mesin Boltzmann terbatas bersyarat faktor yang telah saya latih dengan cara yang tidak diawasi (pada video saya bermain game) sebelum melakukan fine tuning dengan perbedaan temporal propagasi balik (yaitu pembelajaran penguatan dengan standar feed-forward ANNs).
Namun tetap mencari masukan yang lebih berharga, terutama pada masalah pemilihan tindakan secara real-time dan cara menyandikan gambar berwarna untuk pemrosesan JST :-)
UPDATE (10/21/15):
Baru ingat saya menanyakan pertanyaan ini pada hari itu, dan berpikir saya harus menyebutkan bahwa ini bukan lagi ide gila. Sejak pembaruan terakhir saya, DeepMind menerbitkan makalah alam mereka tentang mendapatkan jaringan saraf untuk memainkan game Atari dari input visual . Memang, satu-satunya hal yang mencegah saya menggunakan arsitektur mereka untuk bermain, bagian terbatas, Diablo 2 adalah kurangnya akses ke mesin game yang mendasarinya. Merender ke layar dan kemudian mengalihkannya ke jaringan terlalu lambat untuk dilatih dalam waktu yang wajar. Jadi kami mungkin tidak akan melihat bot semacam ini memainkan Diablo 2 dalam waktu dekat, tetapi hanya karena itu akan memainkan sesuatu baik sumber terbuka atau dengan akses API ke target rendering. (Mungkin gempa?)
sumber
Jawaban:
Saya dapat melihat bahwa Anda khawatir tentang cara melatih ANN, tetapi proyek ini menyembunyikan kerumitan yang mungkin tidak Anda sadari. Pengenalan objek / karakter pada game komputer melalui pemrosesan gambar , ini adalah tugas yang sangat menantang (bukan gila untuk game FPS dan RPG). Saya tidak meragukan keterampilan Anda dan saya juga tidak mengatakan itu tidak dapat dilakukan, tetapi Anda dapat dengan mudah menghabiskan 10x lebih banyak waktu untuk mengerjakan hal-hal yang dikenali daripada menerapkan JST itu sendiri (dengan asumsi Anda sudah memiliki pengalaman dengan teknik pemrosesan gambar digital ).
Saya pikir ide Anda sangat menarik dan juga sangat ambisius . Pada titik ini Anda mungkin ingin mempertimbangkannya kembali. Saya merasa bahwa proyek ini adalah sesuatu yang Anda rencanakan untuk universitas, jadi jika fokus pekerjaannya benar-benar ANN, Anda mungkin harus memilih permainan lain, sesuatu yang lebih sederhana.
Saya ingat bahwa ada orang lain yang datang mencari tip tentang proyek yang berbeda tetapi entah bagaimana serupa belum lama ini. Layak untuk dicoba.
Di sisi lain, mungkin ada pendekatan yang lebih baik / lebih mudah untuk mengidentifikasi objek dalam game jika Anda menerima saran. Tapi pertama-tama, sebut proyek ini untuk apa yang Anda inginkan: bot pintar .
Salah satu metode untuk mengimplementasikan bot adalah mengakses memori klien game untuk menemukan informasi yang relevan, seperti lokasi karakter di layar dan kesehatannya. Membaca memori komputer itu sepele, tetapi mencari tahu persis di mana memori yang harus dicari tidak. Pemindai memori seperti Cheat Engine bisa sangat membantu untuk ini.
Metode lain , yang bekerja di bawah permainan, melibatkan manipulasi informasi rendering. Semua objek permainan harus ditampilkan ke layar. Artinya, lokasi semua objek 3D pada akhirnya akan dikirim ke kartu video untuk diproses. Bersiaplah untuk debugging yang serius.
Dalam jawaban ini saya menjelaskan secara singkat 2 metode untuk mencapai apa yang Anda inginkan melalui pemrosesan gambar. Jika Anda tertarik dengan mereka, Anda dapat menemukan lebih banyak tentang mereka di Memanfaatkan Game Online (bab 6), sebuah buku yang sangat bagus tentang subjek tersebut.
sumber
UPDATE 2018-07-26: Itu saja! Kami sekarang mendekati titik di mana permainan semacam ini akan dapat diselesaikan! Menggunakan OpenAI dan berbasis game DotA 2, sebuah tim bisa membuat AI yang mampu mengalahkan gamer semi profesional dalam game 5v5 . Jika Anda tahu DotA 2, Anda tahu game ini sangat mirip dengan game mirip Diablo dalam hal mekanik, tetapi orang dapat berargumen bahwa itu bahkan lebih rumit karena permainan tim.
Seperti yang diharapkan, ini tercapai berkat kemajuan terbaru dalam pembelajaran penguatan dengan pembelajaran mendalam, dan menggunakan kerangka kerja game terbuka seperti OpenAI yang memudahkan pengembangan AI karena Anda mendapatkan API yang rapi dan juga karena Anda dapat mempercepat permainan (AI yang dimainkan setara dengan 180 tahun gameplay melawan dirinya sendiri setiap hari!).
Pada tanggal 5 Agustus 2018 (dalam 10 hari!) , AI ini direncanakan untuk mengadu pemain top DotA 2. Jika ini berhasil, nantikan revolusi besar, mungkin tidak semediasi penyelesaian game Go, tetapi tetap akan menjadi tonggak penting untuk game AI!
UPDATE 2017-01: Lapangan bergerak sangat cepat sejak kesuksesan AlphaGo, dan ada kerangka kerja baru untuk memfasilitasi pengembangan algoritme pembelajaran mesin di game hampir setiap bulan. Berikut adalah daftar yang terbaru yang saya temukan:
Saat-saat yang sangat menyenangkan!
PEMBARUAN PENTING (2016-06): Seperti dicatat oleh OP, masalah pelatihan jaringan buatan untuk bermain game hanya menggunakan input visual sekarang sedang ditangani oleh beberapa institusi yang serius, dengan hasil yang cukup menjanjikan, seperti DeepMind Deep-Qlearning-Network (DQN ) .
Dan sekarang, jika Anda ingin mengambil tantangan level berikutnya, Anda dapat menggunakan salah satu dari berbagai platform pengembangan game AI vision seperti ViZDoom , platform yang sangat dioptimalkan (7000 fps) untuk melatih jaringan untuk memainkan Doom hanya dengan menggunakan input visual. :
Dan hasilnya cukup luar biasa, lihat video di halaman web mereka dan tutorial yang bagus (dengan Python) di sini!
Ada juga proyek serupa untuk Quake 3 Arena, yang disebut Quagents , yang juga menyediakan akses API yang mudah ke data game yang mendasarinya, tetapi Anda dapat menghapusnya dan hanya menggunakan tangkapan layar dan API hanya untuk mengontrol agen Anda.
Mengapa platform seperti itu berguna jika kita hanya menggunakan tangkapan layar? Meskipun Anda tidak mengakses data game yang mendasarinya, platform seperti itu menyediakan:
Untuk meringkas, hal hebat tentang platform ini adalah mereka meringankan banyak masalah teknis sebelumnya yang harus Anda tangani (cara memanipulasi input game, cara menyiapkan skenario, dll.) Sehingga Anda hanya perlu berurusan dengan algoritme pembelajaran diri.
Jadi sekarang, mulailah bekerja dan jadikan kami bot visual AI terbaik yang pernah ada;)
Posting lama yang menjelaskan masalah teknis dalam mengembangkan AI hanya mengandalkan input visual:
Bertentangan dengan beberapa rekan saya di atas, menurut saya masalah ini tidak terlalu membandel. Tapi itu pasti sangat sulit!
Masalah pertama seperti yang ditunjukkan di atas adalah representasi dari keadaan permainan : Anda tidak dapat mewakili keadaan penuh hanya dengan satu gambar, Anda perlu mempertahankan beberapa jenis hafalan(kesehatan tetapi juga objek yang dilengkapi dan item yang tersedia untuk digunakan, misi dan tujuan, dll.). Untuk mendapatkan informasi seperti itu, Anda memiliki dua cara: dengan mengakses langsung data game, yang paling andal dan mudah; atau Anda dapat membuat representasi abstrak dari informasi ini dengan menerapkan beberapa prosedur sederhana (membuka inventaris, mengambil tangkapan layar, mengekstrak data). Tentu saja, mengekstrak data dari tangkapan layar akan membuat Anda menerapkan beberapa prosedur yang diawasi (yang Anda tentukan sepenuhnya) atau tidak diawasi (melalui algoritma pembelajaran mesin, tetapi kemudian itu akan meningkatkan banyak kerumitan ...). Untuk pembelajaran mesin tanpa pengawasan, Anda perlu menggunakan jenis algoritme yang cukup baru yang disebut algoritme pembelajaran struktural (yang mempelajari struktur data daripada cara mengklasifikasikan atau memprediksi nilai).http://techtalks.tv/talks/54422/
Lalu, masalah lainnya adalah bahkan ketika Anda telah mengambil semua data yang Anda butuhkan, permainan hanya dapat diamati sebagian . Dengan demikian Anda perlu memasukkan model dunia abstrak dan memberinya makan dengan informasi yang diproses dari game, misalnya lokasi avatar Anda, tetapi juga lokasi item pencarian, tujuan, dan musuh di luar layar. Anda mungkin melihat ke dalam Filter Partikel Campuran oleh Vermaak 2003 untuk ini.
Selain itu, Anda harus memiliki agen otonom , dengan sasaran yang dibuat secara dinamis. Arsitektur terkenal yang dapat Anda coba adalah agen BDI, tetapi Anda mungkin harus menyesuaikannya agar arsitektur ini berfungsi dalam kasus praktis Anda. Sebagai alternatif, ada juga Jaring Petri Rekursif, yang mungkin dapat Anda gabungkan dengan semua jenis variasi jaring petri untuk mencapai apa yang Anda inginkan karena kerangka kerja yang dipelajari dengan sangat baik dan fleksibel, dengan formalisasi dan prosedur pembuktian yang bagus.
Dan akhirnya, bahkan jika Anda melakukan semua hal di atas, Anda perlu menemukan cara untuk meniru gim dalam kecepatan yang dipercepat (menggunakan video mungkin bagus, tetapi masalahnya adalah algoritme Anda hanya akan menonton tanpa kendali, dan mampu mencoba sendiri sangat penting untuk belajar). Memang, diketahui bahwa algoritma mutakhir saat ini membutuhkan lebih banyak waktu untuk mempelajari hal yang sama yang dapat dipelajari manusia (terlebih lagi dengan pembelajaran penguatan), jadi jika tidak dapat mempercepat proses ( yaitu, jika Anda tidak dapat mempercepat waktu permainan), algoritme Anda bahkan tidak akan bertemu dalam satu masa hidup ...
Untuk menyimpulkan, apa yang ingin Anda capai di sini berada pada batas (dan mungkin sedikit di luar) algoritme canggih saat ini . Saya pikir itu mungkin saja, tetapi bahkan jika ya, Anda akan menghabiskan banyak waktu , karena ini bukan masalah teoretis tetapi masalah praktis yang Anda hadapi di sini, dan karenanya Anda perlu banyak menerapkan dan menggabungkan pendekatan AI yang berbeda untuk menyelesaikannya.
Beberapa dekade penelitian dengan seluruh tim yang mengerjakannya mungkin tidak cukup, jadi jika Anda sendirian dan mengerjakannya secara paruh waktu (karena Anda mungkin memiliki pekerjaan untuk mencari nafkah), Anda dapat menghabiskan seumur hidup tanpa menjangkau di dekat Anda. solusi yang berhasil.
Jadi saran saya yang paling penting di sini adalah Anda menurunkan ekspektasi Anda, dan mencoba mengurangi kerumitannyamasalah Anda dengan menggunakan semua informasi yang Anda bisa, dan hindari sebanyak mungkin mengandalkan tangkapan layar (yaitu, coba kaitkan langsung ke dalam game, cari injeksi DLL), dan sederhanakan beberapa masalah dengan menerapkan prosedur yang diawasi, jangan biarkan Anda Algoritme mempelajari segalanya (mis., jatuhkan pemrosesan gambar untuk saat ini sebanyak mungkin dan andalkan informasi game internal, nanti jika algoritme Anda berfungsi dengan baik, Anda dapat mengganti beberapa bagian program AI Anda dengan pemrosesan gambar, sehingga secara bertahap mencapai tujuan penuh Anda, misalnya jika Anda bisa mendapatkan sesuatu untuk bekerja dengan cukup baik, Anda dapat mencoba untuk memperumit masalah Anda dan mengganti prosedur yang diawasi dan data permainan memori dengan algoritma pembelajaran mesin tanpa pengawasan pada tangkapan layar).
Semoga berhasil, dan jika berhasil, pastikan untuk menerbitkan artikel, Anda pasti bisa terkenal karena memecahkan masalah praktis yang sulit!
sumber
Masalah yang Anda kejar sulit diselesaikan dengan cara Anda mendefinisikannya. Biasanya adalah kesalahan untuk berpikir bahwa jaringan saraf akan "secara ajaib" mempelajari representasi yang kaya dari suatu masalah. Fakta bagus yang perlu diingat saat memutuskan apakah JST adalah alat yang tepat untuk tugas adalah bahwa ini merupakan metode interpolasi. Pikirkan, apakah Anda dapat membingkai masalah Anda sebagai menemukan perkiraan suatu fungsi, di mana Anda memiliki banyak poin dari fungsi ini dan banyak waktu untuk merancang jaringan dan melatihnya.
Masalah yang Anda usulkan tidak lulus tes ini. Kontrol permainan bukan merupakan fungsi gambar di layar. Ada banyak informasi yang harus disimpan pemain dalam ingatan. Sebagai contoh sederhana, sering kali benar bahwa setiap kali Anda memasuki sebuah toko dalam sebuah game, layarnya terlihat sama. Namun, apa yang Anda beli tergantung pada keadaan. Tidak peduli seberapa rumit jaringannya, jika piksel layar adalah inputnya, ia akan selalu melakukan tindakan yang sama saat memasuki toko.
Selain itu, ada masalah skala. Tugas yang Anda usulkan terlalu rumit untuk dipelajari dalam waktu yang wajar. Anda harus melihat aigamedev.com untuk mengetahui cara kerja AI game. Jaringan Saraf Tiruan telah berhasil digunakan di beberapa game, tetapi dengan cara yang sangat terbatas. Game AI sulit dan seringkali mahal untuk dikembangkan. Jika ada pendekatan umum untuk membangun jaringan saraf fungsional, industri kemungkinan besar akan memanfaatkannya. Saya menyarankan Anda memulai dengan banyak contoh yang lebih sederhana, seperti tic-tac-toe.
sumber
Sepertinya inti dari proyek ini adalah mengeksplorasi apa yang mungkin dilakukan dengan ANN, jadi saya sarankan memilih game di mana Anda tidak harus berurusan dengan pemrosesan gambar (yang dari jawaban orang lain di sini, sepertinya tugas yang sangat sulit di a game real-time). Anda dapat menggunakan Starcraft API untuk membangun bot Anda, mereka memberi Anda akses ke semua status permainan yang relevan.
http://code.google.com/p/bwapi/
sumber
Sebagai langkah pertama, Anda mungkin melihat perbedaan bingkai yang berurutan. Anda harus membedakan antara latar belakang dan sprite monster yang sebenarnya. Saya kira dunia mungkin juga berisi animasi. Untuk menemukannya, saya akan meminta karakter bergerak dan mengumpulkan semua yang bergerak dengan dunia menjadi gambar / animasi latar belakang yang besar.
Anda dapat mendeteksi dan dan mengidentifikasi musuh dengan korelasi (menggunakan FFT). Namun jika animasi mengulang dengan tepat piksel, akan lebih cepat untuk hanya melihat beberapa nilai piksel. Tugas utama Anda adalah menulis sistem yang kuat yang akan mengidentifikasi kapan objek baru muncul di layar dan secara bertahap akan semua bingkai bingkai sprite ke database. Mungkin Anda harus membangun model untuk efek senjata juga. Itu harus dikurangi sehingga mereka tidak mengacaukan database lawan Anda.
sumber
Dengan asumsi baik kapan saja Anda dapat menghasilkan satu set 'hasil' (mungkin melibatkan probabilitas) dari serangkaian semua 'gerakan' yang mungkin, dan bahwa ada beberapa gagasan tentang konsistensi dalam permainan (misalnya Anda dapat memainkan level X berulang kali sekali lagi), Anda dapat mulai dengan jaringan neural N dengan bobot acak, dan masing-masing menjalankan permainan dengan cara berikut:
1) Untuk setiap 'gerakan' yang mungkin, buat daftar 'hasil' yang mungkin (dengan probabilitas terkait) 2) Untuk setiap hasil, gunakan jaringan saraf Anda untuk menentukan 'nilai' (skor) terkait dari 'hasil' (mis. angka antara -1 dan 1, 1 adalah hasil terbaik, -1 adalah yang terburuk) 3) Pilih 'langkah' yang mengarah ke skor prob * tertinggi 4) Jika langkah tersebut menghasilkan 'menang' atau 'kalah', berhenti, jika tidak kembali ke langkah 1.
Setelah jangka waktu tertentu (atau 'menang' / 'kalah'), evaluasi seberapa dekat jaringan saraf dengan 'tujuan' (ini mungkin akan melibatkan beberapa pengetahuan domain). Kemudian buang 50% (atau persentase lain) dari NN yang paling jauh dari gawang, lakukan persilangan / mutasi dari 50% teratas, dan jalankan set NN baru lagi. Terus berjalan sampai NN yang memuaskan keluar.
sumber
Saya pikir taruhan terbaik Anda adalah arsitektur kompleks yang melibatkan beberapa / mungkin jaringan: yaitu yang mengenali dan menanggapi item, satu untuk toko, satu untuk pertempuran (mungkin di sini Anda memerlukan satu untuk pengenalan musuh, satu untuk serangan), dll. .
Kemudian coba pikirkan gameplay Diablo II yang paling sederhana, mungkin seorang Barbar. Kemudian sederhanakan pada awalnya, seperti Babak I, area pertama saja.
Maka saya kira 'gol' yang berharga adalah hilangnya objek musuh, dan penurunan bilah kesehatan (skor terbalik).
Setelah Anda memiliki tugas terpisah yang 'lebih sederhana' ini, Anda dapat menggunakan JST 'master' untuk memutuskan sub-JST mana yang akan diaktifkan.
Sedangkan untuk pelatihan, saya hanya melihat tiga opsi: Anda dapat menggunakan metode evolusi yang dijelaskan di atas, tetapi kemudian Anda perlu memilih 'pemenang' secara manual, kecuali Anda membuat kode program terpisah untuk itu. Anda dapat membuat jaringan 'menonton' seseorang bermain. Di sini mereka akan belajar meniru gaya pemain atau sekelompok pemain. Jaringan mencoba untuk memprediksi tindakan pemain selanjutnya, diperkuat untuk menebak dengan benar, dll. Jika Anda benar-benar mendapatkan ANN yang Anda inginkan, ini dapat dilakukan dengan permainan video, tidak perlu permainan langsung yang sebenarnya. Akhirnya Anda dapat membiarkan jaringan memainkan permainan, mengalami kematian musuh, naik level, memulihkan kesehatan, dll. Sebagai penguatan positif dan kematian pemain, kehilangan kesehatan, dll. Sebagai penguatan negatif. Tetapi melihat bagaimana bahkan jaringan sederhana memerlukan ribuan langkah pelatihan konkret untuk mempelajari bahkan tugas-tugas sederhana,
Secara keseluruhan, proyek Anda sangat ambisius. Tapi saya pikir itu bisa 'secara teori', dengan waktu yang cukup.
Semoga membantu dan semoga berhasil!
sumber