Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Для одной и той же модели машинного обучения могут потребоваться разные ограничения, веса или скорости обучения для обобщения различных шаблонов данных. Эти меры называются гиперпараметрами и должны быть настроены так, чтобы модель могла оптимально решить проблему машинного обучения. Оптимизация гиперпараметров находит кортеж гиперпараметров, который дает оптимальную модель, которая минимизирует предопределенную функцию потерь для заданных независимых данных. [1] Целевая функция принимает кортеж гиперпараметров и возвращает соответствующие потери. [1] Для оценки эффективности обобщения часто используется перекрестная проверка . [2]

Подходы [ править ]

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

Поиск по сетке [ править ]

Традиционным способом выполнения гиперпараметрической оптимизации был поиск по сетке или поиск по параметрам , который представляет собой просто исчерпывающий поиск по заданному вручную подмножеству гиперпараметрического пространства алгоритма обучения. Алгоритм поиска по сетке должен руководствоваться некоторой метрикой производительности, обычно измеряемой перекрестной проверкой на обучающем наборе [3] или оценкой на удерживаемом проверочном наборе. [4]

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

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

Затем поиск по сетке обучает SVM с каждой парой ( C , γ) в декартовом произведении этих двух наборов и оценивает их производительность на удерживаемом наборе проверки (или путем внутренней перекрестной проверки на обучающем наборе, в этом случае несколько SVM обучаются в паре). Наконец, алгоритм поиска по сетке выводит настройки, которые достигли наивысшего балла в процедуре проверки.

Поиск по сетке страдает проклятием размерности , но часто до неловкости параллелен, потому что настройки гиперпараметров, которые он оценивает, обычно не зависят друг от друга. [2]

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

Случайный поиск [ править ]

Случайный поиск заменяет исчерпывающий перечень всех комбинаций случайным их выбором. Это может быть просто применено к дискретной настройке, описанной выше, но также распространяется на непрерывные и смешанные пространства. Он может превзойти поиск по сетке, особенно когда только небольшое количество гиперпараметров влияет на конечную производительность алгоритма машинного обучения. [2] В этом случае говорят, что задача оптимизации имеет низкую внутреннюю размерность. [5] Случайный поиск также досадно параллелен и дополнительно позволяет включить предварительные знания, указав распределение, из которого следует производить выборку.

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

Байесовская оптимизация [ править ]

Байесовская оптимизация - это метод глобальной оптимизации для зашумленных функций черного ящика. Применительно к оптимизации гиперпараметров байесовская оптимизация строит вероятностную модель отображения функций от значений гиперпараметров к цели, оцениваемой на проверочном наборе. Посредством итеративной оценки многообещающей конфигурации гиперпараметров на основе текущей модели и последующего ее обновления байесовская оптимизация направлена ​​на сбор наблюдений, раскрывающих как можно больше информации об этой функции и, в частности, о местонахождении оптимума. Он пытается сбалансировать разведку (гиперпараметры, для которых результат наиболее неопределен) и эксплуатацию (ожидаемые гиперпараметры близки к оптимуму). На практике байесовская оптимизация была показана [6] [7] [8] [9] для получения лучших результатов при меньшем количестве оценок по сравнению с поиском по сетке и случайным поиском, благодаря возможности оценить качество экспериментов до их проведения.

Оптимизация на основе градиента [ править ]

Для конкретных алгоритмов обучения можно вычислить градиент относительно гиперпараметров, а затем оптимизировать гиперпараметры с помощью градиентного спуска. Первое использование этих методов было сосредоточено на нейронных сетях. [10] С тех пор эти методы были распространены на другие модели, такие как опорные векторные машины [11] или логистическая регрессия. [12]

Другой подход к получению градиента относительно гиперпараметров состоит в дифференцировании шагов итеративного алгоритма оптимизации с использованием автоматического дифференцирования . [13] [14] [15]

Эволюционная оптимизация [ править ]

