- PVSM.RU - https://www.pvsm.ru -

PyBrain работаем с нейронными сетями на Python

PyBrain работаем с нейронными сетями на Python
В рамках одного проекта столкнулся необходимостью работать с нейронными сетями, рассмотрел несколько вариантов, больше всего понравилась PyBrain [1]. Надеюсь её описание будет многим интересно почитать.
PyBrain — одна из лучших Python библиотек для изучения и реализации большого количества разнообразных алгоритмов связанных с нейронными сетями. Являет собой хороший пример удачного совмещения компактного синтаксиса Python с хорошей реализацией большого набора различных алгоритмов из области машинного интеллекта.
Предназначен для:

  • Исследователей — предоставляет единообразную среду для реализации различных алгоритмов, избавляя от потребности в использовании десятков различных библиотек. Позволяет сосредоточится на самом алгоритме а не особенностях его реализации.
  • Студентов — с использованием PyBrain удобно реализовать домашнее задание, курсовой проект или вычисления в дипломной работе. Гибкость архитектуры позволяет удобно реализовывать разнообразные сложные методы, структуры и топологии.
  • Лекторов — обучение методам Machine Learning было одной из основных целей при создании библиотеки. Авторы будут рады, если результаты их труда помогут в подготовке грамотных студентов и специалистов.
  • Разработчиков — проект Open Source, поэтому новым разработчикам всегда рады.

О библиотеке

PyBrian представляет собой модульную библиотеку предназначенную для реализации различных алгоритмов машинного обучения на языке Python. Основной его целью является предоставление исследователю гибких, простых в использовании, но в то же время мощных инструментов для реализации задач из области машинного обучения, тестирования и сравнения эффективности различных алгоритмов.
Название PyBrain является аббревиатурой от английского: Python-Based Reinforcement Learning, Artificial Intelligence and Neural Network Library.
Как сказано на одном сайте: PyBrain — swiss army knife for neural networking ( PyBrain — это швейцарский армейский нож в области нейро-сетевых вычислений).

Библиотека построена по модульному принципу, что позволяет использовать её как студентам для обучения основам, так и исследователям, нуждающимся в реализации более сложных алгоритмов. Общая структура процедуры её использования приведена на следующей схеме:
PyBrain работаем с нейронными сетями на Python

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

Tom Schaul, Justin Bayer, Daan Wierstra, Sun Yi, Martin Felder, Frank Sehnke, Thomas Rückstieß, Jürgen Schmidhuber. PyBrain. To appear in: Journal of Machine Learning Research, 2010.

Основные возможности

Основными возможностями библиотеки (для версии 0.3 ) являются:

Сети

PyBrain оперирует сетевыми структурами, которые могут быть использованы для построения практически всех поддерживаемых библиотекой сложных алгоритмов. В качестве примера можно привести:

Инструменты

Дополнительно присутствуют программные инструменты, позволяющие реализовывать сопутствующие задачи:

  • Построение / Визуализация графиков
  • Поддержка netCDF
  • Запись/чтение XML

Установка библиотеки

Перед установкой Pybrain, создатели рекомендуют [52] установить следующие библиотеки:
Setuptools — пакетный менеджер для Python, который значительно упрощает установку новых библиотек. Для его установки рекомендуется скачать и выполнить (python ez_setup.py) этот [53] скрипт.
После установки у Вас появиться возможность использовать команду

easy_install

для установки новых библиотек.
Сразу воспользуемся ими и установим два необходимых пакета:

$ easy_install scipy
$ easy_install matplotlib

Далее устанавливается сама PyBrain

  • Либо используем репозиторий с github
    PyBrain работаем с нейронными сетями на Python

    git clone git://github.com/pybrain/pybrain.git
    

  • Либо качаем последнюю на текущий момент стабильную версию тут [54]. И устанавливаем стандартным способом:
    $ python setup.py install
    

Основы работы с библиотекой

Создание нейронной сети

Создание нейронной сети с двумя входами, тремя скрытыми слоями и одним выходом:

>>> from pybrain.tools.shortcuts import buildNetwork
>>> net = buildNetwork(2, 3, 1)

В результате, в объекте net находится созданная нейронная цепь, инициализированная случайными значениями весов.

Функция активации

Функция активации задаётся следующим образом:

net.activate([2, 1])

