Искуственный интеллект

Наконец придумал, чем занять нейросеть. Научить её играть в игры.

Но для того, чтобы научить нейросеть чему угодно, для начала надо сделать набор данных для обучения. В случае с играми, соответственно, это будут партии различных игр. Для начала я выбрал что-нибудь попроще: крестики-нолики. Благо ПОЛНОЕ дерево решений для этой игры очень небольшое. Чисто теоретически там 9! игр (около 360 000), в реальности намного меньше: не все игры идут 9 шагов, многие являются отражениями других игр, развёрнутых на 90, 180, и 270 градусов. И так далее.

Написал программу на Питоне, которая генерирует все возможные игры, играет в них, и записывает результаты. Таким образом, у меня получилась программа, которая играет в игры традиционным способом — через построение игрового дерева.

Но будучи полным новичком в написании игр, я сделал фатальную ошибку. Вот как именно программа решает, каким ходом ответить на ход противника? Вопрос не такой простой, как кажется. Вроде бы очевидно — берём ход, который скорее всего приведёт нас к победе, и ходим так, да? Так думал и я. И неверно думал. То, что ход может привести нас к победе, совершенно не означает того, что он не приведёт нас к поражению. Поэтому сказав программе выбирать ход с наибольшей вероятностью победы, я сделал её довольно дурной — даже такой плохой игрок как я (я очень хреново играю в крестики-нолики, шашки, шахматы, и прочие подобные вещи), её легко обыгрывал.

Программа должна выбирать не ход, который приводит к победе. А ход, который не приводит к поражению. Вот такая логическая загогулина. Ничего, завтра переделаю программу и попробую заново. Может быть, даже до нейросети — изначального места назначения — дело дойдёт.

Программы, которые играют в шахматы тоже работают таким же образом — через построение игрового дерева. Только полное игровое дерево для шахмат… эээ несколько больше, чем количество атомов в наблюдаемой вселенной, так что дерево строят только частичное, и определают перспективность той или иной ветви через минимакс.

Вообще, если есть возможность строить игровое дерево — лучше строить игровое дерево. Такие программы будут играть в игру лучше, чем нейросети (которые по сути только распознают паттерны и реагируют на них). Но игровое дерево строить возможно далеко не всегда. Скажем, Го не поддавалось, поэтому нормально играть компьютер в Го наконец-то научились именно, что через нейросети. Потому что игровое дерево для шахмат — 10E120 (число Шеннона), а игровое дерево для Го — 1.74E172! Но даже Го меркнет перед огроменным деревом крайне (на первый взгляд) простой игры Стратего, чей размер составляет 10E535!!! Неудивительно, что компьютер играет в Стратего крайне слабо. Может быть, именно что нейросети научатся. В лоб, через построение дерева — путь тупиковый.

Нейронные сети

Ух, как продвинулся прогресс! Раньше создание своих нейронных сетей было занятием дико сложным, требующим понимания математики и нехилого программирования. Я даже нарисовал свою, на Сишарпе. Она, конечно, была простенькая, но я очень много понял (особенно хорошо я понял, почему ничего, кроме свёрточных сетей, для классификации изображений использовать невозможно — тупо памяти не хватит).

А теперь движок нейронных сетей не надо писать самому. Сначала появилась Caffe (я использовал её для одного из проектов в университете по поиску изображений), а потом Гугл открыл свой TensorFlow для всех. Но даже TensorFlow был ОЧЕНЬ непрост в использовании. А теперь выяснилось, что для TensorFlow написали кучу вменяемых библиотек, и создание нейронных сетей стало очень несложным занятием.

Их несколько, но больше всего мне понравилась библиотека keras. И дело не сколько в том, какая она хорошая, а в том, что для неё больше всего документации 🙂 В прошлый раз, когда я щупал нейронные сети, я использовал библиотеку TF-Slim. Документации для неё, можно сказать, не было. Пришлось хакать исходники примеров, чтобы получить что-то своё.

Но оцените, как это теперь просто!

Вот, например, Питонный код для создания простой нейронной сети из двух входных нейронов, 16 скрытых, и 3 выходных. На входе единички и нолики, представляющие собой True и False, и три выходных нейрона, один выдаёт результат логической операции XOR, второй AND, третий OR. Тренируется сеть меньше, чем за 1000 эпох (если увеличить количество нейронов в скрытом слое, то ещё быстрее).

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

model = tf.keras.Sequential()
model.add(layers.Dense(16, activation=’relu’))
model.add(layers.Dense(3))
model.compile(optimizer=’adam’, loss=’mean_squared_error’, metrics=[‘binary_accuracy’])

data = np.array([[0,0],[0,1],[1,0],[1,1]], “float32”)
labels = np.array([[0,0,0],[1,0,1],[1,0,1],[0,1,1]], “float32”)

