0 Recap on Probability and Statistics

参考: probability_1.pdf
Chapter 1 Probability Theory.pdf

0.1 概率空间

我们用信息论基础 - 图2表示一个概率空间, 下面我们介绍几个概念

样本点和样本空间

信息论基础 - 图3: 样本点 信息论基础 - 图4: 所有可能发生的结果的集合,也叫所有样本点的集合,也称样本空间 image.png

sigma 代数

0.2 单变量概率分布

参考: probability_1.pdf
Chapter 1 Probability Theory.pdf

随机变量

离散型变量概率分布

PMF

image.png

连续性变量概率分布

CDF

image.png

PDF

image.png

0.3 多变量概率分布

参考probability_2.pdf

离散型变量

PMF

image.png

条件概率

image.png

连续变型量

CDF

image.png

image.png

PDF

image.png
image.png

条件概率

image.png

0.4 期望与方差

参考:probability_3.pdf

离散型

image.png

连续型

image.png

混合型

image.png

多变量条件期望

image.png

全概率公式

image.png

1 Self-Information

定义

Self-Information代表了一个离散的概率事件所含的信息, 单位是bits 假设我们有一个样本空间信息论基础 - 图21,里面是4位二进制数的排列 信息论基础 - 图22 同时我们有信息论基础 - 图23信息论基础 - 图24, 包含所有可能发生的事件的集合 假定现在我们有一个事件信息论基础 - 图25, 我们想求它的Self-Information 我们可以定义一个函数信息论基础 - 图26, 输入一个事件,输出这个事件所含的Self-Information 信息论基础 - 图27,为了方便起见,我们选取底数是2的对数

比如我们的事件信息论基础 - 图28是: 序列号形如信息论基础 - 图29, 则这个事件发生的概率是信息论基础 - 图30 则这个事件信息论基础 - 图31对应的Self-Information就是信息论基础 - 图32 完成这个计算的python代码如下:

PyTorch实现

  1. import torch
  2. def selfInformation(p):
  3. """
  4. Input a probability
  5. :return: The value of self-information
  6. """
  7. return torch.log2(torch.tensor(p)).item()
  8. if __name__ == "__main__":
  9. print(selfInformation(1/16)) # -4.0

2 Entropy

Self-Information只能描述一个离散的事件所含的信息,但我们想要推广到任何随机变量(离散和连续)

定义

对于一个随机变量信息论基础 - 图33, 它的PMF或者PDF信息论基础 - 图34,我们定义它的熵是信息论基础 - 图35 如果信息论基础 - 图36是一个离散型随机变量(假设可能的取值为信息论基础 - 图37): 信息论基础 - 图38 如果信息论基础 - 图39是一个连续性随即变量: 信息论基础 - 图40

PyTorch实现

  1. def entropy(p):
  2. """
  3. Compute the Entropy For a discrete random variable
  4. :param p: Probability Vector, summing up to 1.0
  5. :return: Shannan Entropy
  6. """
  7. entropy = - p * torch.log2(p)
  8. # Operator `nansum` will sum up the non-nan number
  9. out = nansum(entropy)
  10. return out
  11. entropy(torch.tensor([0.1, 0.5, 0.1, 0.3])) # tensor(1.6855)

由来

问1 : 为什么是**log(p(x))**? 答: 假设信息论基础 - 图41, 那么采用信息论基础 - 图42就能使得信息论基础 - 图43,每个信息论基础 - 图44彼此独立,共同为信息论基础 - 图45贡献信息量, 这其实也很符合直觉,因为信息论基础 - 图46,所以信息论基础 - 图47,也就是说信息论基础 - 图48,概率越小,此事件的信息量就越大

问2: 为什么我们需要对**log(p(x))**取负? 答: 由第一问中的分析,因为entropy也是信息的一种,我们的目标是让这个信息熵对于一个小概率事件的值更大且为正。因为信息论基础 - 图49函数在信息论基础 - 图50上是单调递增且恒为负的,所以取一个负号可以完成这个目标

