Вычисление гиперпараметров при различных гипотезах порождения данных (пример)
Материал из MachineLearning.
(3 промежуточные версии не показаны) | |||
Строка 189: | Строка 189: | ||
== Исходный код == | == Исходный код == | ||
- | + | [https://mlalgorithms.svn.sourceforge.net/svnroot/mlalgorithms/MIPT2006-2010OldProj/Urlov2010EstimationHyperparam/ Urlov2010EstimationHyperparam] | |
== Литература == | == Литература == |
Текущая версия
Содержание |
Постановка задачи
Рассмотрим следующую модель регрессии, описывающую связь между свободной и зависимой переменными
где . Будем считать, что ошибка
это случайная величина из параметрического семейства распределений, у которого существует дважды непрерывно
дифференцируемая плотность
, с параметром
.
Относительно весов
, которые будем называть параметрами модели, сделаем аналогичные
предположения, т.е. что
имеет плотность
, с параметром
.
Оценка гиперпараметров
Гиперпараметрами модели будем называть пару параметров указанных выше распределений
. Оценивать гиперпараметры модели будем максимизируя вероятность появления данных
:
Нетрудно видеть что выражение есть вероятность появления данных при конкретной модели (фиксированных параметрах и гиперпараметрах). Так как мы считаем везде, что свободные переменные даны,
то это есть распределение зависимой переменной
. Оно в свою очередь определяется распределением ошибки и может быть записано в виде:
Плотность вероятности параметров модели нам известна и равна
. В итоге мы получаем задачу оптимизации, которую необходимо решить для нахождения оценки гиперпараметров модели:
Алгоритм нахождения гиперпараметров
Представленная выше задача оптимизации имеет вид максимизации интеграла функции, зависимой от переменных, по которым происходит максмизация. Для решения таких задач общего метода решения не существует. Предлагается искать решение в два этапа. На первом этапе при фиксированных гиперпараметрах ищется аналитическое приближение подинтегральной функции, интеграл от которой известен, с помощью приближения Лапласа. На втором этапе происходит оптимизация вычисленного приближения по гиперпараметрам. После этого повторяется первый шаг с новыми значениями гиперпараметров модели. Итерации повторяются пока решение не стабилизируется.
Первый шаг
Взяв минус логарифм от подинтегральную функции получим следующее выражение:
где введены новые обозначения . Решив задачу
мы получим точку в которой градиент равен нулю
а матрица вторых производных неотрицательна
поэтому справедливо разложение в ряд Тейлора
Отбрасывая малый член, формулу можно проинтегрировать
Второй шаг
На этом этапе необходимо обновить значения гиперпараметров, максимизируя полученное на первом шаге приближение
Или эквивалентно
В силу того, что полученной решение будет много раз обновляться, предлагается решать эту задачу с небольшой точностью, а именно проводить один шаг наискорейшего спуска вдоль градиента, с выбором шага используя дихотомию.
Критерий останова
Повторение первого и второго шага проводится пока изменение параметров или гиперпараметров не станет меньше заданных значений.
Исходный код
Оптимизация на первом шаге, используя функцию fminunc. Предполагается, что носитель плотностей, т.е. множество совпадает со всем множеством, поэтому производится безусловная оптимизация.
function [exitflag, wOpt, status] = estParamUnderFixedHyperparam(g, wInit, hp) %estParamUnderFixedHyperparam - estimate parameters of the model % assuming that hyperparameters are constant % the problem is % g(w, hp) -> min (w) % we use MATLAB fminuncon for that % errorFunc - a function from optimization problem above % hp - value of hyperparameters % wInit - initial value of parameters % output: % exitflag - exit flag from fminuncon function % wOpt - found value of hyperparameters % status - sting explaining error % % options for fminuncon if nargin < 3 error('ESTHP:estParamUnderFixedHyperparam','estParamUnderFixedHyperparam requires 3 arguments'); end % check function handler if ~isa(g, 'function_handle') error('ESTHP:estParamUnderFixedHyperparam','First argument should be function handler'); end options = optimset(... 'GradObj', 'on',... 'Hessian', 'on',... 'Display', 'off'... ); hP = hp(:); numberOfVar = numel(hP); % check for empty point if numberOfVar == 0 error('ESTHP:estParamUnderFixedHyperparam','You must provide a non-empty point'); end [wOpt, fval, exFl] = fminunc(@(w) g(w, hP), wInit, options); if exFl==1 exitflag = 1; status = ''; else exitflag = 0; wOpt = []; status = 'Error with fminunc'; end
Обновление гиперпараметров на втором шаге. Выполняется шаг градиентного спуска.
function [exitflag, hpOpt, status] = estHyperparamUnderFixedParam(g, w0, hpInit, hpLb, hpUb, options) %estHyperparamUnderFixedParam - estimate hyperparameters of the model % assuming that parameters are constant % the problem is % - ln (integr {exp^{-g(w, hp)} dw}) -> min (hp) % we use Laplace approximation at the point w0 and perform % one step of descent gradient method % errorFunc - a function from optimization problem above % w0 - a point where perform laplace approimation % hpInit - initial value of hyperparameters % hpLb - low bounds for hyperparameters % hpUb - up bounds for hyperparameters % options - options for line search method, see lineSearch function % output: % exitflag - if 0 error happend % hpOpt - found value of hyperparameters % status - status explaining error from lineSearch % if nargin < 6 error('ESTHP:estHyperparamUnderFixedParam','estHyperparamUnderFixedParam requires 6 arguments'); end % check function handler if ~isa(g, 'function_handle') error('ESTHP:estHyperparamUnderFixedParam','First argument should be function handler'); end hpCurr = hpInit(:); numberOfVar = numel(hpCurr); % check for empty point if numberOfVar == 0 error('ESTHP:estHyperparamUnderFixedParam','You must provide a non-empty point'); end f = getLaplaceApprErrorFunction(g, w0); % calculate descent direction dir = - finiteDiff(f, hpCurr, hpLb, hpUb); % perform dihotomy line search along the calculated direction [exFl, alpha] = lineSearch(f, hpCurr, dir, hpLb, hpUb, options); if exFl==1 exitflag = 1; status = ''; hpOpt = hpCurr + alpha * dir; else exitflag = 0; hpOpt = []; if exFl == -1 status = 'Too small alpha during line search'; elseif exFl == -2 status = 'Too small changes in the function during line search'; else error('ESTHP:estHyperparamUnderFixedParam','Unknown status from lineSearch'); end end
![]() | При продолжении данной работы необходимо использовать алгоритм оптимизации с ограничениями. --Strijov 15:15, 23 декабря 2010 (MSK) |
Вычислительный эксперимент
При проведении вычислительного эксперимента значения случайно из квадрата выбиралось 100 точек.
Для различных распределений параметров и ошибки (нормальное и гамма), генерировались величины из соответствующих распределение. Величина зависимой переменной принималась равной
. После этого проводился запуск алгоритма для поиска значений гиперпараметров. На рисунке представлено изменение величин гиперпараметров по итерациям. Стоит заметить, что процедура рассчитана на распределения, у которых носитель, т.е. множество
совпадает со всем множеством. Гамма распределение не удовлетворяет такому условию. Поэтому использовалась модификация плотности, состоящая в гладком продолжении плотности влево с помощью квадратичной функции.
Исходный код
Литература
- Стрижов В. В. Методы индуктивного порождения регрессионных моделей. М.: ВЦ РАН. 2008. 55 с. Брошюра, PDF.
- Bishop, C. Pattern Recognition And Machine Learning. Springer. 2006.
![]() | Данная статья была создана в рамках учебного задания.
См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе. |