Комментарии 143
Да вот только почему-то даже слоев нарисовать, связей и формул часто не могут, даже для отписки гуманитариев.
Скорее, статья написана для демистификации нейронных сетей для гуманитариев. Чтобы они не думали, что это какая-то магия и не верили на слово всяким ICO проектам на машинном обучении — но спрашивали структуры и архитектуру проекта хотя бы.
Ну, пускай в статье нет никакого смысла, похоже, увеличил энтропию во вселенной. Для меня будет победой, даже если просто какой-нибудь один человек после прочтения загорится машинным обучением или разберётся в чем-то, ранее загадочном.
Некоторые вещи нельзя объяснить для гуманитариев. В этом смысле сами нейронные сети проблемы не представляют. Вот обучение нейронных сетей — это уже гораздо более сложный вопрос. Например, попробуйте вы объяснить про обратное распространение ошибки не упоминая понятие производной функции.
Не согласен, что не стоит расширять кругозор людей.
Было-бы желание. А именно желание сможет пробудить любопытство, которое повлечёт изучение нового.
Да, знание матана бывает полезным, хотя-бы благодаря тому, что позволяет быстрее и проще донести суть (идеи),
не углубляясь в самые азы (того-же матана).
Например, можно весьма просто описать ту-же суть, используя понятие триггера.
Автор-же использовал понятие перцептрона (более сложного элемента, чем элементарный триггер).
Но был сделан акцент на том, что статья д.б. понятной даже для гуманитария. Отсюда — ясно, почему столь необычно разворачивается объяснение.
Да, спасибо, расширение собственного кругозора — вещь весьма полезная.
У меня перед глазами пример, когда историк решал олимпиадные задачи по математике быстрее выпускников не последнего технического ВУЗа, решивших немного приколоться. А в момент, когда в решениях технарей нашлись ошибки, которые объяснял тупой гуманитарий, граждане почему-то совсем расстроились.
Кстати, мне как технарю прочитать статью было интересно. Потому что занимаясь проектами, наймом, и обучением (и сам, и обучая всяких студентов азам) — не всегда можно найти время на офигенные стендфордские курсы.
Деление людей на "гуманитариев" и "технарей" — это как-раз профессия, а не склад ума. То же самое говорили и про разницу полов, мол, это не биологически разные просто люди, это разные склады ума и интересы. Поэтому женщина должна быть на кухне, а гуманитарий не должен интересоваться техническими науками. Иначе женщина, которая интересуется машинами, уже не женщина вовсе.
А если интересует, и это не просто хайповая история (разобраться, чтобы не ударить в грязь лицом в курилке), а действительно интересно, то он уже и не гуманитарий вовсе, как и ваш историк.
Или «если человека интересуют нейронные сети, то он не гуманитарий». То есть по вашей логике гуманитарий не может интересоваться нейронными сетями.
А меня уже много знакомых гуманитариев — да и тут ребята в комментариях — поблагодарили за статью :) Говорите что угодно, а статья зашла аудитории, для которой писалась, и я очень рад, что приоткрыл завесу тайны нейронных сетей для более, чем одного человека.
Но все равно спасибо за ваше мнение.
Пока что всё, что я вижу, это как вы проецируете собственные предрассудки на те или иные категории граждан.
Точно также, как технари иногда начинают интересоваться гуманитарными науками. И этот интерес также начинается не с зауми, а с простых вещей.
Вообще, если отойти ещё дальше, можно заметить, что так построен почти весь образовательный процесс :).
Вопрос в том, зачем гуманитарию их понимать?
Зачем фронтендеру ардуино?
Зачем знать физику?
Зачем быть снобом? :)
«Если вы ученый, квантовый физик <можно подставить что угодно>, и не можете в двух словах объяснить пятилетнему ребёнку, чем вы занимаетесь, — вы шарлатан.»
Длинно (несколько частей), много математики и слишком умные слова (дропнут на первой четверти текста), имхо, для гуманитариев. Есть попроще статья?
Нужна такая, чтобы нейронных сетей перестали бояться, а не начали бояться с новой силой.
Я не делаю. Но вот моя знакомая филолог дропнула длинную статью по нейронками на первой формуле, так и не разобравшись в принципах работы — ей это было не нужно по профилю. Зато, прочитав эту статью, заполучила минимальное понимание механизмов работы и теперь знает, что никакой магии нет.
ну и опять же — окей, поняла она основную идею, связи между нейронами и веса. И что дальше? Что с этим осознанием она будет делать. Сможет ли она реализовать свою примитивную нейронку? нет. Сможет ли она осознать как эффективнее (не брутфорсом) обучать нейросети? нет. Будет ли догадываться о обратной связи — нет.
Так тогда какой практический смысл для вашей знакомой?
Может, ей это пригодится в будущем.
в том то и суть, что в целом математика нейронок на базовом уровне простая, даже для гуманитария.
Но для того же кругозора стоит сразу сказать в чем проблема такой упрощенной модели (обучение). Что бы люди сразу понимали что в реальности все намного сложнее, хоть и идея простая.
А для того что бы развлечь публику, можно накинуть на вентилятор делему о том, нужно ли понимать модель, которая делает то что надо, или это излишне. Это я к этой фразе:
трясите с попрошаек наброски работы нейронных сетей
Эта фраза может принести много пагубных последствий. А так как развлекательный контент — не вижу никаких проблем.
Можете дать ссылочку на подобное руководство, пожалуйста? Ну, чтобы гуманитарии даже могли понять нейронные сети?
neuralnet.info. Необходим уровень математики средней школы. Его интерпретация Вашего примера с водкой тут.
Но ведь оно длинное! Ни один гуманитарий не будет его читать, а вот ссылочку на эту статью можно кинуть своей бабушке. Это не учебник, это сложное простыми словами за 5 минут или меньше.
Так в самом начале про резюме — это же шутка. Никто в здравом уме, конечно, не будет добавлять после этой статьи "машинное обучение" к себе в резюме. Скорее, начнет глубже разбираться в уже не таком магическом концерте — и уже разобравшись, добавит.
Прошу прощения, если пошутил непонятно :) постараюсь в будущих статьях чуть менее завуалированно юмор свой вставлять. Я ещё новенький на Хабре, пытаюсь найти золотую середину между толстыми и слишком тонкими вкраплениями шуток. Спасибо за комментарии!
Я ещё новенький на Хабре
Первая статья 2012 года.
Приглашён 25 июля 2014 в 17:13 по приглашению НЛО (Профиль)
Пригласил на сайт 9 человек.
Вы по времени путешествуете что ли?
Ни один гуманитарий не будет его читать
Гуманитарии и Вашу статью читать не будут, если можно посмотреть видео на ютубе по ссылке, которую Вы же сами и привели. И вообще много ли здесь гуманитариев?
Это не учебник, это сложное простыми словами за 5 минут или меньше.
Поэтому я дополнительно привёл ссылку на аналогичный пример, где тоже простыми словами и тоже за пять минут. Только помимо примера там ещё и учебник, к которому можно обратиться, если тема заинтересовала. Но и в учебнике, и в Вашей статье описание простых вещей хорошо легли на простые слова (туфта, дичь, шняга (с)), но потом…
берет 9 пикселей рядом друг с другом, например, и усредняет их значения RGB.
8)
ссылочку на эту статью можно кинуть своей бабушке
What? Бабушка в шоке.
Ну, на видео 25 минут, а тут 5 минут :3 последние параграфы тут уже не относятся к объяснению, а показывают дорогу "куда дальше" — так что их бабушке понимать уже не нужно. Но спасибо за ссылку :)
Алсо, в ваш пример на 5 минут длиннее, заумнее и с гораздо большим количеством математики, которая пугает гуманитариев и мгновенно отключает их интерес к теме.
В отличии от кроусейровских и подобных курсов тут идет сверху вниз. От «запустить несколько высокоуровневых команд» (в стиле scikit-learn) к большей детализации — как правильно готовить исходные данные, трюки как лучше учить, чтобы быстрее сходилось, как это все устроно внутри. Собственно про такие «детали» (с точки зрения курса) нейрон (точнее там говорится про активации), веса, сами сверточные сети, методы оптимизации (обучения) там говорится уже в середине курса, после того как несколько нейронок уже обучены, получены результаты из первой сотни участников kaggle и есть мотивация продолжать.
Вот одна из самых простых и понятных статей про нейронку, которую видел — https://m.habr.com/post/369349/
В течении дня приведённый исходник адаптировал под категоризацию некоторых специфических картинок.
И оно реально работает, причём быстро на офисном компе, которому 10 лет.
Хотя картинки, конечно сначала превращаются в довольно крупную мозаику средствами того же самого Golang.
Но там же не описываются принципы, а просто показывается пример работы с библиотекой, который никакой нагрузки смысловой не несёт нетехничнским людям, разве нет?
Почувствовать реальную работу нейросети своими руками. Не залезая в более сложные штуки типа тензорфлоу.
Нетехническим вообще не знаю зачем лезть в эти дебри.
Я уже объяснял, зачем :) чтобы демистификации машинное обучение и чтобы могли спрашивать с проектов на ИИ реальные модели м архитектуру, а не слепо верить в любую сложно написанную псевдонаучную маркетинговую замануху. Эта статья ведь и есть место, где "про принципы отдельно можно почитать" гуманитариям :) Разве нет?
Проблема в том, что вот эти "гуманитарии", которые увидели где-то в интернете заметку длиной в твит (больше текста они, вероятно, не в состоянии осилить), и уверовавшие в собственную осведомленность областью — это и есть главный источник мистификаций и булшита, т.к. начинают теоретизировать в условиях нехватки знаний.
Проблема в том, что вот эти «гуманитарии», которые увидели где-то в интернете заметку длиной в твит (больше текста они, вероятно, не в состоянии осилить), и уверовавшие в собственную осведомленность областью — это и есть главный источник мистификаций и булшита, т.к. начинают теоретизировать в условиях нехватки знаний.
Это вы про нейронные сети? Или прививание населения? Или про аэродинамику самолетов? Или про электричество? Или про гравитацию? Или про жизнь и смерть? Просто ваш комментарий можно с таким же успехом написать под любой вводной статьей в любой сфере.
Источник мистификаций и булшита — это как-раз отсутствие хоть какого-нибудь образования в области, но ни в коем случае не присутствие толик знания. Но это, конечно, исключительно ИМХО.
Лично я из-за большой занятости очень долго откладывал узнать, что же такое нейронки (сейчас только-только освободился, защитил диплом), и мне очень даже зашло :) Сразу же море идей, куда применить, что делать и в какую сторону можно эту идею расширять.
А что автор не привёл кода, который отличает котиков от собачек — ну что ж, статьи-пятиминутки не для этого.
Ну, я не говорил, что, мол, сами разберётесь. Это просто статейка, где я попытался наглядно и простым языком описать минимальные знания по нейронкам. Альтернатива вводным статьям с тучей математики, которая пугает нетехнических людей. Ну и альтернатива тоннам текста, написанным для гуманитариев — тут всего 5 минут чтения.
Не претендую на пользу статьи для технарей.
Скорее, тип нейрона в нейронной сети. Перцептроны можно комбинировать с другими типами нейронов. Если нейронка состоит только из перцептронов (как в статье), то это перцептронная нейронка… Вроде как.
Хотел было кинуть ссылку на Википедию (https://ru.m.wikipedia.org/wiki/Искусственная_нейронная_сеть — там есть классификация), но там недостаточно популярно, да :(
Скорее, тип нейрона в нейронной сети.Нет, это архитектура сети, передаточная функция является лишь одной из характеристик классического перцептрона.
Вот тут так же :)
… создавали, обучали… чем лучше сеть обучена — тем более близкий результат к ожидаемому…
… да… гемор… но другое в бесноватость кидает: заведомо прописанные и известные алгоритмы, заведомо пройденные over n-тысяч циклов обучений созданной нейроной сети, и эту программу, которая якобы способна принимать приближенное к верному решению (в зависимости от входных данных) називают ИИ…
по моему глубочайшему убеждению, все ети ИИ и и т.п. — не более чем ход конем хорошо подкованных маркетологов…
сколько яблоко грушей не называй — суть вещей не измениться… но попыт синтетически создадут…
тема с моделированием нейронной сети увлекательна, но кучу времени бесстыдно сжирает =)
Но ладно, уговорили, пойду допишу резюме — впишу новые строчки между «квантовые вычисления» и «блокчейн».
У бинарных условий есть значения 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 минут и не грузят математикой.
Теперь если меня спросит кто-то из знакомых про нейронные сети, я просто скину ему ссылку на эту статью. Статья подходит не только гуманитариям но и разработчикам, которые ещё не знают нужно им это или нет. Большинство статей для новичков на самом деле написано математиками для математиков и начинаются с фразы «возьмём матрицу m на n» или «рассмотрим такую формулу», но не у каждого человека есть лишних пару дней на преодоление искусственно завышенного порога вхождения в область, которая тебе может и не интересна вовсе.
Я же правильно понимаю, что backprop для обучения с подкреплением вообще не подходит?
Например, ИИ, управляющий танчиком, принял решение двигаться влево на 100 пикселей чтобы избежать попадания от выстрела противника. На 90м пикселе ловит снаряд.
Какова величина ошибки?
Обычно в играх используется алгоритм альфа-бета отсечения для эффективного продумывания на несколько ходов вперед, а через несколько ходов качество достигнутой ситуации на поле оценивается с помощью эвристик. Если есть какие-то более конкретные вопросы — задавайте.
Если допустим с танчиком ещё всё более-менее понятно, то там где нужно принимать решения, основываясь на цепочке событий — что-то я буксую.
Например, взять покер.
- Два игрока, сидящие за сдающим (которого называют «баттон» или «дилер»), вносят ставки вслепую (блайнды). Обычно первый вносит половину минимальной ставки (малый блайнд), а второй — целую ставку (большой блайнд).
- Каждый игрок получает по две карты в закрытую (префлоп), следует круг торговли.
- На стол перед всеми игроками кладутся три карты в открытую (флоп), следует круг торговли.
- На стол кладётся четвёртая карта в открытую (тёрн), следует круг торговли. При игре в лимитированный холдем фиксированная ставка в этот момент удваивается.
- На стол кладётся пятая карта в открытую (ривер). Таким образом, на столе лежит 5 карт, следует последний круг торговли.
- Игроки могут использовать свои (карманные) и общие карты со стола для составления 5-карточных комбинаций.
- В процессе торговли игрок может делать следующие ставки:
- Поставить, «бет» (англ. bet) — сделать ставку;
- Поставить все деньги, «Ва-банк» (англ. all-in) — Сделать ставку на все деньги;
- Ответить, «колл» (англ. call) — поставить столько же, сколько поставил соперник — уравнять;
- Поднять, атаковать, задушить, «рэйз» (англ. raise) — увеличить ставку — поставить больше, чем соперники;
- Поднять, атаковать, задушить, «рэйз» (англ. raise) — увеличить ставку — поставить больше, чем соперники;
- Пасовать, сбросить карты, «фолд» (англ. fold) — отказаться от дальнейшего участия и сбросить карты;
- Отметиться, «чек» (англ. check) — в ситуациях, когда ставки не были сделаны соперниками или ставка уже была сделана вслепую — не добавлять ставку, оставить «как есть».
- Круг торговли заканчивается, когда все соперники сделали равные ставки или сбросили карты.
- Сделанные ставки складываются в банк (англ. pot).
- Если в процессе последнего круга торговли осталось больше одного игрока, то карты открываются и комбинации игроков сравниваются между собой. Если только один игрок остался в игре, то он забирает банк.
- Если больше одного игрока победили в игре, банк делится поровну между всеми выигравшими (англ. split pot).
Ну или если я сильно многого хочу от отдной сети — делаем 4 и каждая принимает решение на своём этапе (префлоп/флоп/тёрн/ривер). Но на флопе три раза обращались к сетке — как распространять?
На выходе сетки одно из решений: поставить/ответить/поднять/оставить и сумма ставки/повышения, на входе параметров достаточно много но их все тоже можно перечислить. С величиной ошибки вроде тоже всё понятно — сумма выигрыша/проигрыша.Боюсь, здесь все немного сложнее. У конкретного хода нет величины выигрыша/проигрыша — если бы эта величина была, то ее производная по весам сети и искалась бы с помощью backprop и никаких проблем не было бы. А еще нейросети нужны соперники, чтобы играть.
Если делать в лоб машинным обучением, я бы попробовал смотреть в сторону Q-learning. С другой стороны, можно проигнорировать всю психологию и смотреть на математическую вероятность выигрыша в случае получения конкретных карт. Можно еще попробовать сделать RNN (или набор отдельных сетей: по одной на каждый ход), заставить их играть друг с другом, а в качестве функционала качества использовать матожидание выигрыша после конкретного хода.
PS: Я не специалист, я эти подходы сейчас за три минуты придумал, наверное, бывает что-то и получше.
проигнорировать всю психологию и смотреть на математическую вероятность выигрыша в случае получения конкретных картО психологии речи вообще нет. А вычисление матожидания очень легко контрится: префлоп/флоп/тёрн — делаем небольшие ставки чтобы противник поддержал а на ривере делаем огромную — противник принимающий решение основанное на вычислении матожидания гарантированно скинет карты. В идеале, конечно, хочется чтобы бот сам научился такому поведению методами ML после серии игр с противником на вероятностях.
Возможно стоит начать с поиска чего-то по теме policy gradient
Есть и более продвинутые алгоритмы, многие из них используют понятие градиента функции. Градиент — это направление, в котором нам нужно идти, чтобы функция максимально быстро возрастала. Например, представим себе график функции двух переменных как поверхность земли. Если положить на землю шарик, то он покатится вниз, в направлении, противоположном градиенту (в точности). Мы можем оптимизировать функцию подобным же способом: берем любую точку, считаем градиент (по формуле, выведенной ручками) и идем в противоположном направлении. Там снова считаем градиент и тд. Этот метод называется градиентным спуском.
Backpropagation — это способ посчитать градиент функции ошибки нейросети, простой и эффективный.
Если что-то непонятно — спрашивайте, постараюсь объяснить.
То есть, скажем, были веса 0.1, 0.5, 0.3; ошибка — 0.6; алгоритм показывает, что нужно изменить первый вес на 0.1, второй на 0.2, третий на 0.3. В итоге у нас веса 0.2, 0.7, 0.6 — и нейронка выдает правильный результат. Backpropagation как раз один из способов подсчета, на сколько нужно двигать веса.
Спасибо большое автору за статью!
И еще у меня сильное подозрение, что ты сам не сможешь объяснить, зачем во втором твоем примере два слоя, если они по правилам матричного умножения сводятся к одному. А это самое главное ;-)
Спасибо за статью.
Хорошая реализация метода обучения Фейнмана в действии.
Как-то у вас получилось введение в введение. Маловато для статьи, прямо как на известной картинке:
Секундочку, но ведь автор ничего не сказал о коэффициентах смещений(bias), без них лезть в дополнительные скрытые слои не вижу смысла.
Нейронки за 5 минут