Количество элементов передаваемых в сеть должно быть равно количеству входов. Метод возвращает ответ в виде единственного числа, если текущая цепь имеет один выход, и массив, в случае большего количества выходов.

Получение данных о сети

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

>>> net['in']
<LinearLayer 'in'>
>>> net['hidden0']
<SigmoidLayer 'hidden0'>
>>> net['out']
<LinearLayer 'out'>

Скрытые слои поименованы с номером слоя добавленным к имени.

Возможности при создании сети

Конечно в большинстве случаев, созданная нейронная сеть должна иметь другие характеристики, нежели заданные по умолчанию. Для этого существуют разнообразные возможности. К примеру, по умолчанию скрытый слой создаётся с использованием сигмоидной функции активации [55], для задания другого её типа возможно использовать следующие константы:

  • BiasUnit
  • GaussianLayer
  • LinearLayer
  • LSTMLayer
  • MDLSTMLayer
  • SigmoidLayer
  • SoftmaxLayer
  • StateDependentLayer
  • TanhLayer

>>> from pybrain.structure import TanhLayer
>>> net = buildNetwork(2, 3, 1, hiddenclass=<b>TanhLayer</b>)
>>> net['hidden0']
<TanhLayer 'hidden0'>

Также возможно задать и тип выходного слоя:

>>> from pybrain.structure import SoftmaxLayer
>>> net = buildNetwork(2, 3, 2, hiddenclass=TanhLayer, outclass=SoftmaxLayer)
>>> net.activate((2, 3))
array([ 0.6656323,  0.3343677])

Дополнительно возможно использование смещения (bias)

>>> net = buildNetwork(2, 3, 1, bias=True)
>>> net['bias']
<BiasUnit 'bias'>
Оперирование данными (Building a DataSet)

Созданная сеть должна обрабатывать данные, работе с которыми и посвящён этот раздел. Типичным набором данных является набор входных и выходных значений. Для работы с ними PyBrain использует модуль pybrain.dataset, также далее используется класс SupervisedDataSet.

Настройка данных

Класс SupervisedDataSet используется для типичного обучения с учителем. Он поддерживает массивы выходных и выходных данных. Их размеры задаются при создании экземпляра класса:
Запись вида:

>>> from pybrain.datasets import SupervisedDataSet
>>> ds = SupervisedDataSet(2, 1)

означает, что создаётся структура данных для хранения двухмерных входных данных и одномерных выходных.

Добавление образцов

Классической задачей при обучении нейронной сети является обучение функции XOR, далее показан набор данных используемый для создания такой сети.

>>> ds.addSample((0, 0), (0,))
>>> ds.addSample((0, 1), (1,))
>>> ds.addSample((1, 0), (1,))
>>> ds.addSample((1, 1), (0,))
Исследование структуры образца

Для получения массивов данных в текущем их наборе возможно использовать стандартные функции Python для работы с массивами.

>>> len(ds)

выведет 4, так-как это количество элементов.
Итерация по множеству также может быть организована обычным для массивов способом:

>>> for inpt, target in ds:
	print inpt, target

...
[ 0.  0.] [ 0.]
[ 0.  1.] [ 1.]
[ 1.  0.] [ 1.]
[ 1.  1.] [ 0.]

Также к каждому набору полей можно получить прямой доступ с использованием его имени:

>>> ds['input']

array([[ 0.,  0.],
       [ 0.,  1.],
       [ 1.,  0.],
       [ 1.,  1.]])
>>> ds['target']

array([[ 0.],
       [ 1.],
       [ 1.],
       [ 0.]])

Также можно вручную освободить занимаемую образцом память полностью его удалив:

>>> ds.clear()
>>> ds['input']

array([], shape=(0, 2), dtype=float64)

>>> ds['target']

array([], shape=(0, 1), dtype=float64)
Тренировка сети на образцах

В PyBrain использована концепция тренеров (trainers) для обучения сетей с учителем. Тренер получает экземпляр сети и экземпляр набора образцов и затем обучает сеть по полученному набору.
Классический пример это обратное распространение ошибки (backpropagation). Для упрощения реализации этого подход в PyBrain существует класс BackpropTrainer.

>>> from pybrain.supervised.trainers import BackpropTrainer

Обучающий набор образцов (ds) и целевая сеть (net) уже созданы в примерах выше, теперь они будут объединены.

