Comments 143
Подобных «руководств» как мух в сортире. А что делать когда это прочитал, не понятно. Хоть бы одну ссылку на годное видео/курс автор оставил
Можете дать ссылочку на подобное руководство, пожалуйста? Ну, чтобы гуманитарии даже могли понять нейронные сети?
UFO landed and left these words here

Да вот только почему-то даже слоев нарисовать, связей и формул часто не могут, даже для отписки гуманитариев.


Скорее, статья написана для демистификации нейронных сетей для гуманитариев. Чтобы они не думали, что это какая-то магия и не верили на слово всяким ICO проектам на машинном обучении — но спрашивали структуры и архитектуру проекта хотя бы.


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

Некоторые вещи нельзя объяснить для гуманитариев. В этом смысле сами нейронные сети проблемы не представляют. Вот обучение нейронных сетей — это уже гораздо более сложный вопрос. Например, попробуйте вы объяснить про обратное распространение ошибки не упоминая понятие производной функции.

UFO landed and left these words here
Если так смотреть, то потенциал есть у каждого, кто не забаненнен в гугле.
Было-бы желание. А именно желание сможет пробудить любопытство, которое повлечёт изучение нового.
Да, знание матана бывает полезным, хотя-бы благодаря тому, что позволяет быстрее и проще донести суть (идеи),
не углубляясь в самые азы (того-же матана).
Например, можно весьма просто описать ту-же суть, используя понятие триггера.
Автор-же использовал понятие перцептрона (более сложного элемента, чем элементарный триггер).
Но был сделан акцент на том, что статья д.б. понятной даже для гуманитария. Отсюда — ясно, почему столь необычно разворачивается объяснение.
Да, спасибо, расширение собственного кругозора — вещь весьма полезная.
Как вариант, можно объяснить гуманитарию понятие производной, на пальцах в нем ничего сложного нет. Я вот недавно брату объяснил — он, конечно, не гуманитарий, но зато в восьмой класс перешел.
Элементарно: В случае ошибки нам нужно скрутить неправильные веса связей (к ней приведшие), поэтому мы раздаём штраф пропорционально весам от места ошибки назад, до самого входа. Чтобы не задавить всех в 0 нужно правильно подобрать силу «болевого» сигнала и не забывать о нормализации весов в слое.
UFO landed and left these words here
UFO landed and left these words here
Не стоит людей судить по дипломам или профессии.
У меня перед глазами пример, когда историк решал олимпиадные задачи по математике быстрее выпускников не последнего технического ВУЗа, решивших немного приколоться. А в момент, когда в решениях технарей нашлись ошибки, которые объяснял тупой гуманитарий, граждане почему-то совсем расстроились.

Кстати, мне как технарю прочитать статью было интересно. Потому что занимаясь проектами, наймом, и обучением (и сам, и обучая всяких студентов азам) — не всегда можно найти время на офигенные стендфордские курсы.
UFO landed and left these words here

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

UFO landed and left these words here
Ваша цитата:

А если интересует, и это не просто хайповая история (разобраться, чтобы не ударить в грязь лицом в курилке), а действительно интересно, то он уже и не гуманитарий вовсе, как и ваш историк.

Или «если человека интересуют нейронные сети, то он не гуманитарий». То есть по вашей логике гуманитарий не может интересоваться нейронными сетями.

А меня уже много знакомых гуманитариев — да и тут ребята в комментариях — поблагодарили за статью :) Говорите что угодно, а статья зашла аудитории, для которой писалась, и я очень рад, что приоткрыл завесу тайны нейронных сетей для более, чем одного человека.

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

Вообще, если отойти ещё дальше, можно заметить, что так построен почти весь образовательный процесс :).
Кант так-то был математиком и его философия отдает «технарским» восприятием мира, может вы вовсе и не технарь?)
UFO landed and left these words here
Хабр читают не только спецы, но и люди интересующиеся технологиями.
Вопрос в том, зачем гуманитарию их понимать?

Зачем фронтендеру ардуино?
Зачем знать физику?
Зачем быть снобом? :)
UFO landed and left these words here
Примитивизировать есть смысл. На этом основан даже небезызвестный алгоритм обучения Ричарда Фейнмана.

