Как стать автором
Обновить

Комментарии 53

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

Да, в статье показана разность в работе двух функций активации, но о причинах такого поведения не сказано почти ни слова.
Разумное замечание и отличный вопрос. Чтобы на него ответить нужно готовить несколько другой пример и смотреть на активации/градиенты, наглядно демонстрируя достоинства и проблемы обеих функций. Выглядит как тема для статьи)
Многие материалы по нейронным сетям сразу начинаются с демонстрации довольно сложных архитектур. При этом самые базовые вещи, касающиеся функций активаций, инициализации весов, выбора количества слоёв в сети и т.д. если и рассматриваются, то вскользь. Получается начинающему практику нейронных сетей приходится брать типовые конфигурации и работать с ними фактически вслепую.

А мне вот наоборот всегда казалось, что многие с энтузиазмом берутся за написание курса по нейронным сетям, начинают с азов, и на том энтузиазм заканчивается. В итоге есть куча статей о том, как работает Персептрон Розенблата и какой-нибудь Многослойный Персептрон, а вот чего посложнее — это редкость.
Разве что наш кумир Карпати зажигательно рассказвыает в своем блоге про всякие современные штуки в области нейросайнса) Но основным источником знаний все равно остается arxiv-sanity.com )

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

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

Представленный материал, строго говоря, не относится ни к тому, ни к другому. Это попытка построить серию модельных примеров для нейросетей, которые можно покрутить, повертеть, подёргать и наработать немного той самой интуиции, которая будет полезна в дальнейшем.
Бодрое начало, жду продолжения. Важный момент: надо помнить об «объеме памяти» сети. Если нейронов много, то весь набор данных может «запомниться» в весах связей и получим переобучение с идеальным повторением тренировочного набора, но абсолютной беспомощностью на других входных данных.
f(x) = w1' * tanh(w1 * x + b1) +… + w5' * tanh(w5 * x + b5) + b

Сделал визуализатор — можно потаскать за точки и увидеть эту аппроксимацию наглядно. Фиолетовые линии это линейные функции (w1 * x + b1), оранжевые — взвешенные гиперболические тангенсы (w * tanh (..)). Красное — итоговая сумма.


Веса у тангенсов задаются расстоянием между точками (чем больше, тем больше вес):


https://www.khanacademy.org/computer-programming/function-approximation-editorvisualizer/5512363205263360


Крутая штука!
Я все сломал =(
image
Очень наглядно и полезно почувствовать поведение аппроксиматора, даже если теоретически всё понятно. Студентам на лабораторку!

Спасибо, за возможность: "покрутить, подергать". Я думаю менно такой подход и будет интересен многим новичкам в НС.

Насколько я неправ, полагая что нейронные сети — это метод подгонки коэффициентов некого полинома или рекуррентого уравнения, в случае обратных связей? Такое чувство, что за словом нейронная сеть ничего нового не стоит, кроме способа подбора этих коэффициентов? Минимизация, может быть что-то из области регрессионного анализа, нет?

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

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

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

Итого, отвечая на ваш вопрос. Математический арсенал, задействованный в НС, пришёл из методов оптимизации и известен уже давно. А вот то, как он применяется для решения практических задач — это очень новые подходы, большинство из которых разработано в последние 5-8 лет. В сочетании со ставшим сильно более доступным железом это открывает кучу возможностей в самых разных областях — от компьютерного зрения и распознавания речи до машинного перевода и генерации текста машиной.

Отличная статья! Спасибо!

Февраль 2017 — check.

НЛО прилетело и опубликовало эту надпись здесь
Здорово, как будто сам поигрался с фреймворком. Я одного не понял, какая задача стояла? Обвести известную кривую?
Спасибо! Приближение кривой на плоскости — это модельный пример, позволяющий более наглядно показать результат работы сети. Ведь если брать, к примеру, классический сет для регрессии с ценами домов, то единственным наглядным результатом работы сети является среднеквадратичное отклонение. И меняя конфигурацию сети человек смотрит в какую сторону меняется это одно единственное число. Что при этом происходит внутрях нейросети остаётся сильно за кадром.

Наше мышление построено по принципу «от частного к общему», поэтому не стоит недооценивать важность простых иллюстративных примеров. Если этот принцип работает при изучении языка, математики, физики и т.д., то почему нейросети — исключение?
Без контекста дальшейшего использования возникает вопрос «Зачем так сложно?» Чтобы построить график известной функции… можно взять и построить график известной функции)) Что дает обучение на таком примере? Возможность интерполировать кривую между точек?