>>> net = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)
>>> trainer = BackpropTrainer(net, ds)

Тренер получил ссылку на структуру сети и может её тренировать.

>>> trainer.train()

0.31516384514375834

Вызов метода train() производит одну итерацию (эпоху) обучения и возвращает значение квадратичной ошибки (double proportional to the error).
Если организовывать цикл по каждой эпохи нет надобности, то существует метод обучающий сеть до сходимости:

>>> trainer.trainUntilConvergence()

Данный метод возвратит массив ошибок для каждой эпохи.

Ещё примеры реализации разных сетей

В статье

Tom Schaul, Martin Felder, et.al. PyBrain, Journal of Machine Learning Research 11 (2010) 743-746.

приведён пример создания сети с загрузкой данных из .mat файла.
PyBrain работаем с нейронными сетями на Python

# Load Data Set. 
ds = SequentialDataSet.loadFromFile(’parity.mat’) 
# Build a recurrent Network. 
net = buildNetwork(1, 2, 1, bias=True, 
	hiddenclass=TanhLayer, 
	outclass=TanhLayer, 
	recurrent=True) 
recCon = FullConnection(net[’out’], net[’hidden0’]) 
net.addRecurrentConnection(recCon) 
net.sortModules() 
# Create a trainer for backprop and train the net. 
trainer = BackpropTrainer(net, ds, learningrate=0.05) 
trainer.trainEpochs(1000) 

Немного ссылок:

Заключение

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

P.S. Если есть поправки по названиям некоторых терминов, то я готов выслушать, не уверен в 100% точности пары переводов, возможно уже есть уставившиеся термины.

Автор: Pavel_Osipov


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/11986

Ссылки в тексте:

[1] PyBrain: http://pybrain.org

[2] обучения с учителем: http://ru.wikipedia.org/wiki/Обучение_с_учителем

[3] Метод обратного распространения ошибки: http://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки

[4] R-Prop: http://www.basegroup.ru/glossary/definitions/rprop/

[5] Support-Vector-Machines: http://ru.wikipedia.org/wiki/Метод_опорных_векторов

[6] Evolino: http://Evolino/

[7] Обучение без учителя: http://ru.wikipedia.org/wiki/%CE%E1%F3%F7%E5%ED%E8%E5_%E1%E5%E7_%F3%F7%E8%F2%E5%EB%FF

[8] K-Means Clustering: http://ru.wikipedia.org/wiki/K-means

[9] Метод главных компонент: http://ru.wikipedia.org/wiki/%CC%E5%F2%EE%E4_%E3%EB%E0%E2%ED%FB%F5_%EA%EE%EC%EF%EE%ED%E5%ED%F2

[10] Probabilistic Principal Component Analysis: https://www.google.com/search?client=opera&amp;rls=en&amp;q=Probabilistic+PCA&amp;sourceid=opera&amp;ie=utf-8&amp;oe=utf-8&amp;channel=suggest

[11] Deep Belief Networks: http://www.scholarpedia.org/article/Deep_belief_networks

[12] Обучение с подкреплением: http://ru.wikipedia.org/wiki/Обучение_с_подкреплением

[13] Value-based: http://www.cs.utexas.edu/~pstone/Papers/bib2html/b2hd-AAAI06-yaxin.html

[14] Q-Learning: http://ru.wikipedia.org/wiki/Q-обучение

[15] SARSA: http://en.wikipedia.org/wiki/SARSA

[16] Neural Fitted Q-iteration: http://yandex.ru/clck/redir/AiuY0DBWFJ4ePaEse6rgeAjgs2pI3DW99KUdgowt9XvqxGyo_rnZJvukMfHayjcfehjV4-JmcYGnYcNPfwUZ_cXsDxaD9pOoJzX8BOC5WBNk4f6h5ID-2YeeuO7d3Xy1A8-AnoLgqKN6Yz2xZHTJT-q4xGKhBYY5QUyj1pBa8SwVFP33iA4CrbVunrJGC4OO-waxCuybVu9qP1zITnBtdw?data=UlNrNmk5WktYejR0eWJFYk1LdmtxcjNRUmxJUHByTThWTjU5YmZmdFd5T0oxRmdTbXphU05GSjBfdHZTeDBNOFpfdGhpNW91ZlRwRGZzdFFTVmh0SlRJM1ZKM2Q5OGh1Zlh1RTg2ODJEc3h0eDMtdFgwdWtMVUhKMEkwdUhmMnFaRGVVNjJ3S3pLaUYybHE1SEFHSHZISWdwLWdzLWtSaw&amp;b64e=2&amp;sign=7962a92ddf439000622c6294887627ad&amp;keyno=8&amp;l10n=ru&amp;i=9