问3: 为什么求信息论基础 - 图51的时候出现了**Expectation**? 答: 当我们看到一个随机变量的实现时,比如,信息论基础 - 图52, 我们把信息论基础 - 图53当做一个离散的事件来看,我们要去求信息论基础 - 图54这个事件的Self-Information信息论基础 - 图55。但是我们不满足于这一次随机变量的观测,因为信息论基础 - 图56还可能取其他的值构成其他的事件。所以,我们想要多次观测取平均,于是期望的概念就被运用在这里了。假设信息论基础 - 图57是一个离散的随机变量, 可能的取值是信息论基础 - 图58, 各自的概率是信息论基础 - 图59,我们对这个随机变量信息论基础 - 图60在各个取值下的**Self-Information**的和, 得到的就是离散条件下的**Entropy**: 信息论基础 - 图61

性质

一下性质假设信息论基础 - 图62是一个随机变量,且信息论基础 - 图63, 概率密度函数是信息论基础 - 图64(离散) 或者信息论基础 - 图65(连续), 但我们统一概率密度函数为信息论基础 - 图66

  1. 信息论基础 - 图67的正负性
  • 对于所有的离散型随机变量信息论基础 - 图68,信息论基础 - 图69
  • 对于连续性随机变量信息论基础 - 图70,信息论基础 - 图71可能为负
  1. 信息论基础 - 图72的最小值
  • 假设我们有两个概率测度(Probability Measure)信息论基础 - 图73信息论基础 - 图74, 对应的概率密度函数是信息论基础 - 图75信息论基础 - 图76信息论基础 - 图77
  • 换句话说,信息论基础 - 图78给出了一个描述随机变量的最小的信息位(information bits)的概率测度信息论基础 - 图79,对于一个随机变量信息论基础 - 图80, 其他任何的概率测度信息论基础 - 图81得到的信息量都会比用信息论基础 - 图82本就服从的概率分布的测度信息论基础 - 图83要大
  1. 信息论基础 - 图84的最大值
  • 如果信息论基础 - 图85, 且不同的事件发生的概率相近或者相等,我们的信息论基础 - 图86的值就越大
  • 对于离散型变量信息论基础 - 图87,样本空间是信息论基础 - 图88且定义事件信息论基础 - 图89, 信息论基础 - 图90
  • 对于连续性变量信息论基础 - 图91,如果它服从均匀分布,他的信息论基础 - 图92相较于其他分布来说更大

3 Mutual Information

定义

前文我们探究了在单变量下的随机变量的信息量, 下文将展开对多变量条件下的随机变量的信息量的分析 我们着重于探究:

  1. 一组变量信息论基础 - 图93的熵是多大?
  2. 一组变量信息论基础 - 图94的熵相比于信息论基础 - 图95信息论基础 - 图96各自的熵的总和的关系?

3.1 Joint Entropy

定义

我们假设有两个随机变量信息论基础 - 图97属于同一个概率测度空间信息论基础 - 图98

  • 对两个连续型变量, 信息论基础 - 图99
  • 对两个离散型变量, 信息论基础 - 图100

类似的,我们定义信息论基础 - 图101 信息论基础 - 图102就相当于是信息论基础 - 图103中包含的信息,有点类似于取并集的感觉

离散型变量

:::success 我们定义信息论基础 - 图104 :::

连续性变量

:::success 我们定义信息论基础 - 图105 :::

性质

:::info 我们可以将信息论基础 - 图106理解为随机变量对信息论基础 - 图107中含有的所有信息量, 于是我们有一下关系:

  • 如果信息论基础 - 图108,那么信息论基础 - 图109
  • 如果信息论基础 - 图110独立, 那么信息论基础 - 图111
  • 对于任意的信息论基础 - 图112,我们有信息论基础 - 图113 :::

PyTorch实现

  1. def joint_entropy(p_xy):
  2. """
  3. Compute the joint entropy for the discrete joint random variables
  4. :param p_xy: A multidimensional array representing the pmf of the (X,Y)
  5. :return: The joint entropy of the (X,Y) , namely, H(X,Y)
  6. """
  7. entropy_array = -p_xy * torch.log2(p_xy)
  8. out = nansum(entropy_array)
  9. return out
  10. print(joint_entropy(torch.tensor([[0.1,0.2,0.3],[0.1,0.1,0.2]]))) # tensor(2.4464)

3.2 Conditional Entropy

由来

