Обобщенные линейные модели

В этой записной книжке мы представляем обобщенные линейные модели на рабочем примере. Мы решаем этот пример двумя разными способами, используя два алгоритма для эффективной подгонки GLM в TensorFlow Probability: оценка Фишера для плотных данных и покоординатный проксимальный градиентный спуск для разреженных данных. Мы сравниваем подогнанные коэффициенты для истинных коэффициентов и, в случае покоординатного проксимальные градиентный спуск, к выходу аналогичного АиРа glmnet алгоритма. Наконец, мы предоставляем дополнительные математические детали и выводы нескольких ключевых свойств GLM.

Задний план

Обобщенная линейная модель (GLM) представляет собой линейную модель (η=xβ) , завернутые в трансформации (функции связи) и оборудованный с распределением отклика от экспоненциального семейства. Выбор функции связи и распределения ответов очень гибкий, что придает большую выразительность GLM. Полную информацию, включая последовательное представление всех определений и результатов, составляющих GLM, в однозначной нотации, можно найти в разделе «Вывод фактов GLM» ниже. Резюмируем:

В GLM, предиктивные распределения для переменного отклика Y связанно с вектором наблюдаемых предикторами x. Распределение имеет вид:

p(y|x)=m(y,ϕ)exp(θT(y)A(θ)ϕ)θ:=h(η)η:=xβ

Здесь β являются параметры ( "весы"), ϕ гиперпараметра , представляющей дисперсия ( "дисперсия"), и m, h, T, A характеризуется указанным пользователем модели семья.

Среднее Y зависит от x композицией линейного отклика η и (обратной) линии связи функции, а именно:

μ:=g1(η)

где g является так называемой функцией связи. В 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 обладают несколькими замечательными свойствами, которые позволяют эффективно реализовать оценку максимального правдоподобия. Главная из этих свойств являются простыми формулами для градиента логарифмического правдоподобия , а также для информационной матрицы Фишера, который является ожидаемым значением гессиана отрицательного логарифмического правдоподобия при повторной выборке ответа в соответствии с те же предикторы. Т.е.:

β(β;x,y)=xdiag(MeanT(xβ)VarT(xβ))(T(y)MeanT(xβ))EYiGLM|xi[β2(β;x,Y)]=xdiag(ϕMeanT(xβ)2VarT(xβ))x

где x является матрицей, iй строкой является прогностическим вектором для i- й выборки данных, а также y является вектором, iй координаты является наблюдаемым откликом для i- й выборки данных . Здесь (грубо говоря), MeanT(η):=E[T(Y)|η] и VarT(η):=Var[T(Y)|η]и полужирный обозначает векторизации этих функций. Полную информацию о распределении этих ожиданий и отклонений можно найти в разделе «Получение фактов 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 = x
  • response = y
  • model = вызываемым который, учитывая аргумент η, возвращает тройной  влево( textbfСреднееt( boldsymbol ETA), textbfварt( boldsymbol ETA), textbfMeanT( boldsymbol eta) right).

Мы рекомендуем 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

Математические детали

Оценка Фишера - это модификация метода Ньютона для нахождения оценки максимального правдоподобия.

β^:=arg maxβ  (β ; x,y).

Метод Ванили Ньютона, ищущий нули градиента логарифмической вероятности, будет следовать правилу обновления

βNewton(t+1):=β(t)α(β2(β ; x,y))β=β(t)1(β(β ; x,y))β=β(t)

где α(0,1] является скорость обучения используется для управления размером шага.

В системе оценок Фишера мы заменяем гессиан на отрицательную информационную матрицу Фишера:

β(t+1):=β(t)αEYipOEF(m,T)(|θ=h(xiβ(t)),ϕ)[(β2(β ; x,Y))β=β(t)]1(β(β ; x,y))β=β(t)

[Следует отметить , что здесь Y=(Yi)i=1n является случайным, тогда как y по - прежнему вектор наблюдаемых реакций.]

По формулам, приведенным ниже в разделе «Подбор параметров GLM к данным», это упрощается до