Эволюционная оптимизация - это методика глобальной оптимизации шумных функций черного ящика. В оптимизации гиперпараметров эволюционная оптимизация использует эволюционные алгоритмы для поиска пространства гиперпараметров для данного алгоритма. [7] Эволюционная оптимизация гиперпараметров следует процессу, вдохновленному биологической концепцией эволюции :

  1. Создайте начальную совокупность случайных решений (т. Е. Случайным образом сгенерируйте кортежи гиперпараметров, обычно 100+)
  2. Оцените кортежи гиперпараметров и получите их функцию пригодности (например, 10-кратную точность перекрестной проверки алгоритма машинного обучения с этими гиперпараметрами)
  3. Ранжируйте кортежи гиперпараметров по их относительной пригодности
  4. Заменить кортежи гиперпараметров с наихудшими показателями новыми кортежами гиперпараметров, созданными посредством кроссовера и мутации.
  5. Повторяйте шаги 2-4 до тех пор, пока не будет достигнута удовлетворительная производительность алгоритма или производительность алгоритма больше не улучшится

Эволюционная оптимизация использовалась в оптимизации гиперпараметров для алгоритмов статистического машинного обучения, [7] автоматизированного машинного обучения , типичной нейронной сети [16] и поиска архитектуры глубокой нейронной сети , [17] [18], а также для обучения весов в глубоких нейронных сетях. сети. [19]

На основе населения [ править ]

Обучение на основе населения (PBT) изучает как значения гиперпараметров, так и веса сети. Несколько процессов обучения работают независимо, используя разные гиперпараметры. Как и в случае с эволюционными методами, плохо работающие модели итеративно заменяются моделями, которые принимают модифицированные значения гиперпараметров и веса на основе лучших исполнителей. Эта замещающая модель теплого пуска является основным отличием PBT от других эволюционных методов. Таким образом, PBT позволяет гиперпараметрам развиваться и устраняет необходимость в ручной настройке. Процесс не делает никаких предположений относительно архитектуры модели, функций потерь или процедур обучения. [20]

На основе ранней остановки [ править ]

Класс алгоритмов оптимизации гиперпараметров на основе ранней остановки специально создан для больших пространств поиска непрерывных и дискретных гиперпараметров, особенно когда вычислительные затраты для оценки производительности набора гиперпараметров высоки. Irace реализует повторяющийся гоночный алгоритм, который фокусирует поиск вокруг наиболее многообещающих конфигураций, используя статистические тесты, чтобы отбросить те, которые работают плохо. [21] [22] Другой алгоритм оптимизации гиперпараметров на ранней стадии - это последовательное сокращение вдвое (SHA), [23] которое начинается как случайный поиск, но периодически сокращает малоэффективные модели, тем самым фокусируя вычислительные ресурсы на более перспективных моделях. Асинхронное последовательное сокращение вдвое (ASHA) [24]дополнительно улучшает профиль использования ресурсов SHA, устраняя необходимость синхронной оценки и сокращения низкопроизводительных моделей. Hyperband [25] - это алгоритм более высокого уровня, основанный на ранней остановке, который вызывает SHA или ASHA несколько раз с различными уровнями агрессивности отсечения, чтобы быть более широко применимым и с меньшим количеством требуемых входных данных.

Другое [ править ]

Также были развиты RBF [26] и спектральный [27] подходы.

Программное обеспечение с открытым исходным кодом [ править ]

Поиск по сетке [ править ]

  • Определено , платформа обучения DL включает поиск по сетке для моделей PyTorch и TensorFlow (Keras и Estimator).
  • H2O AutoML обеспечивает поиск по сетке по алгоритмам в библиотеке машинного обучения с открытым исходным кодом H2O.
  • Катиб система Kubernetes-носителей , которые включают в себя поиск сетки.
  • scikit-learn - это пакет Python, который включает поиск по сетке .
  • Талос включает поиск по сетке для Кераса .
  • Tune - это библиотека Python для настройки распределенных гиперпараметров и поддержка поиска по сетке.