Может в качестве выборки для обучения и для последующей обработки брал набор из зашумленных кривых? Хотя бы результат будет нетривиален =)
>> построить график известной функции… можно взять и построить график известной функции

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

>> Может в качестве выборки для обучения и для последующей обработки брал набор из зашумленных кривых?

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

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

То есть я в целом понимаю, что потом всё это как-то используется для решения задач классификации. Но связи пока не уловил.

> Чтобы построить график известной функции


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

Это уже интереснее, но непонятно, чем НС будет лучше других методов. Например, МНК.

Из того, что бросается в глаза — НС не просто найдет среднее по точкам, а предложит аппроксимацию в виде функции, определенной на всем континууме.
Если под МНК вы имеете ввиду линейный МНК (линейная ф-ия под квадратом), то ИНС, как правило, могут работать с нелинейными зависимости.
Понял. Интернет — коварная штука и не видя интонаций я был в полной уверенности, что вы меня подтролливаете :)

Очень кратко на ваш вопрос я отвечал ниже, см. комментарий. Более развёрнуто имеет смысл смотреть на примерах конкретных задач, например классификации или регрессии. Мне кажется будет интересно сделать статью, где подробно разобрать типовые примеры из репозитория Keras, а заодно посмотреть как нейросеть встраивается в общий конвейер решения задачи машинного обучения. Как считаете, интересен будет такой материал?
Да, конечно! Мне очень нравится ваш формат пошагового усложнения, полный «эффект присутствия».

А что такое "эпохи"?

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

Итерация — это прогон одного примера (в общем случае n_batch примеров) через сеть в прямом и обратном направлениях (forward pass + backward pass).

Эпоха — это прогон всех примеров через сеть в обоих направлениях.

На практике, в большинстве случаев, количество итераций выставляют в единицу, т.е. за эпоху каждый пример прогоняется через сеть один раз. Имеет смысл поиграться с этим параметром, если данных мало. В этом случае вы фактически каждый пример дублируете в тренировочном сете n_iteration раз, не расходуя дополнительную память на дубли.
То есть, видимо, в основе обучения лежит какое-то градиентное, постепенное подкручивание параметров НС. Если я возьму один пример, прогоню через алгоритм обучения, то у меня как-то изменятся коэффициенты. «Сдвинутся» в некотором направлении, характерном для этого примера. Но ещё не упрутся в соответствующий экстремум. Тогда, если я опять прогоню этот же пример, то коэффициенты ещё «подвинутся». И так, пока мы не выйдем на некоторый предел. Каждая из этих попыток — итерация. Я правильно уловил?

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

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

Иллюстрация одного из подходов (отсюда):

image

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

Правильно я понял, что вы их разделяете? И, поправьте если не прав, не является ли НС с одним нейроном и линейной функцией активации ничем иным как линейной регрессией?
Суть фразы как раз в том, что сеть с одним нейроном и линейной активацией вырождается в линейную регрессию. Поэтому если мы хотим раскрыть настоящий потенциал нейросетей, то нужно двигаться дальше к нелинейным приближениям. Что и делается в следующем разделе.
Вопрос, зачем нужны нейронные сети?
Ваш вопрос тянет на отдельную статью :) Кратко — это хороший способ приближать сильно нелинейную многомерную функцию Rn -> Rn. Дальше вокруг нейросети выстраивается целый конвейер, который позволяет решать уйму задач.

На примере. Допустим вы хотите различать фотографии кошек и собак. Вы берёте исходное изображение, вытягиваете его в вектор (по строкам, например), в каждый элемент вектора записываете яркость пикселя, приведя к диапазону [-1, 1]. Для изображения 64x64 получаете 4096-мерный вектор. На выходе у вас двумерный вектор (1, 0) — кошка, (0, 1) — собака. Прогоняете через сеть размеченные изображения кошек и собак, она обучается. Если вы всё сделали правильно, то сеть сможет предсказывать кошка/собака для изображений, которые она никогда не видела.
Возникает вопрос, что такое «хороший»? Я про способ приближения функции. Ответ видимо лежит в области удобства алгоритма приближения, а не в области вычислительной простоты реализации результата?
В одном курсе по машинному обучению нейронный сети рассматриваются как один из способов композиции алгоритмов наряду с адаптивным бустингом, бэггингом и т.д. и т.п… И основная идея, что несколько слабых классификаторов/регрессоров будут компенсировать ошибки друг друга и выдадут лучший результат. Вот так я понимаю слово «хороший». Поправьте, если ошибаюсь.
то есть, например, если вместо одной сети учить десять, с разной конфигурацией, алгоритмом обучения или просто начальная инициализация разная, а затем как то агрегировать их результаты, то итоговый результат будет 'лучше'?

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