[17] Policy Gradients: http://videolectures.net/mlss06au_aberdeen_pgrl/

[18] Natural Actor-Critic: http://yandex.ru/clck/redir/AiuY0DBWFJ4ePaEse6rgeAjgs2pI3DW99KUdgowt9XvoT-twMUKrgMNBrwaxkRXHIjgivxF8A0gfyA4Lg3D9mlfeKJTSUDpLdiZCgOMQzqQakVS3qGFeC5W0Lm8IchO6IqYkLTGl2qFvM7P-vESMPNL_LdErxpKUav3zv65er9k-pmF1F3JE-C9bB0GOmIBVjz39oUBLGNI?data=UlNrNmk5WktYejR0eWJFYk1LdmtxZ0dSMlo3dHgwc3dzWGdlSG9MQWd3OTNscVVSSHRsY0swMGFBT0EzUEZpWEdXcGY1Y1dGaGNzVENvR0h4UzUzd3B3VlpHdGpKczVkR1RLWHpqcDIxNUp3MmJUWXE1b3BfemM3c2RTdnRUVzBZMWJBUUZybklDeTZKUnpZV0JKajF6Y1FpUjBlTUlpd1VGcGxyTmlDeG5v&amp;b64e=2&amp;sign=905ebbb0bc9f76a88925d2b2ae2620b6&amp;keyno=8&amp;l10n=ru&amp;i=4

[19] Epsilon-Greedy Exploration: http://en.wikipedia.org/wiki/Multi-armed_bandit

[20] Boltzmann Exploration: http://www.google.ru/url?sa=t&amp;rct=j&amp;q=Boltzmann+Exploration&amp;source=web&amp;cd=8&amp;ved=0CGAQFjAH&amp;url=http://www.cs.cmu.edu/afs/cs/academic/class/15381-s07/www/slides/050107reinforcementLearning1.pdf&amp;ei=W9z6T-eIJ67P4QT7yOiNBw&amp;usg=AFQjCNGS5W4uVzvSUg9oUyvRfoC9XNNG3A&amp;cad=rjt

[21] Gaussian Exploration: http://www.google.ru/url?sa=t&amp;rct=j&amp;q=Gaussian+Exploration+policy&amp;source=web&amp;cd=1&amp;ved=0CEwQFjAA&amp;url=http://books.nips.cc/papers/files/nips23/NIPS2010_0606.pdf&amp;ei=Ed36T4_AFMTT4QSmqODFBg&amp;usg=AFQjCNHr0dQ-fr-d9ZlUnFMYT6ctWH-srQ&amp;cad=rjt

[22] State-Dependent Exploration: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.139.5478

[23] Оптимизация: http://pybrain.org/docs/tutorial/optimization.html

[24] чёрного ящика: http://ru.wikipedia.org/wiki/Чёрный_ящик

[25] Black-box Optimization: http://www.tigen.org/kevin.kofler/bbowda/

[26] Hill-climbing: http://en.wikipedia.org/wiki/Hill_climbing

[27] Метод роя частиц: http://ru.wikipedia.org/wiki/Метод_роя_частиц

[28] Particle Swarm Optimization: http://en.wikipedia.org/wiki/Particle_swarm_optimization

[29] Эволюционная стратегия: http://ru.wikipedia.org/wiki/Эволюционная_стратегия

[30] Evolution : http://en.wikipedia.org/wiki/Evolution_strategy

[31] Covariance Matrix Adaptation ES: http://en.wikipedia.org/wiki/CMA-ES

[32] Natural Evolution Strategies: http://en.wikipedia.org/wiki/Natural_Evolution_Strategies

[33] Fitness Expectation-Maximization (FEM): http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.164.2624