Случайный поиск [ править ]

  • Determined - это платформа обучения DL, которая поддерживает случайный поиск моделей PyTorch и TensorFlow (Keras и Estimator).
  • Hyperopt , также через hyperas и hyperopt-sklearn , - это пакеты Python, которые включают случайный поиск.
  • Катиб является Kubernetes-нативной системой , которая включает в себя случайный поиск.
  • scikit-learn - это пакет Python, который включает случайный поиск.
  • caret - это пакет R, который включает сетку и случайный поиск.
  • Талос включает настраиваемый случайный поиск Кераса .
  • Tune - это библиотека Python для настройки распределенных гиперпараметров, которая поддерживает случайный поиск по произвольным распределениям параметров.

Байесовский [ править ]

  • Auto-sklearn [28] - это слой оптимизации байесовских гиперпараметров поверх scikit-learn .
  • Ax [29] - это платформа для экспериментов на Python, которая поддерживает байесовскую оптимизацию и бандитскую оптимизацию в качестве исследовательских стратегий.
  • BOCS - это пакет Matlab, который использует полуопределенное программирование для минимизации функции черного ящика над дискретными входами. [30] Также включена реализация Python 3.
  • HpBandSter - это пакет Python, который сочетает байесовскую оптимизацию с методами, основанными на бандитах . [31]
  • Катиб является Kubernetes-нативной системой , которая включает в себя Байесовскую оптимизацию.
  • mlrMBO , также с mlr , представляет собой пакет R для основанной на модели / байесовской оптимизации функций черного ящика.
  • optuna - это пакет Python для оптимизации черного ящика, совместимый с произвольными функциями, которые необходимо оптимизировать.
  • scikit-optimize - это пакет Python или последовательная оптимизация на основе модели с интерфейсом scipy.optimize. [32]
  • SMAC SMAC - это библиотека Python / Java, реализующая байесовскую оптимизацию. [33]
  • tuneRanger - это пакет R для настройки случайных лесов с использованием оптимизации на основе модели.

Оптимизация на основе градиента [ править ]

  • FAR-HO - это пакет Python, содержащий реализации и оболочки Tensorflow для оптимизации гиперпараметров на основе градиента с алгоритмической дифференциацией в прямом и обратном режимах.
  • XGBoost - это программная библиотека с открытым исходным кодом, которая обеспечивает структуру повышения градиента для C ++, Java, Python, R и Julia.

Эволюционный [ править ]

  • ОЭАП является рамочным Python для общего эволюционного вычисления , который является гибким и интегрируется с распараллеливания пакетами , как совок и pyspark и других структур Python , как sklearn через sklearn-ОЭАП .
  • Determined - это платформа обучения DL, которая поддерживает PBT для оптимизации моделей PyTorch и TensorFlow (Keras и Estimator).
  • devol - это пакет Python, который выполняет поиск архитектуры глубокой нейронной сети с использованием генетического программирования .
  • nevergrad [34] - это пакет Python, который включает Differential_evolution , Evolution_strategy , Bayesian_optimization , методы контроля численности для шумного случая и Particle_swarm_optimization . [35]
  • Tune - это библиотека Python для настройки распределенных гиперпараметров, которая использует nevergrad для поддержки эволюционных алгоритмов.

Ранняя остановка [ править ]

  • Determined - это платформа обучения DL, которая поддерживает Hyperband для моделей PyTorch и TensorFlow (Keras и Estimator).
  • irace - это пакет R, который реализует повторяющийся гоночный алгоритм. [21] [22]
  • Катиб система Kubernetes-носителей , которая включает гиперполосную.