β(t+1)=β(t)+α(xdiag(ϕMeanT(xβ(t))2VarT(xβ(t)))x)1(xdiag(MeanT(xβ(t))VarT(xβ(t)))(T(y)MeanT(xβ(t)))).

С регуляризацией 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

Мы представляем алгоритм как последовательность трех модификаций метода Ньютона. В каждом из них, правило обновления для β основан на векторном s и матрицы H , который аппроксимирует градиент и гессианом логарифмического правдоподобия. На этапе t, мы выбираем координату j(t) изменения, и мы обновляем β согласно правилу обновления:

u(t):=(s(t))j(t)(H(t))j(t),j(t)β(t+1):=β(t)αu(t)onehot(j(t))

Это обновление является Newton-подобный шаг с изучением скорости α. Для окончательной части (L1) , за исключением регуляризации, приведенные ниже модификации различаются только в том , как они обновляются s и H.

Отправная точка: координатный метод Ньютона.

В методе покоординатного Ньютона, мы устанавливаем s и H к истинному градиента и гессиана журнала правдоподобия:

svanilla(t):=(β(β;x,y))β=β(t)Hvanilla(t):=(β2(β;x,y))β=β(t)

Меньше оценок градиента и гессиана

Градиент и гессиан логарифма правдоподобия часто являются дорогостоящими для вычисления, поэтому часто имеет смысл их аппроксимировать. Сделать это можно следующим образом:

  • Обычно аппроксимируют гессиан как локально постоянный и аппроксимируют градиент до первого порядка, используя (приблизительный) гессиан:

Happrox(t+1):=H(t)sapprox(t+1):=s(t)+H(t)(β(t+1)β(t))

  • Иногда выполнить «ванильный» шаг обновления , как указаны выше, установку s(t+1) к точному градиента и H(t+1) к точному гессиану логарифмического правдоподобия, измеренному при β(t+1).

Заменить гессенскую отрицательную информацию Фишера

Для дальнейшего снижения стоимости этапов обновления ванили, мы можем установить H к отрицательному информационной матрице Фишера (эффективно вычислимым с использованием формул в «Установке параметров GLM к данным» ниже) , а не точной Hessian:

HFisher(t+1):=EYipOEF(m,T)(|θ=h(xiβ(t+1)),ϕ)[(β2(β;x,Y))β=β(t+1)]=xdiag(ϕMeanT(xβ(t+1))2VarT(xβ(t+1)))xsFisher(t+1):=svanilla(t+1)=(xdiag(MeanT(xβ(t+1))VarT(xβ(t+1)))(T(y)MeanT(xβ(t+1))))

L1 регуляризация через проксимальный градиентный спуск

Чтобы включить регуляризацию L1, мы заменяем правило обновления

β(t+1):=β(t)αu(t)onehot(j(t))

с более общим правилом обновления

γ(t):=αrL1(H(t))j(t),j(t)(βreg(t+1))j:={βj(t+1)if jj(t)SoftThreshold(βj(t)αu(t), γ(t))if j=j(t)

где rL1>0 является постоянным Прилагаемые (коэффициент регуляризации L1) и SoftThreshold является мягким оператором порогового значения, определяемого

SoftThreshold(β,γ):={β+γif β<γ0if γβγβγif β>γ.

Это правило обновления имеет следующие два вдохновляющих свойства, которые мы объясним ниже:

  1. В предельном случае rL10 (т.е. без L1 регуляризации), это правило обновление идентично исходному правилу обновления.

  2. Это правило обновления можно интерпретировать как применение оператора близости, фиксированная точка которого является решением 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). $$

Вырожденный случай rL1=0 восстанавливает исходное правило обновления

Чтобы увидеть (1), заметим , что если rL1=0 затем γ(t)=0, следовательно ,

(βreg(t+1))j(t)=SoftThreshold(βj(t)(t)αu(t), 0)=βj(t)(t)αu(t).

Следовательно

βreg(t+1)=β(t)αu(t)onehot(j(t))=β(t+1).

Оператор близости, неподвижной точкой которого является регуляризованный MLE

Чтобы увидеть (2), первую ноту (см Википедии ) , что для любого γ>0, правило обновления

(βexact-prox,γ(t+1))j(t):=proxγ1(βj(t)(t)+γrL1((β(β;x,y))β=β(t))j(t))

удовлетворяет условию (2), где prox является оператором близости (см Ю , где этот оператор обозначается P). Правая часть приведенного выше уравнения вычисляется здесь :

$$

\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). $$