[34] Finite Difference Gradient Descent: http://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=3&amp;ved=0CF8QFjAC&amp;url=http://hci.iwr.uni-heidelberg.de/Staff/bgoldlue/fvia_ws_2011/fvia_ws_2011_02_gradient_descent.pdf&amp;ei=W9_6T-eYOIqO4gSWtPCLBw&amp;usg=AFQjCNGuMeWWZzuNcG5OceEx2zborgd-Tw

[35] Policy Gradients with Parameter Exploration (PGPE): http://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;ved=0CEgQFjAA&amp;url=http://kyb.mpg.de/publications/attachments/Neural-Networks-2010-Sehnke_%5B0%5D.pdf&amp;ei=q9_6T77ZGdSL4gTb1PjpBg&amp;usg=AFQjCNG1d6weDgFMQAsRMpDEJEwThV_FwA

[36] Simultaneous Perturbation Stochastic Approximation (SPSA): http://www.jhuapl.edu/spsa/

[37] Генетический алгоритм: http://ru.wikipedia.org/wiki/Генетический_алгоритм

[38] Genetic Algorithms: http://en.wikipedia.org/wiki/Genetic_algorithm

[39] Competitive Co-Evolution: http://www.cs.cmu.edu/afs/cs/project/jair/pub/volume21/stanley04a-html/jairhtml.html

[40] Memetic Search: http://en.wikipedia.org/wiki/Memetic_algorithm

[41] Многокритериальная оптимизация: http://ru.wikipedia.org/wiki/Многокритериальная_оптимизация

[42] Multi-Objective Optimization NSGA-II: http://en.wikipedia.org/wiki/Multi-objective_optimization

[43] Restricted Boltzmann Machines (RBM): http://deeplearning.net/tutorial/rbm.html

[44] Рекуррентные нейронные сети: http://ru.wikipedia.org/wiki/%D0%E5%EA%F3%F0%F0%E5%ED%F2%ED%E0%FF_%ED%E5%E9%F0%EE%ED%ED%E0%FF_%F1%E5%F2%FC

[45] Long Short-Term Memory: http://en.wikipedia.org/wiki/Long_short_term_memory

[46] Multi-Dimensional Recurrent Networks: http://arxiv.org/abs/0705.2011

[47] Сети Кохонена: http://ru.wikipedia.org/wiki/Самоорганизующаяся_карта_Кохонена

[48] Self-Organizing Maps: http://en.wikipedia.org/wiki/Self-organizing_map

[49] Reservoirs: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http://minds.jacobs-university.de/sites/default/files/uploads/papers/2261_LukoseviciusJaeger09.pdf&ei=F-P6T7mPI-fh4QSRnv3xBg&usg=AFQjCNGxnKFqKakOqsRkFp6BCb0PPY0Wsg

[50] Нейронная сеть Коско: http://ru.wikipedia.org/wiki/Нейронная_сеть_Коско

[51] Bidirectional networks: http://en.wikipedia.org/wiki/Bidirectional_associative_memory

[52] рекомендуют: http://pybrain.org/docs/quickstart/installation.html

[53] этот: http://peak.telecommunity.com/dist/ez_setup.py

[54] тут: https://github.com/pybrain/pybrain/zipball/0.3.1

[55] сигмоидной функции активации: http://ru.wikipedia.org/wiki/%D1%E8%E3%EC%EE%E8%E4

[56] Как сохранить и загрузить сеть в PyBrain: http://stackoverflow.com/questions/6006187/how-to-save-and-recover-pybrain-traning

[57] Создание сети собственной структуры в PyBrain: http://stackoverflow.com/questions/5692624/creating-custom-connectivity-in-pybrain-neural-networks/5716233#5716233

[58] Как я могу следить за процессом обучения сети в PyBrain: http://stackoverflow.com/questions/9137463/how-can-i-calculate-or-monitor-the-training-of-a-neural-network-in-pybrain/9344722#9344722

[59] Как вывести полученную сеть (узлы и дуги) в PyBrain: http://stackoverflow.com/questions/8150772/pybrain-how-to-print-a-network-nodes-and-weights/8161274#8161274

[60] Как загрузить тренировочное множество в PyBrain: http://stackoverflow.com/questions/8139822/how-to-load-training-data-in-pybrain/8143012#8143012

[61] Небольшой How to start: http://biomunky.wordpress.com/2010/03/17/hmmm-pybrains/

[62] Ещё один: http://simontechblog.blogspot.com/2010/08/pybrain-reinforcement-learning-tutorial_21.html