Другое [ править ]

  • Determined - это платформа обучения DL, которая поддерживает подходы случайного, сеточного, PBT, Hyperband и NAS к оптимизации гиперпараметров для моделей PyTorch и TensorFlow (Keras и Estimator).
  • dlib [36] - это пакет C ++ с API Python, в котором есть оптимизатор без параметров, основанный на LIPO, и оптимизаторы доверенной области, работающие в тандеме. [37]
  • Harmonica - это пакет Python для оптимизации спектральных гиперпараметров. [27]
  • Hyperopt , также через hyperas и hyperopt-sklearn , представляют собой пакеты Python, которые включают оптимизацию распределенных гиперпараметров на основе Tree of Parzen Estimators .
  • Катиб является Kubernetes родной системы , которая включает в себя сетку, случайный поиск, Байесовский оптимизация, гиперполосный и NAS на основе обучения с подкреплением.
  • nevergrad [34] - это пакет Python для оптимизации без градиента с использованием таких методов, как дифференциальная эволюция, последовательное квадратичное программирование, fastGA, адаптация ковариационной матрицы, методы контроля населения и оптимизация роя частиц. [35]
  • Neural Network Intelligence (NNI) - это пакет Python, который включает настройку гиперпараметров для нейронных сетей в локальных и распределенных средах. Его методы включают TPE, случайный, отжиг, эволюцию, SMAC, пакетный, сеточный и гиперполосный.
  • параметр-sherpa - аналогичный пакет Python, который включает несколько методов поиска по сетке, байесовскую и генетическую оптимизацию
  • photonai - это высокоуровневый Python API для проектирования и оптимизации конвейеров машинного обучения на основе сетки, случайного поиска и байесовской оптимизации.
  • pycma - это реализация Python стратегии эволюции адаптации ковариационной матрицы .
  • rbfopt представляет собой пакет Python , который использует радиальную базисную функцию модели [26]
  • Tune - это библиотека Python для выполнения настройки гиперпараметров, которая интегрирует / масштабирует многие существующие библиотеки оптимизации гиперпараметров, такие как hyperopt , nevergrad и scikit-optimize .

Коммерческие услуги [ править ]

  • Amazon Sagemaker использует гауссовские процессы для настройки гиперпараметров.
  • BigML OptiML поддерживает смешанные поисковые домены
  • Google HyperTune поддерживает смешанные поисковые домены
  • Indie Solver поддерживает многокритериальную оптимизацию, а также оптимизацию ограничений.
  • Mind Foundry OPTaaS поддерживает смешанные домены поиска, многоцелевые, ограничения, параллельную оптимизацию и суррогатные модели.
  • SigOpt поддерживает домены смешанного поиска, многоцелевые, мультирешения, множественность, ограничения (линейные и черные ящики) и параллельную оптимизацию.

См. Также [ править ]

  • Автоматизированное машинное обучение
  • Поиск нейронной архитектуры
  • Мета-оптимизация
  • Выбор модели
  • Самонастройка
  • XGBoost

