x1o / lr-gd-r Goto Github PK
View Code? Open in Web Editor NEWLinear Regression Optimisation using Parallel Gradient Descent, in R
Linear Regression Optimisation using Parallel Gradient Descent, in R
В курсе статистики доказывается, что оптимальная оценка
Аналитический метод предпочтительней для случаев, когда данные помещаются в память. Ясно, что если
Наконец, градиентный спуск можно легко запараллелить, что будем делать в следующих тикетах.
system.time()
) и организуем в таблицу.Прирост в скорости может быть заметен при использовании больше двух нод. На макбуке с 12 ядрами автора задания удалось сократить время выполнения примерно в 1.5 раза на двух нодах по сравнению с одной, причем время исполнения продолжало уменьшаться вплоть до 12 нод. На 4-ядерном ThinkPad прирост производительности не был существенным.
Но вы можете использовать всю ту же технику для оптимизации более сложных моделей на неограниченно большом числе вычислительных узлов. Ура!
gd_step
, реализующую шаг градиентного спуска для заданного вектора параметров b
.gd_step
(шагов 200). risk
, считающую среднее квадрата разницы между f
на заданном векторе параметров и данным gd
. Теперь, однако, вдобавок к максимальному числу шагов добавим еще один критерий останова -- сначала надо придумать, какой! Есть по крайней мере два варианта, когда оптимизацию можно прекращать. gd
должна возвращать текущее значение риска, оценку plot_risk
, рисующую значения риска в зависимости от номера итерации.plot_risk
.f
на ней. Можно попробовать нарисовать то что получилось при помощи ggplot2::geom_contour
с aes(colour = after_stat(level))
и наложить сверху точки из make_X
, генерирующую f
, реализующую модель линейной регрессии.GGally::ggpairs
.Как можно было заметить по pairs,
См. также #3.
gd
, gd_step
под параллельное исполнение.Чтобы при разных выполнениях кода, генерирующего случайные значения, получать одинаковые результаты, удобно выполнить set.seed(1)
в самом начале.
В R можно делать параллельные вычисления различными способами. Нам нужен такой, который бы позволял запускать вычислительные ноды, копировать на них произвольные данные и держать из запущенными между итерациями градиентного спуска. Подойдет пакет parallel
, входящий в базовую поставку R, см. ?parallel::`parallel-package`
.
Рабочие ноды могут быть где угодно, но для нашего случая будем запускать ноды на рабочей машине в виде R процессов.
detectCores()
. Условно, будем использовать по одной ноде на одно ядро. Одно ядро оставим для остальной системы.cl <- makePSOCKcluster(n_workers)
. Тут удобно открыть свой менджер процессов и убедиться, что запустилось нужно количество R
сессий.clusterExport
. Удобно складывать все объекты во временное окружение, например так:temp_env <- new.env()
temp_env$x <- 1:10
temp_env$g <- function(x) sum(x)
clusterExport(cl, c('g', 'x'), envir = temp_env)
x
только на первую ноду:temp_env$x <- 1:5
clusterExport(cl[1], 'x', envir = temp_env)
g(x)
на всех кластерах, используем clusterEvalQ
: clusterEvalQ(cl, g(x))
Можно использовать и clusterCall
, и другие функции, но это сложно, потому что приходится особенным образом формировать выполняемую функцию (чтобы на каждую ноду не копировалось всё её окружение).
stopCluster(cl)
Другие пакеты для параллельного программирования:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.