«Если вы ученый, квантовый физик <можно подставить что угодно>, и не можете в двух словах объяснить пятилетнему ребёнку, чем вы занимаетесь, — вы шарлатан.»

Длинно (несколько частей), много математики и слишком умные слова (дропнут на первой четверти текста), имхо, для гуманитариев. Есть попроще статья?


Нужна такая, чтобы нейронных сетей перестали бояться, а не начали бояться с новой силой.

Я не делаю. Но вот моя знакомая филолог дропнула длинную статью по нейронками на первой формуле, так и не разобравшись в принципах работы — ей это было не нужно по профилю. Зато, прочитав эту статью, заполучила минимальное понимание механизмов работы и теперь знает, что никакой магии нет.

ну может быть ей просто это не нужно?

ну и опять же — окей, поняла она основную идею, связи между нейронами и веса. И что дальше? Что с этим осознанием она будет делать. Сможет ли она реализовать свою примитивную нейронку? нет. Сможет ли она осознать как эффективнее (не брутфорсом) обучать нейросети? нет. Будет ли догадываться о обратной связи — нет.

Так тогда какой практический смысл для вашей знакомой?
Я не согласен с вами, что не стоит расширять кругозор людей и что каждая крупица информации должна нести ценность прямо сейчас. Может, ей это пригодится в будущем.
Может, ей это пригодится в будущем.

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


Но для того же кругозора стоит сразу сказать в чем проблема такой упрощенной модели (обучение). Что бы люди сразу понимали что в реальности все намного сложнее, хоть и идея простая.


А для того что бы развлечь публику, можно накинуть на вентилятор делему о том, нужно ли понимать модель, которая делает то что надо, или это излишне. Это я к этой фразе:


трясите с попрошаек наброски работы нейронных сетей

Эта фраза может принести много пагубных последствий. А так как развлекательный контент — не вижу никаких проблем.

Считайте эту статью — развлекательным контентом, она именно под таким ключом и писалась :)
Можете дать ссылочку на подобное руководство, пожалуйста? Ну, чтобы гуманитарии даже могли понять нейронные сети?

neuralnet.info. Необходим уровень математики средней школы. Его интерпретация Вашего примера с водкой тут.

Но ведь оно длинное! Ни один гуманитарий не будет его читать, а вот ссылочку на эту статью можно кинуть своей бабушке. Это не учебник, это сложное простыми словами за 5 минут или меньше.

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

Так в самом начале про резюме — это же шутка. Никто в здравом уме, конечно, не будет добавлять после этой статьи "машинное обучение" к себе в резюме. Скорее, начнет глубже разбираться в уже не таком магическом концерте — и уже разобравшись, добавит.

Конечно у меня не самое лучшее чувство юмора, но тем не менее я не понял, и из контекста тоже шутки не увидел. А вот таких «мастеров» объяснения «на пальцах» слишком много в последнее время :( Вероятно Вы к таким не относитесь, и моё первое впечатление ошибочно, но осадочек остался :)

Прошу прощения, если пошутил непонятно :) постараюсь в будущих статьях чуть менее завуалированно юмор свой вставлять. Я ещё новенький на Хабре, пытаюсь найти золотую середину между толстыми и слишком тонкими вкраплениями шуток. Спасибо за комментарии!

Ни один гуманитарий не будет его читать

Гуманитарии и Вашу статью читать не будут, если можно посмотреть видео на ютубе по ссылке, которую Вы же сами и привели. И вообще много ли здесь гуманитариев?

Это не учебник, это сложное простыми словами за 5 минут или меньше.

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

берет 9 пикселей рядом друг с другом, например, и усредняет их значения RGB.
8)
ссылочку на эту статью можно кинуть своей бабушке

What? Бабушка в шоке.

Ну, на видео 25 минут, а тут 5 минут :3 последние параграфы тут уже не относятся к объяснению, а показывают дорогу "куда дальше" — так что их бабушке понимать уже не нужно. Но спасибо за ссылку :)

Алсо, в ваш пример на 5 минут длиннее, заумнее и с гораздо большим количеством математики, которая пугает гуманитариев и мгновенно отключает их интерес к теме.

