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


    В рамках одного проекта столкнулся необходимостью работать с нейронными сетями, рассмотрел несколько вариантов, больше всего понравилась 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 ) являются:

    Сети


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

    Инструменты


    Дополнительно присутствуют программные инструменты, позволяющие реализовывать сопутствующие задачи:
    • Построение / Визуализация графиков
    • Поддержка 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) 
    


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




    Заключение


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

    P.S. Если есть поправки по названиям некоторых терминов, то я готов выслушать, не уверен в 100% точности пары переводов, возможно уже есть устоявшиеся названия.
    Метки:
    Поделиться публикацией
    Комментарии 22
    • +2
      Спасибо, только начал изучать питон и задумался, а есть ли реализация алгоритмов машинного обучения, а тут как раз ваша статья по теме!
      • +1
        В таком случае надеюсь PyBrain Вам понравится, и позволит реализовать что-нибудь занимательное
        • +5
          Могу еще посоветовать:
          • 0
            Это уже не нейронные сети, но тоже конечно Machine Learning.
            Может расширите Ваш комментарий аргументацией рекомендации именно этих двух проектов?
            • +3
              +1 к этим проектам. Чего тут комментировать) В scikit-learn собрана куча современных алгоритмов, довольно неплохо оптимизированных, и люди все это на практике используют. В PyBrain — только небыстрые и не супер-актуальные нейронные сети + довольно корявые биндинги для SVM, которые, похоже, не очень-то и поддерживаются. Даже если количество коммитов сравнить — в PyBrain их за последний год штук 10 было, в scikit-learn это сотни (по десятку в день), очень активный и хороший проект. Pandas не пользовался, но все хвалят очень.
          • –1
            При обцчении в ШАДе я искал различные библиотеки, реализующие алгоритмы машинного обучения. К сожалению, в большинстве реализованы обычно только базисные алгоритмы и каких-то продвинутостей нету.

            В данной библиотеке PyBrain удивительно много алгоритмов. Насколько удобно ими пользоваться — непонятно.
          • 0
            Когда я сел разбираться в нейронных сетях, то понял, что метод обратного распространения по сравнению с другими методами это как счёты по сравнению с суперкомпьютером. Для объяснения принципов и модельных примеров — пойдёт, для реальных задач он ужасен.
            • +2
              Сравнивали с fann? У них есть биндинги к python в комплекте, да и побыстрее должна быть.
              • +1
                К PyBrain можно прикручивать arac, который дает прирост производительности раз в 10. А вот с fann я как раз собираюсь сравнить.
                • 0
                  Я-бы использовал PyPy для JIT, более общий конечно вариант, по идее должен быть медленнее чем arac, просто смущает то, что последнее обновление для arac было больше двух лет назад
                • +1
                  Так… Вобщем сравнил. Субъективно libfann на порядок медленнее чем PyBrain + arac!
                  • 0
                    На порядок это серьёзно! Опишете процесс тестирования? Есть численные результаты (графики всегда эффектно выглядят)?
                    Сравнить со связкой PyPy + PyBrain не надумали?

                    А вообще, спасибо, что поделились. Такая информация может пригодится.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • +1
                    Девиз Java: «Зачем просто, когда можно сложно?»
                    • +1
                      Чушь. На любом языке можно создать фигню.
                      У меня мой проект сетей создается 1-й строчкой безо всяких фабрик.
                      BPNet net = new BPNet( 4, 100, Type.Sigma );

                      Загружаю данные.
                      net.LoadData( «C:\Net\datain.csv»)

                      Обучение
                      net.train( 100, TypeTrain.BP );

                      И что это доказывает? Да ничего…
                      Еще раз повторю, на любом языке можно написать плохо и хорошо.
                      • НЛО прилетело и опубликовало эту надпись здесь
                    • +3
                      У меня всегда с этим затык, может ТС объяснит как например файл разбирать нейронной сетью?
                      Например я хочу создать датасет из разнообразных слов и словосочетаний и определять спам по ним.
                      Пример простейшей байзановой сети я могу понять (матрица грубо говоря), а с нейронкой с ходу не выходит…
                      Хотя уверен с ней результаты были бы лучше для антиспама.
                      • 0
                        Я очень сомневаюсь что такую задачу нейросетями решить можно. Требуется много ресурсов, не гарантируется нахождение минимума, возможны блуждания в седловых точках. Насколько мне известно, наивные байесовский классификаторы используются для этой цели и показывают хорошие результаты.
                        • 0
                          Проблема Байеса — фальш-позитивы.
                          • 0
                            Ну как сказать, вот для Вас F1 score > 0.98 это достаточно или нет? А требуемое количество ресурсов, на порядок, а то и два больше стоит повышения F1 до 0.999?
                        • 0
                          Единственная статья на хабре, кроме моей, в которой упоминается PyBrain — http://habrahabr.ru/post/136237/ посмотрите, возможно приведённый в ней код поможет Вам разобраться как по log-файлам сеть тренировать
                        • +2
                          Есть еще хорошая библиотек NeuroLab, API которого сильно напоминает MatLab Neural Network Toolbox.

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