:::info 条件熵的来源也非常的直观:
假设我们有一个样本集,其中的每一条数据都是(Image, Class Label)的形式
我们从这个样本中抽取一条数据,假设抽取的是信息论基础 - 图114的二元随机变量组, 则这个随机变量对信息论基础 - 图115就描述了整个样本集, 信息论基础 - 图116就是可能出现的手写数字图片数据,信息论基础 - 图117就是可能出现的Class Label
信息论基础 - 图118就是给定了手写数字图片信息之后class label含有的信息熵
由于在知道了图片长什么样之后,样本空间缩减,class label变得更加确定,事件的概率更大,信息熵就越小 :::

定义

时刻记住我们想要探究的目标是什么,是: 对于一个信息论基础 - 图119二元随机变量组,**X=x的前提下,Y=y**的这个事件带给我们的信息量 因为对于某个事件信息论基础 - 图120,它的Self-Information信息论基础 - 图121我们想要探究所有满足信息论基础 - 图122形如信息论基础 - 图123的事件的平均**Self-Information**, 于是我们定义:信息论基础 - 图124


多变量离散

信息论基础 - 图125

多变量连续

信息论基础 - 图126

性质

信息论基础 - 图127 直观来讲: 信息论基础 - 图128给出了信息论基础 - 图129联合信息量在信息论基础 - 图130给定之后剩下的部分 image.png

PyTorch实现

假设信息论基础 - 图132服从下列联合分布

X=1 X=2 X=3 信息论基础 - 图133
Y=1 0.1 0.1 0.1 0.3
Y=2 0.2 0.2 0.3 0.7
信息论基础 - 图134 0.3 0.3 0.4 1
  1. def conditional_entropy(p_xy,p_x):
  2. """
  3. Compute the conditional entropy given joint PMF and marginal PMF for multi-discrete random variables
  4. :param p_xy: joint pmf
  5. :param p_x: marginal pmf
  6. :return: conditional entropy
  7. """
  8. p_y_given_x = p_xy/p_x
  9. cond_entropy = -p_xy*torch.log2(p_y_given_x)
  10. out = nansum(cond_entropy)
  11. return out
  12. # tensor(0.8755)
  13. print(conditional_entropy(torch.tensor([[0.1,0.1,0.1],[0.2,0.2,0.3]]),torch.tensor([[0.3,0.3,0.4]])))

3.3 Mutual Information

假设我们有两个随机变量信息论基础 - 图135,我们想要探究信息论基础 - 图136共享的信息, 注意不是信息的总和 结合下面的图有助于我们理解Joint EntropyMutual Information的概念

image.png

定义

我们定义两个变量的互信息Mutual Information信息论基础 - 图138 用数学符号表达就是信息论基础 - 图139 具体的推导过程如下: 信息论基础 - 图140

性质

互信息和自信息以及条件信息熵的关系:

  • 信息论基础 - 图141
  • 信息论基础 - 图142
  • 信息论基础 - 图143

互信息的性质:

  • 对称性: 信息论基础 - 图144
  • 非负性: 信息论基础 - 图145
  • 独立条件: 信息论基础 - 图146当且仅当信息论基础 - 图147信息论基础 - 图148是独立的,如果信息论基础 - 图149信息论基础 - 图150是独立的 ,我知道了信息论基础 - 图151不会提供任何线索(信息)给信息论基础 - 图152
  • 如果信息论基础 - 图153之间存在着一种one-to-one correspondance的关系,也就是说: 如果存在一个bijective信息论基础 - 图154,则信息论基础 - 图155共享所有信息,相当于知道了其中任何一个就等于知道了另外一个,所以此时信息论基础 - 图156

image.png

PyTorch实现

假设信息论基础 - 图158服从下列联合分布

X=1 X=2 信息论基础 - 图159
Y=1 0.1 0.3 0.4
Y=2 0.4 0.2 0.6
信息论基础 - 图160 0.5 0.5 1
  1. def mutual_information(p_xy,p_x,p_y):
  2. """
  3. Compute the mutual Information for discrete joint random variables
  4. :param p_xy: Joint probability distribution of (X,Y)
  5. :param p_x: Maringal probability distribution for X
  6. :param p_y: Marginal probability distribution for Y
  7. :return: The mutual information of (X,Y)
  8. """
  9. p_on_condition = p_xy/(p_x*p_y)
  10. entropy = p_xy*torch.log2(p_on_condition)
  11. out = nansum(entropy)
  12. return out
  13. # tensor(0.1830)
  14. print(mutual_information(torch.tensor([[0.1,0.3],[0.4,0.2]]),torch.tensor([[0.5,0.5]]),torch.tensor([[0.4,0.6]])))