Норм руководство. Хотя опять же, что делать дальше — не понятно
Я бы посоветовал курс fast.ai
В отличии от кроусейровских и подобных курсов тут идет сверху вниз. От «запустить несколько высокоуровневых команд» (в стиле scikit-learn) к большей детализации — как правильно готовить исходные данные, трюки как лучше учить, чтобы быстрее сходилось, как это все устроно внутри. Собственно про такие «детали» (с точки зрения курса) нейрон (точнее там говорится про активации), веса, сами сверточные сети, методы оптимизации (обучения) там говорится уже в середине курса, после того как несколько нейронок уже обучены, получены результаты из первой сотни участников kaggle и есть мотивация продолжать.
Фух, хорошо, что я на них ссылочку в конце статьи оставил, правда? :) Ну и 36 минут против 5 минут — это достаточно высокий порог для нетехнического специалиста, у которого нет времени так глубоко вникать.
Значит годное видео! :)
Проще один раз увидеть чем пять минут прочитать. :))

Отнюдь, если у человека нет 36 минут, но за чашкой утреннего кофе глянуть статью время есть. Это просто вопрос коммитмента.

Клевая статья, спасибо! Думаю, моя чуть менее высокоуровневая, но по ссылке статья —огонь!
Если хочется быстро, не за 5 минут, но хотя бы за день пощупать руками и реальный результат ощутить, то мне вот эта статья помогла: habr.com/post/343466
В течении дня приведённый исходник адаптировал под категоризацию некоторых специфических картинок.
И оно реально работает, причём быстро на офисном компе, которому 10 лет.
Хотя картинки, конечно сначала превращаются в довольно крупную мозаику средствами того же самого Golang.

Но там же не описываются принципы, а просто показывается пример работы с библиотекой, который никакой нагрузки смысловой не несёт нетехничнским людям, разве нет?

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

Я уже объяснял, зачем :) чтобы демистификации машинное обучение и чтобы могли спрашивать с проектов на ИИ реальные модели м архитектуру, а не слепо верить в любую сложно написанную псевдонаучную маркетинговую замануху. Эта статья ведь и есть место, где "про принципы отдельно можно почитать" гуманитариям :) Разве нет?

Проблема в том, что вот эти "гуманитарии", которые увидели где-то в интернете заметку длиной в твит (больше текста они, вероятно, не в состоянии осилить), и уверовавшие в собственную осведомленность областью — это и есть главный источник мистификаций и булшита, т.к. начинают теоретизировать в условиях нехватки знаний.

Проблема в том, что вот эти «гуманитарии», которые увидели где-то в интернете заметку длиной в твит (больше текста они, вероятно, не в состоянии осилить), и уверовавшие в собственную осведомленность областью — это и есть главный источник мистификаций и булшита, т.к. начинают теоретизировать в условиях нехватки знаний.

Это вы про нейронные сети? Или прививание населения? Или про аэродинамику самолетов? Или про электричество? Или про гравитацию? Или про жизнь и смерть? Просто ваш комментарий можно с таким же успехом написать под любой вводной статьей в любой сфере.

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

Лично я из-за большой занятости очень долго откладывал узнать, что же такое нейронки (сейчас только-только освободился, защитил диплом), и мне очень даже зашло :) Сразу же море идей, куда применить, что делать и в какую сторону можно эту идею расширять.

А что автор не привёл кода, который отличает котиков от собачек — ну что ж, статьи-пятиминутки не для этого.
Это вы лет на 30 назад заглянули. Тогда были персептроны и примерно такое «на пальцах» примитивное понимание. Примерно как «вот компьютер, там микросхемы, сигналы 0/1 бегают, в байты собираются. Главный принцип такой, в дальше все просто, сами разберетесь».
А в детских книгах было такое. «Сделайте персептрон, отличающий цифру 1 от цифры 2». Батарейка, три канцелярских кнопки, две лампочки и цифры из фольги.
Помню, был еще автомат игры в крестики-нолики, из спичечных коробков и спичек. Путем выкладывания спичек при обучении — достигалась оптимальная стратегия игры (либо ничья, либо выигрыш, если противник сплоховал).

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


Не претендую на пользу статьи для технарей.

UFO landed and left these words here

Скорее, тип нейрона в нейронной сети. Перцептроны можно комбинировать с другими типами нейронов. Если нейронка состоит только из перцептронов (как в статье), то это перцептронная нейронка… Вроде как.

UFO landed and left these words here
UFO landed and left these words here