В частности, установкаγ=γ(t)=αrL1(H(t))j(t),j(t)(обратите внимание , что γ(t)>0 до тех пор , как отрицательный логарифм правдоподобия выпукло), получаем правило обновления

$$

\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 {у}) \ справа) {\ бета = \ бета ^ {( т)}} $ с его приближением s(t), получение

\ начать {Выровнять} \ влево (\ бета {\ текст {точным Prox}, \ Gamma ^ {(т)}} ^ {(т + 1)} \ справа) {J ^ {(т)}} & \ примерно \ текст {SoftThreshold} \ влево (\ бета ^ {(т)} {J ^ {(т)}} - \ альфа \ гидроразрыва {\ влево (s ^ {(т)} \ справа) {J ^ {( т)}}} {\ влево (Н ^ {(т)} \ справа) {J ^ {(т)}, J ^ {(т)}}}, \ \ гамма ^ {(т)} \ справа) \ & = \ текст {SoftThreshold} \ влево (\ бета ^ {(т)} {J ^ {(т)}} - \ альфа \, и ^ {(т)}, \ \ гамма ^ {(т)} \правильно). \ конец {} Align

Следовательно

βexact-prox,γ(t)(t+1)βreg(t+1).

Вывод фактов GLM

В этом разделе мы подробно излагаем и выводим результаты о GLM, которые использовались в предыдущих разделах. Затем мы используем TensorFlow в gradients численно проверить полученные формулы для градиента логарифмической вероятности и информации Фишера.

Оценка и информация Фишера

Рассмотрит семейство вероятностных распределений параметризованных вектор параметров θ, имеющей плотность вероятности {p(|θ)}θT. Оценка итогового y в параметре вектора θ0 определяется как градиент журнала вероятности y (оценивали при θ0), то есть,

score(y,θ0):=[θlogp(y|θ)]θ=θ0.

Утверждение: ожидание результата равно нулю.

В условиях мягкой регулярности (позволяющей пройти дифференцирование под интегралом)

EYp(|θ=θ0)[score(Y,θ0)]=0.

Доказательство

У нас есть

EYp(|θ=θ0)[score(Y,θ0)]:=EYp(|θ=θ0)[(θlogp(Y|θ))θ=θ0]=(1)EYp(|θ=θ0)[(θp(Y|θ))θ=θ0p(Y|θ=θ0)]=(2)Y[(θp(y|θ))θ=θ0p(y|θ=θ0)]p(y|θ=θ0)dy=Y(θp(y|θ))θ=θ0dy=(3)[θ(Yp(y|θ)dy)]θ=θ0=(4)[θ1]θ=θ0=0,

где мы использовали: (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] $$

где θ2F обозначает матрицу Гессе, чьи (i,j) запись 2Fθiθj.

Левая часть этого уравнения называется информацией Фишера семейство {p(|θ)}θT при векторе параметров θ0.

Доказательство претензии

У нас есть

EYp(|θ=θ0)[(θ2logp(Y|θ))θ=θ0]=(1)EYp(|θ=θ0)[(θθp(Y|θ)p(Y|θ))θ=θ0]=(2)EYp(|θ=θ0)[(θ2p(Y|θ))θ=θ0p(Y|θ=θ0)((θp(Y|θ))θ=θ0p(Y|θ=θ0))((θp(Y|θ))θ=θ0p(Y|θ=θ0))]=(3)EYp(|θ=θ0)[(θ2p(Y|θ))θ=θ0p(Y|θ=θ0)score(Y,θ0)score(Y,θ0)],

где мы использовали (1) цепное правило для дифференцирования, (2) правило частного для дифференцирования, (3) снова цепное правило, в обратном порядке.

