- PVSM.RU - https://www.pvsm.ru -
В рамках одного проекта столкнулся необходимостью работать с нейронными сетями, рассмотрел несколько вариантов, больше всего понравилась PyBrain [1]. Надеюсь её описание будет многим интересно почитать.
PyBrain — одна из лучших Python библиотек для изучения и реализации большого количества разнообразных алгоритмов связанных с нейронными сетями. Являет собой хороший пример удачного совмещения компактного синтаксиса Python с хорошей реализацией большого набора различных алгоритмов из области машинного интеллекта.
Предназначен для:
PyBrian представляет собой модульную библиотеку предназначенную для реализации различных алгоритмов машинного обучения на языке Python. Основной его целью является предоставление исследователю гибких, простых в использовании, но в то же время мощных инструментов для реализации задач из области машинного обучения, тестирования и сравнения эффективности различных алгоритмов.
Название PyBrain является аббревиатурой от английского: Python-Based Reinforcement Learning, Artificial Intelligence and Neural Network Library.
Как сказано на одном сайте: PyBrain — swiss army knife for neural networking ( PyBrain — это швейцарский армейский нож в области нейро-сетевых вычислений).
Библиотека построена по модульному принципу, что позволяет использовать её как студентам для обучения основам, так и исследователям, нуждающимся в реализации более сложных алгоритмов. Общая структура процедуры её использования приведена на следующей схеме:
Сама библиотека является продуктом с открытым исходным кодом и бесплатна для использования в любом проекте с единственно оговоркой, при её использовании для научных исследований, они просят добавлять в список цитируемых информационных источников (что народ и делает) следующую книгу:
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 оперирует сетевыми структурами, которые могут быть использованы для построения практически всех поддерживаемых библиотекой сложных алгоритмов. В качестве примера можно привести:
Дополнительно присутствуют программные инструменты, позволяющие реализовывать сопутствующие задачи:
Перед установкой Pybrain, создатели рекомендуют [52] установить следующие библиотеки:
Setuptools — пакетный менеджер для Python, который значительно упрощает установку новых библиотек. Для его установки рекомендуется скачать и выполнить (python ez_setup.py) этот [53] скрипт.
После установки у Вас появиться возможность использовать команду
easy_install
для установки новых библиотек.
Сразу воспользуемся ими и установим два необходимых пакета:
$ easy_install scipy
$ easy_install matplotlib
git clone git://github.com/pybrain/pybrain.git
$ 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], для задания другого её типа возможно использовать следующие константы:
>>> 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'>
Созданная сеть должна обрабатывать данные, работе с которыми и посвящён этот раздел. Типичным набором данных является набор входных и выходных значений. Для работы с ними 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 файла.
# 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&rls=en&q=Probabilistic+PCA&sourceid=opera&ie=utf-8&oe=utf-8&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&b64e=2&sign=7962a92ddf439000622c6294887627ad&keyno=8&l10n=ru&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&b64e=2&sign=905ebbb0bc9f76a88925d2b2ae2620b6&keyno=8&l10n=ru&i=4
[19] Epsilon-Greedy Exploration: http://en.wikipedia.org/wiki/Multi-armed_bandit
[20] Boltzmann Exploration: http://www.google.ru/url?sa=t&rct=j&q=Boltzmann+Exploration&source=web&cd=8&ved=0CGAQFjAH&url=http://www.cs.cmu.edu/afs/cs/academic/class/15381-s07/www/slides/050107reinforcementLearning1.pdf&ei=W9z6T-eIJ67P4QT7yOiNBw&usg=AFQjCNGS5W4uVzvSUg9oUyvRfoC9XNNG3A&cad=rjt
[21] Gaussian Exploration: http://www.google.ru/url?sa=t&rct=j&q=Gaussian+Exploration+policy&source=web&cd=1&ved=0CEwQFjAA&url=http://books.nips.cc/papers/files/nips23/NIPS2010_0606.pdf&ei=Ed36T4_AFMTT4QSmqODFBg&usg=AFQjCNHr0dQ-fr-d9ZlUnFMYT6ctWH-srQ&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&rct=j&q=&esrc=s&source=web&cd=3&ved=0CF8QFjAC&url=http://hci.iwr.uni-heidelberg.de/Staff/bgoldlue/fvia_ws_2011/fvia_ws_2011_02_gradient_descent.pdf&ei=W9_6T-eYOIqO4gSWtPCLBw&usg=AFQjCNGuMeWWZzuNcG5OceEx2zborgd-Tw
[35] Policy Gradients with Parameter Exploration (PGPE): http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CEgQFjAA&url=http://kyb.mpg.de/publications/attachments/Neural-Networks-2010-Sehnke_%5B0%5D.pdf&ei=q9_6T77ZGdSL4gTb1PjpBg&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
Нажмите здесь для печати.