Чую, судя по комментариям, не оценят :) опять будут писать, мол, не нужно такое. Хотя, может быть, напишу на Медиум уже — там, возможно, лучше примут :)

UFO landed and left these words here
Скорее, тип нейрона в нейронной сети.
Нет, это архитектура сети, передаточная функция является лишь одной из характеристик классического перцептрона.

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

Как нарисовать сову? Рисуете два овала… потом дорисовываете все остальное.
Вот тут так же :)
нейронные мы сети изучали в универе, больше 10ти лет назад…

… создавали, обучали… чем лучше сеть обучена — тем более близкий результат к ожидаемому…

… да… гемор… но другое в бесноватость кидает: заведомо прописанные и известные алгоритмы, заведомо пройденные over n-тысяч циклов обучений созданной нейроной сети, и эту программу, которая якобы способна принимать приближенное к верному решению (в зависимости от входных данных) називают ИИ…

по моему глубочайшему убеждению, все ети ИИ и и т.п. — не более чем ход конем хорошо подкованных маркетологов…

сколько яблоко грушей не называй — суть вещей не измениться… но попыт синтетически создадут…

тема с моделированием нейронной сети увлекательна, но кучу времени бесстыдно сжирает =)
В математическом смысле — нейронные сети (точнее модели) это аппроксимация неизвестной функции перехода из пространства данных в пространство решений с помощью комбинации тех или иных известных. А «интеллект» в этом случае — это а) способность иметь дело с данными, которые не встречались при тренировке б) дообучаться по ходу действия (для некоторых типов сетей)
В начале статьи не хватает «Сап, Лурк!».
Но ладно, уговорили, пойду допишу резюме — впишу новые строчки между «квантовые вычисления» и «блокчейн».
Одна из самых полезных для меня статей на ГикТаймсе (Хабре). Огромное спасибо автору!
Спасибо автору, теперь я точно займусь изучением нейросетей, а то в прошлый раз в требованиях к курсу был python и матан. Пока python изучал, желание посмотреть нейросети отпало
Так, падажжи.
У бинарных условий есть значения 0 и 1, так? 0 должен уменьшать вероятность наступления решений, а 1 — увеличивать, так?

Водку некоторые не любят (зря конечно), но пускай она уменьшает шансы — у неё 0.

На вечеринке есть друзья — это, наверное, хорошо? — тут 1.

А почему у дождя тоже единица? Автор любит дождь, в нём можно спрятать слёзы?
Почему дождь на улице увеличивает вероятнось пойти на вечеринку?
В этом и есть прелесть нейронных сетей — в зависимости от того, кто и как обучает ее, результаты будут другими. Возможно, обучающий очень любит дождь или живёт в очень жаркой стране, где в дождь гулять очень приятно. Плюс, в итоге учитывается не простая бинарность отдельных вводов, но и их комбинации при добавлении новых слоев. Может, человеку вообще плевать, на то идёт дождь или нет, если будут друзья и не будет водки?
Хорошо, тогда какие-то связи должны давать минус к решению, так?
Почему это нигде не написано? Почему только плюсы, а решение основывается на умножении бинарного условия на вес (водка — 0*0,2).
А если бы водка была то ещё больше был бы смысл пойти?

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

То есть есть два индивида:
А) любит водку и пьяных друзей
Б) не любит водку и пьяных друзей
Исходя из условий задачи пить нам её придётся, ведь иначе зачем бы нам было обращать на неё внимание?

Итак, условие «на вечеринке будет водка». В случае если она есть (1):
А) получает баллы к решению пойти
Б) не получает баллы к решению пойти, но не теряет их
В обратном случае с водкой соответственно наоборот.

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

Это как если бы мы определяли огурец по правилам «длинный», «зеленый» и «в пупырышку». Мы точно знаем, что огурец должен быть в пупырышку, но этот не в пупырышку и мы просто не добавляем ему баллов, хотя должны бы списать. Так?

Насколько я понял, если у нас есть негативные факторы, влияющие на решение, мы делаем на них отрицательные веса. Ура, баланс вселенной соблюден, вы великолепны)