Ссылки [ править ]

  1. ^ a b Claesen, Марк; Барт Де Мур (2015). «Поиск гиперпараметров в машинном обучении». arXiv : 1502.02127 [ cs.LG ].
  2. ^ a b c Бергстра, Джеймс; Бенжио, Йошуа (2012). «Случайный поиск для оптимизации гиперпараметров» (PDF) . Журнал исследований в области машинного обучения . 13 : 281–305.
  3. Перейти ↑ Chin-Wei Hsu, Chih-Chung Chang и Chih-Jen Lin (2010). Практическое руководство по классификации векторов . Технический отчет, Национальный университет Тайваня .
  4. ^ Chicco D (декабрь 2017 г.). «Десять быстрых советов по машинному обучению в вычислительной биологии» . BioData Mining . 10 (35): 35. DOI : 10,1186 / s13040-017-0155-3 . PMC 5721660 . PMID 29234465 .  
  5. ^ Ziyu, Ван; Фрэнк, Хаттер; Масрур, Зоги; Дэвид, Мэтисон; Нандо, де Фейтас (2016). «Байесовская оптимизация в миллиард размерностей с помощью случайных вложений». Журнал исследований искусственного интеллекта . 55 : 361–387. arXiv : 1301. 1942 . DOI : 10.1613 / jair.4806 .
  6. ^ Хаттер, Фрэнк; Хус, Хольгер; Лейтон-Браун, Кевин (2011), «Последовательная оптимизация на основе моделей для общей конфигурации алгоритма» (PDF) , Обучение и интеллектуальная оптимизация , Лекционные заметки по информатике, 6683 : 507–523, CiteSeerX 10.1.1.307.8813 , doi : 10.1007 / 978-3-642-25566-3_40 , ISBN   978-3-642-25565-6
  7. ^ a b c Бергстра, Джеймс; Барденет, Реми; Бенхио, Йошуа; Кегл, Балаш (2011), "Алгоритмы для оптимизации гиперпараметров" (PDF) , Достижения в системах обработки нейронной информации
  8. ^ Снук, Джаспер; Ларошель, Хьюго; Адамс, Райан (2012). «Практическая байесовская оптимизация алгоритмов машинного обучения» (PDF) . Достижения в системах обработки нейронной информации . arXiv : 1206.2944 . Bibcode : 2012arXiv1206.2944S .
  9. ^ Торнтон, Крис; Хаттер, Фрэнк; Хус, Хольгер; Лейтон-Браун, Кевин (2013). «Auto-WEKA: Комбинированный выбор и гиперпараметрическая оптимизация алгоритмов классификации» (PDF) . Открытие знаний и интеллектуальный анализ данных . arXiv : 1208.3719 . Bibcode : 2012arXiv1208.3719T .
  10. ^ Ларсен, Ян; Хансен, Ларс Кай; Сварер, Клаус; Олссон, М. (1996). «Дизайн и регуляризация нейронных сетей: оптимальное использование набора для проверки» (PDF) . Труды семинара Общества обработки сигналов IEEE 1996 г . : 62–71. CiteSeerX 10.1.1.415.3266 . DOI : 10.1109 / NNSP.1996.548336 . ISBN   0-7803-3550-3.
  11. ^ Оливье Шапель; Владимир Вапник; Оливье Буске; Саян Мукерджи (2002). «Выбор нескольких параметров для опорных векторных машин» (PDF) . Машинное обучение . 46 : 131–159. DOI : 10.1023 / а: 1012450327387 .
  12. ^ Чуонг Б; Чуан-Шэн Фу; Эндрю И Нг (2008). «Эффективное обучение множеству гиперпараметров для лог-линейных моделей» (PDF) . Достижения в системах обработки нейронной информации 20 .
  13. ^ Домке, Джастин (2012). «Общие методы моделирования на основе оптимизации» (PDF) . Аистатс . 22 .
  14. ^ Маклорен, Дуглас; Дювено, Давид; Адамс, Райан П. (2015). «Оптимизация гиперпараметров на основе градиента посредством обратимого обучения». arXiv : 1502.03492 [ stat.ML ].
  15. ^ Франчески, Лука; Донини, Микеле; Фраскони, Паоло; Понтил, Массимилиано (2017). «Прямая и обратная гиперпараметрическая оптимизация на основе градиента» (PDF) . Материалы 34-й Международной конференции по машинному обучению . arXiv : 1703.01785 . Bibcode : 2017arXiv170301785F .
  16. ^ Kousiouris G, Cuccinotta T, Varvarigou T (2011). «Влияние планирования, типа рабочей нагрузки и сценариев консолидации на производительность виртуальных машин и их прогнозирование с помощью оптимизированных искусственных нейронных сетей» . Журнал систем и программного обеспечения . 84 (8): 1270–1291.
  17. ^ Miikkulainen R, Liang J, Meyerson E, Rawal A, Fink D, Francon O, Raju B, Shahrzad H, Navruzyan A, Duffy N, Hodjat B (2017). «Развивающиеся глубокие нейронные сети». arXiv : 1703.00548 [ cs.NE ].
  18. ^ Jaderberg М, Далибар В, Osindero S, Чарнецкий WM, Донахью J, Разави А, Vinyals О, Т Зеленый, Данинг я, Симонян К, Фернандо С, Kavukcuoglu К (2017). «Обучение нейронных сетей на основе популяции». arXiv : 1711.09846 [ cs.LG ].
  19. ^ Такой FP, Madhavan V, Conti E, Lehman J, Stanley KO, Clune J (2017). «Глубокая нейроэволюция: генетические алгоритмы - конкурентоспособная альтернатива для обучения глубоких нейронных сетей для обучения с подкреплением». arXiv : 1712.06567 [ cs.NE ].
  20. ^ Ли, Анг; Спайра, Ола; Перель, Саги; Далибард, Валентин; Ядерберг, Макс; Гу, Чэньцзе; Бадден, Дэвид; Харли, Тим; Гупта, Прамод (05.02.2019). «Обобщенная структура для обучения населения». arXiv : 1902.01894 [ cs.AI ].
  21. ^ a b Лопес-Ибаньес, Мануэль; Дюбуа-Лакост, Жереми; Перес Касерес, Лесли; Штюцле, Томас; Бираттари, Мауро (2016). «Пакет irace: повторяющиеся гонки для автоматической настройки алгоритма» . Перспектива исследования операций (3): 43–58. DOI : 10.1016 / j.orp.2016.09.002 .
  22. ^ a b Бираттари, Мауро; Штюцле, Томас; Пакете, Луис; Варрентрапп, Клаус (2002). «Гоночный алгоритм для настройки метаэвристики». GECCO 2002 : 11–18.
  23. ^ Джеймисон, Кевин; Талвалкар, Амит (27 февраля 2015 г.). «Нестохастическая идентификация наилучшего плеча и оптимизация гиперпараметров». arXiv : 1502.07943 [ cs.LG ].
  24. ^ Ли, Лиам; Джеймисон, Кевин; Ростамизаде, Афшин; Гонина, Екатерина; Хардт, Мориц; Рехт, Бенджамин; Талвалкар, Амит (16 марта 2020 г.). «Система для параллельной настройки гиперпараметров». arXiv : 1810.05934v5 .
  25. ^ Ли, Лиша; Джеймисон, Кевин; ДеСальво, Джулия; Ростамизаде, Афшин; Талвалкар, Амит (16 марта 2020 г.). «Hyperband: новый бандитский подход к оптимизации гиперпараметров». arXiv : 1603.06560v4 .
  26. ^ a b Диас, Гонсало; Фокуэ, Ахилл; Нанничини, Джакомо; Самуловиц, Хорст (2017). «Эффективный алгоритм гиперпараметрической оптимизации нейронных сетей». arXiv : 1705.08520 [ cs.AI ].
  27. ^ а б Хазан, Эльад; Кливанс, Адам; Юань, Ян (2017). «Оптимизация гиперпараметров: спектральный подход». arXiv : 1706.00764 [ cs.LG ].
  28. ^ Feurer М, Клейн А, Eggensperger К, Springenberg Дж, Блюм М, Хуттер F (2015). «Эффективное и надежное автоматизированное машинное обучение» . Достижения в системах обработки нейронной информации 28 (NIPS 2015) : 2962–2970.
  29. ^ «Открытый исходный код Axe и BoTorch: новые инструменты ИИ для адаптивного экспериментирования» . 2019.
  30. ^ Баптиста, Рикардо; Полочек, Маттиас (2018). «Байесовская оптимизация комбинаторных структур». arXiv : 1806.08838 [ stat.ML ].
  31. ^ Фолкнер, Стефан; Кляйн, Аарон; Хаттер, Фрэнк (2018). «BOHB: надежная и эффективная оптимизация гиперпараметров в масштабе». arXiv : 1807.01774 [ stat.ML ].
  32. ^ "документация skopt API" . scikit-optimize.github.io .
  33. ^ Hutter F, Hoos HH, Leyton-Brown K. "Последовательная оптимизация на основе модели для общей конфигурации алгоритма" (PDF) . Материалы конференции по обучению и интеллектуальной оптимизации (LION 5) .
  34. ^ a b "[ВОПРОС] Как использовать для оптимизации гиперпараметров NN · Проблема №1 · facebookresearch / nevergrad" . GitHub .
  35. ^ a b «Nevergrad: инструмент с открытым исходным кодом для оптимизации без производных» . 20 декабря 2018.
  36. ^ "Набор инструментов для создания реальных приложений машинного обучения и анализа данных на C ++: davisking / dlib" . 25 февраля 2019 г. - через GitHub.
  37. ^ Король, Дэвис. «Стоит использовать алгоритм глобальной оптимизации» .