Так на практике и поступают. У нейросети тоже есть конфигурация в рамках которой она обучается (например, количество эпох). Вы можете выставить всё «на глазок», а можете написать метаалгоритм, который гоняет обучающий набор на разных настройках и выбирает лучший.

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

В общем, при работе с нейросетками сложно переоценить значение опыта, интуиции и удачи.
Пока разговор про классификацию даже не заходил ;) Пока что нейросеть —
это хороший способ приближать сильно нелинейную многомерную функцию Rn -> Rn.


Но есть ведь и другие способы приближения нелинейных функций. Хоть в ряд Тейлора её разложить, или в Фурье.

Давайте пока определимся хотя бы в чем состоит «хорошесть» по сравнению с другими способами, а потом уже будет наворачивать новые абстракции.

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

>Но есть ведь и другие способы приближения нелинейных функций. Хоть в ряд Тейлора её разложить, или в Фурье.
Как правило у вас нет почти никакой информации о ф-ии которую вы хотите аппроксимировать, только ее значения в некоторых точках. В этих условиях взять туже производную для ряда Тейлора несколько проблематично.
Я практик, поэтому для меня ответ однозначен: для определённых задач, будучи правильно приготовленными, нейросети выдают результат лучше, чем другие инструменты. Есть ситуации, когда сеть не является оптимальным решением — по точности или по скорости. Используйте другой инструмент.

В теорию работы нейросетей погружаться можно и нужно, но в той мере, где это помогает практике, а не наоборот. Теоретизирование — удел больших корпораций, которые могут позволить себе сотрудничать с людьми уровня Джеффри Хинтона (например Google Brain / Google Translate). Простым смертным остаётся брать готовые рецепты от крупных компаний и исследователей, а затем пытаться применить их к своим задачам. Чаще всего это неплохо работает.

При этом я не умоляю значения опыта и интуиции каждого практика нейросетей, т.к. даже адаптировать готовый рецепт нужно уметь. Но и чувствовать сети, как ведущие исследователи из крупных университетов, вряд ли получится — у них просто больше ресурсов.
* умаляю
Думал, что нарвусь на агрессию из-за своего вопроса. Спасибо Вам огромное за объяснение!
Благодаря обладанию таковой Вы задали этот вопрос :-)
В данной статье после обучения отклик представляется как сумма гиперболических тангенсов от текущего входного значения.

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

Для моделирования временных рядов используются рекуррентные нейронные сети (RNN) и их разновидность — сети с долгой краткосрочной памятью (LSTM RNN). Там как раз реализован механизм памяти, чтобы сеть не успевала забывать события, происходившие давно (с точки зрения обучения). Причём этот механизм также реализован с помощью простой нейросети.

Процесс обучения тоже перестраивается. Вместо тренировочного набора, мы бежим по временному ряду и в качестве входа сети берём значение ряда на шаге N, а в качестве выхода значение ряда на шаге N + 1. В результате сеть учится предсказывать S(N + 1) при входе S(N) и предшествующем контексте (выраженном в текущем состоянии сети), где S(1..M) — моделируемый временной ряд.

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

Если знаете английский, то есть просто-таки культовая статья на эту тему: The Unreasonable Effectiveness of Recurrent Neural Networks
Всё ближе к области моих интересов))

У меня есть процессы, которые принято описывать диффузионными марковскими случайными процессами. С ними хорошо работает математика, всё просто и понятно. Вот только настоящие процессы, как правило, плохо соответствуют модельным.

Преимущества нейросети — ей не нужно давать какие-то дополнительные математические модели процессов, она их сама определяет в процессе обучения.

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

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


Тут возникает интересный практический вопрос. После обучения сеть знает «как надо». Можно ли её заставить анализировать вводимый текст и подсказывать в % выражении насколько он адекватен?

Практический вопрос на практический вопрос: как формализовать понятие 'адекватен'?

В данном контексте — «вероятен». Соответствует нормам и правилам, выведенным ранее НС на этапе обучения.

Вспоминаем байесовский фильтр. У него есть экстраполяционная плотность вероятности, описывающая вероятности S(N+1). Есть ли нечто подобное для НС?
Статья отличная, спасибо, всё повторил и пощупал. Правда, у меня результаты получались значительно хуже, хотя делал вроде бы всё также. Не понял почему.
И ещё замечание к заголовку. К глубоким архитектурам мы не приблизились и близко. Двуслойная сеть с одним входом это где-то на дальних подступах.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории