http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&user=DimaPhil&feedformat=atomВикиконспекты - Вклад участника [ru]2024-03-19T07:53:19ZВклад участникаMediaWiki 1.30.0http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68753Нейронные сети, перцептрон2019-01-21T22:06:24Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]<br />
<br />
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]'''<sup>на 16.01.19 не создан</sup> (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами.<br />
#* Одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the mnist dataset<br />
mnist = datasets.load_digits()<br />
<br />
# Create our X and y data<br />
n_samples = len(mnist.images)<br />
X = mnist.images.reshape((n_samples, -1))<br />
y = mnist.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(256, 512, 128), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Single-layer perceptron accuracy: %.4f' % accuracy_score(y_test, y_pred))<br />
print('Multilayer perceptron accuracy: %.4f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
Вывод:<br />
Single-layer perceptron accuracy: 0.9574<br />
Multilayer perceptron accuracy: 0.9759<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из того же датасета MNIST.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_all_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
[[File:Tensorflow-mnist-failures.png|400px|thumb|Правильные метки {{---}} 5, 4, 9, 7. Результат классификации {{---}} 6, 6, 4, 4.]]<br />
<br />
Вывод:<br />
Accuracy: 0.9164<br />
<br />
<br />
На рисунке справа показаны четыре типичных изображения, на которых классификаторы ошибаются. Согласитесь, случаи действительно тяжелые.<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Нейронные сети]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68748Нейронные сети, перцептрон2019-01-21T21:52:49Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]<br />
<br />
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]'''<sup>на 16.01.19 не создан</sup> (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами.<br />
#* Одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Single-layer perceptron accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Multilayer perceptron accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
Вывод:<br />
Single-layer perceptron accuracy: 0.76<br />
Multilayer perceptron accuracy: 0.96<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_all_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
[[File:Tensorflow-mnist-failures.png|400px|thumb|Правильные метки {{---}} 5, 4, 9, 7. Результат классификации {{---}} 6, 6, 4, 4.]]<br />
<br />
Вывод:<br />
Accuracy: 0.9164<br />
<br />
<br />
На рисунке справа показаны четыре типичных изображения, на которых классификатор ошибается. Согласитесь, случаи действительно тяжелые.<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Нейронные сети]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tensorflow-mnist-failures.png&diff=68747Файл:Tensorflow-mnist-failures.png2019-01-21T21:47:59Z<p>DimaPhil: </p>
<hr />
<div></div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68746Нейронные сети, перцептрон2019-01-21T21:32:54Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]<br />
<br />
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]'''<sup>на 16.01.19 не создан</sup> (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами.<br />
#* Одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Single-layer perceptron accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Multilayer perceptron accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
Вывод:<br />
Single-layer perceptron accuracy: 0.76<br />
Multilayer perceptron accuracy: 0.96<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_all_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
Вывод:<br />
Accuracy: 0.9164<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Нейронные сети]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68744Нейронные сети, перцептрон2019-01-21T21:22:20Z<p>DimaPhil: add links to images</p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]<br />
<br />
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]'''<sup>на 16.01.19 не создан</sup> (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами.<br />
#* Одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Нейронные сети]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Single-layer-neural-net-scheme.png&diff=68561Файл:Single-layer-neural-net-scheme.png2019-01-18T21:48:52Z<p>DimaPhil: </p>
<hr />
<div>Схема однослойной нейронной сети.<br />
<br />
Источник: https://studfiles.net/preview/3170620/page:3/</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68560Нейронные сети, перцептрон2019-01-18T21:48:13Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Single-layer-neural-net-scheme.png|500px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]'''<sup>на 16.01.19 не создан</sup> (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами.<br />
#* Одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Искусственные нейронные сети]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Multi-layer-neural-net-scheme.png&diff=68559Файл:Multi-layer-neural-net-scheme.png2019-01-18T21:46:41Z<p>DimaPhil: Схема многослойной нейронной сети
Источник: https://wiki.loginom.ru/articles/multilayer-neural-net.html</p>
<hr />
<div>Схема многослойной нейронной сети<br />
<br />
Источник: https://wiki.loginom.ru/articles/multilayer-neural-net.html</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Single-layer-neural-net-scheme.png&diff=68558Файл:Single-layer-neural-net-scheme.png2019-01-18T21:44:15Z<p>DimaPhil: </p>
<hr />
<div></div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9E%D0%B4%D0%BD%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD.png&diff=68557Файл:Однслойный перцептрон.png2019-01-18T21:40:00Z<p>DimaPhil: </p>
<hr />
<div>Схема однослойного перцептрона<br />
<br />
Источник: https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD.png&diff=68556Файл:Перцептрон.png2019-01-18T21:39:30Z<p>DimaPhil: </p>
<hr />
<div>Схема биологического перцептрона<br />
<br />
Источник: https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D0%B5%D1%82%D0%B8_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8.png&diff=68555Файл:Сети с обратными связями.png2019-01-18T21:39:00Z<p>DimaPhil: </p>
<hr />
<div>Схема сетей с обратными связями<br />
<br />
Источник: https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C_%D1%81%D1%85%D0%B5%D0%BC%D0%B0.png&diff=68554Файл:Многослойная нейронная сеть схема.png2019-01-18T21:38:17Z<p>DimaPhil: </p>
<hr />
<div>Схема многослойной нейронной сети<br />
<br />
Источник: https://wiki.loginom.ru/articles/multilayer-neural-net.html</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Singler-layer-network.png&diff=68553Файл:Singler-layer-network.png2019-01-18T21:37:36Z<p>DimaPhil: </p>
<hr />
<div>Схема однослойной нейронной сети<br />
Источник: https://studwood.ru/766338/bankovskoe_delo/neyronnoy_seti_set_kohonena</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD_%D1%81%D1%85%D0%B5%D0%BC%D0%B0.png&diff=68552Файл:Искусственный нейрон схема.png2019-01-18T21:36:47Z<p>DimaPhil: </p>
<hr />
<div>Схема искусственного нейрона<br />
Источник: https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.png&diff=68551Файл:Нейронная сеть.png2019-01-18T21:35:45Z<p>DimaPhil: </p>
<hr />
<div>Структура нейронной сети<br />
Источник: https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68545Нейронные сети, перцептрон2019-01-18T21:23:13Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Singler-layer-network.png|500px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть схема.png|600px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]'''<sup>на 16.01.19 не создан</sup> (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами.<br />
#* Одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Искусственные нейронные сети]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C_%D1%81%D1%85%D0%B5%D0%BC%D0%B0.png&diff=68544Файл:Многослойная нейронная сеть схема.png2019-01-18T21:22:29Z<p>DimaPhil: </p>
<hr />
<div></div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C_.png&diff=68540Файл:Многослойная нейронная сеть .png2019-01-18T20:59:06Z<p>DimaPhil: </p>
<hr />
<div></div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Singler-layer-network.png&diff=68534Файл:Singler-layer-network.png2019-01-18T20:47:20Z<p>DimaPhil: Схема однослойной нейронной сети</p>
<hr />
<div>Схема однослойной нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.png&diff=68532Файл:Однослойная нейронная сеть.png2019-01-18T20:44:47Z<p>DimaPhil: DimaPhil загрузил новую версию Файл:Однослойная нейронная сеть.png</p>
<hr />
<div>Схема однослойной нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.png&diff=68530Файл:Однослойная нейронная сеть.png2019-01-18T20:42:13Z<p>DimaPhil: DimaPhil загрузил новую версию Файл:Однослойная нейронная сеть.png</p>
<hr />
<div>Схема однослойной нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68499Нейронные сети, перцептрон2019-01-18T15:20:40Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.png|400px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.png&diff=68498Файл:Однослойная нейронная сеть.png2019-01-18T15:18:44Z<p>DimaPhil: Схема однослойной нейронной сети</p>
<hr />
<div>Схема однослойной нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68497Нейронные сети, перцептрон2019-01-18T15:15:15Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|400px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68495Нейронные сети, перцептрон2019-01-18T15:12:15Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68492Нейронные сети, перцептрон2019-01-18T15:03:38Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68491Нейронные сети, перцептрон2019-01-18T15:02:57Z<p>DimaPhil: </p>
<hr />
<div>'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68465Нейронные сети, перцептрон2019-01-17T20:23:18Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>. Таким образом, выходов искусственного нейрона является <tex>\phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68464Нейронные сети, перцептрон2019-01-17T20:21:52Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68435Нейронные сети, перцептрон2019-01-17T07:11:49Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Упрощение биологической нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68433Нейронные сети, перцептрон2019-01-16T19:34:04Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68432Нейронные сети, перцептрон2019-01-16T19:33:26Z<p>DimaPhil: done</p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===<br />
<br />
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.<br />
<br />
# Load required libraries<br />
from sklearn import datasets<br />
from sklearn.preprocessing import StandardScaler<br />
from sklearn.linear_model import Perceptron #Single-layer perceptron<br />
from sklearn.neural_network import MLPClassifier #Multilayer perceptron <br />
from sklearn.model_selection import train_test_split<br />
from sklearn.metrics import accuracy_score<br />
import numpy as np<br />
<br />
# Load the iris dataset<br />
iris = datasets.load_iris()<br />
<br />
# Create our X and y data<br />
X = iris.data<br />
y = iris.target<br />
<br />
# Split the data into 70% training data and 30% test data<br />
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)<br />
<br />
# Train the scaler, which standarizes all the features to have mean=0 and unit variance<br />
sc = StandardScaler()<br />
sc.fit(X_train)<br />
<br />
# Apply the scaler to the X training data<br />
X_train_std = sc.transform(X_train)<br />
<br />
# Apply the SAME scaler to the X test data<br />
X_test_std = sc.transform(X_test)<br />
<br />
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1<br />
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)<br />
# Create a multilayer perceptron object<br />
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)<br />
<br />
# Train the perceptrons<br />
ppn.fit(X_train_std, y_train)<br />
mppn.fit(X_train_std, y_train)<br />
<br />
# Apply the trained perceptrons on the X data to make predicts for the y test data<br />
y_pred = ppn.predict(X_test_std)<br />
multi_y_pred = mppn.predict(X_test_std)<br />
<br />
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)<br />
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))<br />
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))<br />
<br />
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===<br />
<br />
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.<br />
<br />
# Load required libraries<br />
import tensorflow as tf<br />
from tensorflow.examples.tutorials.mnist import input_data<br />
<br />
#Load MNIST dataset<br />
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)<br />
<br />
#placeholder for test data<br />
x = tf.placeholder(tf.float32, [None, 784])<br />
#placeholder for weights and bias<br />
W = tf.Variable(tf.zeros([784, 10]))<br />
b = tf.Variable(tf.zeros([10]))<br />
#tensorflow model<br />
y = tf.nn.softmax(tf.matmul(x, W) + b)<br />
<br />
#loss function<br />
y_ = tf.placeholder(tf.float32, [None, 10])<br />
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))<br />
<br />
#gradient descent step<br />
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)<br />
<br />
init = tf.initialize_global_variables()<br />
sess = tf.Session()<br />
sess.run(init)<br />
for i in range(1000):<br />
batch_xs, batch_ys = mnist.train.next_batch(100)<br />
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})<br />
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))<br />
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))<br />
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68430Нейронные сети, перцептрон2019-01-16T18:27:44Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю <<виртуальную размерность>> и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<br />
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
* [https://scikit-learn.org/ Документация по библиотеке scikit-learn ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68429Нейронные сети, перцептрон2019-01-16T18:26:55Z<p>DimaPhil: Added perceptron without code</p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть <tex>n</tex> входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i = w^T \cdot x</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции;<br />
* Rectified linear units (ReLU). <tex>ReLU(x) = \begin{cases}<br />
x & x \geq 0 \\<br />
0 & x < 0<br />
\end{cases} = \max(x, 0)</tex>.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 16.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 16.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход перцептрона равен ''-1''.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
===Классификация перцептронов===<br />
<br />
[[File:Однслойный_перцептрон.png|300px|thumb|Схема однослойного перцептрона]]<br />
<br />
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.<br />
<br />
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.<br />
<br />
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.<br />
<br />
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.<br />
<br />
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.<br />
<br />
'''Многослойный перцепртрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:<br />
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;<br />
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.<br />
<br />
===Обучение перцептрона===<br />
<br />
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю <<виртуальную размерность>> и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.<br />
<br />
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.<br />
<br />
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.<br />
<br />
Теперь <tex>E_P(w)</tex> можно оптимизировать градиентным спуском. На очередном шаге получаем: <tex>w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)</tex>.<br />
<br />
Алгоритм такой {{---}} мы последовательно проходим примеры <tex>x_1, x_2, \ldots</tex> из обучающего множества, и для каждого <tex>x_n</tex>:<br />
* если он классифицирован правильно, не меняем ничего;<br />
* а если неправильно, прибавляем <tex>\eta \triangledown_w E_P(w)</tex>.<br />
<br />
Ошибка на примере <tex>x_n</tex> при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.<br />
<br />
===Применение===<br />
<br />
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости<br />
* Прогнозирование и распознавание образов<ref><br />
* Управление агентами[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref><br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
* [https://scikit-learn.org/ Документация по библиотеке scikit-learn ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD.png&diff=68428Файл:Многослойный перцептрон.png2019-01-16T17:12:48Z<p>DimaPhil: Схема многослойного перцептрона</p>
<hr />
<div>Схема многослойного перцептрона</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9E%D0%B4%D0%BD%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD.png&diff=68426Файл:Однслойный перцептрон.png2019-01-16T16:44:43Z<p>DimaPhil: Схема однослойного перцептрона</p>
<hr />
<div>Схема однослойного перцептрона</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68410Нейронные сети, перцептрон2019-01-16T14:17:54Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть несколько входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: '''обучение с учителем''' и '''обучение без учителя'''. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Персептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«персептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом персептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе персептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход персептрона равен -1.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
* [https://scikit-learn.org/ Документация по библиотеке scikit-learn ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68409Нейронные сети, перцептрон2019-01-16T14:16:34Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть несколько входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: '''обучение с учителем''' и '''обучение без учителя'''. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Персептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«персептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом персептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе персептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход персептрона равен -1.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
==См. также==<br />
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
* [https://scikit-learn.org/ Документация по библиотеке scikit-learn ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68408Нейронные сети, перцептрон2019-01-16T14:09:04Z<p>DimaPhil: Finished neural net, started perceptron</p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть несколько входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
<br />
<br />
===Сети прямого распространения===<br />
<br />
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.<br />
<br />
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.<br />
<br />
Однако сигнал в нейронных сетях может идти и в обратную сторону.<br />
<br />
===Сети с обратными связями===<br />
<br />
[[File:Сети_с_обратными_связями.png|400px|thumb|Схема сети с обратными связями]]<br />
<br />
'''Сети с обратными связями''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.<br />
<br />
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).<br />
<br />
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
==Обучение нейронной сети==<br />
<br />
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.<br />
<br />
Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.<br />
<br />
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только мы подадим немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.<br />
<br />
В самом деле, зачем нам сеть, определяющая лицо только на одном фото. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и на других фотографиях тоже. Именно с этой целью и создаются ''обучающие выборки''.<br />
<br />
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.<br />
<br />
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.<br />
<br />
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.<br />
<br />
Само обучение нейронной сети можно разделить на два подхода: '''обучение с учителем''' и '''обучение без учителя'''. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.<br />
<br />
==Перцептрон==<br />
<br />
[[File:Перцептрон.png|350px|thumb|Схема перцептрона]]<br />
<br />
'''Персептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.<br />
<br />
===История===<br />
<br />
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«персептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.<br />
<br />
Таким образом персептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.<br />
<br />
===Описание===<br />
<br />
В основе персептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.<br />
<br />
Принцип работы перцептрона следующий:<br />
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').<br />
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.<br />
# Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами<br />
#* Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов;<br />
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог <tex>\theta</tex>, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';<br />
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.<br />
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они уже могут принимать любые значения (в отличие от S-A связей).<br />
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем<br />
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';<br />
#* eсли порог не превышен, то выход персептрона равен -1.<br />
<br />
Для элементов перцептрона используют следующие названия:<br />
* S-элементы называют сенсорами;<br />
* A-элементы называют ассоциативными;<br />
* R-элементы называют реагирующими.<br />
<br />
==См. также==<br />
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]<br />
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]<br />
==Примечания==<br />
<references/><br />
== Источники информации ==<br />
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.<br />
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]<br />
* [https://scikit-learn.org/ Документация по библиотеке scikit-learn ]<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD.png&diff=68406Файл:Перцептрон.png2019-01-16T13:44:46Z<p>DimaPhil: Схема биологического перцептрона</p>
<hr />
<div>Схема биологического перцептрона</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D0%B5%D1%82%D0%B8_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8.png&diff=68402Файл:Сети с обратными связями.png2019-01-16T12:19:36Z<p>DimaPhil: Схема сетей с обратными связями</p>
<hr />
<div>Схема сетей с обратными связями</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68398Нейронные сети, перцептрон2019-01-15T21:43:26Z<p>DimaPhil: </p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть несколько входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. Single-layer neural network) {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. Multilayer neural network) {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.<br />
<br />
[[Категория: Машинное обучение]]<br />
[[Категория: Глубокое обучение]]</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&diff=68397Нейронные сети, перцептрон2019-01-15T21:40:59Z<p>DimaPhil: Added initial version</p>
<hr />
<div>[[File:Нейронная_сеть.png|700px|thumb|Схема нейронной сети]]<br />
<br />
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.<br />
<br />
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом. В 1958 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.<br />
<br />
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.<br />
<br />
==Структура нейронной сети==<br />
<br />
[[File:Искусственный_нейрон_схема.png|700px|thumb|Схема искусственного нейрона]]<br />
<br />
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.<br />
<br />
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция, которая преобразует несколько входных параметров в один выходной.<br />
<br />
Как видно на рисунке справа, у нейрона есть несколько входов <tex>x_i</tex>, у каждого из которого есть вес <tex>w_i</tex>, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы <tex>x_i \cdot w_i</tex> направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют <tex>net</tex>. Таким образом, <tex>net = \sum_{i=1}^{i=n} x_i \cdot w_i</tex>.<br />
<br />
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации (activation function), которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, <tex>out = \phi(net)</tex>.<br />
<br />
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:<br />
* Функция единичного скачка. Если <tex>net > threshold</tex>, <tex>\phi(net) = 1</tex>, а иначе <tex>0</tex>;<br />
* Сигмоидальная функция. <tex>\phi(net) = \frac{1}{1 + exp(-a \cdot net)}</tex>, где параметр <tex>a</tex> характеризует степень крутизны функции;<br />
* Гиперболический тангенс. <tex>\phi(net) = tanh(\frac{net}{a})</tex>, где параметр <tex>a</tex> также определяет степень крутизны графика функции.<br />
<br />
==Виды нейронных сетей==<br />
<br />
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.<br />
<br />
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.<br />
<br />
===Однослойные нейронные сети===<br />
<br />
[[File:Однослойная_нейронная_сеть.gif|350px|thumb|Схема однослойной нейронной сети]]<br />
<br />
'''Однослойная нейронная сеть''' (англ. Single-layer neural network) {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.<br />
<br />
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===Многослойные нейронные сети===<br />
<br />
[[File:Многослойная нейронная сеть.png|400px|thumb|Схема многослойной нейронной сети]]<br />
<br />
'''Многослойная нейронная сеть''' (англ. Multilayer neural network) {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.<br />
<br />
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.<br />
<br />
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.png&diff=68396Файл:Многослойная нейронная сеть.png2019-01-15T21:26:14Z<p>DimaPhil: Схема многослойной нейронной сети</p>
<hr />
<div>Схема многослойной нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.gif&diff=68395Файл:Однослойная нейронная сеть.gif2019-01-15T21:09:44Z<p>DimaPhil: Схема однослойной нейронной сети</p>
<hr />
<div>Схема однослойной нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD_%D1%81%D1%85%D0%B5%D0%BC%D0%B0.png&diff=68394Файл:Искусственный нейрон схема.png2019-01-15T17:55:32Z<p>DimaPhil: Схема искусственного нейрона</p>
<hr />
<div>Схема искусственного нейрона</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD.png&diff=68393Файл:Искусственный нейрон.png2019-01-15T17:47:04Z<p>DimaPhil: Схема искусственного нейрона</p>
<hr />
<div>Схема искусственного нейрона</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C.png&diff=68392Файл:Нейронная сеть.png2019-01-15T17:22:59Z<p>DimaPhil: Структура нейронной сети</p>
<hr />
<div>Структура нейронной сети</div>DimaPhilhttp://neerc.ifmo.ru/wiki/index.php?title=WAN_-_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8,_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B5%D1%82%D0%B5%D0%B9&diff=57802WAN - особенности, принципы построения сетей2016-12-13T14:49:40Z<p>DimaPhil: </p>
<hr />
<div><br />
=== Общая классификация === <br />
<br />
Для классификации компьютерных сетей используются различные признаки, но чаще всего сети делят по территориальному признаку, то есть по величине территории, которую покрывает сеть. <br />
<br />
* Глобальные сети - '''World Area Networks (WAN)'''. Объединяют территориально рассредоточенные компьютеры, которые могут находиться в различных городах и странах. Охватывает большие территории и включает в себя большое число компьютеров.<br />
* Городские сети - '''Metropolitan Area Networks (MAN)'''. Предназначены для обслуживания территории крупного города - мегаполиса.<br />
* Корпоративные (сети организаций, предприятий) - '''Enterprise Wide Networks(EWN)'''. Объединяют большое количество компьютеров в территориально распределенных филиалах отдельного предприятия. Корпоративные сети могут быть сложно связаны и покрывать город, регион или даже континент.<br />
* Локальные - '''Local Area Networks (LAN)'''. К локальным сетям относятся сети компьютеров, сосредоточенные на небольшой территории (обычно в радиусе 1-2 км). В общем случае локальная сеть представляет собой коммуникационную систему, принадлежащую одной организации.<br />
* Персональные - '''Personal Area Networks (PAN)'''. К персональным сетям относятся сети, предназначенные для взаимодействия устройств, принадлежащих одному владельцу на небольшом расстоянии (обычно до 10м).<br />
<br />
[[Файл:Network-classification.png]]<br />
[[Файл:Network-classification-2.jpg]]<br />
<br />
Все многообразие компьютерных сетей можно классифицировать по группе признаков:<br />
территориальная распространенность;<br />
* ведомственная принадлежность;<br />
* скорость передачи информации;<br />
* тип среды передачи.<br />
По принадлежности различают ведомственные и государственные сети: ведомственные принадлежат одной организации и располагаются на ее территории, а государственные сети используются в государственных структурах.<br />
<br />
По скорости передачи информации компьютерные сети делятся па низко-, средне- и высокоскоростные.<br />
<br />
По типу среды передачи разделяются на сети коаксиальные, на витой паре, оптоволоконные, с передачей информации по радиоканалам, в инфракрасном диапазоне.<br />
<br />
=== Особенности WAN, отличия от LAN ===<br />
<br />
* Связывает компьютеры, рассредоточенные на большом расстоянии - сотен и тысяч километров;<br />
* Протяженность, качество и способ прокладки линий связи: в глобальных сетях часто применяются уже существующие линии связи (телеграфные или телефонные), а в локальных сетях они прокладываются заново;<br />
* Более низкие, чем в локальных сетях, скорости передачи данных (десятки килобит в секунду), которые как следствие ограничивают набор услуг передачей файлов;<br />
* В условиях низкой надежности физических каналов в глобальных сетях требуются более сложные методы передачи данных и более сложное оборудование;<br />
* В отличие от локальных сетей, рассчитаны на ограниченное число абонентов и используют некачественные каналы связи. В глобальных сетях намного более важно не качество связи, а ее существование.<br />
* Масштабируемость - локальные сети плохо масштабируются из-за привязанности к топологии, глобальные же масштабируются хорошо, так как изначально разрабатывались в расчете на работу с произвольными топологиями.<br />
<br />
[[Файл:WAN_vs_LAN.png]]<br />
<br />
=== Принципы построения WAN === <br />
<br />
Многие глобальные сети построены для конкретной организации и являются закрытыми. Другие, построенные интернет провайдерами, предоставляют соединение из локальной сети организации в интернет. WAN довольно часто построены с использованием выделенных линий (закрытых двунаправленных линий между двумя или более локациями, предоставляемых за определенную месячную плату). На каждом конце выделенной линии, роутер соединяет локальную сеть на его стороне со вторым роутером, имеющим собственную локальную сеть. Однако, выделенные линии могут быть очень дорогими. Поэтому вместо них WAN также могут быть построены c использованием менее дорогой схемы передачи пакетов.<br />
<br />
[[Файл:Leased_line.png]]<br />
<br />
Основными используемыми протоколами в глобальных сетях являются TCP/IP, SONET/SDH, MPLS, ATM и Frame relay. Ранее был также широко распространён протокол X.25, который может по праву считаться прародителем Frame relay.<br />
<br />
<br />
=== Тенденция к сближению локальных и глобальных сетей ===<br />
<br />
Понятно, что глобальные сети имеют множество недостатков, которые хотелось бы оптимизировать. Сближение в методах передачи данных в глобальных и локальных сетях происходит на платформе оптической цифровой (немодулированной) передачи данных по оптоволоконным линиям связи. Из-за резкого улучшения качества каналов связи в глобальных сетях начали отказываться от сложных и избыточных процедур обеспечения корректности передачи данных. Примером могут служить сети Frame relay. В этих сетях предполагается, что искажение бит происходит настолько редко, что ошибочный пакет просто уничтожается, а все проблемы, связанные с его потерей, решаются программами прикладного уровня, которые непосредственно не входят в состав сети Frame relay.<br />
<br />
За счет новых сетевых технологий и, соответственно, нового оборудования, рассчитанного на более качественные линии связи, скорости передачи данных в уже существующих коммерческих глобальных сетях нового поколения приближаются к традиционным скоростям локальных сетей (в сетях frame relay сейчас доступны скорости 2 Мбит/с), а в глобальных сетях АТМ и превосходят их, достигая 622 Мбит/с.<br />
<br />
С появлением более качественной связи и с увеличением скорости передачи данных, соответственно также нужны новые алгоритмы маршрутизации, оптимальные для новых параметров сетей.<br />
<br />
И наконец, появляются новые технологии, изначально предназначенные для обоих видов сетей. Наиболее ярким представителем нового поколения технологий является технология АТМ, которая может служить основой не только локальных и глобальных компьютерных сетей, но и телефонных сетей, а также широковещательных видеосетей, объединяя все существующие типы трафика в одной транспортной сети.<br />
<br />
=== Маршрутизация в WAN === <br />
<br />
При разработке алгоритмов маршрутизации часто преследуют одну или несколько из перечисленных ниже целей:<br />
* Оптимальность;<br />
* Простота и низкие непроизводительные затраты;<br />
* Живучесть и стабильность;<br />
* Быстрая сходимость;<br />
* Гибкость.<br />
<br />
Сами алгоритмы маршрутизации могут быть классифицированы по типам. Например, алгоритмы могут быть: <br />
* Статическими или динамическими;<br />
* Одномаршрутными или многомаршрутными;<br />
* Одноуровневыми или иерархическими;<br />
* С интеллектом в главной вычислительной машине или в маршрутизаторе;<br />
* Внутридоменными и междоменными;<br />
* Алгоритмами состояния канала или вектора расстояний.<br />
<br />
'''Статические алгоритмы''' маршрутизации вообще вряд ли являются алгоритмами. Распределение статических таблиц маршрутизации устанавливается администратором сети до начала маршрутизации. Оно не меняется, если только администратор сети не изменит его. Алгоритмы, использующие статические маршруты, просты для разработки и хорошо работают в окружениях, где трафик сети относительно предсказуем, а схема сети относительно проста. Т.к. статические системы маршрутизации не могут реагировать на изменения в сети, они, как правило, считаются непригодными для современных крупных, постоянно изменяющихся сетей.<br />
<br />
'''Динамические алгоритмы''' маршрутизации подстраиваются к изменяющимся обстоятельствам сети в масштабе реального времени. Они выполняют это путем анализа поступающих сообщений об обновлении маршрутизации. Если в сообщении указывается, что имело место изменение сети, программы маршрутизации пересчитывают маршруты и рассылают новые сообщения о корректировке маршрутизации. Динамические алгоритмы маршрутизации могут дополнять статические маршруты там, где это уместно. Например, можно разработать "маршрутизатор последнего обращения" (т.е. маршрутизатор, в который отсылаются все неотправленные по определенному маршруту пакеты). Такой маршрутизатор выполняет роль хранилища неотправленных пакетов, гарантируя, что все сообщения будут хотя бы определенным образом обработаны.<br />
<br />
Названия '''одномаршрутных''' и '''многомаршрутных''' алгоритмов говорят сами за себя. Некоторые сложные протоколы маршрутизации обеспечивают несколько маршрутов к одному и тому же пункту назначения, тем самым увеличивая пропускную способность и надежность. ''Одномаршрутные'' же алгоритмы находят лишь один маршрут, что, естесственно, хуже.<br />
<br />
Некоторые алгоритмы маршрутизации оперируют в плоском пространстве, в то время как другие используют '''иерархии маршрутизации'''. В '''одноуровневой системе маршрутизации''' все маршрутизаторы равны по отношению друг к другу. В иерархической системе маршрутизации некоторые маршрутизаторы формируют то, что составляет основу (backbone {{---}} базу) маршрутизации. Пакеты из небазовых маршрутизаторов перемещаются к базовым маршрутизаторам и пропускаются через них до тех пор, пока не достигнут общей области пункта назначения. Начиная с этого момента, они перемещаются от последнего базового маршрутизатора через один или несколько небазовых маршрутизаторов до конечного пункта назначения. Основным преимуществом иерархической маршрутизации является то, что она имитирует организацию большинства компаний и следовательно, очень хорошо поддерживает их схемы трафика.<br />
<br />
'''Алгоритмы с интеллектом в главной вычислительной машине или в маршрутизаторе.'''<br />
<br />
Некоторые алгоритмы маршрутизации предполагают, что конечный узел источника определяет весь маршрут. Обычно это называют маршрутизацией от источника. В системах маршрутизации от источника маршрутизаторы действуют просто как устройства хранения и пересылки пакета, без всяких раздумий отсылая его к следующей остановке. <br />
<br />
Другие алгоритмы предполагают, что главные вычислительные машины ничего не знают о маршрутах. При использовании этих алгоритмов маршрутизаторы определяют маршрут через объединенную сеть, базируясь на своих собственных расчетах. В первой системе, рассмотренной выше, интеллект маршрутизации находится в главной вычислительной машине. В системе, рассмотренной во втором случае, интеллектом маршрутизации наделены маршрутизаторы. <br />
<br />
'''Внутридоменные или междоменные алгоритмы.'''<br />
<br />
Некоторые алгоритмы маршрутизации действуют только в пределах доменов; другие {{---}} как в пределах доменов, так и между ними. Природа этих двух типов алгоритмов различная. Поэтому понятно, что оптимальный алгоритм внутридоменной маршрутизации не обязательно будет оптимальным алгоритмом междоменной маршрутизации. <br />
<br />
'''Алгоритмы состояния канала''' (известные также как алгоритмы "первоочередности наикратчайшего маршрута") направляют потоки маршрутной информации во все узлы объединенной сети. Однако каждый маршрутизатор посылает только ту часть маршрутной таблицы, которая описывает состояние его собственных каналов. <br />
<br />
'''Алгоритмы вектора расстояния''' (известные также как алгоритмы Форда-Беллмана) требуют от каждого маршрутизатора посылки всей или части своей маршрутной таблицы, но только своим соседям. Алгоритмы состояния каналов фактически направляют небольшие корректировки по всем направлениям, в то время как алгоритмы вектора расстояний отсылают более крупные корректировки только в соседние маршрутизаторы. <br />
Отличаясь более быстрой сходимостью, алгоритмы состояния каналов несколько меньше склонны к образованию петель маршрутизации, чем алгоритмы вектора расстояния. С другой стороны, алгоритмы состояния канала характеризуются более сложными расчетами в сравнении с алгоритмами вектора расстояний, требуя большей процессорной мощности и памяти, чем алгоритмы вектора расстояний.<br />
<br />
=== Принцип работы глобальных сетей === <br />
<br />
Существуют так называемые «операторы связи», которые содержат собственные каналы и арендуют провайдерам доступ к ним. Собственность каждого оператора, включая все локальные сети провайдеров, подключенные к нему, принято называть «автономной системой». <br />
<br />
Автономная система – это ряд связанных между собой машин с единой внутренней политикой маршрутизации '''(IGP – Internal Gateway Protocol)'''. Сами автономные системы посредством мощных каналов соединяются между собой, образуя единую сеть Internet. Но невозможно передать данные каждому маршрутизатору обо всех остальных роутерах. Поэтому принято выделять так называемые «пограничные шлюзы» автономной системы. Все шлюзы соединяются по единой магистрали и обмениваются данными посредством внешних протоколов маршрутизации '''(EGP – External Gateway Protocol)'''.<br />
<br />
К внутренним протоколам относятся ''RIP'' и ''OSPF''.<br />
<br />
Прежде чем описать эти протоколы, введем понятие «хоп», использующееся во многих метриках протоколов. '''Хоп''' или '''транзитный участок''' {{---}} участок сети между двумя узлами сети, по которому передаются сетевые пакеты. Обычно используется для определения «расстояния» между узлами. Чем больше хопов {{---}} тем сложнее путь маршрутизации и тем «дальше» находятся узлы друг от друга. Например, на иллюстрации ниже количество хопов будет равно 2.<br />
<br />
[[Файл:Hops_count.png]]<br />
<br />
1. '''RIP'''<br />
<br />
Протокол RIP (Routing Information Protocol) очень прост и универсален, поэтому поддерживается всеми операционными системами и железными маршрутизаторами. Он относится к классу «дистанционно-векторных» протоколов.<br />
<br />
Идея RIP очень проста. Каждый маршрутизатор через определенный интервал времени (30 секунд) отсылает информацию о связях своим соседям. Сосед соотносит их со своей базой и добавляет данные, если они актуальны. Таким образом, все роутеры должны знать обо всех своих сетях.<br />
Метрика в RIP совпадает с числом хопов до нужной сети. В случае, если метрика равна 16, сеть считается недоступной. Следовательно, протокол может работать с сетью, в которой максимально число шлюзов менее 16.<br />
<br />
Бывают случаи, когда происходят внештатные ситуации, получившие названия «зацикливание» и «счет до бесконечности». Зацикливание происходит после отключения одной из сети, когда сторонний роутер оповестит соседа, что сеть доступна через него (в случае, если сосед не успеет оповестить маршрутизатор о недоступности сети). Таким образом, между шлюзами образуется петля.<br />
<br />
Чтобы избежать петель, вводят два ограничения в протокол RIP. Первое называется «правилом разделения горизонта». Оно гласит, что маршрутизатор A не должен отправлять данные о сети B, маршрутизатору C, если последний ему сообщил о сети B. Иными словами, роутер не шлет информацию о сети соседу, если изначально получил сведения об этой сети от него. Второе ограничение обязывает шлюз изменить метрику маршрута, если ее разослал тот же самый роутер. Отчасти, эти добавления спасают от петель, но не всегда. Бывает, что маршрутизатор получает ложные данные от стороннего шлюза по цепочке.<br />
<br />
Счет до бесконечности происходит в результате несвоевременного оповещения станций. При этом ложный маршрут может существовать, пока метрика сети не станет равной 16.<br />
<br />
Более формально, алгоритм работает следующим образом: таблица маршрутизации RIP содержит по записи на каждую обслуживаемую машину. Запись должна включать в себя<br />
* IP-адрес места назначения;<br />
* Метрика маршрута (от 1 до 15; число хопов до места назначения);<br />
* IP-адрес ближайшего маршрутизатора (gateway) по пути к месту назначения;<br />
* Таймеры маршрута.<br />
<br />
Периодически (через таймаут) маршрутизатор посылает копию своей маршрутной таблицы всем своим соседям-маршрутизаторам, а те обновляют свои таблицы, если находят более короткий маршрут. На иллюстрации показано финальное состояние после выполнения алгоритма поиска пути от '''Source''' до '''Target''':<br />
<br />
[[Файл:Rip.png]]<br />
<br />
В процессе алгоритма происходило следующее:<br />
<br />
* У '''Target''' число хопов равно 0, потому что это расстояние до него самого;<br />
* Затем, когда пройдет таймаут, Target пошлет свою таблицу маршрутизации всем соседям {{---}} ''70.43.253.42'', ''71.42.252.40'' и ''72.42.252.41'' (пошлют свои таблицы все роутеры, но только для этого нам интересно что будет);<br />
* У этих его соседей изменится оптимальное расстояние {{---}} раньше оно было неизвестно, теперь 1;<br />
* Затем каждый из них пошлет свои таблицы своим соседям, у них число хопов станет равно 2;<br />
* На третьем шаге, дело дойдет до '''Source''', и мы нашли число хопов для него {{---}} это 3.<br />
<br />
Также обратите внимание на поле ''Gateway'' в каждой таблице {{---}} благодаря нему можно восстановить весь маршрут. <br />
<br />
2. '''OSPF'''<br />
<br />
На смену RIP пришел протокол OSPF, который снимает ограничение в 15 узлов и сводит к минимуму служебный трафик. Он относится к классу протоколов «состояния связей», а его работа складывается в два этапа:<br />
<br />
1. Каждый маршрутизатор после включения рассылает информацию по всем своим интерфейсам обо всех своих соседях.<br />
<br />
2. После составления полной сетевой картины роутер начинает искать оптимальный маршрут до каждой сети с помощью алгоритма Дейкстры.<br />
<br />
Метрика представляет собой уже не число хопов, а пропускную способность канала (время передачи одного бита в 10-наносекундных интервалах). Так, для Ethernet метрика равна десяти, для Fast Ethernet {{---}} единице, а для канала 56 Кб/с {{---}} 1785. Полная метрика для определенного маршрута является суммой всех промежуточных каналов. При этом OSPF никогда не пропустит пакет через канал в один хоп, если имеется связь, построенная на Fast Ethernet, пусть даже состоящая из 3-4 хопов.<br />
<br />
Следует отметить, что OSPF умеет посылать данные сразу по нескольким каналам, тем самым, уменьшая нагрузку на сеть. Однако в этом случае действует ограничение по метрике. Подробно это здесь описывать не будем.<br />
<br />
3. '''BGP'''<br />
<br />
На текущий момент BGP зарегистрирован под четвертой версией и не имеет конкурентов. Общая схема работы BGP такова. BGP-маршрутизаторы соседних АС, решившие обмениваться маршрутной информацией, устанавливают между собой соединения по протоколу BGP и становятся BGP-соседями<br />
<br />
Далее BGP использует подход под названием ''path vector'', являющийся развитием дистанционно-векторного подхода. BGP-соседи рассылают друг другу векторы путей (path vectors). Вектор путей, в отличие от вектора расстояний, содержит не просто адрес сети и расстояние до нее, а адрес сети и список атрибутов (path attributes), описывающих различные характеристики маршрута от маршрутизатора-отправителя в указанную сеть.<br />
<br />
Типы BGP-сообщений<br />
<br />
* ''OPEN'' - посылается после установления TCP-соединения. Ответом на OPEN является сообщение KEEPALIVE, если вторая сторона согласна стать BGP-соседом; иначе посылается сообщение NOTIFICATION с кодом, поясняющим причину отказа, и соединение разрывается.<br />
* ''KEEPALIVE'' - сообщение предназначено для подтверждения согласия установить соседские отношения, а также для мониторинга активности открытого соединения: для этого BGP-соседи обмениваются KEEPALIVE-сообщениями через определенные интервалы времени.<br />
* ''UPDATE'' - сообщение предназначено для анонсирования и отзыва маршрутов. После установления соединения с помощью сообщений UPDATE пересылаются все маршруты, которые маршрутизатор хочет объявить соседу (full update), после чего пересылаются только данные о добавленных или удаленных маршрутах по мере их появления (partial update).<br />
* ''NOTIFICATION'' - сообщение этого типа используется для информирования соседа о причине закрытия соединения. После отправления этого сообщения BGP-соединение закрывается.<br />
<br />
Примерная схема работы сообщений в BGP выглядит так:<br />
<br />
[[Файл:Bgp.png]]<br />
<br />
При выборе протокола маршрутизации необходимо взвесить все «за» и «против». С одной стороны, громоздкий OSPF. С другой {{---}} никто не мешает использовать RIP второй версии, который научился понимать маски подсети и аутентификацию, чего не умел его предшественник.<br />
<br />
=== Принцип работы глобальных сетей: пример === <br />
<br />
Представим, что мы сидим в Нью-Йорке и хотим подключиться к серверу, который находится в Санкт-Петербурге по адресу ''<nowiki>http://neerc.ifmo.ru</nowiki>''. Что примерно будет происходить, когда мы наберем адрес и нажем Enter?<br />
<br />
В первую очередь в ход идет DNS-сервер: он транслирует сначала поддомены (neerc), обращаясь к локальному провайдеру, затем транслирует основной домен (ifmo.ru), обращаясь в глобальную сеть. Получив IP-адрес сервера, мы знаем, куда надо подключаться. Наш IP тоже известен, поэтому мы спокойно подключаемся, создаем соединение и передаем/получаем нужную информацию.<br />
<br />
Возможное примерное развитие событий представлено на картинке. DNS-серверов обычно несколько, в данном случае рассмотрен вариант двух:<br />
<br />
[[Файл:DNS-connecting.png]]<br />
<br />
=== Источники информации ===<br />
<br />
* [https://en.wikipedia.org/wiki/Wide_area_network Википедия {{---}} WAN];<br />
* [https://en.wikipedia.org/wiki/Leased_line Википедия {{---}} Leased line];<br />
* Компьютерные сети. Принципы, технологии, протоколы. В. Олифер, Н. Олифер, 5е издание;<br />
* Сети ЭВМ: протоколы стандарты, интерфейсы. Ю. Блэк; перев. с англ. - М.: Мир, 2005;<br />
* Компьютерные сети. Учебный курс, 2-е изд. - MicrosoftPress, Русская редакция, 2004.<br />
<br />
[[Категория:Компьютерные сети]]</div>DimaPhil