Изменения

Перейти к: навигация, поиск

Нейронные сети, перцептрон

2272 байта добавлено, 04:10, 18 апреля 2019
Нет описания правки
[[File:Нейронная_сеть'''Искусственная нейронная сеть (ИНС)''' (англ.png|700px|thumb|Схема ''Artificial neural network (ANN)'') {{---}} упрощенная модель биологической нейронной сети]], представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.
'''Искусственная нейронная сеть (ИНС)''' (англ[[File:Нейронная_сеть. ''Artificial neural network (ANN)'') {{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 Упрощение биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.]]]
Основные принципы работы нейронные нейронных сетей были описаны еще в 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 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.
==Структура нейронной сети==
[[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 Схема искусственного нейрона]]]
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция <tex>\mathbb{R}^n \rightarrow \mathbb{R}</tex>, которая преобразует несколько входных параметров в один выходной.
Как видно на рисунке справа, у нейрона есть <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 w_i \cdot w_i x_i = w^T \cdot x</tex>.
Просто так передавать взвешенную сумму <tex>net</tex> на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации (activation function)]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается <tex>\phi(net)</tex>, а выход {{---}} out. Таким образом, выходов искусственного нейрона является <tex>out = \phi(net)</tex>.
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:
===Однослойные нейронные сети===
[[File:Однослойная_нейронная_сетьSingle-layer-neural-net-scheme.gifpng|350px500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы <tex>x_1, x_2, \ldots x_n</tex> поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.
 
 
 
===Многослойные нейронные сети===
[[File:Многослойная нейронная сетьMulti-layer-neural-net-scheme.png|400px500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиямна станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.
===Сети с обратными связями===
[[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 Схема сети с обратными связями]]]
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).
 
Возможность сигналов циркулировать в сети открывает новые, удивительные возможности нейронных сетей. С помощью таких сетей можно создавать нейросети, восстанавливающие или дополняющие сигналы. Другими словами такие нейросети имеют свойства кратковременной памяти (как у человека).
 
 
 
 
 
 
 
==Обучение нейронной сети==
'''Обучение нейронной сети''' (англ. ''Neural net training'') {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной. Такой подход к термину «обучение нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей. Каждая из них в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Мы обучаемся благодаря изменению синапсов {{---}} элементов, которые усиливают/ослабляют входной сигнал.
Если обучать сеть, используя только один входной сигналЭто определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, то сеть просто «запомнит правильный ответ»каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Со стороны будет казатьсяНаш мозг обучается благодаря изменению синапсов {{---}} элементов, что она очень быстро «обучилась». И как только мы подадим немного измененный которые усиливают или ослабляют входной сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.
В самом делеЕсли обучать сеть, используя только один входной сигнал, зачем нам то сетьпросто «запомнит правильный ответ», определяющая лицо а как только на одном фотомы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и узнавать лица и решать задачу на других фотографиях тожеразличных входных данных. Именно с этой целью и создаются ''обучающие выборки''.
'''Обучающая выборка''' (англ. ''Training set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.
'''Тестовая выборка''' (англ. ''Testing set'') {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]<sup>[на 1628.01.19 не создан]</sup> и [[Обучение без учителя|обучение без учителя]]<sup>[на 1628.01.19 не создан]</sup>. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.
==Перцептрон==
[[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 Схема перцептрона]]]
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.
Принцип работы перцептрона следующий:
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'').;# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1''.;# Затем сигналы от сенсорных элементов, прошедших по S-A связям , попадают в A-элементы, которые еще называют ассоциативными элементами;#* Стоит заметить, что одному Одному A-элементу может соответствовать несколько S-элементов;
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог ​<tex>\theta</tex>​, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.;# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако, здесь они (которые уже могут принимать любые значения (, в отличие от S-A связей).;
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';
===Классификация перцептронов===
[[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 Схема однослойного перцептрона]]]
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}} перцептрон, у которого имеется только по одному слою S, A и R элементов.
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.
'''Многослойный перцепртрон перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.
Задача обучения перцептрона {{---}} подобрать такие <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>.
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<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> классифицирует неправильно.
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на <tex>y(x)</tex> здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.
===Применение===
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости;* Прогнозирование и распознавание образов;* Управление агентами<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>.
===Примеры кода=======Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>====
Будем классифицировать с помощью перцептрона датасет irisMNIST<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set MNIST_database Датасет irisMNIST]</ref>.
# Load required libraries
import numpy as np
# Load the iris mnist dataset iris mnist = datasets.load_irisload_digits()
# Create our X and y data
n_samples = len(mnist.images) X = irismnist.images.datareshape((n_samples, -1)) y = irismnist.target
# Split the data into 70% training data and 30% test data
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)
# Create a multilayer perceptron object
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5256, 2512, 128), random_state=1)
# Train the perceptrons
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)
print('AccuracySingle-layer perceptron accuracy: %.2f4f' % accuracy_score(y_test, y_pred)) print('AccuracyMultilayer perceptron accuracy: %.2f4f' % accuracy_score(y_test, multi_y_pred))
===Пример использования с помощью tensorflow<ref>[httpsВывод://www Single-layer perceptron accuracy: 0.tensorflow9574 Multilayer perceptron accuracy: 0.org/ Библиотека tensorflow для Python]</ref>===9759
Будем классифицировать цифры из датасета MNIST====Пример использования с помощью tensorflow<ref>[https://enwww.wikipediatensorflow.org/wiki/MNIST_database Датасет MNISTБиблиотека tensorflow для Python]</ref>==== Будем классифицировать цифры из того же датасета MNIST.
# Load required libraries
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
init = tf.initialize_global_variablesinitialize_all_variables()
sess = tf.Session()
sess.run(init)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
 
[[File:Tensorflow-mnist-failures.png|400px|thumb|Правильные метки {{---}} 5, 4, 9, 7. Результат классификации {{---}} 6, 6, 4, 4.]]
 
Вывод:
Accuracy: 0.9164
 
 
На рисунке справа показаны четыре типичных изображения, на которых классификаторы ошибаются. Согласитесь, случаи действительно тяжелые.
 
====Пример на языке Java====
Пример классификации с применением <code>weka.classifiers.functions.MultilayerPerceptron</code><ref>[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]</ref>
 
<code>Maven</code> зависимость:
<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>weka-stable</artifactId>
<version>3.8.0</version>
</dependency>
 
'''import''' weka.classifiers.functions.MultilayerPerceptron;
'''import''' weka.core.converters.CSVLoader;
'''import''' java.io.File;
 
<font color="green">// read train & test datasets and build MLP classifier</font>
'''var''' trainds = new DataSource("etc/train.csv");
'''var''' train = trainds.getDataSet();
train.setClassIndex(train.numAttributes() - 1);
'''var''' testds = new DataSource("etc/test.csv");
'''var''' test = testds.getDataSet();
test.setClassIndex(test.numAttributes() - 1);
'''var''' mlp = new MultilayerPerceptron();
mlp.buildClassifier(train);
<font color="green">// Test the model</font>
'''var''' eTest = new Evaluation(train);
eTest.evaluateModel(mlp, test);
<font color="green">// Print the result à la Weka explorer:</font>
'''var''' strSummary = eTest.toSummaryString();
System.out.println(strSummary);
==См. также==
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<sup>[на 28.01.19 не создан]</sup> 
==Примечания==
<references/>
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]
[[Категория: Машинное обучение]][[Категория: Глубокое обучениеСверточные сети]]
Анонимный участник

Навигация