model.fit(data, labels, epochs=1000)

print(model.predict(data).round())

Элементарщина же!

Осталось понять, чего прикольного теперь можно с этим сделать 🙂 Наверное, ничего — чтобы сделать что-то прикольное, надо поставить задачу и дать вводные 🙂 Разве что сделать нейронную сеть и запустить её наоборот, в генеративном режиме, предварительно скормив ей, например, музыку Моцарта в формате MIDI 🙂 Кстати, вполне реальная вещь, вот чувак кормил сеть Бахом: https://www.youtube.com/watch?v=SacogDL_4JU

Блютусное

Хозяйке на заметку. Если ваш лаптоп с десятой вендой вроде бы подключается к блютусным колонкам, но в панели управлением звуком эти колонки показываются как “disconnected” потому что индусские долбопрограммеры в очередной раз что-то сломали в ОС, попробуйте вынести колонки из системы КЕМ, и добавить следующий ключик в реестр из командной строки:

reg add HKLM\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AVRCP\CT /v DisableAbsoluteVolume /t REG_DWORD /d 1 /f

Видимо, по умолчанию венда чего-то там пытается сделать с колонками, но натыкается на непонимание, и маркирует колонки как “отключенные”. А этот ключик, насколько понял, отключает эту функциональность.

Чего-то мне в последнее время всё больше и больше хочется на Мак. Игр вот под ним только мало, а для работы всё, что надо, есть. Мелкомягкие даже RDP клиент с поддержкой смарт-карт (это к вопросу, почему я категорически не могу работать под ентим вашим недоразумением под именем “Линупс”, помимо многих прочих причин) сварганили для Маков.

Пропал Калабуховский дом

Кабздец моему антивирусу. Симантек был куплен Бродкомом и разделён на две части, а существующих пользователей — без трусов на мороз.

Придётся что-то другое покупать. Вот сижу думаю, чего. Касперский, разумеется, отпадает сразу — спасибо, нажрался уже, мне ЭТО завешивало машину раз в два-три дня самым аккуратным образом.

Битдефендер какой-нибудь, что ли. Все остальное как-то дороговато, и отзывы не очень лестные.

Мкрсфт упрлся

В новом терминале для Винды есть эффект эмуляции ЭЛТ монитора:

Это ж как надо накуриться, чтобы такое понравилось по доброй воле… Ещё несведение лучей в углах добавить, для полной, блин, аутентичности. Вот кому это надо — добровольно жрать уже мёртвое говно? Аудиокассетофильство из той же серии. Интересно, кстати, что на видеокассеты никто нынче не дрочит. Видимо, потому, что говённость качества более очевидна.

Но новый микрософтовский терминал штука неплохая, наконец-то в нём можно будет сделать несколько закладок, даже с разными интерпретаторами. К слову, этой фиче уже сто лет в обед на никсах. Осталось доделать закладки в файловом менеджере, наконец-то получится на уровне Убунту %)

Прикольный баг

Забавный баг обнаружили в прошивках некоторых моделей хепешных твёрдотельников. После того, как диск отработает свыше 32768 часов, он навечно отключается, теряя все данные. Насколько понимаю, связано это с неверной интерпретацией 16-битного числа, представлющего собой атрибут S.M.A.R.T. Power-on Hours. Оно должно было интерпретироваться как беззнаковое, а интерпретируется как знаковое. Так что когда старший бит из нуля станет единичкой — прошивка будет считать, что диск был включён ОТРИЦАТЕЛЬНОЕ количество часов и от таких новостей выпадет в осадок.

Те же, поди, программисты писали, что расколотили спускаемый аппарат об Марс из-за того, что кто-то забыл перевести футы в метры.

Прелесть

AMD снова на высоте.

Вкратце — в микрокоде процессоров АМД есть ошибка, из-за которой встроенный хардверный генератор случайных чисел раз за разом выдаёт 0xFFFFFFFF. Это, разумеется, приводит к серьёзнейшим дырам в безопасности для пакетов, которые используют машкод RDRAND. Чтобы починить, надо сгружать обновление для БИОСА (!) материнской платы (!!), которое обновит микрокод процессора (!!!). Нет, просто пойти на сайт АМД и скачать обновление низзя, что вы, это бы было слишком просто.

Помнится, ещё где-то в начале-середине 2000х я это уже видел — компьютеры на процессорах Интел нормально себе собирались и работали, в то время когда владельцы компьютеров на процессорах АМД пребывали в перманентном поиске нужной длины заячьей лапки и правильного размера бубна, чтобы ЭТО, наконец, нормально заработало.

