В рамках одного проекта столкнулся необходимостью работать с нейронными сетями, рассмотрел несколько вариантов, больше всего понравилась PyBrain. Надеюсь её описание будет многим интересно почитать.
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 — это швейцарский армейский нож в области нейро-сетевых вычислений).
Библиотека построена по модульному принципу, что позволяет использовать её как студентам для обучения основам, так и исследователям, нуждающимся в реализации более сложных алгоритмов. Общая структура процедуры её использования приведена на следующей схеме:
Сама библиотека является продуктом с открытым исходным кодом и бесплатна для использования в любом проекте с единственно оговоркой, при её использовании для научных исследований, они просят добавлять в список цитируемых информационных источников (что народ и делает) следующую книгу:
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 ) являются:
- Алгоритмы обучения с учителем (Supervised Learning ).
- Метод обратного распространения ошибки (Back-Propagation)
- R-Prop (Resilient propagation)
- Support-Vector-Machines (интерфейс к сторонней библиотеке LIBSVM)
- Evolino
- Обучение без учителя (Black-Box Optimization / Evolutionary
Methods )- K-Means Clustering
- Метод главных компонент / Probabilistic Principal Component Analysis (PCA/pPCA)
- LSH для пространств Хамминга и Эвклида
- Deep Belief Networks
- Обучение с подкреплением (Reinforcement Learning)
- Стоимостные (Value-based)
- Q-Learning (с/без вычислением приемлемых путей)
- SARSA
- Neural Fitted Q-iteration
- Градиенты Политик (Policy Gradients)
- REINFORCE
- Natural Actor-Critic
- Стратегии исследования
- Epsilon-Greedy Exploration (дискретный)
- Boltzmann Exploration (дискретный)
- Gaussian Exploration (непрерывный)
- State-Dependent Exploration (непрерывный)
- Стоимостные (Value-based)
- Оптимизация методом чёрного ящика (Black-box Optimization)
- Hill-climbing
- Метод роя частиц (Particle Swarm Optimization (PSO)
- Эволюционная стратегия (Evolution Strategies(ES)
- Covariance Matrix Adaptation ES (CMA-ES)
- Natural Evolution Strategies (NES)
- Fitness Expectation-Maximization (FEM)
- Finite Difference Gradient Descent
- Policy Gradients with Parameter Exploration (PGPE)
- Simultaneous Perturbation Stochastic Approximation (SPSA)
- Генетический алгоритм / Genetic Algorithms (GA)
- Competitive Co-Evolution
- Memetic Search (Inner/Inverse)
- Многокритериальная оптимизация / Multi-Objective Optimization NSGA-II
Сети
PyBrain оперирует сетевыми структурами, которые могут быть использованы для построения практически всех поддерживаемых библиотекой сложных алгоритмов. В качестве примера можно привести:
- Сети прямого распространения, включая Deep Belief Networks и Restricted Boltzmann Machines (RBM)
- Рекуррентные нейронные сети ( Recurrent networks — RNN), включая архитектуру Long Short-Term Memory (LSTM)
- Multi-Dimensional Recurrent Networks (MDRNN)
- Сети Кохонена / Self-Organizing Maps
- Reservoirs
- Нейронная сеть Коско / Bidirectional networks
- Создание топологий собственной структуры
Инструменты
Дополнительно присутствуют программные инструменты, позволяющие реализовывать сопутствующие задачи:
- Построение / Визуализация графиков
- Поддержка netCDF
- Запись/чтение XML
Установка библиотеки
Перед установкой Pybrain, создатели рекомендуют установить следующие библиотеки:
Setuptools — пакетный менеджер для Python, который значительно упрощает установку новых библиотек. Для его установки рекомендуется скачать и выполнить (python ez_setup.py) этот скрипт.
После установки у Вас появиться возможность использовать команду
easy_install
для установки новых библиотек.
Сразу воспользуемся ими и установим два необходимых пакета:
$ easy_install scipy
$ easy_install matplotlib
Далее устанавливается сама PyBrain
- Либо используем репозиторий с github
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'>
Скрытые слои поименованы с номером слоя добавленным к имени.
Возможности при создании сети
Конечно в большинстве случаев, созданная нейронная сеть должна иметь другие характеристики, нежели заданные по умолчанию. Для этого существуют разнообразные возможности. К примеру, по умолчанию скрытый слой создаётся с использованием сигмоидной функции активации, для задания другого её типа возможно использовать следующие константы:
- 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 файла.
# 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)
Немного ссылок:
- Как сохранить и загрузить сеть в PyBrain?
- Создание сети собственной структуры в PyBrain.
- Как я могу следить за процессом обучения сети в PyBrain?
- Как вывести полученную сеть (узлы и дуги) в PyBrain?
- Как загрузить тренировочное множество в PyBrain?
- Небольшой How to start, статья 2010 года.
- Ещё один, также от 2010.
Заключение
В заключении хочу сказать, что эта библиотека производит очень хорошее впечатление, работать с ней удобно, описания алгоритмов получаются компактные, но не теряют понятности в дебрях кода.
P.S. Если есть поправки по названиям некоторых терминов, то я готов выслушать, не уверен в 100% точности пары переводов, возможно уже есть уставившиеся термины.
Автор: Pavel_Osipov