Для завершения доказательства достаточно показать, что

EYp(|θ=θ0)[(θ2p(Y|θ))θ=θ0p(Y|θ=θ0)]=?0.

Для этого дважды пройдем дифференцирование под знаком интеграла:

EYp(|θ=θ0)[(θ2p(Y|θ))θ=θ0p(Y|θ=θ0)]=Y[(θ2p(y|θ))θ=θ0p(y|θ=θ0)]p(y|θ=θ0)dy=Y(θ2p(y|θ))θ=θ0dy=[θ2(Yp(y|θ)dy)]θ=θ0=[θ21]θ=θ0=0.

Лемма о производной логарифмической статистической суммы

Если a, b и c являются скалярные функции, c дважды дифференцируемые, такие , что семейство распределений {p(|θ)}θT , определяемой

p(y|θ)=a(y)exp(b(y)θc(θ))

удовлетворяет мягкие условия регулярности , которые позволяют прохождение дифференцирования по θ под интегралом по отношению к y, то

EYp(|θ=θ0)[b(Y)]=c(θ0)

и

VarYp(|θ=θ0)[b(Y)]=c(θ0).

(Здесь означает дифференцирование, поэтому c и c является первым и вторым производным c.)

Доказательство

Для этого семейства распределений, мы имеем score(y,θ0)=b(y)c(θ0). Первое уравнение следует из того факта , что EYp(|θ=θ0)[score(y,θ0)]=0. Далее у нас есть

VarYp(|θ=θ0)[b(Y)]=EYp(|θ=θ0)[(b(Y)c(θ0))2]=the one entry of EYp(|θ=θ0)[score(y,θ0)score(y,θ0)]=the one entry of EYp(|θ=θ0)[(θ2logp(|θ))θ=θ0]=EYp(|θ=θ0)[c(θ0)]=c(θ0).

Сверхдисперсная экспоненциальная семья

А (скалярный) overdispersed экспоненциального семейства представляет собой семейство распределений плотности которых принимает форму

pOEF(m,T)(y|θ,ϕ)=m(y,ϕ)exp(θT(y)A(θ)ϕ),

где m и T известны скалярные функции и θ и ϕ являются скалярными параметрами.

[Следует отметить , что A переопределена: для любого ϕ0, функция A полностью определяется тем ограничением , чтоpOEF(m,T)(y | θ,ϕ=ϕ0)dy=1для всех θ. A«ы производства различных значений ϕ0 все должны быть такими же, что накладывает ограничение на функции m и T.]

Среднее и дисперсия достаточной статистики

При тех же условиях, что и «Лемма о производной логарифмической статистической суммы», мы имеем

$$ \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}. $$

Результат следует из того факта , что ожидание является линейным (E[aX]=aE[X]) и дисперсией является степенью 2 однородного (Var[aX]=a2Var[X]).

Обобщенная линейная модель

В обобщенной линейной модели, предиктивные распределения для переменного отклика Y связанно с вектором наблюдаемых предикторов x. Распределение является членом overdispersed экспоненциального семейства, а параметр θ заменяется h(η) , где h является известной функцией, η:=xβ является так называемым линейным откликом, и β представляет собой вектор параметров (коэффициентов регрессии), которые необходимо изучить. В общем случае параметр дисперсии ϕ можно научиться тоже, но в нашей установке мы будем рассматривать ϕ , как известно. Итак, наша установка

YpOEF(m,T)(|θ=h(η),ϕ)

где структура модель характеризуется распределением pOEF(m,T) и функции h , который преобразует линейный отклик на параметры.

Традиционно, отображение из линейного отклика η к среднему μ:=EYpOEF(m,T)(|θ=h(η),ϕ)[Y] обозначается

μ=g1(η).

Это отображение требуется , чтобы один-к-одному, и обратное, g, называется функцией связи для этого GLM. Обычно GLM описывают, называя его функцию связи и семейство распределений - например, «GLM с распределением Бернулли и функцией логита связи» (также известной как модель логистической регрессии). Для того , чтобы полностью охарактеризовать GLM, функция h также должен быть указан. Если h является тождественным, то g называется канонической функцией связи.