Для наглядности в самом первом примере условие с водкой пометим как "1" (т.е. влияет на решение) и повесим на нее -0.8 (если мы убежденные трезвенники, и не любим пьяных людей). Соответственно, в итоге получим -0.81+0.91+0.1*1 = 0.2. Значит, не идем на вечеринку, нам (читай, нашей нейросети) пьяные друзья не нравятся.

Ну и я и говорю — где-то должен быть минус, чтобы получился отрицательный вес.
Но в статье про это ни слова.
В статье ни слова ещё про очень много концептов :) статья заведомо переупрощена, чтобы было интересно и быстро читать.
Со всей очевидностью, минусовый вес должен быть у нейрона, получающего вход от дождя. То есть — «мало водки и сильный дождь — спасибо, я пивка дома хряпну» ;)

Отрицательный вес не нужен, это просто вопрос начала отсчёта, и в статье есть упоминание нормализации и сравнение с 0.5.
Если вес связи n, то начало отсчёта считается за n/2. Тогда присутствие фичи увеличивает "шанс" на n/2, а отсутствие — уменьшает на ту же величину. При идеальных условиях матожидание нормализованной сети составит 0.5. Вуху.

У нас с вами, например, очень разные взгляды на жизнь. В жизни у меня так: я пить не люблю, но очень люблю находиться в пьющей компании :) вот на наших с вами данных нейронка будет диаметрально противоположные результаты выдавать.
А как быть с моментом обучения когда один видит синее платье а другой золотое?
Как ведет себя сеть обученная на таком материале?
Зависит от того, как и кто ее обучал. Алсо, зависит от того, слышит она Лорен или Янни.

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


Так что не "лучше", а просто для других целей.

Ох, книжки никто читать не будет для минимального понимания механизма работы.

Не думайте так плохо о людях ;-)

Я не думаю плохо :) скажем, я просто так не хочу читать учебник по анатомии, но знаю, с какой стороны у меня печень. Благодаря статье "анатомия за 5 минут" и подобным ресурсам :)

Зашел в надежде понять нейронки за 5 минут. В итоге пролистал статью в ожидании когда же я все-таки не пойду на вечеринку :)
Либо, например, вообще избавляется от красного цвета в картинке, так как он не важен (ищем, например, только зелено-синие платья)

