Logistic Regression 公式推导

假设X是一个离散型随机变量,其取值集合为ϰ\varkappa

信息量

针对事件x0x_0,它发生的“惊讶程度”或不确定性,也就是信息量,通过下面的公式计算。

I(x0)=log2p(x0)I(x_0) = -log_2 \, p(x_0)

熵(信息熵)

对于一个随机变量X而言,它的所有可能取值的信息量的期望E[I(x)]E[I(x)]就称为熵

离散变量

H(X)=Eplog21p(x)=xϰp(x)log2p(x)H(X)= E_p log_2 \frac {1}{p(x)} = -\sum_{x\in \varkappa} p(x) log_2 \, p(x)

连续变量

H(X)=xϰp(x)log2p(x)dxH(X) = - \int_{x \in \varkappa} \, p(x) \, log_2 p(x) \, dx

相对熵(Relative Entropy)

相对熵(Eelative Entropy)又称为KL散度(Kullback-Leibler divergence),KL距离,是两个随机分布间距离的度量。记作DKL(pq)D_{KL}(p||q)

DKL(pq)=Ep[logp(x)q(x)]=xϰp(x)logp(x)q(x)=xϰ[p(x)logp(x)p(x)logq(x)]=xϰp(x)logp(x)xϰp(x)logq(x)=H(p)xϰp(x)logq(x)=H(p)+Ep[logq(x)]=Hp(q)H(p)\begin{aligned} D_{KL}(p||q) &= E_p[log \, \frac {p(x)} {q(x)}] \\ &= \sum_{x \in \varkappa} \, p(x) \, log \, \frac {p(x)} {q(x)} \\ &= \sum_{x \in \varkappa} [p(x)\,log\,p(x) - p(x)\,log\,q(x)] \\ &= \sum_{x \in \varkappa} p(x)\,log\,p(x) - \sum_{x \in \varkappa} p(x)\,log\,q(x) \\ &= -H(p) - \sum_{x \in \varkappa} p(x)\,log\,q(x) \\ &= -H(p) + E_p [-log\,q(x)] \\ &= H_p(q) - H(p) \end{aligned}

上述公式中log = log_2,但是在代码实现中都以ee为底数

假设pp为真实概率分布,qq为我们假设的概率分布

  • p=qp=q时,显然DKL(pq)D_KL(p||q)=0
  • H(p)H(p) 表示对真实分布p所需要的最小编码bit数
  • Hq(p)H_q(p) 表示在pp分布下,使用qq进行编码所需要的bit数量
  • DKL(pq)D_KL(p||q)表示在真实分布pp的前提下,使用qq进行编码相对于pp进行编码(最优编码)多出来的bit数

交叉熵(Cross Entropy)

CEH(p,q)=Ep[logq]=xϰp(x)logq(x)=H(p)+DKL(pq)CEH(p, q) = E_p[-log\,q] = - \sum_{x \in \varkappa} p(x) log\,q(x) = H(p) + D_{KL}(p||q)

pp为真实概率分布的前提下,H(p)H(p)可以看作常数,此时交叉熵和相对熵在行为上表现一致,都反映分布ppqq之前的相似程度。所以一般在机器学习中,都直接优化交叉熵。

逻辑回归(Logistic Regression)

  • p: 真实样本分布,服从参数为p的0-1分布
  • q: 待估计的模型,服从参数为q的0-1分布

定义假设函数(hypothesis function)为

hθ=11+eθTxh_{\theta} = \frac {1} {1+ e ^{ -{\theta}^T x }}

逻辑回归本质就是2分类问题

P(y^x(i);θ)={hθ(x(i))if y^=11hθ(x(i))if y^=0P(\hat{y}| x^{(i)};\theta) = \begin{cases} h_{\theta}(x^{(i)}) &\text{if } \hat{y} = 1 \\ 1- h_{\theta}(x^{(i)}) &\text{if } \hat{y} = 0 \end{cases}

上述公式可以写为更一般的形式

P(y^x(i);θ)=y^hθ(x(i))+(1y^)(1hθ(x(i)))P(\hat{y}| x^{(i)};\theta) = \hat{y} \, h_{\theta}(x^{(i)}) + (1- \hat{y}) (1- h_{\theta}(x^{(i)}))

带入至交叉熵公式中

Loss(y^,y)=CEH(p,q)=p(y^)logq(y)=[Pp(y^=1)]logPq(y^=1)+Pp(y^=0)logPq(y^=0)]=[y^loghθ(x)+(1y^)log(1hθ(x))]\begin{aligned} Loss(\hat{y}, y) \\ &= CEH(p, q) \\ &= - p(\hat{y})\,log\,q(y) \\ &= - [P_p(\hat{y}=1)]\,logP_q(\hat{y}=1) + P_p(\hat{y}=0)\,log\,P_q(\hat{y}=0)] \\ &= -[\hat{y}\,log\,h_{\theta}(x)+(1-\hat{y})\,log\,(1-h_{\theta}(x))] \end{aligned}

对于m个样本取均值

1mi=1m[y(i)hθ(x)(i)+(1y(i))(1hθ(x)(i))]\frac {1}{m} \sum_{i=1}^{m}[y^{(i)} h_{\theta}(x)^{(i)} + (1-y^{(i)}) (1-h_{\theta}(x)^{(i)})]

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import tensorflow as tf
import numpy as np
lables = np.array([0,1,1,1,0], dtype=np.float32)
predictions = np.array([-5,6,5,2,-1], dtype=np.float32)

def sigmoid(x):
return 1 / (1 + np.exp(-x))

def sigmoid_corss_entropy(lables, predictions):
logits = sigmoid(predictions)
ces = - lables * np.log(logits) - (1 - lables) * np.log(1-logits)
return ces

np_sigmoid_corss_entropy = sigmoid_corss_entropy(lables, predictions).mean()

with tf.Session() as sess:
tf_sigmoid_cross_entropy_tensor = tf.losses.sigmoid_cross_entropy(multi_class_labels=tf.constant(lables), logits=tf.constant(predictions))
tf_sigmoid_cross_entropy = sess.run(tf_sigmoid_cross_entropy_tensor)

print(np_sigmoid_corss_entropy) # 0.0912192
print(tf_sigmoid_cross_entropy) # 0.0912192