![]() | ![]() | ![]() | ![]() |
В этой записной книжке мы представляем обобщенные линейные модели на рабочем примере. Мы решаем этот пример двумя разными способами, используя два алгоритма для эффективной подгонки GLM в TensorFlow Probability: оценка Фишера для плотных данных и покоординатный проксимальный градиентный спуск для разреженных данных. Мы сравниваем подогнанные коэффициенты для истинных коэффициентов и, в случае покоординатного проксимальные градиентный спуск, к выходу аналогичного АиРа glmnet
алгоритма. Наконец, мы предоставляем дополнительные математические детали и выводы нескольких ключевых свойств GLM.
Задний план
Обобщенная линейная модель (GLM) представляет собой линейную модель () , завернутые в трансформации (функции связи) и оборудованный с распределением отклика от экспоненциального семейства. Выбор функции связи и распределения ответов очень гибкий, что придает большую выразительность GLM. Полную информацию, включая последовательное представление всех определений и результатов, составляющих GLM, в однозначной нотации, можно найти в разделе «Вывод фактов GLM» ниже. Резюмируем:
В GLM, предиктивные распределения для переменного отклика связанно с вектором наблюдаемых предикторами . Распределение имеет вид:
Здесь являются параметры ( "весы"), гиперпараметра , представляющей дисперсия ( "дисперсия"), и , , , характеризуется указанным пользователем модели семья.
Среднее зависит от композицией линейного отклика и (обратной) линии связи функции, а именно:
где является так называемой функцией связи. В TFP выбор функции связи и модели семьи совместно с помощью предписанных в технических заданиях tfp.glm.ExponentialFamily
подкласса. Примеры включают:
-
tfp.glm.Normal
, также известная как «линейная регрессия» -
tfp.glm.Bernoulli
, также известный как «логистическая регрессия» -
tfp.glm.Poisson
, ака «Пуассон регрессия» -
tfp.glm.BernoulliNormalCDF
, также известный как «пробит регрессии».
TFP предпочитает называть модели семьи в соответствии с распределением по Y
, а не функцию связи , так как tfp.Distribution
s уже гражданами первого класса. Если в tfp.glm.ExponentialFamily
подкласса имя содержит второе слово, то это указывает на неканоничной функции связи .
GLM обладают несколькими замечательными свойствами, которые позволяют эффективно реализовать оценку максимального правдоподобия. Главная из этих свойств являются простыми формулами для градиента логарифмического правдоподобия , а также для информационной матрицы Фишера, который является ожидаемым значением гессиана отрицательного логарифмического правдоподобия при повторной выборке ответа в соответствии с те же предикторы. Т.е.:
где является матрицей, й строкой является прогностическим вектором для - й выборки данных, а также является вектором, й координаты является наблюдаемым откликом для - й выборки данных . Здесь (грубо говоря), и и полужирный обозначает векторизации этих функций. Полную информацию о распределении этих ожиданий и отклонений можно найти в разделе «Получение фактов GLM» ниже.
Пример
В этом разделе мы кратко опишем и продемонстрировать два встроенных GLM установки алгоритмов в TensorFlow Вероятность: Fisher скоринг ( tfp.glm.fit
) и покоординатное проксимального градиент снижения ( tfp.glm.fit_sparse
).
Синтетический набор данных
Давайте представим, что загружаем некоторый обучающий набор данных.
import numpy as np
import pandas as pd
import scipy
import tensorflow.compat.v2 as tf
tf.enable_v2_behavior()
import tensorflow_probability as tfp
tfd = tfp.distributions
def make_dataset(n, d, link, scale=1., dtype=np.float32):
model_coefficients = tfd.Uniform(
low=-1., high=np.array(1, dtype)).sample(d, seed=42)
radius = np.sqrt(2.)
model_coefficients *= radius / tf.linalg.norm(model_coefficients)
mask = tf.random.shuffle(tf.range(d)) < int(0.5 * d)
model_coefficients = tf.where(
mask, model_coefficients, np.array(0., dtype))
model_matrix = tfd.Normal(
loc=0., scale=np.array(1, dtype)).sample([n, d], seed=43)
scale = tf.convert_to_tensor(scale, dtype)
linear_response = tf.linalg.matvec(model_matrix, model_coefficients)
if link == 'linear':
response = tfd.Normal(loc=linear_response, scale=scale).sample(seed=44)
elif link == 'probit':
response = tf.cast(
tfd.Normal(loc=linear_response, scale=scale).sample(seed=44) > 0,
dtype)
elif link == 'logit':
response = tfd.Bernoulli(logits=linear_response).sample(seed=44)
else:
raise ValueError('unrecognized true link: {}'.format(link))
return model_matrix, response, model_coefficients, mask
Примечание. Подключитесь к локальной среде выполнения.
В этой записной книжке мы обмениваемся данными между ядрами Python и R с помощью локальных файлов. Чтобы включить этот общий доступ, используйте среду выполнения на том же компьютере, на котором у вас есть разрешение на чтение и запись локальных файлов.
x, y, model_coefficients_true, _ = [t.numpy() for t in make_dataset(
n=int(1e5), d=100, link='probit')]
DATA_DIR = '/tmp/glm_example'
tf.io.gfile.makedirs(DATA_DIR)
with tf.io.gfile.GFile('{}/x.csv'.format(DATA_DIR), 'w') as f:
np.savetxt(f, x, delimiter=',')
with tf.io.gfile.GFile('{}/y.csv'.format(DATA_DIR), 'w') as f:
np.savetxt(f, y.astype(np.int32) + 1, delimiter=',', fmt='%d')
with tf.io.gfile.GFile(
'{}/model_coefficients_true.csv'.format(DATA_DIR), 'w') as f:
np.savetxt(f, model_coefficients_true, delimiter=',')
Без регуляризации L1
Функция tfp.glm.fit
реализует Fisher скоринга, который принимает как некоторые из его аргументов:
-
model_matrix
= -
response
= -
model
= вызываемым который, учитывая аргумент , возвращает тройной .
Мы рекомендуем model
быть экземпляром tfp.glm.ExponentialFamily
класса. Доступно несколько готовых реализаций, поэтому для большинства распространенных GLM специальный код не требуется.
@tf.function(autograph=False)
def fit_model():
model_coefficients, linear_response, is_converged, num_iter = tfp.glm.fit(
model_matrix=x, response=y, model=tfp.glm.BernoulliNormalCDF())
log_likelihood = tfp.glm.BernoulliNormalCDF().log_prob(y, linear_response)
return (model_coefficients, linear_response, is_converged, num_iter,
log_likelihood)
[model_coefficients, linear_response, is_converged, num_iter,
log_likelihood] = [t.numpy() for t in fit_model()]
print(('is_converged: {}\n'
' num_iter: {}\n'
' accuracy: {}\n'
' deviance: {}\n'
'||w0-w1||_2 / (1+||w0||_2): {}'
).format(
is_converged,
num_iter,
np.mean((linear_response > 0.) == y),
2. * np.mean(log_likelihood),
np.linalg.norm(model_coefficients_true - model_coefficients, ord=2) /
(1. + np.linalg.norm(model_coefficients_true, ord=2))
))
is_converged: True num_iter: 6 accuracy: 0.75241 deviance: -0.992436110973 ||w0-w1||_2 / (1+||w0||_2): 0.0231555201462
Математические детали
Оценка Фишера - это модификация метода Ньютона для нахождения оценки максимального правдоподобия.
Метод Ванили Ньютона, ищущий нули градиента логарифмической вероятности, будет следовать правилу обновления
где является скорость обучения используется для управления размером шага.
В системе оценок Фишера мы заменяем гессиан на отрицательную информационную матрицу Фишера:
[Следует отметить , что здесь является случайным, тогда как по - прежнему вектор наблюдаемых реакций.]
По формулам, приведенным ниже в разделе «Подбор параметров GLM к данным», это упрощается до
С регуляризацией L1
tfp.glm.fit_sparse
реализует GLM слесарем более подходит для разреженных наборов данных на основе алгоритма в Юань, Хо и Лин 2012 . Его особенности включают в себя:
- L1 регуляризация
- Нет инверсии матриц
- Немногочисленные оценки градиента и гессиана.
Сначала мы представляем пример использования кода. Детали алгоритма доработаны в «Алгоритм Детали для tfp.glm.fit_sparse
» ниже.
model = tfp.glm.Bernoulli()
model_coefficients_start = tf.zeros(x.shape[-1], np.float32)
@tf.function(autograph=False)
def fit_model():
return tfp.glm.fit_sparse(
model_matrix=tf.convert_to_tensor(x),
response=tf.convert_to_tensor(y),
model=model,
model_coefficients_start=model_coefficients_start,
l1_regularizer=800.,
l2_regularizer=None,
maximum_iterations=10,
maximum_full_sweeps_per_iteration=10,
tolerance=1e-6,
learning_rate=None)
model_coefficients, is_converged, num_iter = [t.numpy() for t in fit_model()]
coefs_comparison = pd.DataFrame({
'Learned': model_coefficients,
'True': model_coefficients_true,
})
print(('is_converged: {}\n'
' num_iter: {}\n\n'
'Coefficients:').format(
is_converged,
num_iter))
coefs_comparison
is_converged: True num_iter: 1 Coefficients:
Обратите внимание, что изученные коэффициенты имеют тот же образец разреженности, что и истинные коэффициенты.
# Save the learned coefficients to a file.
with tf.io.gfile.GFile('{}/model_coefficients_prox.csv'.format(DATA_DIR), 'w') as f:
np.savetxt(f, model_coefficients, delimiter=',')
Сравните с R - х glmnet
Сравним выход покоординатное проксимальный градиентного спуска к тому , что из АиР glmnet
, который использует подобный алгоритм.
ПРИМЕЧАНИЕ. Для выполнения этого раздела необходимо переключиться в среду выполнения R colab.
suppressMessages({
library('glmnet')
})
data_dir <- '/tmp/glm_example'
x <- as.matrix(read.csv(paste(data_dir, '/x.csv', sep=''),
header=FALSE))
y <- as.matrix(read.csv(paste(data_dir, '/y.csv', sep=''),
header=FALSE, colClasses='integer'))
fit <- glmnet(
x = x,
y = y,
family = "binomial", # Logistic regression
alpha = 1, # corresponds to l1_weight = 1, l2_weight = 0
standardize = FALSE,
intercept = FALSE,
thresh = 1e-30,
type.logistic = "Newton"
)
write.csv(as.matrix(coef(fit, 0.008)),
paste(data_dir, '/model_coefficients_glmnet.csv', sep=''),
row.names=FALSE)
Сравните R, TFP и истинные коэффициенты (Примечание: назад к ядру Python)
DATA_DIR = '/tmp/glm_example'
with tf.io.gfile.GFile('{}/model_coefficients_glmnet.csv'.format(DATA_DIR),
'r') as f:
model_coefficients_glmnet = np.loadtxt(f,
skiprows=2 # Skip column name and intercept
)
with tf.io.gfile.GFile('{}/model_coefficients_prox.csv'.format(DATA_DIR),
'r') as f:
model_coefficients_prox = np.loadtxt(f)
with tf.io.gfile.GFile(
'{}/model_coefficients_true.csv'.format(DATA_DIR), 'r') as f:
model_coefficients_true = np.loadtxt(f)
coefs_comparison = pd.DataFrame({
'TFP': model_coefficients_prox,
'R': model_coefficients_glmnet,
'True': model_coefficients_true,
})
coefs_comparison
Алгоритм Детали для tfp.glm.fit_sparse
Мы представляем алгоритм как последовательность трех модификаций метода Ньютона. В каждом из них, правило обновления для основан на векторном и матрицы , который аппроксимирует градиент и гессианом логарифмического правдоподобия. На этапе , мы выбираем координату изменения, и мы обновляем согласно правилу обновления:
Это обновление является Newton-подобный шаг с изучением скорости . Для окончательной части (L1) , за исключением регуляризации, приведенные ниже модификации различаются только в том , как они обновляются и .
Отправная точка: координатный метод Ньютона.
В методе покоординатного Ньютона, мы устанавливаем и к истинному градиента и гессиана журнала правдоподобия:
Меньше оценок градиента и гессиана
Градиент и гессиан логарифма правдоподобия часто являются дорогостоящими для вычисления, поэтому часто имеет смысл их аппроксимировать. Сделать это можно следующим образом:
- Обычно аппроксимируют гессиан как локально постоянный и аппроксимируют градиент до первого порядка, используя (приблизительный) гессиан:
- Иногда выполнить «ванильный» шаг обновления , как указаны выше, установку к точному градиента и к точному гессиану логарифмического правдоподобия, измеренному при .
Заменить гессенскую отрицательную информацию Фишера
Для дальнейшего снижения стоимости этапов обновления ванили, мы можем установить к отрицательному информационной матрице Фишера (эффективно вычислимым с использованием формул в «Установке параметров GLM к данным» ниже) , а не точной Hessian:
L1 регуляризация через проксимальный градиентный спуск
Чтобы включить регуляризацию L1, мы заменяем правило обновления
с более общим правилом обновления
где является постоянным Прилагаемые (коэффициент регуляризации L1) и является мягким оператором порогового значения, определяемого
Это правило обновления имеет следующие два вдохновляющих свойства, которые мы объясним ниже:
В предельном случае (т.е. без L1 регуляризации), это правило обновление идентично исходному правилу обновления.
Это правило обновления можно интерпретировать как применение оператора близости, фиксированная точка которого является решением L1-регуляризованной задачи минимизации.
$$ \underset{\beta - \beta^{(t)} \in \text{span}{ \text{onehot}(j^{(t)}) } }{\text{arg min} } \left( -\ell(\beta \,;\, \mathbf{x}, \mathbf{y})
- r_{\text{L1} } \left\lVert \beta \right\rVert_1 \right). $$
Вырожденный случай восстанавливает исходное правило обновления
Чтобы увидеть (1), заметим , что если затем , следовательно ,
Следовательно
Оператор близости, неподвижной точкой которого является регуляризованный MLE
Чтобы увидеть (2), первую ноту (см Википедии ) , что для любого , правило обновления
удовлетворяет условию (2), где является оператором близости (см Ю , где этот оператор обозначается ). Правая часть приведенного выше уравнения вычисляется здесь :
$$
\left(\beta{\text{exact-prox}, \gamma}^{(t+1)}\right){j^{(t)} }
\text{SoftThreshold} \left( \beta^{(t)}{j^{(t)} } + \frac{\gamma}{r{\text{L1} } } \left( \left( \nabla\beta\, \ell(\beta \,;\, \mathbf{x}, \mathbf{y}) \right){\beta = \beta^{(t)} } \right)_{j^{(t)} } ,\ \gamma \right). $$
В частности, установка(обратите внимание , что до тех пор , как отрицательный логарифм правдоподобия выпукло), получаем правило обновления
$$
\left(\beta{\text{exact-prox}, \gamma^{(t)} }^{(t+1)}\right){j^{(t)} }
\text{SoftThreshold} \left( \beta^{(t)}{j^{(t)} } - \alpha \frac{ \left( \left( \nabla\beta\, \ell(\beta \,;\, \mathbf{x}, \mathbf{y}) \right){\beta = \beta^{(t)} } \right){j^{(t)} } }{ \left(H^{(t)}\right)_{j^{(t)}, j^{(t)} } } ,\ \gamma^{(t)} \right). $$
Затем заменим точный градиент $ \ влево (\ набла \ бета \, \ ell_p (\ бета \; \, \ mathbf {X}, \ mathbf {у}) \ справа) {\ бета = \ бета ^ {( т)}} $ с его приближением , получение
\ начать {Выровнять} \ влево (\ бета {\ текст {точным Prox}, \ Gamma ^ {(т)}} ^ {(т + 1)} \ справа) {J ^ {(т)}} & \ примерно \ текст {SoftThreshold} \ влево (\ бета ^ {(т)} {J ^ {(т)}} - \ альфа \ гидроразрыва {\ влево (s ^ {(т)} \ справа) {J ^ {( т)}}} {\ влево (Н ^ {(т)} \ справа) {J ^ {(т)}, J ^ {(т)}}}, \ \ гамма ^ {(т)} \ справа) \ & = \ текст {SoftThreshold} \ влево (\ бета ^ {(т)} {J ^ {(т)}} - \ альфа \, и ^ {(т)}, \ \ гамма ^ {(т)} \правильно). \ конец {} Align
Следовательно
Вывод фактов GLM
В этом разделе мы подробно излагаем и выводим результаты о GLM, которые использовались в предыдущих разделах. Затем мы используем TensorFlow в gradients
численно проверить полученные формулы для градиента логарифмической вероятности и информации Фишера.
Оценка и информация Фишера
Рассмотрит семейство вероятностных распределений параметризованных вектор параметров , имеющей плотность вероятности . Оценка итогового в параметре вектора определяется как градиент журнала вероятности (оценивали при ), то есть,
Утверждение: ожидание результата равно нулю.
В условиях мягкой регулярности (позволяющей пройти дифференцирование под интегралом)
Доказательство
У нас есть
где мы использовали: (1) цепное правило дифференцирования, (2) определение математического ожидания, (3) переходное дифференцирование под знаком интеграла (с использованием условий регулярности), (4) интеграл плотности вероятности равен 1.
Утверждение (информация Фишера): дисперсия оценки равна отрицательному ожидаемому гессиану логарифмической вероятности.
В условиях мягкой регулярности (позволяющей пройти дифференцирование под интегралом)
$$ \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \text{score}(Y, \theta_0) \text{score}(Y, \theta_0)^\top
\right]
-\mathbb{E}_{Y \sim p(\cdot | \theta=\theta0)}\left[ \left(\nabla\theta^2 \log p(Y | \theta)\right)_{\theta=\theta_0} \right] $$
где обозначает матрицу Гессе, чьи запись .
Левая часть этого уравнения называется информацией Фишера семейство при векторе параметров .
Доказательство претензии
У нас есть
где мы использовали (1) цепное правило для дифференцирования, (2) правило частного для дифференцирования, (3) снова цепное правило, в обратном порядке.
Для завершения доказательства достаточно показать, что
Для этого дважды пройдем дифференцирование под знаком интеграла:
Лемма о производной логарифмической статистической суммы
Если , и являются скалярные функции, дважды дифференцируемые, такие , что семейство распределений , определяемой
удовлетворяет мягкие условия регулярности , которые позволяют прохождение дифференцирования по под интегралом по отношению к , то
и
(Здесь означает дифференцирование, поэтому и является первым и вторым производным .)
Доказательство
Для этого семейства распределений, мы имеем . Первое уравнение следует из того факта , что . Далее у нас есть
Сверхдисперсная экспоненциальная семья
А (скалярный) overdispersed экспоненциального семейства представляет собой семейство распределений плотности которых принимает форму
где и известны скалярные функции и и являются скалярными параметрами.
[Следует отметить , что переопределена: для любого , функция полностью определяется тем ограничением , чтодля всех . «ы производства различных значений все должны быть такими же, что накладывает ограничение на функции и .]
Среднее и дисперсия достаточной статистики
При тех же условиях, что и «Лемма о производной логарифмической статистической суммы», мы имеем
$$ \mathbb{E}{Y \sim p{\text{OEF}(m, T)}(\cdot | \theta, \phi)} \left[ T(Y)
\right]
A'(\theta) $$
и
$$ \text{Var}{Y \sim p{\text{OEF}(m, T)}(\cdot | \theta, \phi)} \left[ T(Y)
\right]
\phi A''(\theta). $$
Доказательство
По «лемме о производной логарифмической статистической суммы» имеем
$$ \mathbb{E}{Y \sim p{\text{OEF}(m, T)}(\cdot | \theta, \phi)} \left[ \frac{T(Y)}{\phi}
\right]
\frac{A'(\theta)}{\phi} $$
и
$$ \text{Var}{Y \sim p{\text{OEF}(m, T)}(\cdot | \theta, \phi)} \left[ \frac{T(Y)}{\phi}
\right]
\frac{A''(\theta)}{\phi}. $$
Результат следует из того факта , что ожидание является линейным () и дисперсией является степенью 2 однородного ().
Обобщенная линейная модель
В обобщенной линейной модели, предиктивные распределения для переменного отклика связанно с вектором наблюдаемых предикторов . Распределение является членом overdispersed экспоненциального семейства, а параметр заменяется , где является известной функцией, является так называемым линейным откликом, и представляет собой вектор параметров (коэффициентов регрессии), которые необходимо изучить. В общем случае параметр дисперсии можно научиться тоже, но в нашей установке мы будем рассматривать , как известно. Итак, наша установка
где структура модель характеризуется распределением и функции , который преобразует линейный отклик на параметры.
Традиционно, отображение из линейного отклика к среднему обозначается
Это отображение требуется , чтобы один-к-одному, и обратное, , называется функцией связи для этого GLM. Обычно GLM описывают, называя его функцию связи и семейство распределений - например, «GLM с распределением Бернулли и функцией логита связи» (также известной как модель логистической регрессии). Для того , чтобы полностью охарактеризовать GLM, функция также должен быть указан. Если является тождественным, то называется канонической функцией связи.
Требование: Выражение в терминах достаточной статистики
Определять
и
Тогда у нас есть
Доказательство
Под «средним значением и дисперсией достаточной статистики» мы имеем
Дифференцируя цепным правилом, получаем
и "Среднее значение и дисперсия достаточной статистики"
Напрашивается вывод.
Подгонка параметров GLM к данным
Свойства полученных выше поддаются очень хорошо подгоночных параметров GLM к набору данных. Квазиньютоновские методы, такие как оценка Фишера, основываются на градиенте логарифмической вероятности и информации Фишера, которую, как мы теперь показываем, можно вычислить особенно эффективно для GLM.
Предположим , что мы наблюдали векторы прогнозирующих и связанные с ними скалярные ответов . В матричной форме, мы будем говорить , что мы наблюдали предсказатель и ответ , где является матрицей, й строкой является и является вектором, - й элемент . Логарифмическое правдоподобие параметров затем
Для единичной выборки данных
Для упрощения обозначений, давайте сначала рассмотрим случай одной точки данных, ; затем мы расширим его на общий случай по аддитивности.
Градиент
У нас есть
Следовательно, по цепному правилу
Отдельно от «среднего и дисперсии достаточной статистики,» мы имеем . Следовательно, по «претензии: Выражая в терминах достаточной статистики,» мы имеем
Гессен
Дифференцируя второй раз, по правилу произведения получаем
Информация Fisher
Под «средним значением и дисперсией достаточной статистики» мы имеем
Следовательно
Для нескольких выборок данных
Продолжим теперь дело в общем случае. Пусть обозначим вектор, - й координате линейный отклик от - й выборки данных. Пусть (соотв. , соответственно ) обозначает функцию , которая применяет скалярная функция транслируемое (векторизованную) (соответственно , соответственно ) каждой координате . Тогда у нас есть
и
где дроби обозначают поэлементное деление.
Проверка формул численно
Проверим теперь приведенную выше формулу для градиента логарифмического правдоподобия численно с использованием tf.gradients
и проверить формулу для информации Фишера с оценкой методом Монте - Карло с использованием tf.hessians
:
def VerifyGradientAndFIM():
model = tfp.glm.BernoulliNormalCDF()
model_matrix = np.array([[1., 5, -2],
[8, -1, 8]])
def _naive_grad_and_hessian_loss_fn(x, response):
# Computes gradient and Hessian of negative log likelihood using autodiff.
predicted_linear_response = tf.linalg.matvec(model_matrix, x)
log_probs = model.log_prob(response, predicted_linear_response)
grad_loss = tf.gradients(-log_probs, [x])[0]
hessian_loss = tf.hessians(-log_probs, [x])[0]
return [grad_loss, hessian_loss]
def _grad_neg_log_likelihood_and_fim_fn(x, response):
# Computes gradient of negative log likelihood and Fisher information matrix
# using the formulas above.
predicted_linear_response = tf.linalg.matvec(model_matrix, x)
mean, variance, grad_mean = model(predicted_linear_response)
v = (response - mean) * grad_mean / variance
grad_log_likelihood = tf.linalg.matvec(model_matrix, v, adjoint_a=True)
w = grad_mean**2 / variance
fisher_info = tf.linalg.matmul(
model_matrix,
w[..., tf.newaxis] * model_matrix,
adjoint_a=True)
return [-grad_log_likelihood, fisher_info]
@tf.function(autograph=False)
def compute_grad_hessian_estimates():
# Monte Carlo estimate of E[Hessian(-LogLikelihood)], where the expectation is
# as written in "Claim (Fisher information)" above.
num_trials = 20
trial_outputs = []
np.random.seed(10)
model_coefficients_ = np.random.random(size=(model_matrix.shape[1],))
model_coefficients = tf.convert_to_tensor(model_coefficients_)
for _ in range(num_trials):
# Sample from the distribution of `model`
response = np.random.binomial(
1,
scipy.stats.norm().cdf(np.matmul(model_matrix, model_coefficients_))
).astype(np.float64)
trial_outputs.append(
list(_naive_grad_and_hessian_loss_fn(model_coefficients, response)) +
list(
_grad_neg_log_likelihood_and_fim_fn(model_coefficients, response))
)
naive_grads = tf.stack(
list(naive_grad for [naive_grad, _, _, _] in trial_outputs), axis=0)
fancy_grads = tf.stack(
list(fancy_grad for [_, _, fancy_grad, _] in trial_outputs), axis=0)
average_hess = tf.reduce_mean(tf.stack(
list(hess for [_, hess, _, _] in trial_outputs), axis=0), axis=0)
[_, _, _, fisher_info] = trial_outputs[0]
return naive_grads, fancy_grads, average_hess, fisher_info
naive_grads, fancy_grads, average_hess, fisher_info = [
t.numpy() for t in compute_grad_hessian_estimates()]
print("Coordinatewise relative error between naively computed gradients and"
" formula-based gradients (should be zero):\n{}\n".format(
(naive_grads - fancy_grads) / naive_grads))
print("Coordinatewise relative error between average of naively computed"
" Hessian and formula-based FIM (should approach zero as num_trials"
" -> infinity):\n{}\n".format(
(average_hess - fisher_info) / average_hess))
VerifyGradientAndFIM()
Coordinatewise relative error between naively computed gradients and formula-based gradients (should be zero): [[2.08845965e-16 1.67076772e-16 2.08845965e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [2.08845965e-16 1.67076772e-16 2.08845965e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [2.08845965e-16 1.67076772e-16 2.08845965e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [2.08845965e-16 1.67076772e-16 2.08845965e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [2.08845965e-16 1.67076772e-16 2.08845965e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [2.08845965e-16 1.67076772e-16 2.08845965e-16] [1.96118673e-16 3.13789877e-16 1.96118673e-16] [2.08845965e-16 1.67076772e-16 2.08845965e-16]] Coordinatewise relative error between average of naively computed Hessian and formula-based FIM (should approach zero as num_trials -> infinity): [[0.00072369 0.00072369 0.00072369] [0.00072369 0.00072369 0.00072369] [0.00072369 0.00072369 0.00072369]]
использованная литература
[1]: Го-Сюнь Юань, Чиа-Хуа Хо и Чжи-Джен Линь. Улучшенный GLMNET для L1-регуляризованной логистической регрессии. Журнал Machine Learning Research, 13, 2012. http://www.jmlr.org/papers/volume13/yuan12a/yuan12a.pdf
[2]: skd. Вывод оператора мягкого порога. 2018. https://math.stackexchange.com/q/511106
[3]: Авторы Википедии. Проксимальные градиентные методы обучения. Википедия, свободная энциклопедия, 2018. https://en.wikipedia.org/wiki/Proximal_gradient_methods_for_learning
[4]: Яо-Лян Юй. Оператор близости. https://www.cs.cmu.edu/~suvrit/teach/yaoliang_proximity.pdf