3.4 Pointwise Mutual Information

定义

前文介绍了求互信息的方法,本质是求了一个期望,但现在我们想知道一个特定事件的互信息 由于是互信息,一定就会牵扯到两个随机变量信息论基础 - 图161的关系 参考Self-Information的定义,我们有: 信息论基础 - 图162 这个指标使我们能够将互信息理解为: 如果信息论基础 - 图163变量不独立,观测到信息论基础 - 图164的信息和如果信息论基础 - 图165独立,观测到信息论基础 - 图166的信息相比是大了还是小了

3.5 Applications of Mutual Information

在自然语言处理中,最困难的问题是**Ambiguity Resolution** ,就是比如我们有一句话Amazon is on fire, 我们不知道这里的Amazon是亚马逊公司还是亚马逊雨林。 这时候我们可以应用互信息的概念, 假设信息论基础 - 图167,信息论基础 - 图168之类的词,然后计算信息论基础 - 图169,看看是信息论基础 - 图170雨林,热带,雨的时候大还是信息论基础 - 图171公司,科技的时候大,依次来判断文章中的Amazon是什么意思

4 Kullback-Leibler Divergence

由来

:::info K-L Divergence力图刻画两个不同的概率测度信息论基础 - 图172信息论基础 - 图173之间的相近程度 :::

定义

假设随机变量信息论基础 - 图174, 且它的pmf/pdf信息论基础 - 图175,这时有另外一个概率测度信息论基础 - 图176,且信息论基础 - 图177在这个概率测度下的pdf/pmfq(x),我们定义KL-Divergence: 信息论基础 - 图178 此时我们发现,如果信息论基础 - 图179,信息论基础 - 图180为正且值很大,也就是说,随机变量信息论基础 - 图181信息论基础 - 图182的概率测度下更可能出现,信息论基础 - 图183事件的概率普遍比事件信息论基础 - 图184在概率测度信息论基础 - 图185下的概率大,且Self-Information更小 总而言之: 我们借助随机变量信息论基础 - 图186信息论基础 - 图187得到了两个概率测度信息论基础 - 图188之间的相近程度

性质

image.png

PyTorch实现

X=1 X=2 X=3 X=4
信息论基础 - 图190 0.1 0.1 0.2 0.6
信息论基础 - 图191 0.4 0.3 0.1 0.2
  1. def kl_divergence(p, q):
  2. """
  3. Compute the KL Divergence for a random variable under distribution P and Q
  4. :param p: pmf for X under probabilistic measure P
  5. :param q: pmf for X under probabilistic measure Q
  6. :return: The absolute value of KL Divergence
  7. """
  8. kl = p * torch.log2(p / q)
  9. out = nansum(kl)
  10. return out.abs().item()
  11. # 0.7924812436103821
  12. print(kl_divergence(torch.tensor([0.1,0.1,0.2,0.6]),torch.tensor([0.4,0.3,0.1,0.2])))

这里随机变量信息论基础 - 图192在概率测度信息论基础 - 图193下更容易出现

验证非对称性

假设有三个正太分布信息论基础 - 图194,我们要验证KL-Divergence的非对成性

  1. def driver():
  2. """
  3. Run the program
  4. :return:
  5. """
  6. p_p,p_q1,p_q2 = generate_random_variable(10000)
  7. return calculate_similarity(p_p, p_q1, p_q2)
  8. def generate_random_variable(vector_length=10000):
  9. """
  10. Generate random variable from different normal distributions
  11. :param vector_length: Length of the vector
  12. :return: The generated probability vector of normal distributions
  13. """
  14. torch.manual_seed(1)
  15. p = torch.normal(0,1,(vector_length,))
  16. q1 = torch.normal(-1, 1, (vector_length,))
  17. q2 = torch.normal(1, 1, (vector_length,))
  18. return p,q1,q2
  19. def calculate_similarity(p, q1,q2):
  20. """
  21. Calculate the similarity between two distributions
  22. :param refer: referenced distribution
  23. :param target1: 1st compared distribution
  24. :param target2: 2nd compared distribution
  25. :return: The similaritybetween distribution target1 and target2
  26. """
  27. kl_pq1 = kl_divergence(p, q1)
  28. kl_pq2 = kl_divergence(p, q2)
  29. kl_q2p = kl_divergence(q2, p)
  30. similar_percentage = abs(kl_pq1-kl_pq2) / ((kl_pq1 + kl_pq2) / 2)*100
  31. differ_percentage = abs(kl_q2p - kl_pq2) / ((kl_q2p + kl_pq2) / 2) * 100
  32. return kl_pq1,kl_pq2,kl_q2p,similar_percentage,differ_percentage
  33. if __name__ == "__main__":
  34. print(driver()) #(676.23779296875, 575.7619018554688, 8803.0966796875, 16.050465751493352, 175.4442655532291)

