机器学习数学基础(数值计算)

Posted on 2018-08-15 14:51  Charlie_ODD  阅读(1754)  评论(0编辑  收藏  举报

四、信息论

信息论是应用数学的一个分支,主要研究的是对一个信号能够提供信息的多少进行量化。如果说概率使我们能够做出不确定性的陈述以及在不确定性存在的情况下进行推理,那信息论就是使我们能够量化概率分布中不确定性的总量。

1948年,香农引入信息熵,将其定义为离散随机事件的出现概率。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。

4-1、熵

如果一个随机变量X的可能取值为X=\left\{ x_{1},x_{2} ,.....,x_{n}   \right\},其概率分布为P\left( X=x_{i}  \right) =p_{i} ,i=1,2,.....,n,则随机变量X的熵定义为H(X):

H\left( X \right) =-\sum_{i=1}^{n}{P\left( x_{i}  \right) logP\left( x_{i}  \right) } =\sum_{i=1}^{n}{P\left( x_{i}  \right) \frac{1}{logP\left( x_{i}  \right) } }

4-2、联合熵

两个随机变量X和Y的联合分布可以形成联合熵,定义为联合自信息的数学期望,它是二维随机变量XY的不确定性的度量,用H(X,Y)表示:

H\left( X,Y \right) =-\sum_{i=1}^{n}{\sum_{j=1}^{n}{P\left( x_{i} ,y_{j}  \right)} logP\left( x_{i},y_{j}   \right)  }

4-3、条件熵

在随机变量X发生的前提下,随机变量Y发生新带来的熵,定义为Y的条件熵,用H(Y|X)表示:

H\left(Y|X \right) =-\sum_{x,y}^{}{P\left( x,y \right) logP\left( y|x \right) }

条件熵用来衡量在已知随机变量X的条件下,随机变量Y的不确定性。

实际上,熵、联合熵和条件熵之间存在以下关系:

H\left( Y|X \right) =H\left( X,Y\right) -H\left( X \right)

推导过程如下:

其中:

  • 第二行推到第三行的依据是边缘分布P(x)等于联合分布P(x,y)的和;
  • 第三行推到第四行的依据是把公因子logP(x)乘进去,然后把x,y写在一起;
  • 第四行推到第五行的依据是:因为两个sigma都有P(x,y),故提取公因子P(x,y)放到外边,然后把里边的-(log P(x,y) - log P(x))写成- log (P(x,y) / P(x) ) ;
  • 第五行推到第六行的依据是:P(x,y) = P(x) * P(y|x),故P(x,y) / P(x) = P(y|x)。

4-4、相对熵

相对熵又称互熵、交叉熵、KL散度、信息增益,是描述两个概率分布P和Q差异的一种方法,记为D(P||Q)。在信息论中,D(P||Q)表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布。

对于一个离散随机变量的两个概率分布P和Q来说,它们的相对熵定义为:

D\left( P||Q \right) =\sum_{i=1}^{n}{P\left( x_{i}  \right) log\frac{P\left( x_{i}  \right) }{Q\left( x_{i}  \right) } }

注意:D(P||Q) ≠ D(Q||P)

4-5、互信息

两个随机变量X,Y的互信息定义为X,Y的联合分布和各自独立分布乘积的相对熵称为互信息,用I(X,Y)表示。互信息是信息论里一种有用的信息度量方式,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。

I\left( X,Y \right) =\sum_{x\in X}^{}{\sum_{y\in Y}^{}{P\left( x,y \right) } log\frac{P\left( x,y \right) }{P\left( x \right) P\left( y \right) } }

互信息、熵和条件熵之间存在以下关系: H\left( Y|X \right) =H\left( Y \right) -I\left( X,Y \right)

推导过程如下:

通过上面的计算过程发现有:H(Y|X) = H(Y) - I(X,Y),又由前面条件熵的定义有:H(Y|X) = H(X,Y) - H(X),于是有I(X,Y)= H(X) + H(Y) - H(X,Y),此结论被多数文献作为互信息的定义。

4-6、最大熵模型

最大熵原理是概率模型学习的一个准则,它认为:学习概率模型时,在所有可能的概率分布中,熵最大的模型是最好的模型。通常用约束条件来确定模型的集合,所以,最大熵模型原理也可以表述为:在满足约束条件的模型集合中选取熵最大的模型。

前面我们知道,若随机变量X的概率分布是P\left( x_{i}  \right),则其熵定义如下:

H\left( X \right) =-\sum_{i=1}^{n}{P\left( x_{i}  \right) logP\left( x_{i}  \right) } =\sum_{i=1}^{n}{P\left( x_{i}  \right) \frac{1}{logP\left( x_{i}  \right) } }

熵满足下列不等式:

0\leq H\left( X \right) \leq log\left| X \right|

式中,|X|是X的取值个数,当且仅当X的分布是均匀分布时右边的等号成立。也就是说,当X服从均匀分布时,熵最大。

直观地看,最大熵原理认为:要选择概率模型,首先必须满足已有的事实,即约束条件;在没有更多信息的情况下,那些不确定的部分都是“等可能的”。最大熵原理通过熵的最大化来表示等可能性;“等可能”不易操作,而熵则是一个可优化的指标。

五、 数值计算

5-1、上溢和下溢

在数字计算机上实现连续数学的基本困难是:我们需要通过有限数量的位模式来表示无限多的实数,这意味着我们在计算机中表示实数时几乎都会引入一些近似误差。在许多情况下,这仅仅是舍入误差。如果在理论上可行的算法没有被设计为最小化舍入误差的累积,可能会在实践中失效,因此舍入误差是有问题的,特别是在某些操作复合时。

一种特别毁灭性的舍入误差是下溢。当接近零的数被四舍五入为零时发生下溢。许多函数会在其参数为零而不是一个很小的正数时才会表现出质的不同。例如,我们通常要避免被零除。

另一个极具破坏力的数值错误形式是上溢(overflow)。当大量级的数被近似为\varpi-\varpi时发生上溢。进一步的运算通常将这些无限值变为非数字。

必须对上溢和下溢进行数值稳定的一个例子是softmax 函数。softmax 函数经常用于预测与multinoulli分布相关联的概率,定义为:

当式中的x_{i}都是很小的负数时,e^{x_{i} }就会发生下溢,这意味着上面函数的分母会变成0,导致结果是未定的;同理,当式中的x_{i}是很大的正数时,e^{x_{i} }就会发生上溢导致结果是未定的。

5-2、计算复杂性与NP问题

1、算法复杂性

现实中大多数问题都是离散的数据集,为了反映统计规律,有时数据量很大,而且多数目标函数都不能简单地求得解析解。这就带来一个问题:算法的复杂性。

算法理论被认为是解决各类现实问题的方法论。衡量算法有两个重要的指标:时间复杂度和空间复杂度,这是对算法执行所需要的两类资源——时间和空间的估算。

一般,衡量问题是否可解的重要指标是:该问题能否在多项式时间内求解,还是只能在指数时间内求解?在各类算法理论中,通常使用多项式时间算法即可解决的问题看作是易解问题,需要指数时间算法解决的问题看作是难解问题。

指数时间算法的计算时间随着问题规模的增长而呈指数化上升,这类问题虽然有解,但并不适用于大规模问题。所以当前算法研究的一个重要任务就是将指数时间算法变换为多项式时间算法。

2、确定性和非确定性 

除了问题规模与运算时间的比较,衡量一个算法还需要考虑确定性和非确定性的概念。

这里先介绍一下“自动机”的概念。自动机实际上是指一种基于状态变化进行迭代的算法。在算法领域常把这类算法看作一个机器,比较知名的有图灵机、玻尔兹曼机、支持向量机等。

所谓确定性,是指针对各种自动机模型,根据当时的状态和输入,若自动机的状态转移是唯一确定的,则称确定性;若在某一时刻自动机有多个状态可供选择,并尝试执行每个可选择的状态,则称为非确定性。

换个说法就是:确定性是程序每次运行时产生下一步的结果是唯一的,因此返回的结果也是唯一的;非确定性是程序在每个运行时执行的路径是并行且随机的,所有路径都可能返回结果,也可能只有部分返回结果,也可能不返回结果,但是只要有一个路径返回结果,那么算法就结束。

在求解优化问题时,非确定性算法可能会陷入局部最优。

3、NP问题

有了时间上的衡量标准和状态转移的确定性与非确定性的概念,我们来定义一下问题的计算复杂度。

P类问题就是能够以多项式时间的确定性算法来对问题进行判定或求解,实现它的算法在每个运行状态都是唯一的,最终一定能够确定一个唯一的结果——最优的结果。

NP问题是指可以用多项式时间的非确定性算法来判定或求解,即这类问题求解的算法大多是非确定性的,但时间复杂度有可能是多项式级别的。

但是,NP问题还要一个子类称为NP完全问题,它是NP问题中最难的问题,其中任何一个问题至今都没有找到多项式时间的算法。

机器学习中多数算法都是针对NP问题(包括NP完全问题)的。

5-3、数值计算

上面已经分析了,大部分实际情况中,计算机其实都只能做一些近似的数值计算,而不可能找到一个完全精确的值,这其实有一门专门的学科来研究这个问题,这门学科就是——数值分析(有时也叫作“计算方法”);运用数值分析解决问题的过程为:实际问题→数学模型→数值计算方法→程序设计→上机计算求出结果。

计算机在做这些数值计算的过程中,经常会涉及到的一个东西就是“迭代运算”,即通过不停的迭代计算,逐渐逼近真实值(当然是要在误差收敛的情况下)。

六、最优化

本节介绍机器学习中的一种重要理论——最优化方法。

6-1、最优化理论

无论做什么事,人们总希望以最小的代价取得最大的收益。在解决一些工程问题时,人们常会遇到多种因素交织在一起与决策目标相互影响的情况;这就促使人们创造一种新的数学理论来应对这一挑战,也因此,最早的优化方法——线性规划诞生了。

6-2、最优化问题的数学描述

最优化的基本数学模型如下:

它有三个基本要素,即:

  • 设计变量:x是一个实数域范围内的n维向量,被称为决策变量或问题的解;
  • 目标函数:f(x)为目标函数;
  • 约束条件:h_{i} \left( x \right) =0称为等式约束,g_{i} \left( x \right) \leq 0为不等式约束,i=0,1,2,......

6-3、凸集与凸集分离定理

1、凸集

实数域R上(或复数C上)的向量空间中,如果集合S中任两点的连线上的点都在S内,则称集合S为凸集,如下图所示:

数学定义为:

设集合D\subset R^{n},若对于任意两点x,y\in D,及实数\lambda \left( 0\leq \lambda \leq 1 \right)都有:

\lambda x+\left( 1-\lambda  \right) y\in D

则称集合D为凸集。

2、超平面和半空间

实际上,二维空间的超平面就是一条线(可以使曲线),三维空间的超平面就是一个面(可以是曲面)。其数学表达式如下:

超平面:H=\left\{ x\in R^{n} |a_{1} +a_{2}+...+a_{n} =b  \right\}

半空间:H^{+} =\left\{ x\in R^{n} |a_{1} +a_{2}+...+a_{n} \geq b  \right\}

3、凸集分离定理

所谓两个凸集分离,直观地看是指两个凸集合没有交叉和重合的部分,因此可以用一张超平面将两者隔在两边,如下图所示:

4、凸函数

凸函数就是一个定义域在某个向量空间的凸子集C上的实值函数。

数学定义为:

对于函数f(x),如果其定义域C是凸的,且对于∀x,y∈C,0\leq \alpha \leq 1, 有: 

f\left( \theta x+\left( 1-\theta  \right) y \right) \leq \theta f\left( x \right) +\left( 1-\theta  \right) f\left( y \right)

则f(x)是凸函数。

注:如果一个函数是凸函数,则其局部最优点就是它的全局最优点。这个性质在机器学习算法优化中有很重要的应用,因为机器学习模型最后就是在求某个函数的全局最优点,一旦证明该函数(机器学习里面叫“损失函数”)是凸函数,那相当于我们只用求它的局部最优点了。

6-4、梯度下降算法

1、引入 

前面讲数值计算的时候提到过,计算机在运用迭代法做数值计算(比如求解某个方程组的解)时,只要误差能够收敛,计算机最后经过一定次数的迭代后是可以给出一个跟真实解很接近的结果的。

这里进一步提出一个问题,如果我们得到的目标函数是非线性的情况下,按照哪个方向迭代求解误差的收敛速度会最快呢?

答案就是沿梯度方向。这就引入了我们的梯度下降法。

2、梯度下降法

在多元微分学中,梯度就是函数的导数方向。

梯度法是求解无约束多元函数极值最早的数值方法,很多机器学习的常用算法都是以它作为算法框架,进行改进而导出更为复杂的优化方法。

在求解目标函数f\left( x \right)的最小值时,为求得目标函数的一个凸函数,在最优化方法中被表示为:

minf\left( x \right)

根据导数的定义,函数f\left( x \right)的导函数就是目标函数在x上的变化率。在多元的情况下,目标函数f\left( x,y,z \right)在某点的梯度grad f\left( x,y,z \right) =\left( \frac{\partial f}{\partial x}  ,\frac{\partial f}{\partial y},\frac{\partial f}{\partial z}  \right)是一个由各个分量的偏导数构成的向量,负梯度方向是f\left( x,y,z \right)减小最快的方向。

如上图所示,当需要求f\left( x \right)的最小值时(机器学习中的f\left( x \right)一般就是损失函数,而我们的目标就是希望损失函数最小化),我们就可以先任意选取一个函数的初始点x_{0}(三维情况就是\left( x_{0} ,y_{0} ,z_{0}  \right)),让其沿着途中红色箭头(负梯度方向)走,依次到x_{1}x_{2},...,x_{n}(迭代n次)这样可最快达到极小值点。

梯度下降法过程如下:

输入:目标函数f\left( x \right),梯度函数g\left( x \right) =grad f\left( x \right),计算精度\varepsilon

输出:f\left( x \right)的极小值点x^{*}

  • 1、任取取初始值x_{0},置k=0
  • 2、计算f\left( x_{k}  \right)
  • 3、计算梯度g_{k} =grad f\left( x_{k}  \right),当\left| \left| g_{k} \right|  \right| <\varepsilon时停止迭代,令x^{*} =x_{k}
  • 4、否则令P_{k} =-g_{k},求\lambda _{k}使f\left( x_{k+1} \right) =minf\left( x_{k} +\lambda _{k} P_{k}  \right)
  • 5、置x_{k+1} =x_{k} +\lambda _{k} P_{k},计算f\left( x_{k+1}\right),当\left| \left| f\left( x_{k+1}\right) -f\left( x_{k}\right)  \right| \right| <\varepsilon\left| \left| x_{k+1} -x_{k}  \right|  \right| <\varepsilon时,停止迭代,令x^{*} =x_{k+1} ;
  • 6、否则,置k=k+1,转3。

6-5、随机梯度下降算法

上面可以看到,在梯度下降法的迭代中,除了梯度值本身的影响外,还有每一次取的步长\lambda _{k}也很关键:步长值取得越大,收敛速度就会越快,但是带来的可能后果就是容易越过函数的最优点,导致发散;步长取太小,算法的收敛速度又会明显降低。因此我们希望找到一种比较好的方法能够平衡步长。

随机梯度下降法并没有新的算法理论,仅仅是引进了随机样本抽取方式,并提供了一种动态步长取值策略。目的就是又要优化精度,又要满足收敛速度。

也就是说,上面的批量梯度下降法每次迭代时都会计算训练集中所有的数据,而随机梯度下降法每次迭代只是随机取了训练集中的一部分样本数据进行梯度计算,这样做最大的好处是可以避免有时候陷入局部极小值的情况(因为批量梯度下降法每次都使用全部数据,一旦到了某个局部极小值点可能就停止更新了;而随机梯度法由于每次都是随机取部分数据,所以就算局部极小值点,在下一步也还是可以跳出)

两者的关系可以这样理解:随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。

6-6、牛顿法

1、牛顿法介绍

牛顿法也是求解无约束最优化问题常用的方法,最大的优点是收敛速度快。

从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。通俗地说,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法 每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以, 可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
或者从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

2、牛顿法的推导

将目标函数f\left( x \right) 在x_{k}处进行二阶泰勒展开,可得:

f\left( x \right) =f\left( x_{k}  \right) +f^{'} \left( x_{k}  \right) \left( x-x_{k}  \right) +\frac{1}{2} f^{''}\left( x_{k}  \right)  \left( x-x_{k}  \right) ^{2}

因为目标函数f\left( x \right)有极值的必要条件是在极值点处一阶导数为0,即:f^{'} \left( x \right) =0

所以对上面的展开式两边同时求导(注意x才是变量,x_{k}是常量\Rightarrow f^{'} \left( x_{k}  \right) ,f^{''} \left( x_{k}  \right)都是常量),并令f^{'} \left( x \right) =0可得:

f^{'} \left( x_{k} \right) +f^{''} \left( x_{k} \right) \left( x-x_{k} \right) =0

即:

x=x_{k} -\frac{f^{'} \left( x_{k}  \right) }{f^{''} \left( x_{k}  \right) }

于是可以构造如下的迭代公式:

x_{k+1} =x_{k} -\frac{f^{'} \left( x_{k}  \right) }{f^{''} \left( x_{k}  \right) }

这样,我们就可以利用该迭代式依次产生的序列\left\{x_{1},x_{2},....,   x_{k}  \right\}才逐渐逼近f\left( x \right)的极小值点了。

牛顿法的迭代示意图如下:

上面讨论的是2维情况,高维情况的牛顿迭代公式是:

式中, ▽ff\left( x \right)的梯度,即:

H是Hessen矩阵,即:

3、牛顿法的过程

  • 1、给定初值x_{0}和精度阈值\varepsilon,并令k=0
  • 2、计算x_{k}H_{k}
  • 3、若\left| \left| g_{k}  \right|  \right| <\varepsilon则停止迭代;否则确定搜索方向:d_{k} =-H_{k}^{-1} \cdot g_{k}
  • 4、计算新的迭代点:x_{k+1} =x_{k} +d_{k}
  • 5、令k=k+1,转至2。

6-7、阻尼牛顿法

1、引入

注意到,牛顿法的迭代公式中没有步长因子,是定步长迭代。对于非二次型目标函数,有时候会出现f\left( x_{k+1}  \right) >f\left( x_{k}  \right)的情况,这表明,原始牛顿法不能保证函数值稳定的下降。在严重的情况下甚至会造成序列发散而导致计算失败。

为消除这一弊病,人们又提出阻尼牛顿法。阻尼牛顿法每次迭代的方向仍然是x_{k},但每次迭代会沿此方向做一维搜索,寻求最优的步长因子\lambda _{k},即:

\lambda _{k} = minf\left( x_{k}  +\lambda d_{k}  \right)

2、算法过程

  • 1、给定初值x_{0}和精度阈值\varepsilon,并令k=0
  • 2、计算g_{k}f\left( x \right)x_{k}处的梯度值)和H_{k}
  • 3、若\left| \left| g_{k}  \right|  \right| <\varepsilon则停止迭代;否则确定搜索方向:d_{k} =-H_{k}^{-1} \cdot g_{k}
  • 4、利用d_{k} =-H_{k}^{-1} \cdot g_{k}得到步长\lambda _{k},并令x_{k+1} =x_{k} +\lambda _{k} d_{k}
  • 5、令k=k+1,转至2。

6-8、拟牛顿法

1、概述

由于牛顿法每一步都要求解目标函数的Hessen矩阵的逆矩阵,计算量比较大(求矩阵的逆运算量比较大),因此提出一种改进方法,即通过正定矩阵近似代替Hessen矩阵的逆矩阵,简化这一计算过程,改进后的方法称为拟牛顿法。

2、拟牛顿法的推导

先将目标函数在x_{k+1}处展开,得到:

f\left( x \right) =f\left( x_{k+1}  \right) +f^{'} \left( x_{k+1}  \right) \left( x-x_{k+1}  \right) +\frac{1}{2} f^{''}\left( x_{k+1}  \right)  \left( x-x_{k+1}  \right) ^{2}

两边同时取梯度,得:

f^{'}\left( x \right) = f^{'} \left( x_{k+1} \right) +f^{''} \left( x_{k+1} \right) \left( x-x_{k+1} \right)

取上式中的x=x_{k},得:

f^{'}\left( x_{k}  \right) = f^{'} \left( x_{k+1} \right) +f^{''} \left( x_{k+1} \right) \left( x-x_{k+1} \right)

即:

g_{k+1} -g_{k} =H_{k+1} \cdot \left( x_{k+1} -x_{k}  \right)

可得:

H_{k}^{-1} \cdot \left( g_{k+1} -g_{k}  \right) =x_{k+1} -x_{k}

上面这个式子称为“拟牛顿条件”,由它来对Hessen矩阵做约束。