Xây dựng trò chơi AI bằng máy học


Hồ Thúy Ngân
3 năm trước
Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 4418

Hướng đến PyCon, chúng tôi muốn kết hợp một thứ gì đó để chứng minh một số gói Python tuyệt vời có sẵn trong không gian học máy cũng như thể hiện một số tối ưu hóa Thư viện hạt nhân Intel® Math (MKL) mới được tích hợp trong phiên bản ActivePython mới nhất . Bản demo đó đã trở thành trò chơi NeuroBlast, một trò chơi bắn súng không gian arcade cổ điển có kẻ thù được hỗ trợ bởi máy học. Đó là một cách thú vị để thu hút mọi người tham gia tại gian hàng của chúng tôi và tìm hiểu về những gì có sẵn trong hệ sinh thái Python đáng kinh ngạc. Nó cũng cho tôi cơ hội để xây dựng một cái gì đó không tầm thường bằng cách sử dụng các kỹ thuật máy học, và nền tảng của tôi trong các trò chơi đã làm cho một bản demo tương tác rất phù hợp.

Đang giới thiệu NeuroBlast cho một số người quan tâm tại PyCon.

NeuroBlast là một game bắn súng không gian cuộn theo chiều dọc, nơi bạn điều khiển một con tàu cố gắng đánh bại những đợt kẻ thù đang gia tăng. Thông thường, những kẻ thù này bay theo đội hình được xác định trước với các kiểu bắn được xác định trước và xuất hiện theo từng đợt. Sự khác biệt lớn trong NeuroBlast là kẻ thù sử dụng máy học để xác định kiểu bắn của chúng là gì.

Under the Hood: Tensorflow, Keras và Intel MKL

Để chứng minh những gì bạn có thể làm với các công cụ có sẵn, chúng tôi đã quyết định xây dựng một mạng lưới thần kinh để điều khiển hành vi của kẻ thù trong trò chơi và chúng tôi đã xây dựng nó bằng thư viện Keras phổ biến bằng cách sử dụng phụ trợ TensorFlow. Ngoài ra, bằng cách sử dụng ActivePython để phát triển trò chơi của chúng tôi, chúng tôi có thể tận dụng tối ưu hóa Intel MKL được biên dịch vào bản phát hành mới nhất để mọi thứ sử dụng chức năng toán học cốt lõi nhất định, ví dụ, NumPy, sẽ tăng tốc nhanh chóng. 

Về phần trò chơi, chúng tôi đang sử dụng PyGame và nói chung, tôi khá ý thức về hiệu năng với việc triển khai để đảm bảo rằng chúng tôi có thể chạy trò chơi ở tốc độ khung hình vững chắc và vẫn có sẵn nhiều CPU để thực hiện - đánh giá và trực quan hóa mạng lưới thần kinh thời gian (ví dụ, trò chơi không có tính năng va chạm hoàn hảo pixel).

Đào tạo mạng lưới thần kinh

Mạng lưới thần kinh của chúng ta cuối cùng là một mạng lưới rất đơn giản: bốn đầu vào và một nơron đầu ra duy nhất. Nó sẽ sử dụng việc học có giám sát để thực hiện phân loại nhị phân cho một vấn đề đơn giản: Mỗi lần bắn là trúng hay bỏ lỡ? Nó sử dụng đồng bằng giữa vị trí của người chơi và kẻ thù, và vận tốc của người chơi và kẻ thù làm đầu vào. Tế bào thần kinh đầu ra duy nhất sẽ kích hoạt nếu giá trị kích hoạt của nó là> = 0,5 và sẽ không kích hoạt nếu nó <0,5.

Khi xây dựng mạng, ban đầu tôi chỉ có một lớp ẩn duy nhất với bốn nút nhưng thấy rằng sau khi đào tạo nó, nó có phần thất thường. Có vẻ như nó rất nhạy cảm với dữ liệu đào tạo và sẽ không giải quyết một chiến lược cụ thể theo bất kỳ cách nhất quán nào. Tôi đã thử nghiệm với một vài cấu hình khác nhau và cuối cùng giải quyết trên cái chúng tôi sử dụng cho bản demo. Nó hoàn toàn không phải là thiết lập tối ưu và có thể có nhiều lớp hơn mức cần thiết. Mặc dù vậy, điều hấp dẫn tôi là dù chỉ với một lượng dữ liệu đào tạo rất nhỏ và bất kể bạn đã đào tạo nó như thế nào, nó vẫn sẽ ổn định thành một mô hình hành vi tương tự, điều đó thật tuyệt vời cho bản demo sàn nơi mọi người có thể chơi hoặc đào tạo trò chơi.

