- 19 марта 2016 г.
- Василис Вриниотис
- . 1 Комментарий
Я очень рад сообщить, что после нескольких месяцев разработки вышла новая версия Datumbox! Версия 0.7.0 включает поддержку многопоточности, быстрое обучение на диске для наборов данных, которые не помещаются в памяти, несколько усовершенствований алгоритмов и улучшенную архитектуру. Загрузите его сейчас с Гитхаб или Центральный репозиторий Maven.
В центре внимания версия 0.7.0 наконец-то внедрить поддержку многопоточности в фреймворк и сделать обучение на диске сверхбыстрым. Кроме того, он приносит несколько алгоритмических улучшений во все алгоритмы на основе регрессии, модель совместной фильтрации и экстрактор N-грамм, который используется в приложениях NLP. Архитектура фреймворка была переработана, чтобы разделить проект на несколько модулей (обратите внимание, что ArtifactId основной библиотеки теперь Datumbox-framework-lib) и упростить его структуру. Наконец, новая версия содержит несколько улучшений кода, улучшенную документацию в виде javadocs и улучшенное тестовое покрытие.
Версия фреймворка 0.7.0 не имеет обратной совместимости с веткой 0.6.x. Это связано с тем, что потребовалась серьезная переработка, чтобы добавить новые функции, а также улучшить и упростить архитектуру фреймворка. Ниже я подробно расскажу о новых функциях:
Поддержка многопоточности
Новый фреймворк в несколько раз быстрее ветки 0.6.x. Это было достигнуто за счет использования потоков, тщательного профилирования горячих точек кода и перезаписи основных компонентов, чтобы обеспечить неблокирующие одновременные операции чтения/записи. В настоящее время потоки используются во всех алгоритмах, которые можно распараллелить, что составляет большинство поддерживаемых моделей фреймворка. Параллельное выполнение поддерживается как при обучении, так и при тестировании/прогнозировании.
В проекте используется множество функций Java 8, чтобы уменьшить многословность кода, улучшить читаемость и модернизировать кодовую базу. Обратите внимание, что несмотря на то, что фреймворк интенсивно использует потоки, все задачи выполняются в собственном пуле ForkJoinPool, чтобы гарантировать, что они не застрянут. Уровень параллелизма контролируется либо программным изменением объекта ConcurrencyConfiguration, либо настройкой файла datumbox.config.properties.
Дисковое обучение
Несмотря на то, что обучение на диске (обучение моделей без загрузки данных в память) было возможно, начиная с версии 0.6.0, оно было настолько медленным, что сделало эту функцию практически непригодной для использования. В версии 0.7.0 механизм Storage Engine был переработан, чтобы обеспечить гибридный подход к хранению горячих/регулярно используемых записей в памяти и LRU-кэше, при сохранении остальных на диске. Этот подход делает обучение на диске очень быстрым, и его следует отдавать предпочтение даже в тех случаях, когда данные едва помещаются в памяти (очевидно, если данные легко помещаются в ОЗУ, предпочтение следует отдавать обучению в памяти по умолчанию). Как и в предыдущей версии, конфигурацию хранилища памяти можно изменить программно, изменив соответствующие объекты DatabaseConfiguration или настроив файл datumbox.config.properties.
Здесь я хотел бы отметить, что эта функция была бы невозможна без потрясающей работы, проделанной Яном Котеком над MapDB. MapDB — это встроенный механизм базы данных Java, который предоставляет параллельные Карты, поддерживаемые дисковым хранилищем и внешней памятью. Используя его библиотеку с открытым исходным кодом, я смог разработать Storage Engine, который позволяет Datumbox обрабатывать несколько ГБ обучающих данных на моем ноутбуке, не загружая их в память.
Алгоритмические улучшения
В новой версии добавлена поддержка регуляризации L1, L2 и ElasticNet в моделях SoftMaxRegression (многономиальная логистическая регрессия), OrdinalRegression и NLMS (линейная регрессия). Это означает, что, используя одни и те же стандартные классы, можно выполнять регрессию гребня, регрессию лассо или использовать эластичные сети. Кроме того, в новой версии алгоритм совместной фильтрации был изменен для поддержки более общих моделей CF типа «пользователь-пользователь». Наконец, алгоритм NgramsExtractor был переписан, чтобы он мог экспортировать больше ключевых слов и обеспечивать более высокие оценки.
Архитектура фреймворка и улучшения кода
Еще одним важным обновлением новой структуры является тот факт, что проект был разделен на несколько подмодулей. Ниже я перечисляю поддерживаемые в настоящее время модули, названные в честь их артефактов:
- Datumbox-фреймворк-общий: Он содержит наиболее важные интерфейсы, вспомогательные и служебные классы, структуры данных и механизмы фреймворка. Этот модуль не содержит никаких алгоритмов, но является основой фреймворка.
- Datumbox-фреймворк-ядро: Он состоит из 3 основных слоев структуры (машинное обучение, статистика и математика), а также уровня утилит. Этот модуль содержит все алгоритмы, методы и статистические тесты фреймворка.
- Datumbox-фреймворк-приложения: Он содержит список классов, которые созданы для того, чтобы предлагать готовые решения для общих задач машинного обучения, таких как классификация текста, моделирование данных и т. д. Все классы модуля построены поверх основного модуля.
- Datumbox-фреймворк-библиотека: Это платформа машинного обучения Datumbox! Обратите внимание, что ArtiftId библиотеки изменился с «datumbox-framework» на «datumbox-framework-lib» в результате реструктуризации.
В дополнение к вышеупомянутым модулям у нас есть родительский модуль «datumbox-framework», который больше не является библиотекой Java, а просто объединяет все подмодули в рамках одного проекта. Чтобы использовать новую структуру в проектах Maven, добавьте в файл pom.xml следующие строки:
<dependencies>
...
<dependency>
<groupId>com.datumbox</groupId>
<artifactId>datumbox-framework-lib</artifactId>
<version>0.7.0</version>
</dependency>
...
</dependencies>
Новая версия вносит серьезные изменения в структуру фреймворка, интерфейсы и наследование с основной целью упростить и улучшить его архитектуру. Одним из критических изменений, внесенных в новую структуру, является отказ от использования старого класса Dataset (который использовался для хранения всех данных обучения и тестирования в среде) и введение класса Dataframe. Класс Dataframe реализует интерфейс Collection, позволяет изменять и удалять записи, а также обеспечивает параллельную обработку записей. Еще одно важное изменение заключается в том, что BaseMLrecommender, который является базовым классом для всех алгоритмов системы рекомендаций, теперь наследуется от BaseMLmodel.
В дополнение к вышеупомянутым изменениям платформа включает в себя некоторые улучшения кода и исправления ошибок: в каждый сериализуемый класс добавлен serialVersionUID, улучшены исключения и сообщения об ошибках, а также документация javadocs и тестовое покрытие. Для получения дополнительной информации об обновлениях новой версии см. Список изменений.
Datumbox 0.7.0 завершил несколько важных этапов первоначально предложенной дорожной карты. Разработка структуры продолжится в следующие месяцы для решения следующих задач:
- Доступ к платформе через консоль или Python: Фреймворк должен стать более доступным для разработчиков, не использующих Java. Для этого он должен предоставлять доступ к алгоритмам через командную строку или предлагать API на других языках, таких как Python.
- Новые алгоритмы машинного обучения: По мере того, как архитектура фреймворка становится более зрелой, будет проще увеличивать количество поддерживаемых алгоритмов и включать такие модели, как смесь гауссианов, гауссовские процессы, k-NN, деревья решений, случайные леса, факторный анализ, SVD, машины факторизации. , искусственные нейронные сети и т. д.
- Дополнительные механизмы хранения: Пользователям фреймворка должно быть предложено больше возможностей для хранения своих моделей и обучения своих алгоритмов без загрузки всех данных в память. Более того, тем, кто хочет перенести модель с одного механизма хранения на другой, должны быть предоставлены лучшие инструменты.
- Улучшить документацию, тестовое покрытие и примеры кода: Несмотря на то, что javadocs и покрытие тестами улучшаются с каждым выпуском, документация фреймворка по-прежнему оставляет желать лучшего. Следующие версии должны предоставить лучшую документацию, лучшее тестовое покрытие и больше примеров того, как использовать поддерживаемые алгоритмы.
Учитывая, что у меня постоянная работа, ожидаю, что развитие фреймворка будет продолжаться такими же темпами, выпуская новую версию каждые 4-6 месяцев. Если вы хотите предложить новую веху, не стесняйтесь открыть вопрос в официальном репозитории Github. И последнее, но не менее важное: если вы используете проект, пожалуйста, подумайте о том, чтобы внести свой вклад. Неважно, являетесь ли вы Java-разработчиком-ниндзя, рок-звездой Data Scientist или опытным пользователем библиотеки; Я могу использовать всю помощь, которую я могу получить, так что не стесняйтесь свяжитесь со мной.
Еще раз хочу поблагодарить моего друга и коллегу Элефтериос Бампалетакис за помощь в улучшении архитектуры фреймворка его отзывы были неоценимы. Также я хотел бы поблагодарить Яна Котека за бесплатную консультацию по эффективному использованию MapDB и для открытого исходного кода такого удивительного продукта. Кроме того, большое спасибо ej-technologies GmbH и JetBrains за предоставление лицензий на их замечательные инструменты. JProfiler и IntelliJ ИДЕЯ; они оба предлагают замечательные продукты, которые очень помогли развитию фреймворка. И последнее, но не менее важное: я хотел бы поблагодарить любовь всей моей жизни, Кириаки, за поддержку и терпение во время написания проекта.
Не забудьте клонировать код Datumbox v0.7.0 из Гитхаб. Библиотека доступна также на Центральный репозиторий Maven. Также ознакомьтесь с Подробным руководством по установке и Примеры кода чтобы узнать больше о том, как использовать фреймворк.
Жду ваших комментариев и рекомендаций. Пулл-реквесты всегда приветствуются! 🙂