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

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

Но для того, что­бы научить ней­ро­сеть чему угод­но, для нача­ла надо сде­лать набор дан­ных для обу­че­ния. В слу­чае с игра­ми, соот­вет­ствен­но, это будут пар­тии раз­лич­ных игр. Для нача­ла я выбрал что-нибудь попро­ще: кре­сти­ки-ноли­ки. Бла­го ПОЛНОЕ дере­во реше­ний для этой игры очень неболь­шое. Чисто тео­ре­ти­че­ски там 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 кли­ент с под­держ­кой смарт-карт (это к вопро­су, поче­му я кате­го­ри­че­ски не могу рабо­тать под ентим вашим недо­ра­зу­ме­ни­ем под име­нем «Линупс», поми­мо мно­гих про­чих при­чин) свар­га­ни­ли для Маков.

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

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

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

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

Избыточная точность

Таб­лич­ка в бли­жай­шей забе­га­лов­ке Panera:

Не про­ве­рял, но чует моё сисад­мин­ское серд­це, что врут. Эту вер­сию вай­фая сей­час хер най­дёшь. Ско­рее все­го, там N или в край­нем слу­чае G.

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

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

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

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

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

Забав­ный баг обна­ру­жи­ли в про­шив­ках неко­то­рых моде­лей хепеш­ных твёр­до­тель­ни­ков. После того, как диск отра­бо­та­ет свы­ше 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 мик­ро­фон. Один конец кабе­ля в комп, дру­гой в разъ­ём 14 дюй­ма на род­ном стра­то­ка­сте­ре и погна­ли.

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

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

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

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

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

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