Các đầu vào là bốn nút ở trên cùng, với nút đầu ra (được mồi ở đây) ở phía dưới. Dòng dày hơn đại diện cho trọng lượng cao hơn. Giá trị kích hoạt xuất hiện trong các trung tâm nút.

Hình dung đã được tôi tự lắp ghép với nhau để chạy bên trong PyGame. Lấy cảm hứng từ bài đăng trên blog này , trực quan hóa ở đây hiển thị các kết nối giữa các nút dưới dạng đường màu đỏ hoặc màu xanh lá cây. Các đường màu xanh lá cây biểu thị các trọng số dương sẽ làm thiên vị mạng đối với việc bắn súng, các giá trị màu đỏ và màu đỏ ngăn cản việc chụp. Các đường kẻ dày biểu thị các giá trị trọng lượng cao hơn và do đó, các kết nối mạnh mẽ hơn. Tôi đã phải triển khai nó một cách tự nhiên trong PyGame vì một thư viện âm mưu truyền thống như matplotlib quá chậm.

Sau khi đào tạo, mạng dường như luôn hội tụ về chiến lược sau:

  • Nếu người chơi ở trong một hình nón hợp lý của tầm nhìn phía trước, thì hãy bắn bừa bãi.
  • Nếu người chơi không ở trong hình nón phía trước hợp lý đó, thì đừng bắn.

Lúc đầu, điều rất thú vị đối với tôi là mạng không giải quyết được chiến lược rõ ràng hơn, chỉ bắn liên tục vào chiến lược, nhưng cho rằng nó nhận được dữ liệu huấn luyện cho thấy rằng miss miss, điều đó là không mong muốn bắn phát súng với xác suất bắn thấp.

Trong hình ảnh này, lưu ý rằng vì tôi đang ở trong một hình nón phía trước, hầu hết kẻ thù đang bắn vào tôi một cách bừa bãi.

Trong hình ảnh này, bạn sẽ nhận thấy không có kẻ thù nào đang bắn vì tôi rõ ràng nằm ngoài phạm vi thành công có thể của họ. Tuy nhiên, nếu bạn nhìn vào các giá trị kích hoạt, bạn sẽ thấy kẻ thù vừa xuất hiện trên màn hình sắp nổ tung tôi vì sản lượng của anh ta là 0,83. Rất tiếc!

Trong chế độ huấn luyện, kẻ địch bắn ngẫu nhiên, và sau đó mỗi phát bắn của kẻ thù được ghi lại là một cú đánh hoặc một cú trượt cùng với các giá trị vị trí / vận tốc tương đối ban đầu của nó. Mỗi một trong số các bức ảnh này trở thành một hàng trong ma trận huấn luyện và mạng được đào tạo trong thời gian thực trực tiếp, sau khi mỗi hàng được thêm vào để bạn có thể thấy mạng được xây dựng và phát triển khi bạn đào tạo.

Điều đáng chú ý là trong các lần lặp lại đầu tiên của trò chơi, tôi đã chuyển các giá trị pixel thô cho các vị trí và vận tốc. Điều này có nghĩa là có một biến thể thực sự rộng giữa các giá trị trong đầu vào và tôi thấy rằng mạng sẽ không thực sự hội tụ thành một hành vi nhất quán. Vì vậy, tôi đã bình thường hóa dữ liệu đầu vào trong khoảng 0,0-1,0 và thấy rằng về cơ bản nó được hội tụ ngay lập tức thành một hành vi có thể sử dụng được. Vì vậy, bài học cho trẻ em của bạn: bình thường hóa dữ liệu đầu vào của bạn!

Khi mạng được huấn luyện, khi bạn chơi trò chơi, mọi trường hợp tàu vũ trụ của kẻ thù đều sử dụng thể hiện riêng của mạng lưới thần kinh để đưa ra quyết định khi nào nên bắn.

Sử dụng máy ảnh

Keras làm cho việc thiết lập và đánh giá các mạng lưới thần kinh cực kỳ đơn giản và khả năng lựa chọn giữa Theano hoặc Tensorflow cho phần phụ trợ làm cho nó rất linh hoạt. Chúng ta hãy xem nhanh mã Keras để thiết lập mạng mà chúng ta đã sử dụng:

       self.keras = Sequential()
       self.keras.add(Dense(4, input shape=(4,), activation='relu'))
       self.keras.add(Dense(6, activation='relu'))
       self.keras.add(Dense(4, activation='relu'))
       self.keras.add(Dense(4, activation='relu'))
       self.keras.add(Dense(1, activation='sigmoid'))
       self.keras.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