image.png

5 Cross Entropy

定义

假设有两个概率测度信息论基础 - 图196, **Cross Entropy**也可以用于衡量两个概率测度之间的**Divergence** **KL-Divergence**类似, 我们可以定义交叉熵为: 信息论基础 - 图197 同时根据**Entropy****KL-Divergence**的定义,我们可以把交叉熵改写成: 信息论基础 - 图198

PyTorch 实现

:::success 我们的输入标签相当于One-hot Encoding ::: | | 信息论基础 - 图199 | 信息论基础 - 图200 | 信息论基础 - 图201 | Cross Entropy | | —- | —- | —- | —- | —- | | 信息论基础 - 图202 | 信息论基础 - 图203 | 信息论基础 - 图204 | 信息论基础 - 图205 | 信息论基础 - 图206 | | 信息论基础 - 图207 | 信息论基础 - 图208 | 信息论基础 - 图209 | 信息论基础 - 图210 | 信息论基础 - 图211 |

def cross_entropy(y_hat, y):

    ce = -torch.log(y_hat[range(len(y_hat)), y])
    return ce.mean()

labels = torch.tensor([0, 2])
preds = torch.tensor([[0.3, 0.6, 0.1], [0.2, 0.3, 0.5]])

cross_entropy(preds, labels)  # tensor(0.9486)

性质

image.png

多分类任务

假设我们现在有数据集信息论基础 - 图213,构成为信息论基础 - 图214 假设数据集对应的标签为信息论基础 - 图215, 表示我们的分类任务有信息论基础 - 图216个维度, 也就是有信息论基础 - 图217类 标签信息论基础 - 图218为独热编码 假设模型参数是信息论基础 - 图219

:::success 现在我们对每个样本的预测情况进行分析并对其求交叉熵, 这里假设信息论基础 - 图220都是随机变量: 信息论基础 - 图221
现在我们着眼于某个样本标签对信息论基础 - 图222:
首先我们求 信息论基础 - 图223,它代表的含义是在给定信息论基础 - 图224和模型参数信息论基础 - 图225的情况下,输出正确标签信息论基础 - 图226的概率,也就是输出正确分类的概率,我们自然是希望我们的模型使得这个概率越大越好, 这也是我们优化信息论基础 - 图227的目标, 下面开始计算, 由极大似然估计得:
信息论基础 - 图228,这个公式难理解的点在于这个指数的存在,假设对于当前数据集,分类数量是信息论基础 - 图229, 且第一条数据信息论基础 - 图230 因为我们要预测的实际上是在信息论基础 - 图231的条件下信息论基础 - 图232的概率, 也就是使得信息论基础 - 图233的那个维度信息论基础 - 图234处的概率(信息论基础 - 图235), 也就是信息论基础 - 图236的概率,但信息论基础 - 图237是一个Random Vector, 所以每一个维度信息论基础 - 图238都需要求一下概率。而我们要求的只是那个维度的概率, 所以需要加上指数标记一下我们需要的那个维度的概率信息,其他维度都不需要,这其实也就和One-hot encoding对应起来了
负对数转化成交叉熵: 信息论基础 - 图239
所有样本的CE值相加, 就成了我们的Loss Function: 信息论基础 - 图240 ::: image.png

PyTorch 实现

# Implementation of cross-entropy loss in PyTorch combines `nn.LogSoftmax()`
# and `nn.NLLLoss()`
nll_loss = NLLLoss()
loss = nll_loss(torch.log(preds), labels)
loss