Требование: Выражение h в терминах достаточной статистики

Определять

MeanT(η):=EYpOEF(m,T)(|θ=h(η),ϕ)[T(Y)]

и

VarT(η):=VarYpOEF(m,T)(|θ=h(η),ϕ)[T(Y)].

Тогда у нас есть

h(η)=ϕMeanT(η)VarT(η).

Доказательство

Под «средним значением и дисперсией достаточной статистики» мы имеем

MeanT(η)=A(h(η)).

Дифференцируя цепным правилом, получаем

MeanT(η)=A(h(η))h(η),

и "Среднее значение и дисперсия достаточной статистики"

=1ϕVarT(η) h(η).

Напрашивается вывод.

Подгонка параметров GLM к данным

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

Предположим , что мы наблюдали векторы прогнозирующих xi и связанные с ними скалярные ответов yi. В матричной форме, мы будем говорить , что мы наблюдали предсказатель x и ответ y, где x является матрицей, iй строкой является xi и y является вектором, i- й элемент yi. Логарифмическое правдоподобие параметров β затем

(β;x,y)=i=1NlogpOEF(m,T)(yi|θ=h(xiβ),ϕ).

Для единичной выборки данных

Для упрощения обозначений, давайте сначала рассмотрим случай одной точки данных, N=1; затем мы расширим его на общий случай по аддитивности.

Градиент

У нас есть

(β;x,y)=logpOEF(m,T)(y|θ=h(xβ),ϕ)=logm(y,ϕ)+θT(y)A(θ)ϕ,where θ=h(xβ).

Следовательно, по цепному правилу

β(β;x,y)=T(y)A(θ)ϕh(xβ)x.

Отдельно от «среднего и дисперсии достаточной статистики,» мы имеем A(θ)=MeanT(xβ). Следовательно, по «претензии: Выражая h в терминах достаточной статистики,» мы имеем

=(T(y)MeanT(xβ))MeanT(xβ)VarT(xβ)x.

Гессен

Дифференцируя второй раз, по правилу произведения получаем

β2(β;x,y)=[A(h(xβ))h(xβ)]h(xβ)xx+[T(y)A(h(xβ))]h(xβ)xx]=(MeanT(xβ)h(xβ)+[T(y)A(h(xβ))])xx.

Информация Fisher

Под «средним значением и дисперсией достаточной статистики» мы имеем

EYpOEF(m,T)(|θ=h(xβ),ϕ)[T(y)A(h(xβ))]=0.

Следовательно

EYpOEF(m,T)(|θ=h(xβ),ϕ)[β2(β;x,y)]=MeanT(xβ)h(xβ)xx=ϕMeanT(xβ)2VarT(xβ)xx.

Для нескольких выборок данных

Продолжим теперь N=1 дело в общем случае. Пусть η:=xβ обозначим вектор, i- й координате линейный отклик от i- й выборки данных. Пусть T (соотв. MeanT, соответственно VarT) обозначает функцию , которая применяет скалярная функция транслируемое (векторизованную) T (соответственно MeanT, соответственно VarT) каждой координате . Тогда у нас есть

β(β;x,y)=i=1Nβ(β;xi,yi)=i=1N(T(y)MeanT(xiβ))MeanT(xiβ)VarT(xiβ)xi=xdiag(MeanT(xβ)VarT(xβ))(T(y)MeanT(xβ))

и

EYipOEF(m,T)(|θ=h(xiβ),ϕ)[β2(β;x,Y)]=i=1NEYipOEF(m,T)(|θ=h(xiβ),ϕ)[β2(β;xi,Yi)]=i=1NϕMeanT(xiβ)2VarT(xiβ)xixi=xdiag(ϕMeanT(xβ)2VarT(xβ))x,

где дроби обозначают поэлементное деление.

Проверка формул численно

Проверим теперь приведенную выше формулу для градиента логарифмического правдоподобия численно с использованием 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