Comments 53
Да, в статье показана разность в работе двух функций активации, но о причинах такого поведения не сказано почти ни слова.
Многие материалы по нейронным сетям сразу начинаются с демонстрации довольно сложных архитектур. При этом самые базовые вещи, касающиеся функций активаций, инициализации весов, выбора количества слоёв в сети и т.д. если и рассматриваются, то вскользь. Получается начинающему практику нейронных сетей приходится брать типовые конфигурации и работать с ними фактически вслепую.
А мне вот наоборот всегда казалось, что многие с энтузиазмом берутся за написание курса по нейронным сетям, начинают с азов, и на том энтузиазм заканчивается. В итоге есть куча статей о том, как работает Персептрон Розенблата и какой-нибудь Многослойный Персептрон, а вот чего посложнее — это редкость.
Разве что наш кумир Карпати зажигательно рассказвыает в своем блоге про всякие современные штуки в области нейросайнса) Но основным источником знаний все равно остается arxiv-sanity.com )
В нейросетях сейчас та же ситуация — есть теория, объясняющая основные принципы нейросетей, вводящая терминологию, очерчивающая круг проблем, которые решают с помощью НС и т.д. Есть готовые рецепты — когда исследователь проанализировал определённый круг задач, нашёл рабочие подходы и изложил их, к примеру, в научной статье.
Представленный материал, строго говоря, не относится ни к тому, ни к другому. Это попытка построить серию модельных примеров для нейросетей, которые можно покрутить, повертеть, подёргать и наработать немного той самой интуиции, которая будет полезна в дальнейшем.
f(x) = w1' * tanh(w1 * x + b1) +… + w5' * tanh(w5 * x + b5) + b
Сделал визуализатор — можно потаскать за точки и увидеть эту аппроксимацию наглядно. Фиолетовые линии это линейные функции (w1 * x + b1
), оранжевые — взвешенные гиперболические тангенсы (w * tanh (..)
). Красное — итоговая сумма.
Веса у тангенсов задаются расстоянием между точками (чем больше, тем больше вес):
Спасибо, за возможность: "покрутить, подергать". Я думаю менно такой подход и будет интересен многим новичкам в НС.
Насколько я неправ, полагая что нейронные сети — это метод подгонки коэффициентов некого полинома или рекуррентого уравнения, в случае обратных связей? Такое чувство, что за словом нейронная сеть ничего нового не стоит, кроме способа подбора этих коэффициентов? Минимизация, может быть что-то из области регрессионного анализа, нет?
В случае с даже простыми нейросетями у вас на руках куда более богатое семейство функций, позволяющее хорошо приближать даже неравномерно распределённые нелинейности и нетривиальные корреляции в данных (если речь идёт о нескольких входах сети).
Получаем более мощный инструмент для аппроксимации, но и обучать его намного сложнее. Собственно солидная доля исследований в области нейросетей посвящена практике правильного обучения и борьбы с разными возникающими спецэффектами.
Итого, отвечая на ваш вопрос. Математический арсенал, задействованный в НС, пришёл из методов оптимизации и известен уже давно. А вот то, как он применяется для решения практических задач — это очень новые подходы, большинство из которых разработано в последние 5-8 лет. В сочетании со ставшим сильно более доступным железом это открывает кучу возможностей в самых разных областях — от компьютерного зрения и распознавания речи до машинного перевода и генерации текста машиной.
Отличная статья! Спасибо!
Февраль 2017 — check.
Наше мышление построено по принципу «от частного к общему», поэтому не стоит недооценивать важность простых иллюстративных примеров. Если этот принцип работает при изучении языка, математики, физики и т.д., то почему нейросети — исключение?
Может в качестве выборки для обучения и для последующей обработки брал набор из зашумленных кривых? Хотя бы результат будет нетривиален =)
Не придирайтесь. Пример модельный и подбирался по принципу иллюстративности, чтобы наглядно показать как конфигурация сети влияет на результат.
>> Может в качестве выборки для обучения и для последующей обработки брал набор из зашумленных кривых?
Дельное предложение, однозначно стоит попробовать.
Ваша статья была очень интересна. Я наглядно увидел как пользоваться фреймворком, впервые встретил простую и наглядную интерпретацию результата через сумму по функциям активации и получил удовольствие. Тут есть наглядные ответы на вопрос «как?», но я, будучи читатетелем с околонулевым бэкграундом в нейросетях, сразу задался вопросом «зачем?». Его и транслирую вам.
То есть я в целом понимаю, что потом всё это как-то используется для решения задач классификации. Но связи пока не уловил.
> Чтобы построить график известной функции
Так а вы представьте, что функция не известна. Есть большой набор данных, и нужно найти относительно простую функцию, которая наиболее хорошо их описывает. Алгоритм обучения подгоняет коэффициенты, пока такое приближение не будет найдено с достаточной степенью соответствия.
Из того, что бросается в глаза — НС не просто найдет среднее по точкам, а предложит аппроксимацию в виде функции, определенной на всем континууме.
Очень кратко на ваш вопрос я отвечал ниже, см. комментарий. Более развёрнуто имеет смысл смотреть на примерах конкретных задач, например классификации или регрессии. Мне кажется будет интересно сделать статью, где подробно разобрать типовые примеры из репозитория Keras, а заодно посмотреть как нейросеть встраивается в общий конвейер решения задачи машинного обучения. Как считаете, интересен будет такой материал?
А что такое "эпохи"?
Итерация — это прогон одного примера (в общем случае n_batch примеров) через сеть в прямом и обратном направлениях (forward pass + backward pass).
Эпоха — это прогон всех примеров через сеть в обоих направлениях.
На практике, в большинстве случаев, количество итераций выставляют в единицу, т.е. за эпоху каждый пример прогоняется через сеть один раз. Имеет смысл поиграться с этим параметром, если данных мало. В этом случае вы фактически каждый пример дублируете в тренировочном сете n_iteration раз, не расходуя дополнительную память на дубли.
Эпоха же отличается от итерации тем, что мы используем все доступные обучающие примеры. Они тоже все «подпинывают» коэффициенты в некотором направлении из некоторого начального состояния. Но в конечное, предельное состояние за один «пинок» коэффициенты не перевести. Таким образом, эпоха — это как итерация, только по совокупности примеров.
Но как подобрать количество эпох, чтобы избежать переобучения? Алгоритмический вариант — использовать метод ранней остановки (early stopping). Идея в том, чтобы делать промежуточные промеры качества работы сети и если видим, что улучшений нет — останавливать обучение.
Иллюстрация одного из подходов (отсюда):
Хорошо, с приближением прямой всё ясно. Но это и классическая линейная регрессия неплохо делала.
Правильно я понял, что вы их разделяете? И, поправьте если не прав, не является ли НС с одним нейроном и линейной функцией активации ничем иным как линейной регрессией?
На примере. Допустим вы хотите различать фотографии кошек и собак. Вы берёте исходное изображение, вытягиваете его в вектор (по строкам, например), в каждый элемент вектора записываете яркость пикселя, приведя к диапазону [-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
У меня есть процессы, которые принято описывать диффузионными марковскими случайными процессами. С ними хорошо работает математика, всё просто и понятно. Вот только настоящие процессы, как правило, плохо соответствуют модельным.
Преимущества нейросети — ей не нужно давать какие-то дополнительные математические модели процессов, она их сама определяет в процессе обучения.
Это и является моим основным интересом. Не обработка данных с помощью нейросети, а изучение самих процессов.
Из этой статьи я пришел к выводу, что НС разложит мои процессы по своему базису функций возбуждения. Соответственно, задача состоит не только в обучении некоторой НС с последующим изучением получившейся структуры, а в осмысленном выборе конфигурации НС! Так, чтобы потом эту НС можно было интерпретировать в удобных понятиях и функциях.
Если через такую сеть посимвольно прогнать большой объём текста, то она позволяет генерировать новый текст, причём практически идеальный с точки зрения грамматики. Правда совершенно бессмысленный :)
Тут возникает интересный практический вопрос. После обучения сеть знает «как надо». Можно ли её заставить анализировать вводимый текст и подсказывать в % выражении насколько он адекватен?
Практический вопрос на практический вопрос: как формализовать понятие 'адекватен'?
И ещё замечание к заголовку. К глубоким архитектурам мы не приблизились и близко. Двуслойная сеть с одним входом это где-то на дальних подступах.
Нейронные сети в картинках: от одного нейрона до глубоких архитектур