Плохой пример, для поиска зеленых платьев нужен не только зеленый канал, а все, тк зеленый цвет это не только максимум на зеленом канале, но И минимум на остальных, поэтому для поиска зелено-синих нужен красный, иначе белые будут считаться зелено-синими тоже.
Хайп на нейронные сети не стихает и когда периодически кто-то из гуманитариев спрашивает, что это за такой невиданный зверь «нейронная сеть», то вроде бы и понимаешь, что там под капотом, но сложно объяснить простым языком.
Ещё полгода назад мне чтобы самому понять нейронные сети на уровне чуть выше чем в статье ушло пару дней на прочтение разных заумных статей, а здесь всё изложено за 5 минут и не грузят математикой.
Теперь если меня спросит кто-то из знакомых про нейронные сети, я просто скину ему ссылку на эту статью. Статья подходит не только гуманитариям но и разработчикам, которые ещё не знают нужно им это или нет. Большинство статей для новичков на самом деле написано математиками для математиков и начинаются с фразы «возьмём матрицу m на n» или «рассмотрим такую формулу», но не у каждого человека есть лишних пару дней на преодоление искусственно завышенного порога вхождения в область, которая тебе может и не интересна вовсе.
Хотел сделать ИИ в простенькой игре, смотрю в сторону нейронок.
Я же правильно понимаю, что backprop для обучения с подкреплением вообще не подходит?
Если я правильно понимаю backprop, нужно же знать численную величину ошибки относительно эталонно верного ответа?
Например, ИИ, управляющий танчиком, принял решение двигаться влево на 100 пикселей чтобы избежать попадания от выстрела противника. На 90м пикселе ловит снаряд.
Какова величина ошибки?
Какие, вы считаете, классические алгоритмы машинного обучения подойдут для данного случая?
Насколько я понимаю, уважаемый backmeupplz имел в виду противопоставление классических алгоритмов алгоритмам машинного обучения.
Обычно в играх используется алгоритм альфа-бета отсечения для эффективного продумывания на несколько ходов вперед, а через несколько ходов качество достигнутой ситуации на поле оценивается с помощью эвристик. Если есть какие-то более конкретные вопросы — задавайте.
Спасибо за указанные в комментариях алгоритмы, обязательно постараюсь разобраться. В сторону ML смотрю потому, что хочется делать максимально адаптирующихся к игре оппонентов ботов.
Если допустим с танчиком ещё всё более-менее понятно, то там где нужно принимать решения, основываясь на цепочке событий — что-то я буксую.
Например, взять покер.
Краткое описание правил с вики
  • Два игрока, сидящие за сдающим (которого называют «баттон» или «дилер»), вносят ставки вслепую (блайнды). Обычно первый вносит половину минимальной ставки (малый блайнд), а второй — целую ставку (большой блайнд).
  • Каждый игрок получает по две карты в закрытую (префлоп), следует круг торговли.
  • На стол перед всеми игроками кладутся три карты в открытую (флоп), следует круг торговли.
  • На стол кладётся четвёртая карта в открытую (тёрн), следует круг торговли. При игре в лимитированный холдем фиксированная ставка в этот момент удваивается.
  • На стол кладётся пятая карта в открытую (ривер). Таким образом, на столе лежит 5 карт, следует последний круг торговли.
  • Игроки могут использовать свои (карманные) и общие карты со стола для составления 5-карточных комбинаций.


  • В процессе торговли игрок может делать следующие ставки:
  • Поставить, «бет» (англ. bet) — сделать ставку;
  • Поставить все деньги, «Ва-банк» (англ. all-in) — Сделать ставку на все деньги;
  • Ответить, «колл» (англ. call) — поставить столько же, сколько поставил соперник — уравнять;
  • Поднять, атаковать, задушить, «рэйз» (англ. raise) — увеличить ставку — поставить больше, чем соперники;
  • Поднять, атаковать, задушить, «рэйз» (англ. raise) — увеличить ставку — поставить больше, чем соперники;
  • Пасовать, сбросить карты, «фолд» (англ. fold) — отказаться от дальнейшего участия и сбросить карты;
  • Отметиться, «чек» (англ. check) — в ситуациях, когда ставки не были сделаны соперниками или ставка уже была сделана вслепую — не добавлять ставку, оставить «как есть».


  • Круг торговли заканчивается, когда все соперники сделали равные ставки или сбросили карты.
  • Сделанные ставки складываются в банк (англ. pot).
  • Если в процессе последнего круга торговли осталось больше одного игрока, то карты открываются и комбинации игроков сравниваются между собой. Если только один игрок остался в игре, то он забирает банк.
  • Если больше одного игрока победили в игре, банк делится поровну между всеми выигравшими (англ. split pot).

