Я имел в виду примерно все вот эти современные символьные библиотеки — Theano, Torch, и Caffe, как выясняется, тоже) Конкретно от TensorFlow я пока тоже немного шарахаюсь, результаты бенчмарков настораживают, но у него большое потенциальное преимущество, наверное — Google в качестве разработчика.
Никакой магии, обычный, э-ээ… вычислительный сахар) Допустим, у вас есть сложная функция типа f(g(h(j(k(l(x))))), и вам надо посчитать производную по x. В соответствии с chain rule вам надо написать df/dg * dg/dh * dh/dj * dj/dk * dk/dl * dl/dx и дальше с проклятьями и ругательствами писать для каждой из этих производных формулу (проклятья умножаются на количество слоев — представьте, что их несколько сотен). Ладно еще если они однотипные — обратное распространение дает нам алгоритм, и мы можем просто втупую расписать много одинаковых производных; а если мы хотим заморочиться и вставить в сеть что-нибудь этакое: subsampling-слой, upsampling-слой, или еще чего-нибудь? В общем, все решабельно, никакой трагедии, просто неудобно.
Тогда мы делаем следующее: забиваем в библиотеку производные для всех простых аналитических функций типа полинома, экспоненты или логарифма, и пишем туда правило, как конструировать chain rule, чтобы она символьно выписывала все эти df/dg, и дальше решала исходя из забитых в нее правил. И счастливый ленивый разработчик может просто написать «посчитай мне все производные для весов этой сети» одной строчкой, вне зависимости от того, что у него там за сеть)
Примеров есть тут.
Собственно, я пока не вижу в этой картине ничего сильно нового) Слои у нас есть. Каждый нейрон связан с каждым из предыдущего слоя — ну, это просто удобная конструкция для вычислений, чтобы веса можно было забить в прямоугольную матрицу (представьте себе, что некоторые веса там равны нулю, и соответствующие нейроны как раз «не связаны»).
Ну и, по-моему, периодически люди уходят во всякие ответвления от классической схемы с обратным распространением. Вот, скажем, из довольно нового, Бенджио писал про more biologicaly plausible version of deep learning. Есть еще neuroevolution, где люди обучают сети генетическим алгоритмом — тоже вроде как не совсем то, что происходит в голове, но подход сильно отличаются. Проблема в том, что пока никто из них не просигнализировал, что вот оно, поперло настоящее AI, только успевай в мешки паковать.
Когда я пытал всяких людей, занимающихся машинлернингом более профессионально, чем я, они даже шли на шаг дальше и говорили, что biological plausibility — это вообще не требование. Нас интересует вопрос о том, как работать с информацией, и мы собираемся изучать его языком теории вероятности и Байесовской статистики, а моделировать дендриты нам для этого совершенно не нужно. Это слегка не согласуется с идеями того же самого коннекционизма, но в принципе, мне кажется, мысль как минимум интересная.
Справедливости ради, это очень крутой результат, я не хотел тем постом его сильно преуменьшить) Лет пятьдесят назад, скажем, люди просто понятия не имели, как так сделать. И сам факт, что у нас это получилось, по-моему, сильно о чем-то сигнализирует.
Насчет биологических нейронов, наверное, лучше сказать так: люди в какой-то момент решили, что сила их не в том, как работает отдельный нейрон, а в том, что их много и они связаны. Это называется коннекционизм — представление о том, что интеллект, разум и прочие феномены мышления возникают из больших сетей с дофигищем связей, который функционируют по определенным правилам.
Не то чтобы у нас сейчас был какой-то карт-бланш на тему того, что коннекционизм прав — очень может быть, что нет. Или может быть, что он прав, но мы упустили некоторое важное свойство биологических нейронов, и из-за этого у нас все не работает. Но вообще говоря, подтверждений много: мы знаем, что у умных животных мозги больше, что математически большое количество уровней сети дает более сложные репрезентации (то самое «глубокое обучение»). При этом мы считаем, что повторять нейроны целиком один-в-один необязательно: потому что, во-первых, есть некоторые математически соображения на эту тему (о том, что наши искусственные нейроны при необходимом числе могут аппроксимировать любую функцию, и потенциально всемогущи), а во-вторых, как заметил предыдущий комментарор, вычислительно очень замороченно)
И в догонку, по-моему, тезис «природа всегда права, нужно делать один-в-один как в биологии» сам по себе небезупречен) Наши биологические нейроны, в конце концов, делались эволюцией, которая далеко не всегда производит идеально подходящий hardware — один возвратный нерв чего стоит. А вдруг половина механизмов в наших нейронах вообще низачем не нужна и просто тут болтается, пока ее естественный отбор не отсеял?)
Аналогия, которая очень мне нравится и используется настолько часто, что всем уже надоела — это самолет) У нас до сих пор, по-моему, затруднения с тем, чтобы воссоздать птичьи крылья, но тем не менее, мы смогли понять принцип полета и с легкостью побить природу на этом поле.
Я немного запоздало, но спасибо, да, здоровский обзор, и вообще да здравствует поднимание интереса к теме.
Мне вообще кажется, что нам предстоит немного переосмыслить происходящее и начать использовать эти аппроксиматоры, нейронные сети в том числе, как простые такие примитивы в задачах распознавания. Нужно построить трехмерную картинку по изображению? Нефиг искать опорные точки и выдумывать геометрический алгоритм — просто натренируйте на это нейронную сеть. Нужно локализовать объект на большой картинке? Лесом отправляются всевозможные гауссовы пирамиды, sliding windows и замороченные R-CNN — просто натренируйте на это нейронную сеть. Нужен плагин для фотошопа, который поправлял бы цвета? Не нужна еще-непонятно-как-сделанная подгонка картинки под цветовой профиль, который психофизиологически благоприятен юзеру — просто… ну, вы поняли.
Кстати, с локализацией объекта я немного игрался на последнем соревновании в Kaggle — любопытная штука. Начинает постепенно доходить, что аппроксиматор можно заставить выдавать буквально все, что тебе нужно в рамках поставленной задачи, необязательно привычное «да/нет».
Всякие вещи вроде autograd и TensorFlow у нас уже есть; шаг вперед по сравнению с ситуацией, когда производные приходилось считать руками. Следующий шаг, кмк, должен принести нам что-то еще более простое и автоматизированное, доступное каждому; что-то, что ограничивалось бы model.approximate(source, target). Не то чтобы это сильно обещает сингулярность, но по-моему, что-то даст.
Не за что) Мощность дискриминатора обсуждают в том же посте, откуда заглавная гифка — насколько я понимаю, верхняя граница должна быть меньше, чем у генератора, а вот нижняя должна плавать и влиять на точность подделок.
О, кстати, спасибо, что напомнили про DRAW — давно ее мельком видел, и каким-то образом забыл) Хочу попробовать дальше разобрать еще немного порождающих моделей (NADE, модные вариационные автоэнкодеры), возьмем и эту тоже)
Я настолько никогда не занимался текстом, что даже не знаю, что это такое) Плохие результаты на текущем этапе, по крайней мере у меня, кажется, объясняются для начала тем, что я скармливаю сети слишком маленький кусок данных для предсказания следующей буквы (нужно по куску из 20 букв предсказать 21-ю). По той же ссылке на Карпатого у него сотня букв — попробую теперь так)
Насколько я понимаю, на пальцах это должно работать примерно так — сеть должна держать в памяти такое число знаков, чтобы в него помещалась структура, которую мы хотим воспроизвести. Если говорить только о рифме, то получается, что нужно помнить последние две строки, скажем. Если о смысле — то четыре, и тут мне уже просто интересно, насколько это вообще реально — воспроизвести осмысленные (согласованные) четыре строки подряд.
Ситуация слегка осложняется тем, что мы до сих пор не знаем, какой кусок рецепта что означает (т.е. мы не знаем, как их сравнивать — может, 90% рецепта контролирует какие-то тонкости типа цвета обоев за спиной, которые к похожести не имеют отношения?), а вот можно ли это как-то выяснить? Скажем, развернуть сеть вашим способом, закидывать туда парочки изображений с контролируемыми различиями и смотреть, что в рецепте поменяется, хм…
А, ну, с этим сложно спорить. Просто, наверное, люди разные. Мне нравятся лекции, и чем более доходчивые, тем лучше — я иногда даже читаю/слушаю туториалы по уже знакомым темам, просто чтобы понимание в голове устоялось. А уж на незнакомую я тем более с большим интересом послушаю того же Певзнера с его тривиальным поиском подстроки, чем открою учебник, в котором нужно потратить больше времени на въезжание.
Ну и люди далеко не всегда приходят в вуз, четко держа в голове все, чем они хотят дальше заниматься. Попался интересный преподаватель/предмет — и готово ответвление куда-нибудь.
Серьезно, посмотрите какую-нибудь лекцию на Курсере) Я когда прошел пару курсов от Стэндфорда, ощущение было просто неба и земли — и тем более когда впервые попал на летнюю школу с живыми лекциями. Хотя, казалось бы, люди тоже могли надуться, сесть носом в угол и сказать «интересно рассказывать — не мое дело».
Ну, это же не мой ответ? Это сторонники противоположной точки зрения прямо так и говорят: «мы не учим вас полезным знаниям, это не наша задача, мы просто учим вас учиться». Что в переводе означает, что они учат бесполезным знаниям, и сами это признают.
Но пф, спасибо отечественному образованию, хрени я вам накидаю сколько угодно. Моя специальность была про безопасность информации, и люди на ней:
— не знали, что такое SQL-иньекции
— в принципе не имели никакого курса про базы данных
— не знали, как хранить пароль и не знали, что такое соль
— не знали, зачем нужен https и как работают сертификаты
— ни разу не взламывали ни один шифр
— не знали, как поднять VPN
— был курс «программирования», но не было ничего про алгоритмы и структуры данных — вообще. Программирование было почему-то на C# — факультет решил, что это более модный язык, чем C++, который был раньше. Ничего сложнее базового ООП там не было.
Зато они знали:
— кучу законодательства на тему того, как защищать персональные данные и какие сертификаты на оборудование для этого нужны
— кучу бюрократического формализма на тему того, как сформулировать модель угроз и модель безопасности. Ничего не имею против формализма, но серьезно, может, сначала SQL-инъекции?
— дискретную и вычислительную математику. Я люблю математику и мне было очень на ней интересно, но может, сначала SQL-инъекции?
— как писать документы с грифом секретности. (см. пункт 1)
— как составлять (на бумаге) политики безопасности
— как работают отечественные железные устройства безопасности вроде глушилок и локаторов закладок, которые 99% из студентов никогда в жизни не увидит
— как писать должностные инструкции, чтобы безопасность не нарушалась
На выходе получалось ровно то, что можно предположить — человек шел работать в службу безопасности, занимался там бесконечным перекладыванием бумажек и понятия не имел о том, как подключиться к интернету. И абсолютно каждый из преподавателей в ответ на упреки в том, что они рассказывают абстрактные вещи, которые сами по себе не служат никакой безопасности, выдавали в ответ один и тот же скопированный ответ — «это не наше дело, мы не должны давать вам актуальные знания, вы должны сами идти и этим заниматься». Какое-то короткое время я работал по специальности в паре мест и успел увидеть, как «помогают быстро расти» эти «фундаментальные знания» — человек очень быстро становится просто чудовищным бюрократом, который привыкает под каждое действие брать расписку, и так никогда и не осваивает базовые вещи из первого перечня.
А теперь серьезно скажите мне, что знание о том, как хранить пароли в базе — это «модные штучки», которые «можно самому погуглить», и преподаватель совершенно не обязан об этом рассказывать)
Вот я и говорю, что это грустная история. А может быть, если бы кто-нибудь рассказал человек про программирование/физику/рисование, он бы нашел в этом увлечение если не всей жизни, то энной ее части? А вы вместо этого его за деньгами отправляете.
Мне иногда жалко, что я так в школе биологию пропустил — почему-то все преподаватели предпочитали игнорировать потрясающую историю вселенской игры на выживание, и рассказывали, сколько у кошки позвонков. Но это мне сейчас видно, что она потрясающая, а тогда-то я что мог сделать?
Я очень извиняюсь, но по-моему, это какое-то самое ужасное заблуждение насчет образования, которое есть буквально у всех) «Наше заведение нужно для того, чтобы заставляя вас учить бессмысленную и никому не нужную хрень, привить вам навыки изучения нужной вам хрени, которую вы будете сами учить уже потом». Оооокей, предлагаю усовершенствование алгоритма — а давайте первоначальная хрень как раз и будет нужной и полезной тоже, и мы добьемся цели в два раза быстрее.
Все это просто попытки преподавателей придать хоть какой-то смысл своей работе, когда они понимают, что их знания никому не нужны, по-моему.
Тогда мы делаем следующее: забиваем в библиотеку производные для всех простых аналитических функций типа полинома, экспоненты или логарифма, и пишем туда правило, как конструировать chain rule, чтобы она символьно выписывала все эти df/dg, и дальше решала исходя из забитых в нее правил. И счастливый ленивый разработчик может просто написать «посчитай мне все производные для весов этой сети» одной строчкой, вне зависимости от того, что у него там за сеть)
Примеров есть тут.
Ну и, по-моему, периодически люди уходят во всякие ответвления от классической схемы с обратным распространением. Вот, скажем, из довольно нового, Бенджио писал про more biologicaly plausible version of deep learning. Есть еще neuroevolution, где люди обучают сети генетическим алгоритмом — тоже вроде как не совсем то, что происходит в голове, но подход сильно отличаются. Проблема в том, что пока никто из них не просигнализировал, что вот оно, поперло настоящее AI, только успевай в мешки паковать.
Когда я пытал всяких людей, занимающихся машинлернингом более профессионально, чем я, они даже шли на шаг дальше и говорили, что biological plausibility — это вообще не требование. Нас интересует вопрос о том, как работать с информацией, и мы собираемся изучать его языком теории вероятности и Байесовской статистики, а моделировать дендриты нам для этого совершенно не нужно. Это слегка не согласуется с идеями того же самого коннекционизма, но в принципе, мне кажется, мысль как минимум интересная.
Насчет биологических нейронов, наверное, лучше сказать так: люди в какой-то момент решили, что сила их не в том, как работает отдельный нейрон, а в том, что их много и они связаны. Это называется коннекционизм — представление о том, что интеллект, разум и прочие феномены мышления возникают из больших сетей с дофигищем связей, который функционируют по определенным правилам.
Не то чтобы у нас сейчас был какой-то карт-бланш на тему того, что коннекционизм прав — очень может быть, что нет. Или может быть, что он прав, но мы упустили некоторое важное свойство биологических нейронов, и из-за этого у нас все не работает. Но вообще говоря, подтверждений много: мы знаем, что у умных животных мозги больше, что математически большое количество уровней сети дает более сложные репрезентации (то самое «глубокое обучение»). При этом мы считаем, что повторять нейроны целиком один-в-один необязательно: потому что, во-первых, есть некоторые математически соображения на эту тему (о том, что наши искусственные нейроны при необходимом числе могут аппроксимировать любую функцию, и потенциально всемогущи), а во-вторых, как заметил предыдущий комментарор, вычислительно очень замороченно)
И в догонку, по-моему, тезис «природа всегда права, нужно делать один-в-один как в биологии» сам по себе небезупречен) Наши биологические нейроны, в конце концов, делались эволюцией, которая далеко не всегда производит идеально подходящий hardware — один возвратный нерв чего стоит. А вдруг половина механизмов в наших нейронах вообще низачем не нужна и просто тут болтается, пока ее естественный отбор не отсеял?)
Мне вообще кажется, что нам предстоит немного переосмыслить происходящее и начать использовать эти аппроксиматоры, нейронные сети в том числе, как простые такие примитивы в задачах распознавания. Нужно построить трехмерную картинку по изображению? Нефиг искать опорные точки и выдумывать геометрический алгоритм — просто натренируйте на это нейронную сеть. Нужно локализовать объект на большой картинке? Лесом отправляются всевозможные гауссовы пирамиды, sliding windows и замороченные R-CNN — просто натренируйте на это нейронную сеть. Нужен плагин для фотошопа, который поправлял бы цвета? Не нужна еще-непонятно-как-сделанная подгонка картинки под цветовой профиль, который психофизиологически благоприятен юзеру — просто… ну, вы поняли.
Кстати, с локализацией объекта я немного игрался на последнем соревновании в Kaggle — любопытная штука. Начинает постепенно доходить, что аппроксиматор можно заставить выдавать буквально все, что тебе нужно в рамках поставленной задачи, необязательно привычное «да/нет».
Всякие вещи вроде autograd и TensorFlow у нас уже есть; шаг вперед по сравнению с ситуацией, когда производные приходилось считать руками. Следующий шаг, кмк, должен принести нам что-то еще более простое и автоматизированное, доступное каждому; что-то, что ограничивалось бы
model.approximate(source, target)
. Не то чтобы это сильно обещает сингулярность, но по-моему, что-то даст.О, кстати, спасибо, что напомнили про DRAW — давно ее мельком видел, и каким-то образом забыл) Хочу попробовать дальше разобрать еще немного порождающих моделей (NADE, модные вариационные автоэнкодеры), возьмем и эту тоже)
Насколько я понимаю, на пальцах это должно работать примерно так — сеть должна держать в памяти такое число знаков, чтобы в него помещалась структура, которую мы хотим воспроизвести. Если говорить только о рифме, то получается, что нужно помнить последние две строки, скажем. Если о смысле — то четыре, и тут мне уже просто интересно, насколько это вообще реально — воспроизвести осмысленные (согласованные) четыре строки подряд.
Ситуация слегка осложняется тем, что мы до сих пор не знаем, какой кусок рецепта что означает (т.е. мы не знаем, как их сравнивать — может, 90% рецепта контролирует какие-то тонкости типа цвета обоев за спиной, которые к похожести не имеют отношения?), а вот можно ли это как-то выяснить? Скажем, развернуть сеть вашим способом, закидывать туда парочки изображений с контролируемыми различиями и смотреть, что в рецепте поменяется, хм…
мы все умер и под другой
тога значит режет стены
в водьше наступили к куру
труда не выновить в культор
кричит олег а под летом
воя с насон присопяты
закончится веси беспорность
а теля понячный продкайся
с Шекспиром у Карпатого как-то лучше получалось, так что я теперь пробую три слоя)
Ну и люди далеко не всегда приходят в вуз, четко держа в голове все, чем они хотят дальше заниматься. Попался интересный преподаватель/предмет — и готово ответвление куда-нибудь.
Но пф, спасибо отечественному образованию, хрени я вам накидаю сколько угодно. Моя специальность была про безопасность информации, и люди на ней:
— не знали, что такое SQL-иньекции
— в принципе не имели никакого курса про базы данных
— не знали, как хранить пароль и не знали, что такое соль
— не знали, зачем нужен https и как работают сертификаты
— ни разу не взламывали ни один шифр
— не знали, как поднять VPN
— был курс «программирования», но не было ничего про алгоритмы и структуры данных — вообще. Программирование было почему-то на C# — факультет решил, что это более модный язык, чем C++, который был раньше. Ничего сложнее базового ООП там не было.
Зато они знали:
— кучу законодательства на тему того, как защищать персональные данные и какие сертификаты на оборудование для этого нужны
— кучу бюрократического формализма на тему того, как сформулировать модель угроз и модель безопасности. Ничего не имею против формализма, но серьезно, может, сначала SQL-инъекции?
— дискретную и вычислительную математику. Я люблю математику и мне было очень на ней интересно, но может, сначала SQL-инъекции?
— как писать документы с грифом секретности. (см. пункт 1)
— как составлять (на бумаге) политики безопасности
— как работают отечественные железные устройства безопасности вроде глушилок и локаторов закладок, которые 99% из студентов никогда в жизни не увидит
— как писать должностные инструкции, чтобы безопасность не нарушалась
На выходе получалось ровно то, что можно предположить — человек шел работать в службу безопасности, занимался там бесконечным перекладыванием бумажек и понятия не имел о том, как подключиться к интернету. И абсолютно каждый из преподавателей в ответ на упреки в том, что они рассказывают абстрактные вещи, которые сами по себе не служат никакой безопасности, выдавали в ответ один и тот же скопированный ответ — «это не наше дело, мы не должны давать вам актуальные знания, вы должны сами идти и этим заниматься». Какое-то короткое время я работал по специальности в паре мест и успел увидеть, как «помогают быстро расти» эти «фундаментальные знания» — человек очень быстро становится просто чудовищным бюрократом, который привыкает под каждое действие брать расписку, и так никогда и не осваивает базовые вещи из первого перечня.
А теперь серьезно скажите мне, что знание о том, как хранить пароли в базе — это «модные штучки», которые «можно самому погуглить», и преподаватель совершенно не обязан об этом рассказывать)
Мне иногда жалко, что я так в школе биологию пропустил — почему-то все преподаватели предпочитали игнорировать потрясающую историю вселенской игры на выживание, и рассказывали, сколько у кошки позвонков. Но это мне сейчас видно, что она потрясающая, а тогда-то я что мог сделать?
Все это просто попытки преподавателей придать хоть какой-то смысл своей работе, когда они понимают, что их знания никому не нужны, по-моему.