Комментарии 43
Спасибо за грамотное и достаточно точное изложение материала.

Побольше бы таких стаей, может меньше будет таких давеча по топорной сортировке изображений на основе просто нахватанных кусками знаний и с использованием библиотек методом «забьем этот гвоздь вот этим микроскопом».
Спасибо. Я старался подать материал так, чтобы он не спугнул новичков в этой области, стараясь при этом не упускать и не упрощать теорию.
Будут и более глубокие статьи по машинному обучению.
Лучшая статья из всех, которые я когда-либо читал по нейронным сетям. Спасибо большое!

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

Спасибо, Вы правы, исправил.
1) На графике была опечатка, там имелась в виду рекуррентная нейросеть.
2) Действительно, применение сверточной нейросети (CNN) в скоринг задаче и я себе слабо представляю, так как не вижу возможных пространственно распределенных данных. А вот применение рекуррентной нейросети (RNN) возможно в тех случаях, когда клиент или пользователь имеет временную историю действий или обращений. Такая архитектура сможет установить взаимосвязи в действиях объекта, понять к чему эти действия приводят.
Не могли бы вы объяснить в чем заключается практическое преимущество рекуррентных нейронных над сетями без обратных связей? В литературе обычно описывают либо структурные отличия (по которым сложно сделать вывод о практических преимуществах RNN), либо предлагают общие фразы типа: «рекуррентная сеть способна находить более сложные зависимости», не удосуживаясь ответить на вопрос о зависимостях какого вида идет речь.

В вашем посте казалось бы содержится ответ на мой вопрос: «Такая архитектура сможет установить взаимосвязи в действиях объекта, понять к чему эти действия приводят.», но что мешает нам достичь такого же эффекта, подав на вход нерекурретной ИНС вектора, описывающие действия объекта в предыдущие моменты времени, таким образом не прибегая к использованию внутренних обратных связей?
RNN архитектура предполагает, что значения выхода нейросети во времени tn будут частью ее входа во времени tn+1. Например LSTM обладает возможность находить зависимости сквозь тысячи символов в тексте. В этом основная особенность рекуррентных нейросетей — находить взаимосвязи во времени. CNN же проходится окошком (вектором, матрицей или тензором — ядром свертки) по всему распределению данных. Так что и сверточная нейронная сеть способна к нахождению паттернов (закономерностей) в временном ряде, но длительность этих закономерностей будет ограничена размером окна.
Так что и сверточная нейронная сеть способна к нахождению паттернов (закономерностей) в временном ряде, но длительность этих закономерностей будет ограничена размером окна.

Спасибо, понял вашу мысль.
Если интерпретировать историю пользователя как цепочку событий то можно. Каждое событие — отдельное «слово» в словаре. А дальше работаем как с текстами ))
Ну, в статье описаны не временные ряды, а совсем другой формат данных, так что, да, в целом к этой задаче RNN применимы, но не к такой формулировке, как рассматривается здесь.
Верно. В контексте статьи мы имеем вектор признаков клиента, не обладающий ни временной ни пространственной зависимостью. Я привел эти модели (convolutional and recurrent neural networks), как пример мощных, но тяжело интерпретируемых человеком (можно, но сложно восстановить всю цепочку «мыслей» нейросети) инструментов. CNN имеет смысл использовать в тех случаях, когда вектор признаков не желательно перетасовывать (если у нас есть кол-во обращений пользователя по дням в течении года, то CNN сможет найти паттерны и построить гипотезы из распределения его обращений). А RNN использовать в тех случаях, когда объект представлен временной последовательностью векторов признаков (если пользователь проявлял одну активность, затем другую, то возможно его поведенческий «стэйт» изменился, и RNN сможет отследить это).
Скажу честно, несколько лет назад я взял оттуда не просто пару формул, а большой багаж знаний. Я сам очень рекомендую этот курс, он просто чудесный. Лектор Andrew Ng не только специалист в своей области, но и прекрасный учитель, который смог изложить структурно и доступно такой нелегкий материал. Курс посвящен «классическому» (до «deep», если можно так сказать) машинному обучению, и охватывает не только обучение на размеченных данных: нейросети, SVM (метод опорных векторов) и регрессионные модели, но и обучение без учителя (англ. unsupervised learning): кластеризация (на основе метода k-средних), PCA (метод главных компонент). Deep Learning я учил уже сам. Могу порекомендовать два цикла лекций, которые помогли мне в основных направлениях современного машинного обучения (глубокое обучение). Это:
  1. Оксфордский курс по Deep Learning (2016)
  2. Стенфордский курс по Deep Learning (2016)