Вроде бы всё просто. На выходе сетки одно из решений: поставить/ответить/поднять/оставить и сумма ставки/повышения, на входе параметров достаточно много но их все тоже можно перечислить. С величиной ошибки вроде тоже всё понятно — сумма выигрыша/проигрыша. А как делать backprop? Допустим: префлоп 1 круг торговли, флоп — 3 круга, тёрн 2 круга, ривер — 1 круг. В итоге для принятия решения мы к сетке обращались 7 раз. Как распространять?
Ну или если я сильно многого хочу от отдной сети — делаем 4 и каждая принимает решение на своём этапе (префлоп/флоп/тёрн/ривер). Но на флопе три раза обращались к сетке — как распространять?
На выходе сетки одно из решений: поставить/ответить/поднять/оставить и сумма ставки/повышения, на входе параметров достаточно много но их все тоже можно перечислить. С величиной ошибки вроде тоже всё понятно — сумма выигрыша/проигрыша.
Боюсь, здесь все немного сложнее. У конкретного хода нет величины выигрыша/проигрыша — если бы эта величина была, то ее производная по весам сети и искалась бы с помощью backprop и никаких проблем не было бы. А еще нейросети нужны соперники, чтобы играть.
Если делать в лоб машинным обучением, я бы попробовал смотреть в сторону Q-learning. С другой стороны, можно проигнорировать всю психологию и смотреть на математическую вероятность выигрыша в случае получения конкретных карт. Можно еще попробовать сделать RNN (или набор отдельных сетей: по одной на каждый ход), заставить их играть друг с другом, а в качестве функционала качества использовать матожидание выигрыша после конкретного хода.
PS: Я не специалист, я эти подходы сейчас за три минуты придумал, наверное, бывает что-то и получше.
проигнорировать всю психологию и смотреть на математическую вероятность выигрыша в случае получения конкретных карт
О психологии речи вообще нет. А вычисление матожидания очень легко контрится: префлоп/флоп/тёрн — делаем небольшие ставки чтобы противник поддержал а на ривере делаем огромную — противник принимающий решение основанное на вычислении матожидания гарантированно скинет карты. В идеале, конечно, хочется чтобы бот сам научился такому поведению методами ML после серии игр с противником на вероятностях.
Тогда, как вариант, можно попробовать по ходам противников в прошлых играх прогнозировать их ходы в будущих раундах, и уже от этого оптимизировать матожидание. Вообще, думаю, стоит поискать научных статей на эту тему.
Ну не факт что есть история игр с противником, а тактику и в текущей игре можно два-три раза поменять
Если совершенно неизвестный вам противник первым ходом делает определенную ставку, то вы никак не можете определить, блефует ли он, для этого слишком мало данных. Нейронные сети чудеса творить не умеют.
Смотря какую функцию мы оптимизируем. Если, например, время жизни, и хотим довести его до 100, то ошибка равна 10 (ну или какая-то функция от 10, в зависимости от метрики).
Как правило в играх никаких ИИ не нужно, всё проще, элегантнее и эффективнее реализуется обычными алгоритмами.
Я не спец, но вроде как современные работы посвященные RL по большей части опираются на градиентные методы (например AlphaZero).
Возможно стоит начать с поиска чего-то по теме policy gradient
Большое спасибо за статью. Просто, быстро, на пальцах. Великолепно!
Отличная статья, спасибо. А backpropagation это механизм изменения весов связей или что-то другое?
Алгоритм оптимизации, описанный в статье (рандомно перебираем варианты и берем из них лучший) называется методом Монте-Карло.
Есть и более продвинутые алгоритмы, многие из них используют понятие градиента функции. Градиент — это направление, в котором нам нужно идти, чтобы функция максимально быстро возрастала. Например, представим себе график функции двух переменных как поверхность земли. Если положить на землю шарик, то он покатится вниз, в направлении, противоположном градиенту (в точности). Мы можем оптимизировать функцию подобным же способом: берем любую точку, считаем градиент (по формуле, выведенной ручками) и идем в противоположном направлении. Там снова считаем градиент и тд. Этот метод называется градиентным спуском.

Backpropagation — это способ посчитать градиент функции ошибки нейросети, простой и эффективный.

Если что-то непонятно — спрашивайте, постараюсь объяснить.
Да. Если нейронка ошиблась — то из размера ошибки на выводе (например, если правильный вывод 1.5, а нейронка показала 0.9, то размер ошибки 1.5-0.9=0.6) он позволяет последовательно (справа налево) слегка изменить веса связей.

То есть, скажем, были веса 0.1, 0.5, 0.3; ошибка — 0.6; алгоритм показывает, что нужно изменить первый вес на 0.1, второй на 0.2, третий на 0.3. В итоге у нас веса 0.2, 0.7, 0.6 — и нейронка выдает правильный результат. Backpropagation как раз один из способов подсчета, на сколько нужно двигать веса.
Очень легко и понятно изложен материал.
Спасибо большое автору за статью!
Извиняюсь, но это халтура. Индусы любят так «объяснять» и «систематизировать», типа умные.
И еще у меня сильное подозрение, что ты сам не сможешь объяснить, зачем во втором твоем примере два слоя, если они по правилам матричного умножения сводятся к одному. А это самое главное ;-)
Объяснить концепцию простым языком – достойная задача! Многим проще сыпать остротами и напускать таинственности и «избранности».
Спасибо за статью.
Хорошая реализация метода обучения Фейнмана в действии.

Как-то у вас получилось введение в введение. Маловато для статьи, прямо как на известной картинке:


Количество времени для адаптации кода

Секундочку, но ведь автор ничего не сказал о коэффициентах смещений(bias), без них лезть в дополнительные скрытые слои не вижу смысла.

На суть это мало влияет. Можно добавить константный признак, всегда равный 1.

Согласен, но полное отсутствие этого признака на много что влияет.

Only those users with full accounts are able to leave comments. Log in, please.