عرض على TensorFlow.org | تشغيل في Google Colab | عرض المصدر على جيثب | تحميل دفتر |
في هذا الكمبيوتر الدفتري نقدم نماذج خطية معممة من خلال مثال عملي. لقد قمنا بحل هذا المثال بطريقتين مختلفتين باستخدام خوارزميتين لتناسب GLMs بكفاءة في احتمالية TensorFlow: تسجيل نقاط فيشر للبيانات الكثيفة ، وتنسيق نزول التدرج القريب للبيانات المتفرقة. قارنا معاملات المجهزة لمعاملات حقيقية، وفي حالة coordinatewise القريبة التدرج النسب، لإخراج مماثلة R في glmnet
الخوارزمية. أخيرًا ، نقدم المزيد من التفاصيل والمشتقات الرياضية للعديد من الخصائص الرئيسية لـ GLMs.
خلفية
نموذج الخطي المعمم (GLM) هو النموذج الخطي (\(\eta = x^\top \beta\)) ملفوفة في التحول (وظيفة وصلة) ومجهزة توزيع استجابة من أسرة الأسس. اختيار وظيفة الارتباط وتوزيع الاستجابة مرن للغاية ، مما يضفي تعبيرًا رائعًا على GLMs. التفاصيل الكاملة ، بما في ذلك العرض التقديمي المتسلسل لجميع التعاريف والنتائج التي تصل إلى GLMs في تدوين لا لبس فيه ، موجودة في "اشتقاق حقائق GLM" أدناه. نلخص:
في GLM، وتوزيع التنبؤي للمتغير استجابة \(Y\) يرتبط متجه للتنبؤ المرصودة \(x\). التوزيع له الشكل:
\[ \begin{align*} p(y \, |\, x) &= m(y, \phi) \exp\left(\frac{\theta\, T(y) - A(\theta)}{\phi}\right) \\ \theta &:= h(\eta) \\ \eta &:= x^\top \beta \end{align*} \]
هنا \(\beta\) هي المعلمات ( "الأوزان")، \(\phi\) على hyperparameter تمثل تشتت ( "التباين")، و \(m\)، \(h\)، \(T\)، \(A\) ويتميز هذا النموذج المحدد من قبل المستخدم الأسرة.
يعني من \(Y\) يعتمد على \(x\) من تكوين الخطية استجابة \(\eta\) و(معكوس) وظيفة وصلة، أي:
\[ \mu := g^{-1}(\eta) \]
حيث \(g\) هو ما يسمى وظيفة الارتباط. في TFP وspecifed اختيار وظيفة صلة وعائلة نموذجية مشتركة من قبل tfp.glm.ExponentialFamily
فرعية. الامثله تشمل:
-
tfp.glm.Normal
، ويعرف أيضا باسم "الانحدار الخطي" -
tfp.glm.Bernoulli
، ويعرف أيضا باسم "الانحدار اللوجستي" -
tfp.glm.Poisson
، ويعرف أيضا باسم "انحدار بواسون" -
tfp.glm.BernoulliNormalCDF
، ويعرف أيضا باسم "الاحتمالية الانحدار".
TFP يفضل تسمية العائلات نموذج وفقا للتوزيع على Y
بدلا من وظيفة وصلة منذ tfp.Distribution
الصورة هي بالفعل مواطنين من الدرجة الأولى. إذا كان tfp.glm.ExponentialFamily
اسم فئة فرعية يحتوي على الكلمة الثانية، وهذا يشير إلى وجود وظيفة وصلة غير متعارف عليها .
تتمتع GLMs بالعديد من الخصائص الرائعة التي تسمح بالتنفيذ الفعال لمقدر الاحتمالية القصوى. ومن أهم هذه الخصائص هي صيغ بسيطة لالتدرج من سجل-احتمالات \(\ell\)، وبالنسبة للمصفوفة المعلومات فيشر، الذي هو القيمة المتوقعة من هسه من السلبية سجل-احتمالات تحت إعادة أخذ العينات للاستجابة تحت نفس المتنبئين. بمعنى آخر:
\[ \begin{align*} \nabla_\beta\, \ell(\beta\, ;\, \mathbf{x}, \mathbf{y}) &= \mathbf{x}^\top \,\text{diag}\left(\frac{ {\textbf{Mean}_T}'(\mathbf{x} \beta) }{ {\textbf{Var}_T}(\mathbf{x} \beta) }\right) \left(\mathbf{T}(\mathbf{y}) - {\textbf{Mean}_T}(\mathbf{x} \beta)\right) \\ \mathbb{E}_{Y_i \sim \text{GLM} | x_i} \left[ \nabla_\beta^2\, \ell(\beta\, ;\, \mathbf{x}, \mathbf{Y}) \right] &= -\mathbf{x}^\top \,\text{diag}\left( \frac{ \phi\, {\textbf{Mean}_T}'(\mathbf{x} \beta)^2 }{ {\textbf{Var}_T}(\mathbf{x} \beta) }\right)\, \mathbf{x} \end{align*} \]
حيث \(\mathbf{x}\) هي المصفوفة التي \(i\)عشر الصف متجه مؤشرا ل \(i\)عشر عينة البيانات، و \(\mathbf{y}\) هو متجه التي \(i\)عشر تنسيق هو الرد المرصودة لل \(i\)عشر عينة البيانات . هنا (متحدثا فضفاضة)، \({\text{Mean}_T}(\eta) := \mathbb{E}[T(Y)\,|\,\eta]\) و \({\text{Var}_T}(\eta) := \text{Var}[T(Y)\,|\,\eta]\)، وبحروف بارزة يدل على كمية موجهة من هذه الوظائف. يمكن الاطلاع على التفاصيل الكاملة لتوزيعات هذه التوقعات والتباينات في "اشتقاق حقائق GLM" أدناه.
مثال
في هذا القسم ونحن تصف لفترة وجيزة وعرض اثنين من المدمج في GLM المناسب الخوارزميات في TensorFlow الاحتمالات: فيشر التهديف ( tfp.glm.fit
) وcoordinatewise القريبة التدرج أصل ( 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
الأدوات فيشر التهديف، والتي تأخذ عن بعض من حججها:
-
model_matrix
= \(\mathbf{x}\) -
response
= \(\mathbf{y}\) -
model
= استدعاء التي، نظرا حجة \(\boldsymbol{\eta}\)، إرجاع $ الثلاثي \ الأيسر ({\ textbf {يعني} _T} (\ boldsymbol {\ ايتا})، {\ textbf {فار} _T} (\ boldsymbol {\ ايتا} ) ، {\ textbf {Mean} _T} '(\ boldsymbol {\ eta}) \ right) $.
من المستحسن أن model
يكون مثيل tfp.glm.ExponentialFamily
الصف. تتوفر العديد من عمليات التنفيذ المعدة مسبقًا ، لذلك لا يلزم وجود رمز مخصص لمعظم GLMs الشائعة.
@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
تفاصيل رياضية
تسجيل درجات فيشر هو تعديل لطريقة نيوتن لإيجاد تقدير الاحتمالية القصوى
\[ \hat\beta := \underset{\beta}{\text{arg max} }\ \ \ell(\beta\ ;\ \mathbf{x}, \mathbf{y}). \]
طريقة Vanilla Newton ، التي تبحث عن أصفار تدرج احتمالية السجل ، ستتبع قاعدة التحديث
\[ \beta^{(t+1)}_{\text{Newton} } := \beta^{(t)} - \alpha \left( \nabla^2_\beta\, \ell(\beta\ ;\ \mathbf{x}, \mathbf{y}) \right)_{\beta = \beta^{(t)} }^{-1} \left( \nabla_\beta\, \ell(\beta\ ;\ \mathbf{x}, \mathbf{y}) \right)_{\beta = \beta^{(t)} } \]
حيث \(\alpha \in (0, 1]\) هو معدل التعلم المستخدمة للسيطرة على حجم الخطوة.
في تسجيل نقاط فيشر ، نستبدل Hessian بمصفوفة معلومات Fisher السلبية:
\[ \begin{align*} \beta^{(t+1)} &:= \beta^{(t)} - \alpha\, \mathbb{E}_{ Y_i \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(x_i^\top \beta^{(t)}), \phi) } \left[ \left( \nabla^2_\beta\, \ell(\beta\ ;\ \mathbf{x}, \mathbf{Y}) \right)_{\beta = \beta^{(t)} } \right]^{-1} \left( \nabla_\beta\, \ell(\beta\ ;\ \mathbf{x}, \mathbf{y}) \right)_{\beta = \beta^{(t)} } \\[3mm] \end{align*} \]
[لاحظ أن هنا \(\mathbf{Y} = (Y_i)_{i=1}^{n}\) هو عشوائي، في حين \(\mathbf{y}\) لا يزال ناقلات الردود المرصودة.]
من خلال الصيغ الموجودة في "Fitting GLM Parameters To Data" أدناه ، يتم تبسيط ذلك إلى
\[ \begin{align*} \beta^{(t+1)} &= \beta^{(t)} + \alpha \left( \mathbf{x}^\top \text{diag}\left( \frac{ \phi\, {\textbf{Mean}_T}'(\mathbf{x} \beta^{(t)})^2 }{ {\textbf{Var}_T}(\mathbf{x} \beta^{(t)}) }\right)\, \mathbf{x} \right)^{-1} \left( \mathbf{x}^\top \text{diag}\left(\frac{ {\textbf{Mean}_T}'(\mathbf{x} \beta^{(t)}) }{ {\textbf{Var}_T}(\mathbf{x} \beta^{(t)}) }\right) \left(\mathbf{T}(\mathbf{y}) - {\textbf{Mean}_T}(\mathbf{x} \beta^{(t)})\right) \right). \end{align*} \]
مع تنظيم L1
tfp.glm.fit_sparse
الأدوات وGLM مجرب أكثر مناسبة لمجموعات البيانات متفرق، استنادا إلى خوارزمية في يوان، هو ولين 2012 . تشمل ميزاته:
- تسوية L1
- لا مصفوفة انقلابات
- تقييمات قليلة للتدرج و Hessian.
نقدم أولاً مثالاً لاستخدام الكود. وبمزيد من التفصيل تفاصيل الخوارزمية في "تفاصيل حسابي ل 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
قارنا إخراج coordinatewise القريبة التدرج النسب إلى أن من R في 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
نقدم الخوارزمية كسلسلة من ثلاثة تعديلات على طريقة نيوتن. في كل واحدة، وسيادة التحديث ل \(\beta\) تقوم على ناقلات \(s\) ومصفوفة \(H\) التي تقارب التدرج وهسه من سجل-احتمالات. في خطوة \(t\)، نختار تنسيق \(j^{(t)}\) إلى التغيير، ونقوم بتحديث \(\beta\) وفقا لقاعدة تحديث:
\[ \begin{align*} u^{(t)} &:= \frac{ \left( s^{(t)} \right)_{j^{(t)} } }{ \left( H^{(t)} \right)_{j^{(t)},\, j^{(t)} } } \\[3mm] \beta^{(t+1)} &:= \beta^{(t)} - \alpha\, u^{(t)} \,\text{onehot}(j^{(t)}) \end{align*} \]
هذا التحديث هو نيوتن مثل خطوة في تعلم معدل \(\alpha\). فيما عدا الجزء الاخير (L1 التنظيم)، والتعديلات أدناه تختلف فقط في كيفية تحديث \(s\) و \(H\).
نقطة البداية: تنسيق طريقة نيوتن
في طريقة coordinatewise نيوتن، وضعنا \(s\) و \(H\) إلى التدرج الحقيقي وهسه من سجل-احتمالات:
\[ \begin{align*} s^{(t)}_{\text{vanilla} } &:= \left( \nabla_\beta\, \ell(\beta \,;\, \mathbf{x}, \mathbf{y}) \right)_{\beta = \beta^{(t)} } \\ H^{(t)}_{\text{vanilla} } &:= \left( \nabla^2_\beta\, \ell(\beta \,;\, \mathbf{x}, \mathbf{y}) \right)_{\beta = \beta^{(t)} } \end{align*} \]
تقييمات أقل للتدرج و Hessian
غالبًا ما يكون حساب التدرج اللوني و Hessian احتمال السجل مكلفًا ، لذلك غالبًا ما يكون من المفيد تقريبهما. يمكننا القيام بذلك على النحو التالي:
- عادة ، تقريب Hessian على أنها ثابتة محليًا وتقريب التدرج إلى الترتيب الأول باستخدام (تقريبي) Hessian:
\[ \begin{align*} H_{\text{approx} }^{(t+1)} &:= H^{(t)} \\ s_{\text{approx} }^{(t+1)} &:= s^{(t)} + H^{(t)} \left( \beta^{(t+1)} - \beta^{(t)} \right) \end{align*} \]
- في بعض الأحيان، تنفيذ "الفانيليا" خطوة التحديث على النحو الوارد أعلاه، ووضع \(s^{(t+1)}\) إلى التدرج الدقيق و \(H^{(t+1)}\) إلى هسه الدقيق للسجل-احتمالات وتقييمها في \(\beta^{(t+1)}\).
استبدل معلومات Fisher السلبية بـ Hessian
لمزيد من خفض تكلفة خطوات التحديث الفانيليا، فإننا يمكن أن يحدد \(H\) إلى السلبية فيشر مصفوفة المعلومات (محسوب كفاءة استخدام الصيغ في "تركيب GLM معلمات لبيانات" أدناه) بدلا من هسه بالضبط:
\[ \begin{align*} H_{\text{Fisher} }^{(t+1)} &:= \mathbb{E}_{Y_i \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(x_i^\top \beta^{(t+1)}), \phi)} \left[ \left( \nabla_\beta^2\, \ell(\beta\, ;\, \mathbf{x}, \mathbf{Y}) \right)_{\beta = \beta^{(t+1)} } \right] \\ &= -\mathbf{x}^\top \,\text{diag}\left( \frac{ \phi\, {\textbf{Mean}_T}'(\mathbf{x} \beta^{(t+1)})^2 }{ {\textbf{Var}_T}(\mathbf{x} \beta^{(t+1)}) }\right)\, \mathbf{x} \\ s_{\text{Fisher} }^{(t+1)} &:= s_{\text{vanilla} }^{(t+1)} \\ &= \left( \mathbf{x}^\top \,\text{diag}\left(\frac{ {\textbf{Mean}_T}'(\mathbf{x} \beta^{(t+1)}) }{ {\textbf{Var}_T}(\mathbf{x} \beta^{(t+1)}) }\right) \left(\mathbf{T}(\mathbf{y}) - {\textbf{Mean}_T}(\mathbf{x} \beta^{(t+1)})\right) \right) \end{align*} \]
تنظيم L1 عبر هبوط التدرج القريب
لتضمين تسوية L1 ، نقوم باستبدال قاعدة التحديث
\[ \beta^{(t+1)} := \beta^{(t)} - \alpha\, u^{(t)} \,\text{onehot}(j^{(t)}) \]
مع قاعدة التحديث الأكثر عمومية
\[ \begin{align*} \gamma^{(t)} &:= -\frac{\alpha\, r_{\text{L1} } }{\left(H^{(t)}\right)_{j^{(t)},\, j^{(t)} } } \\[2mm] \left(\beta_{\text{reg} }^{(t+1)}\right)_j &:= \begin{cases} \beta^{(t+1)}_j &\text{if } j \neq j^{(t)} \\ \text{SoftThreshold} \left( \beta^{(t)}_j - \alpha\, u^{(t)} ,\ \gamma^{(t)} \right) &\text{if } j = j^{(t)} \end{cases} \end{align*} \]
حيث \(r_{\text{L1} } > 0\) هو ثابت الموردة (تقنين معامل L1) و \(\text{SoftThreshold}\) هي المشغل العتبة الناعمة، التي يحددها
\[ \text{SoftThreshold}(\beta, \gamma) := \begin{cases} \beta + \gamma &\text{if } \beta < -\gamma \\ 0 &\text{if } -\gamma \leq \beta \leq \gamma \\ \beta - \gamma &\text{if } \beta > \gamma. \end{cases} \]
تحتوي قاعدة التحديث هذه على الخاصيتين الملهمتين التاليتين ، والتي نوضحها أدناه:
في الحد من حالة \(r_{\text{L1} } \to 0\) (أي، لا 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). $$
حالة منحطة \(r_{\text{L1} } = 0\) يسترد قاعدة تحديث الأصلية
لرؤية (1)، لاحظ أنه إذا \(r_{\text{L1} } = 0\) ثم \(\gamma^{(t)} = 0\)، وبالتالي
\[ \begin{align*} \left(\beta_{\text{reg} }^{(t+1)}\right)_{j^{(t)} } &= \text{SoftThreshold} \left( \beta^{(t)}_{j^{(t)} } - \alpha\, u^{(t)} ,\ 0 \right) \\ &= \beta^{(t)}_{j^{(t)} } - \alpha\, u^{(t)}. \end{align*} \]
لذلك
\[ \begin{align*} \beta_{\text{reg} }^{(t+1)} &= \beta^{(t)} - \alpha\, u^{(t)} \,\text{onehot}(j^{(t)}) \\ &= \beta^{(t+1)}. \end{align*} \]
عامل القرب الذي تكون نقطته الثابتة هي MLE المنتظم
لرؤية (2)، المذكرة الأولى (انظر ويكيبيديا ) أن أي \(\gamma > 0\)وسيادة التحديث
\[ \left(\beta_{\text{exact-prox}, \gamma}^{(t+1)}\right)_{j^{(t)} } := \text{prox}_{\gamma \lVert \cdot \rVert_1} \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)} } \right) \]
يرضي (2)، حيث \(\text{prox}\) هي المشغل القرب (انظر يو ، حيث يرمز هذا المشغل \(\mathsf{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). $$
على وجه الخصوص، ووضع\(\gamma = \gamma^{(t)} = -\frac{\alpha\, r_{\text{L1} } }{\left(H^{(t)}\right)_{j^{(t)}, j^{(t)} } }\)(علما بأن \(\gamma^{(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). $$
نحن ثم استبدال المحدد التدرج $ \ الأيسر (\ nabla \ بيتا \، \ الذراع (\ بيتا \؛ \، \ mathbf {س}، \ mathbf {ص}) \ اليمين) {\ بيتا = \ بيتا ^ {( ر)}} $ مع ه تقريب \(s^{(t)}\)، والحصول على
\ تبدأ {محاذاة} \ الأيسر (\ بيتا {\ النص {بالضبط-بالوكاله}، \ جاما ^ {(ر)}} ^ {(ر + 1)} \ اليمين) {ي ^ {(ر)}} & \ تقريبا \ النص {SoftThreshold} \ الأيسر (\ بيتا ^ {(ر)} {ي ^ {(ر)}} - \ ألفا \ فارك {\ اليسار (ق ^ {(ر)} \ اليمين) {ي ^ {( ر)}}} {\ الأيسر (H ^ {(ر)} \ اليمين) {ي ^ {(ر)}، ي ^ {(ر)}}}، \ \ جاما ^ {(ر)} \ اليمين) \ \ اليسار و= \ النص {SoftThreshold} (\ بيتا ^ {(ر)} {ي ^ {(ر)}} - \ ألفا \، ش ^ {(ر)}، \ \ جاما ^ {(ر)} \الصحيح). \ نهاية {محاذاة}
لذلك
\[ \beta_{\text{exact-prox}, \gamma^{(t)} }^{(t+1)} \approx \beta_{\text{reg} }^{(t+1)}. \]
اشتقاق حقائق GLM
في هذا القسم نذكر بالتفصيل الكامل ونشتق النتائج حول GLMs المستخدمة في الأقسام السابقة. ثم، ونحن نستخدم TensorFlow و gradients
للتحقق عدديا الصيغ المشتقة عن التدرج من سجل-احتمالات والمعلومات فيشر.
سكور ومعلومات فيشر
النظر في عائلة من التوزيعات الاحتمالية معلمات بواسطة ناقلات المعلمة \(\theta\)، وجود كثافة احتمال \(\left\{p(\cdot | \theta)\right\}_{\theta \in \mathcal{T} }\). النتيجة من نتائج \(y\) في المعلمة ناقلات \(\theta_0\) يعرف أن التدرج من احتمال سجل \(y\) (تقييم في \(\theta_0\))، وهذا هو،
\[ \text{score}(y, \theta_0) := \left[\nabla_\theta\, \log p(y | \theta)\right]_{\theta=\theta_0}. \]
مطالبة: توقع النتيجة صفر
في ظل ظروف انتظام معتدلة (مما يسمح لنا بتمرير التمايز تحت التكامل) ،
\[ \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[\text{score}(Y, \theta_0)\right] = 0. \]
دليل
لدينا
\[ \begin{align*} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[\text{score}(Y, \theta_0)\right] &:=\mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[\left(\nabla_\theta \log p(Y|\theta)\right)_{\theta=\theta_0}\right] \\ &\stackrel{\text{(1)} }{=} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[\frac{\left(\nabla_\theta p(Y|\theta)\right)_{\theta=\theta_0} }{p(Y|\theta=\theta_0)}\right] \\ &\stackrel{\text{(2)} }{=} \int_{\mathcal{Y} } \left[\frac{\left(\nabla_\theta p(y|\theta)\right)_{\theta=\theta_0} }{p(y|\theta=\theta_0)}\right] p(y | \theta=\theta_0)\, dy \\ &= \int_{\mathcal{Y} } \left(\nabla_\theta p(y|\theta)\right)_{\theta=\theta_0}\, dy \\ &\stackrel{\text{(3)} }{=} \left[\nabla_\theta \left(\int_{\mathcal{Y} } p(y|\theta)\, dy\right) \right]_{\theta=\theta_0} \\ &\stackrel{\text{(4)} }{=} \left[\nabla_\theta\, 1 \right]_{\theta=\theta_0} \\ &= 0, \end{align*} \]
حيث استخدمنا: (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] $$
حيث \(\nabla_\theta^2 F\) يدل على مصفوفة هس، الذي \((i, j)\) هو دخول \(\frac{\partial^2 F}{\partial \theta_i \partial \theta_j}\).
ويطلق على الجانب الأيسر من هذه المعادلة المعلومات فيشر الأسرة \(\left\{p(\cdot | \theta)\right\}_{\theta \in \mathcal{T} }\) في ناقلات المعلمة \(\theta_0\).
إثبات المطالبة
لدينا
\[ \begin{align*} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \left(\nabla_\theta^2 \log p(Y | \theta)\right)_{\theta=\theta_0} \right] &\stackrel{\text{(1)} }{=} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \left(\nabla_\theta^\top \frac{ \nabla_\theta p(Y | \theta) }{ p(Y|\theta) }\right)_{\theta=\theta_0} \right] \\ &\stackrel{\text{(2)} }{=} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \frac{ \left(\nabla^2_\theta p(Y | \theta)\right)_{\theta=\theta_0} }{ p(Y|\theta=\theta_0) } - \left(\frac{ \left(\nabla_\theta\, p(Y|\theta)\right)_{\theta=\theta_0} }{ p(Y|\theta=\theta_0) }\right) \left(\frac{ \left(\nabla_\theta\, p(Y|\theta)\right)_{\theta=\theta_0} }{ p(Y|\theta=\theta_0) }\right)^\top \right] \\ &\stackrel{\text{(3)} }{=} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \frac{ \left(\nabla^2_\theta p(Y | \theta)\right)_{\theta=\theta_0} }{ p(Y|\theta=\theta_0) } - \text{score}(Y, \theta_0) \,\text{score}(Y, \theta_0)^\top \right], \end{align*} \]
حيث استخدمنا (1) قاعدة السلسلة للتفاضل ، (2) قاعدة خارج القسمة للتفاضل ، (3) قاعدة السلسلة مرة أخرى ، في الاتجاه المعاكس.
ويكفي إثبات ذلك لإكمال الإثبات
\[ \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \frac{ \left(\nabla^2_\theta p(Y | \theta)\right)_{\theta=\theta_0} }{ p(Y|\theta=\theta_0) } \right] \stackrel{\text{?} }{=} 0. \]
للقيام بذلك ، نجتاز عملية التفاضل تحت علامة التكامل مرتين:
\[ \begin{align*} \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)}\left[ \frac{ \left(\nabla^2_\theta p(Y | \theta)\right)_{\theta=\theta_0} }{ p(Y|\theta=\theta_0) } \right] &= \int_{\mathcal{Y} } \left[ \frac{ \left(\nabla^2_\theta p(y | \theta)\right)_{\theta=\theta_0} }{ p(y|\theta=\theta_0) } \right] \, p(y | \theta=\theta_0)\, dy \\ &= \int_{\mathcal{Y} } \left(\nabla^2_\theta p(y | \theta)\right)_{\theta=\theta_0} \, dy \\ &= \left[ \nabla_\theta^2 \left( \int_{\mathcal{Y} } p(y | \theta) \, dy \right) \right]_{\theta=\theta_0} \\ &= \left[ \nabla_\theta^2 \, 1 \right]_{\theta=\theta_0} \\ &= 0. \end{align*} \]
Lemma حول مشتق وظيفة قسم السجل
إذا \(a\)، \(b\) و \(c\) هي وظائف العددية-الكرام، \(c\) مرتين للاختلاف، مثل أن عائلة توزيعات \(\left\{p(\cdot | \theta)\right\}_{\theta \in \mathcal{T} }\) يحددها
\[ p(y|\theta) = a(y) \exp\left(b(y)\, \theta - c(\theta)\right) \]
يلبي شروط الانتظام الخفيفة التي تسمح للمارة التمايز فيما يتعلق \(\theta\) تحت جزءا لا يتجزأ فيما يتعلق \(y\)، ثم
\[ \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ b(Y) \right] = c'(\theta_0) \]
و
\[ \text{Var}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ b(Y) \right] = c''(\theta_0). \]
(هنا \('\) ترمز إلى التمايز، لذلك \(c'\) و \(c''\) هي المشتقات الأولى والثانية من \(c\)).
دليل
لهذه الأسرة من التوزيعات، لدينا \(\text{score}(y, \theta_0) = b(y) - c'(\theta_0)\). ثم يتبع المعادلة الأولى من حقيقة أن \(\mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ \text{score}(y, \theta_0) \right] = 0\). بعد ذلك ، لدينا
\[ \begin{align*} \text{Var}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ b(Y) \right] &= \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ \left(b(Y) - c'(\theta_0)\right)^2 \right] \\ &= \text{the one entry of } \mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ \text{score}(y, \theta_0) \text{score}(y, \theta_0)^\top \right] \\ &= \text{the one entry of } -\mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ \left(\nabla_\theta^2 \log p(\cdot | \theta)\right)_{\theta=\theta_0} \right] \\ &= -\mathbb{E}_{Y \sim p(\cdot | \theta=\theta_0)} \left[ -c''(\theta_0) \right] \\ &= c''(\theta_0). \end{align*} \]
عائلة أسية منتشرة بشكل مفرط
A (العددية) overdispersed أسرة الأسس هي عائلة من التوزيعات التي تأخذ شكل كثافة
\[ p_{\text{OEF}(m, T)}(y\, |\, \theta, \phi) = m(y, \phi) \exp\left(\frac{\theta\, T(y) - A(\theta)}{\phi}\right), \]
حيث \(m\) و \(T\) هي وظائف معروفة قيمتها العددية، و \(\theta\) و \(\phi\) معلمات العددية.
[لاحظ أن \(A\) وoverdetermined: لأي \(\phi_0\)، وظيفة \(A\) يتحدد تماما من قبل القيد الذي\(\int p_{\text{OEF}(m, T)}(y\ |\ \theta, \phi=\phi_0)\, dy = 1\)لجميع \(\theta\). و \(A\)الصورة التي تنتجها قيم مختلفة من \(\phi_0\) يجب أن يكون كل نفس، والذي يضع قيدا على وظائف \(m\) و \(T\).]
يعني وتباين الإحصاء الكافي
في ظل نفس الظروف مثل "Lemma حول مشتق وظيفة قسم السجل" لدينا
$$ \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). $$
دليل
من خلال "Lemma حول مشتق وظيفة قسم السجل" لدينا
$$ \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}. $$
ثم يتبع نتيجة من حقيقة أن التوقع هو الخطي (\(\mathbb{E}[aX] = a\mathbb{E}[X]\)) والتباين هو درجة-2 متجانسة (\(\text{Var}[aX] = a^2 \,\text{Var}[X]\)).
النموذج الخطي المعمم
في النموذج الخطي العام، أو توزيع التنبؤي للمتغير استجابة \(Y\) يرتبط متجه للتنبؤ المرصودة \(x\). توزيع هو عضو في أسرة الأسس overdispersed، والمعلمة \(\theta\) يتم استبداله \(h(\eta)\) حيث \(h\) هي وظيفة معروفة، \(\eta := x^\top \beta\) هو ما يسمى الاستجابة الخطية، و \(\beta\) متجه من المعلمات (معاملات الانحدار) ليتم تعلمها. في عام المعلمة تشتت \(\phi\) يمكن استخلاصها أيضا، ولكن في الإعداد لدينا وسوف نتعامل مع \(\phi\) كما هو معروف. لذا فإن إعدادنا هو
\[ Y \sim p_{\text{OEF}(m, T)}(\cdot\, |\, \theta = h(\eta), \phi) \]
حيث يتميز الهيكل النموذجي من خلال توزيع \(p_{\text{OEF}(m, T)}\) وظيفة \(h\) الذي يحول استجابة خطية إلى المعلمات.
تقليديا، ورسم الخرائط من الخطية استجابة \(\eta\) إلى متوسط \(\mu := \mathbb{E}_{Y \sim p_{\text{OEF}(m, T)}(\cdot\, |\, \theta = h(\eta), \phi)}\left[ Y\right]\) راشي
\[ \mu = g^{-1}(\eta). \]
مطلوب هذا التعيين ليكون واحدا إلى واحد، ولها معكوس، \(g\)، يتم استدعاء الدالة صلة لهذا GLM. عادةً ما يصف المرء GLM من خلال تسمية وظيفة الارتباط الخاصة به وعائلة التوزيعات الخاصة به - على سبيل المثال ، "GLM مع وظيفة ارتباط توزيع Bernoulli و Logit link" (المعروف أيضًا باسم نموذج الانحدار اللوجستي). من أجل تميز تماما GLM، وظيفة \(h\) يجب أيضا أن تكون محددة. إذا \(h\) هي الهوية، ثم \(g\) هو ان يكون وظيفة الارتباط الكنسي.
المطالبة: التعبير عن \(h'\) من حيث إحصائية كافية
حدد
\[ {\text{Mean}_T}(\eta) := \mathbb{E}_{Y \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(\eta), \phi)} \left[ T(Y) \right] \]
و
\[ {\text{Var}_T}(\eta) := \text{Var}_{Y \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(\eta), \phi)} \left[ T(Y) \right]. \]
إذن لدينا
\[ h'(\eta) = \frac{\phi\, {\text{Mean}_T}'(\eta)}{ {\text{Var}_T}(\eta)}. \]
دليل
من خلال "يعني وتباين الإحصاء الكافي" لدينا
\[ {\text{Mean}_T}(\eta) = A'(h(\eta)). \]
نحصل على التفريق مع قاعدة السلسلة
\[ {\text{Mean}_T}'(\eta) = A''(h(\eta))\, h'(\eta), \]
وبواسطة "يعني وتباين الإحصاء الكافي ،"
\[ \cdots = \frac{1}{\phi} {\text{Var}_T}(\eta)\ h'(\eta). \]
الاستنتاج يتبع.
تركيب معلمات GLM في البيانات
خصائص مستمدة فوق تصلح جيدا لتركيب المعلمات GLM \(\beta\) إلى مجموعة البيانات. تعتمد طرق شبه نيوتن مثل مقياس فيشر على تدرج احتمالية السجل ومعلومات فيشر ، التي نعرضها الآن يمكن حسابها بكفاءة خاصة لـ GLM.
لنفترض أن لدينا ناقلات مؤشرا المرصودة \(x_i\) وما يرتبط بها من ردود العددية \(y_i\). في شكل مصفوفة، ونحن سوف نقول لدينا تنبئ المرصودة \(\mathbf{x}\) والاستجابة \(\mathbf{y}\)، حيث \(\mathbf{x}\) هي المصفوفة التي \(i\)عشر الصف \(x_i^\top\) و \(\mathbf{y}\) هو متجه التي \(i\)عشر العنصر غير \(y_i\). احتمال سجل من المعلمات \(\beta\) ومن ثم
\[ \ell(\beta\, ;\, \mathbf{x}, \mathbf{y}) = \sum_{i=1}^{N} \log p_{\text{OEF}(m, T)}(y_i\, |\, \theta = h(x_i^\top \beta), \phi). \]
لعينة بيانات واحدة
لتبسيط تدوين، دعونا النظر أولا في حالة وجود نقطة بيانات واحدة، \(N=1\). ثم سنمتد إلى الحالة العامة عن طريق الجمع.
الانحدار
لدينا
\[ \begin{align*} \ell(\beta\, ;\, x, y) &= \log p_{\text{OEF}(m, T)}(y\, |\, \theta = h(x^\top \beta), \phi) \\ &= \log m(y, \phi) + \frac{\theta\, T(y) - A(\theta)}{\phi}, \quad\text{where}\ \theta = h(x^\top \beta). \end{align*} \]
ومن ثم من خلال قاعدة السلسلة ،
\[ \nabla_\beta \ell(\beta\, ; \, x, y) = \frac{T(y) - A'(\theta)}{\phi}\, h'(x^\top \beta)\, x. \]
بشكل منفصل، من قبل "متوسط وتباين إحصائية كافية،" لدينا \(A'(\theta) = {\text{Mean}_T}(x^\top \beta)\). وبالتالي، من خلال "المطالبة: التعبير عن \(h'\) من حيث إحصائية كافية،" لدينا
\[ \cdots = \left(T(y) - {\text{Mean}_T}(x^\top \beta)\right) \frac{ {\text{Mean}_T}'(x^\top \beta)}{ {\text{Var}_T}(x^\top \beta)} \,x. \]
هسه
التفريق مرة ثانية بقاعدة المنتج التي نحصل عليها
\[ \begin{align*} \nabla_\beta^2 \ell(\beta\, ;\, x, y) &= \left[ -A''(h(x^\top \beta))\, h'(x^\top \beta) \right] h'(x^\top \beta)\, x x^\top + \left[ T(y) - A'(h(x^\top \beta)) \right] h''(x^\top \beta)\, xx^\top ] \\ &= \left( -{\text{Mean}_T}'(x^\top \beta)\, h'(x^\top \beta) + \left[T(y) - A'(h(x^\top \beta))\right] \right)\, x x^\top. \end{align*} \]
معلومات فيشر
من خلال "يعني وتباين الإحصاء الكافي" لدينا
\[ \mathbb{E}_{Y \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(x^\top \beta), \phi)} \left[ T(y) - A'(h(x^\top \beta)) \right] = 0. \]
لذلك
\[ \begin{align*} \mathbb{E}_{Y \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(x^\top \beta), \phi)} \left[ \nabla_\beta^2 \ell(\beta\, ;\, x, y) \right] &= -{\text{Mean}_T}'(x^\top \beta)\, h'(x^\top \beta) x x^\top \\ &= -\frac{\phi\, {\text{Mean}_T}'(x^\top \beta)^2}{ {\text{Var}_T}(x^\top \beta)}\, x x^\top. \end{align*} \]
لعينات بيانات متعددة
ونعرب الآن \(N=1\) القضية إلى قضية عامة. دعونا \(\boldsymbol{\eta} := \mathbf{x} \beta\) دلالة ناقلات التي \(i\)عشر تنسيق هو استجابة خطية من \(i\)بيانات العينة عشر. دعونا \(\mathbf{T}\) (التركيب. \({\textbf{Mean}_T}\)، التن. \({\textbf{Var}_T}\)) للدلالة على وظيفة بث (vectorized) الذي ينطبق على دالة قيم العددية \(T\) (التركيب. \({\text{Mean}_T}\)، التن. \({\text{Var}_T}\)) لكل تنسيق . إذن لدينا
\[ \begin{align*} \nabla_\beta \ell(\beta\, ;\, \mathbf{x}, \mathbf{y}) &= \sum_{i=1}^{N} \nabla_\beta \ell(\beta\, ;\, x_i, y_i) \\ &= \sum_{i=1}^{N} \left(T(y) - {\text{Mean}_T}(x_i^\top \beta)\right) \frac{ {\text{Mean}_T}'(x_i^\top \beta)}{ {\text{Var}_T}(x_i^\top \beta)} \, x_i \\ &= \mathbf{x}^\top \,\text{diag}\left(\frac{ {\textbf{Mean}_T}'(\mathbf{x} \beta) }{ {\textbf{Var}_T}(\mathbf{x} \beta) }\right) \left(\mathbf{T}(\mathbf{y}) - {\textbf{Mean}_T}(\mathbf{x} \beta)\right) \\ \end{align*} \]
و
\[ \begin{align*} \mathbb{E}_{Y_i \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(x_i^\top \beta), \phi)} \left[ \nabla_\beta^2 \ell(\beta\, ;\, \mathbf{x}, \mathbf{Y}) \right] &= \sum_{i=1}^{N} \mathbb{E}_{Y_i \sim p_{\text{OEF}(m, T)}(\cdot | \theta = h(x_i^\top \beta), \phi)} \left[ \nabla_\beta^2 \ell(\beta\, ;\, x_i, Y_i) \right] \\ &= \sum_{i=1}^{N} -\frac{\phi\, {\text{Mean}_T}'(x_i^\top \beta)^2}{ {\text{Var}_T}(x_i^\top \beta)}\, x_i x_i^\top \\ &= -\mathbf{x}^\top \,\text{diag}\left( \frac{ \phi\, {\textbf{Mean}_T}'(\mathbf{x} \beta)^2 }{ {\textbf{Var}_T}(\mathbf{x} \beta) }\right)\, \mathbf{x}, \end{align*} \]
حيث تشير الكسور إلى تقسيم العنصر.
التحقق من الصيغ عدديا
نحن الآن التحقق من الصيغة أعلاه عن التدرج من احتمال سجل عدديا باستخدام 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]: Guo-Xun Yuan و Chia-Hua Ho و Chih-Jen Lin. GLMNET مُحسَّن من أجل الانحدار اللوجستي المنظم L1. مجلة آلة الأبحاث التعلم، 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