Спасибо за статью! Только One-hot encoding — не панацея! Он не подходит для порядковых переменных, которые наверняка присутствовали в исходных данных. Очевидно, что такой метод приводит к потере информации о соотношении категорий, а следовательно, ухудшает показатели модели.
Так One-hot encoding собственно используется для тех категориальных данных, для которых соотношения «больше-меньше» нет, а для других используется либо Label encoding, либо вообще Target encoding. Думаю, это просто осталось за пределами статьи, потому что для того конкретного примера категориальных данных, который разбирался (вкусовые ощущения), OHE отлично подходит.
Огонь, спасибо!
Скажите, а почему нельзя категории просто переводить в разные числа, например: синий — 1, зеленый — 2, красный — 3 и т.д., почему надо обязательно приводить это к бинарному вектору?
Грубо говоря, потому что многие модели (но не все) применяют к фичам какие-то операции, которые используют отношение расстояния между фичами.
Например, у нас есть категориальная фича «уровень сахара в крови», которая принимает значения «низкий», «средний», «высокий». Тут всё окей. Высокий уровень больше среднего, а средний больше низкого. Высокий от среднего отличается так же, как средний от низкого, но больше, чем высокий от низкого.
А в вашем же примере модель может аналогично посчитать, что синий дальше от красного, чем зеленый (так как расстояние между 3 и 1 больше, чем между 3 и 2), а это уже некорректно.
Спасибо за статью!
Это одно из лучших кратких и доступных для понимания изложений материала.
Понравилось:
1) Сравнительная картина с методами: И про модель Байеса не забыли и о deeplearning stack(не слышал).
2) В одном из материалов по курсу математики есть хорошая интерпритация сигмойд функции: усиление слабых сигналов и ослабление влияния сильных сигналов.
image
  1. Deep Learning Stack — это стэк из нескольких моделей глубинного обучения. Например, фото может подаваться на сверточную нейросеть CNN, затем выход будет подаваться на рекуррентную LSTM, которая будет пытаться описывать то, что видит на изображении принимая на вход предыдущее слово (начиная со start и кончая end токеном) и снова обращаясь к выходу CNN (механизм внимания). Именно за разработкой новых архитектур и за грамотной композицией уже известных моделей — будущее deep learning.
  2. Вы правы, логистическая кривая интересна тем, что обладает квазилинейным участком в области нуля, и это свойство можно использовать для усиления слабых сигналов. Кроме того она ограничивает, как вы сказали, большие амплитуды. Интересным свойством логистической кривой является ее «насыщение». Она является кривой дозы-эффекта в медицине, кривой обучения в Павловских экспериментах, функцией активации математического нейрона, но первый раз в жизни я столкнулся с ней, как с решением логистического уравнения при рассмотрении модели роста численности популяции, скорость размножения которой пропорциональна её текущей численности и количеству доступных ресурсов (без ограничения по доступным ресурсам рост был бы экспоненциальным).