Надо, правда, сказать, что часто это была вина самих владельцев, которые покупали АМД не потому, что он был лучше, а потому, что эти процессоры были дешевле. Ну, и заодно экономили ещё на всём остальном — на материнской плате, на памяти, и даже на блоке питания (не надо ржать, неустойчивая работа компьютера как правило на хреновость питания и указывает). Получалось в результате говно из серии “на грош пятаков”. И работало точно так же.

Но это также была и вина АМД, которые, например, не продавали вместе в процессором кулер. Интел продавали, а АМД нет. Поэтому форумы фанатов АМД были заполнены сообщениями типа: а площадь радиатора в 130 квадратных миллиметров это достаточно? А 40 кубов в минуту хватит? Нет, не хватит, надо минимум 45!

А владельцы Интелов не парились и ставили кулер, который шёл в комплекте. И всё нормально работало искоропки.

Отдельная ржака по охлаждению была когда на процессорах АМД не ставили защиту по перегреву, из-за чего процессор при полной загрузке, если с него снять кулер, за несколько секунд уходил вразнос и выпускал волшебный белый дым, на котором, как известно, всё и работает. Ну, а когда дым заканчивался — то и работать всё переставало. А Интеловские процессоры, увидев зашкал по температуре, тупо тормозили тапкой в пол и вставали раком.

АМД ещё тогда же начал сваливать с больной головы на здоровую — мол, изготовители материнских плат виноваты, они не ставят на платы термисторы и защиту (вот ТОЧНОСТИ как в данном примере — нехай БИОС апгрейдят, а мы белые и пушистые и вообще не при чём). А Интел без излишней зауми ставил защиту в сам процессор. Ибо нехрен.

Потом АМД взялись, наконец, за ум, и стали продавать вместе с процессорами кулеры. А теперь, вишь, опять перестали:

Нет, прелесть же. 32-х ядерная “Рязань” за почти две тыщи баксов, но кулер нихера в поставку не входит. 20 долларов сэкономили, молодцы!

Про десятую винду

Меня, в принципе, десятая винда удовлетворяет. Хотя стартовое меню я до сих пор считаю одним из кривейших решений в истории Микрософта. Его, конечно, можно настраивать, и сделать довольно удобным, но всё равно — хреновое это решение, если честно. Это, впрочем, не с десятой винды началось, а ещё с восьмой. И что характерно, совершенно непонятно, почему и зачем. То-есть, в случае с десятой виндой ещё более-менее понятно — ради лучшей работы на мобильных устройствах (Microsoft Surface весьма неплохо себя чувствует на рынке, у меня даже такое есть). Но совершенно непонятно, на кой хер это издевательство надо было тянуть на серверные версии винды, там что, тоже мобильные устройства, что ли? Ага, сервер баз данных на планшете. Или доменный контроллер. Рехнуться и не встать.

Но одна вещь в десятой винде просто ВЫБЕШИВАЕТ. Это работа с не очень стандартными USB устройствами. Почему-то тут всё строго через анальное отверстие.

Вот у меня, например, есть игра RockSmith. Игра заключается в том, чтобы подключить настоящую электрогитару с компу и играть по табам. В комплекте с игрой идёт USB кабель, с точки зрения компьютера представляющий собой USB микрофон. Один конец кабеля в комп, другой в разъём 1/4 дюйма на родном стратокастере и погнали.

Так вот заставить этот микрофон работать на десятой винде — это просто майн кампф какой-то. В последний раз я это сделал, вынеся ВСЕ USB устройства из диспетчера устройств к соответствующей матери нахер. После этого оно заработало. Но проработало недолго — до следующего обновления. Потому что в обновлении они в очередной раз что-то докручивают, после чего нихера не фурычит.

И ладно бы ещё устройства третьих фирм бы ломались. Но сейчас я, например, не могу заставить винду увидеть контроллер от коробокса. Хотя уж, ЕПТЫТЬ, казалось бы — Микрософтовский же продукт! И Микрософтовская ОС его в упор не видит.

Что за ерунда….

Какое интересное кино

Американские таможенники потребовали от Гугла и Эппла выдать информацию о пользователях мобильного приложения Obsidian. Данное приложение специально сделано для того, чтобы цепляться по вайфаю к прицелам ATN серий X-Sight 4k и ThOR 4m. При помощи приложения можно вносить поправки, делать видеозапись с прицела, считать баллистику и т.д. А мотивация для запроса таможни в том, для экспорта данных прицелов необходимо получать разрешение. Сопоставив количество выданных разрешений и количество зарубежных пользователей, можно примерно оценить, сколько прицелов было вывезено контрабасом. Чего они, правда, собираются делать с этой информацией — не вполне понятно. Прицел у них уже не отберёшь — юрисдикция не та. Разве что ещё раз вздрючить таможню на предмет “не пущать”?

Вот такая вот интересная новость, сплав компьютерного оборудования и огнестрельного оружия.