Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-07-31

Large-Scale Machine Learning & Example


А потом начались нейросети — Neural Networks.
Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning).
А потом нам рассказали про Support Vector Machines (SVMs) и Kernels.
А потом была неделя посвященная темам Clustering (K-Means) и Dimensionality Reduction (PCA).
А после были рассмотрены алгоритмы систем Anomaly Detection и Recommender Systems.

А потом наступила последняя, 10-я неделя обучения, на которой кратенько были рассмотрены способы масштабирования задач ML — Large-scale Machine Learning и, более подробно, пример решения практической задачи с применением инструментов ML.

Итак, Large-scale Machine Learning.

Под крупномасштабным обучением машин подразумевается необходимость переваривать огромные наборы данных, десятки, сотни миллионов записей в процессе обучения. Хотя профессор постоянно напоминал нам, что большинство задач можно решить не прибегая к сбору огромного количества данных, все-таки есть класс задач, в которых чем больше данных, тем лучше результат.
Некогда был проведен эксперимент, показывающий, что на решение задачи бОльшее влияние оказывает размер датасета, нежели алгоритм обучения.

В чем заключаются проблемы огромных датасетов? В том, что алгоритм будет слишком долго заниматься расчетами. К примеру, gradient descent итеративно (в смысле многократно) вычисляет суммы расчетов по всем записям датасета. А записей — миллионы и даже миллиарды. Это реально долго.

Поэтому есть рекомендация: перед тем как сражаться с миллиардами записей, проверьте, может быть будет достаточно выборки (случайной) меньшего размера, скажем, 1000 записей.

Как проверить — имеет ли смысл увеличение датасета? Просто. Использовать learning curves. Кривые обучения от размера датасета показывают оверфиттинг / high variance на малых датасетах? Значит увеличение датасета может помочь (а может и нет, надо и к этому быть готовым, увеличение датасета это не серебряная пуля).


Допустим, решено использовать огромный датасет.
Есть два основных подхода к перевариванию больших датасетов:
Stochastic Gradient Descent и
Map Reduce (data parallelizm)

Широко используемый в ML метод оптимизации (нахождение оптимума/минимума) Batch Gradient Descent становится неподъемным при обработке огромных датасетов. Вычислительно очень дорогим из-за необходимости крутить циклы вычислений по всем записям датасета.


Модификация BGD называется Stochastic Gradient Descent.
В этом алгоритме убираются циклы по записям и вместо них ставится вычисление по одной случайной записи датасета.

В итоге получается интересная картина. Вместо плавного продвижения к оптимуму наблюдается нервная пляска вокруг дороги к этому оптимуму.

В целом, стохастический GD движется к глобальному минимуму, но не всегда, не на каждом шаге. Вообще, вместо точного попадания в глобальный минимум, стохастический GD может бродить вокруг этого минимума. На практике это обычно не беда, это достаточно хорошее приближение. Зато быстро высчитывается.

Как много повторений внешнего цикла надо сделать? Это зависит от размера датасета и определяется сходимостью результата тета. Обычно хватает 1-10 повторений.

Компромиссом между Batch Gradient Descent и Stochastic Gradient Descent является Mini-batch Gradient Descent.
Мини-батч GD использует не все и не одну запись, он использует поднабор b (mini-batch size) записей датасета.

Хорошо векторизованная реализация мини-батч GD может обогнать по производительности стохастический GD.

Недостаток мини-батч GD в том, что у нас появляется еще один параметр b, надо уделять время на его подбор и проверку.

Stochastic Gradient Descent Convergence. А как подобрать learning rate альфа для стохастик GD? Как убедиться в безглючности стохастик GD? Сходится ли стохастик GD?
Для этого используем уже известную технику — рисование графика зависимости цены (ошибки) от количества итераций. Правильный график должен снижаться. В данном случае цена представляет собой среднее значение для последних, скажем, 1000 итераций.

Свойство стохастического GD (обработка по одной записи) используется в отдельном классе задач — Online Learning. Суть алгоритма решения таких задач в том, что мы имеем дело с потоком записей, обрабатываем их по мере поступления и выбрасываем, не сохраняем.

При большом потоке данных может быть выгоднее сделать онлайновое обучение, вместо сохранения датасетов для последующего использования. Особенно с учетом адаптации системы к меняющимся внешним условиям — отбрасывая старые записи мы получаем систему не учитывающую (грубо говоря) старые сведения, что отражает в результатах текущую коньюнктуру.




original post http://vasnake.blogspot.com/2014/07/large-scale-machine-learning-example.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)