Действительно очень хорошо написанная статья (читается легко, прям почти научно-популярно все изложено). Было интересно почитать, даже несмотря на то, что уже почти полгода как работаю в области ML) Позанудствую и внесу пару замечаний. Совсем не рассказали про задачу регрессии, хотя довольно подробно описанные нейронки способны вполне эту задачу решать. В разделе про тестирование обученной модели все-таки славно было бы обмолвиться о кросс-валидации, очень уж важная штука, согласитесь, данные далеко не всегда идеальны (на самом деле никогда) и можно так тестовую выборку выделить, что показанному качеству верить и не особо можно. Рисунок 1 довольно интересный, хотя и несколько спорный. Так, например, я не уверен, что можно МНК ставить в ряд с моделями ML, все-таки довольно по-разному его можно применять и вообще это довольно общий математический метод. Занудство кончилось)
Будет интересно увидеть от Вас еще статьи по теме, например, углубленные. Даже подпишусь, чтобы вдруг не пропустить.
Спасибо Вам за подробный комментарий. Согласен с Вами и по поводу того, что нейросети способны решить задачу регрессии, и по поводу важности кросс-валидации. Действительно нейросеть является универсальным аппроксиматором. При должном количестве нейронов в скрытом слое, нейросеть способна аппроксимировать практически любую математическую функцию. Классическим решение для регрессии будет являться использование MSE функции потерь вместо Cross-entropy. Что касается кросс-валидации, то действительно, стоило бы сказать, что необходимо разделить выборку на обучающую и на тестовую несколько раз, каждый раз проводя обучение, с целью анализа качества. При подготовки этой модели я проводил кросс-валидацию. Я думаю добавить этот пункт в статью.
А как Вам видится, можно ли еще за счет чего-то усовершенствовать Вашу модель и повысить полноту, скажем, на 5%?
Да, можно за счет точности. Обычно, в случае одного нейрона, решение о классе принимается в том случае, если значение его выхода (после активации) больше одной второй (hw(x) > 0.5). Без активации (как в случае скоринга) значение больше 0 (больше порога). Так вот этот порог можно сдвинуть, например, принимая решение о классе при вероятности 0.4 или 0.3, тем самым повысить полноту за счет точности. То есть уменьшить ошибку второго рода за счет ошибки первого.
Кстати, поэтому в сравнении качества моделей было бы интересно посмотреть на ROC или precision-recall curve
Скажите, почему в Таблице №1 первая колонка «класс» — это категория, а не bool? Разве ответы "+" и "-" не делают её бикатегориальной?
Согласен с Вами, в этом примере класс — это бикатегориальный тип. Клиент либо купил (1), либо нет (0). Но я пытался описать общий случай, например при распознавание рукописных цифр классов будет десять, и выходной слой нейросети будет иметь столько же нейронов (one-hot):
• «0» = (1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
• «1» = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0)
• «2» = (0, 0, 1, 0, 0, 0, 0, 0, 0, 0)
•…
• «9» = (0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
При обучении мы будем требовать чтобы возбуждался нейрон, отвечающий за класс со значением близким к единице, а все остальные нейроны «молчали» — выдавали значения близкие к нулю. Логика при обучении останется той же, что и с одним нейроном, только в случае, когда классов больше двух, количество нейронов в выходном слое будет соответствовать количеству классов.
Рис.13 немного вводит в заблуждение. type I error подписано к столбцу TN, а выше указано, что ошибка первого рода это FP. Как же всё-таки правильно?
Спасибо большое за внимательность. Рис. 13 поправил, там действительно была ошибка. Ошибка первого рода — FP, ошибка второго рода — FN.
Для решения сложной задачи необходимо множество скрытых слоев. С задачей хорошо справляется нейросеть с топологией «бутылочное горлышко»
Анимация 8 — Многослойная нейросеть с топологией «бутылочное горлышко»

А если включить «фичи» то хватит одного слоя в 5 нейронов для получения эпического результата:
Рад что Вы попробовали поиграть с архитектурами. Мне очень нравится библиотека TensorFlow. Я согласен с Вашим наблюдением. Дополнительные нелинейные «фичи», как функции от обычных параметров очень помогают, в двумерном, в трехмерном пространстве параметров, учитывающие квадратические, ну максимум кубические комбинации. Но проблема начнется когда захотим рассмотреть нелинейные комбинации в более высоком пространстве. В примере из X1 и X2 получены комбинации: X12, X12, X1X2. Представьте себе, что будет, если на вход подается картинка размером 128*128 пикселей (16384-хмерное пространство), и мы захотим учитывать нелинейные комбинации, таким способом. Мы столкнемся с комбинаторным взрывом. Именно для того, чтобы избежать его, и создали многослойные нейронные сети, способные строить сложные нелинейные комбинации, при наличии в них достаточного количества скрытых ассоциативных слоев.
А если вместо таких прожорливых фич подать на вход помимо переменной еще дополнительно квадрат той же переменной и куб со своими весами, даст что-нибудь?
При должном количестве нейронов в скрытом (в первом и самом ближнем ко входному) слое, и при правильном подборе коэффициентов w в процессе обучения, нейронная сеть способна аппроксимировать любую непрерывную функцию многих переменных с любой желаемой точностью. Эта теорема носит имя Universal Approximation Theorem. Так что можно не волноваться о нелинейных преобразованиях над фичами. Если нелинейные преобразования важны для какой-то задачи, то первые ассоциативные слои возьмут это дело на себя.
Спасибо, Михаил.
Очень бы хотелось увидеть столь же толковую статью по предсказаниям временных рядов на основе нейросетей.
Вот так же вот, с самых основ до прогноза. На примере валютных курсов, например, или цены золота.
Может быть автор (Михаил) возьмётся? :-)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.