Mẹo : Tôi đã sử dụng Keras 2.0.4, nhưng trong các phiên bản trước của Keras, bạn sẽ phải thay thế chức năng mất thành lỗi bình phương có nghĩa là lỗi bình phương và tối ưu hóa thành Hồi sgdiêu vì phiên bản trước đó dường như không hỗ trợ binary_crossentropy / adam sự phối hợp.

Điều tuyệt vời ở Keras là chỉ với một vài dòng mã, chúng ta có thể xác định toàn bộ mạng của mình mà không cần thực sự biết nhiều về cách thức hoạt động của TensorFlow hoặc thậm chí phải cấu hình cấu trúc dữ liệu phức tạp của riêng mình để quản lý mạng lưới thần kinh của chính chúng ta.

Khi chúng tôi đã hoàn thành đào tạo (trong trò chơi, bạn có thể ngừng đào tạo tại bất kỳ thời điểm nào), chúng tôi có thể đào tạo mô hình của mình với một dòng mã duy nhất:

self.keras.fit(x,y,epochs=150,batch size=10)

Điều đó sẽ đặt dữ liệu đầu vào X của chúng tôi là ma trận n * 4 của dữ liệu vị trí / vận tốc, cũng như dữ liệu Y của chúng tôi là một vectơ n * 1 từ 1 đến 0 thông qua 150 kỷ nguyên đào tạo. ( Lưu ý : Nếu bạn đang sử dụng phiên bản cũ hơn của Máy ảnh, epochsthì nb_epoch).)

Trong quá trình chơi, mỗi kẻ thù đánh giá NN này mỗi khung hình để xác định xem chúng có nên bắn vào người chơi hay không, chỉ với một dòng mã:

self.brain.keras.predict(np.array([list((dx,dy,du,dv))]))>=0.5

Những gì bạn có thể thấy ở đây là nếu nơ ron cuối cùng xuất ra> = 0,5, thì kẻ thù sẽ khai hỏa. Bạn cũng có thể thấy chúng ta đi qua vị trí tương đối hiện tại (dx, dy) và vận tốc (du, dv) làm dữ liệu đầu vào để não dự đoán.

Bài học kinh nghiệm

Nói chung, có một vài bài học quan trọng mà tôi đã học được khi kết hợp bản demo này:

  • Chọn đúng dữ liệu để đào tạo mạng của bạn là rất quan trọng . Có rất nhiều dữ liệu có sẵn để lựa chọn, nhưng việc chọn đúng bộ dữ liệu chính xác là rất quan trọng để xây dựng một mạng có thể sử dụng được. Cảm ơn VP Kỹ thuật Tom Radcliffe của chúng tôi, một chuyên gia ML; ông đã cung cấp hướng dẫn tuyệt vời về loại dữ liệu đào tạo phù hợp để sử dụng.
  • Dữ liệu của Prepping của bạn là dữ liệu chính . Bình thường hóa dữ liệu đầu vào của bạn! Nó không thực sự cần thiết, nhưng nó cũng không có khả năng gây ra vấn đề và rẻ tiền và dễ làm. Bạn cũng nên cảm thấy thoải mái với NumPy và cách thích hợp để định dạng ma trận để Keras biết cách diễn giải dữ liệu bạn ném vào nó.
  • Thử nghiệm với cấu trúc liên kết mạng . Lúc đầu, tôi ngần ngại làm xáo trộn bố cục của mạng và cảm thấy lạ khi sử dụng thử và lỗi để đưa ra giải pháp, nhưng càng tìm hiểu về không gian này, tôi càng nhận ra rằng đây là một phần quan trọng của quá trình.
  • Hình dung là quan trọng . Trước khi tôi thực hiện trực quan hóa, tôi thấy rất khó để gỡ lỗi và lý do về những gì đang xảy ra với NN của tôi. Mặc dù có nhiều tùy chọn có sẵn để trực quan hóa, hình ảnh trực quan mà tôi đã ghép lại có ý nghĩa với tôi và giúp tôi rất nhiều trong việc xác định hành vi của mạng.

Điều đáng chú ý là hành vi của mạng đơn giản này phù hợp như thế nào, và mặc dù có một số cải tiến và bổ sung rõ ràng có thể được thực hiện cho điều này, tuy nhiên nó vẫn thể hiện sức mạnh của học máy ... và giờ đây nó có thể truy cập siêu bất kỳ ai.

Tiến về phía trước tôi sẽ tìm cách thực hiện một vài điều chỉnh và cải tiến cho mạng này. Cuối cùng, tôi muốn chuyển nó cho GitHub vì tôi đã có một số yêu cầu tại PyCon để làm như vậy và rất thích thấy những người khác học hỏi từ dự án này.

Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 4418