对SVD唯一性的理解
Relevance Vector Machine 2
接下来,我们讨论一下在已经得到训练样本的情况下,\mathbf{w}的后验概率。
--------------------------------------------------------------------------------------------------------------------------------------------
在获得训练数据之前。\mathbf{w}是0均值的,那么给定一个\mathbf{x}之后,期望的输出应该是0。现在得到训练数据之后,我们可能发现输出的\mathbf{t} = [t_1, t_2, ..., t_N]^T并不完全是0。这个时候,在给定的训练数据之后,我们可以计算出来\mathbf{x}的后验概率。也就是计算
p(\mathbf{w}|\mathbf{t}, \mathbf{X}, \mathbf{\alpha}, \beta)。
在这里,我们暂时应该把\mathbf{\alpha}和\beta看作是已知的,或者说实在给定的情况下。根据概率公式,我们有
p(\mathbf{w}|\mathbf{t}, \mathbf{X}, \mathbf{\alpha}, \beta) = \frac{p(\mathbf{w}|\mathbf{\alpha})p(\mathbf{t}|\mathbf{X}, \mathbf{\alpha}, \beta)}{p(t|\mathbf{X}, \mathbf{\alpha}, \beta)}。
首先看分母,分母其实是一个归一化的参数,保证了对\mathbf{w}在整个空间上积分的值为1。再看一下分子,第一项是一个关于\mathbf{w}的高斯分布,第二项也是一个高斯分布。参数\mathbf{w}都在这个高斯分布的指数上面,并且可以看出,都是关于\mathbf{w}的二项式。也就是说,从这里我们可以断定,这个\mathbf{w}的后验概率,也是一个高斯分布。如果对于高斯分布的具体形式不是很清楚的话,请看附录。
既然是一个高斯分布,我们只需要求解出来它的均值和方差就行了。在这里,我们只需要计算化简指数上面跟\mathbf{w}相关的二项式。我们把这个二项式写出来
-\frac{1}{2}\mathbf{w}^T A \mathbf{w} - \frac{1}{2}\sum_{i = 1}^{N}{\beta(t_i - \mathbf{w}^T \phi(\mathbf{x}_i))^2}
这里的A = diag(\alpha_i)。接下来进行化简,化简的过程中,我们可以尽情的扔掉与\mathbf{w}无关的项。最后得到的结果为
-\frac{1}{2}(\mathbf{w}^T(A + \beta \Phi^T\Phi)\mathbf{w} - 2\beta \mathbf{w}^T\Phi^T\mathbf{t})
其中\Phi是一个矩阵,每一行是一个样本\phi_{\mathbf{x}_i}^T。根据前面的讨论,我们已经知道\mathbf{w}的后验概率是一个高斯分布,假定其均值为\mathbf{m},协方差矩阵为\Sigma,那么它的指数项为
-\frac{1}{2}(\mathbf{w} - \mathbf{m})^T\Sigma^{-1}(\mathbf{x} - \mathbf{m}) = -\frac{1}{2}(\mathbf{w}^T\Sigma^{-1}\mathbf{w} - 2 \mathbf{w}^T\Sigma^{-1}\mathbf{m})+const
这里面的const代表了跟\mathbf{w}无关系的项。这两项进行对比,我们可以得到如下的结论
\Sigma = (A + \beta\Phi^T\Phi)^{-1}
和
\mathbf{m} = \beta\Sigma\Phi^{T}\mathbf{t}
自此,我们得到了在给定训练样本的情况下,参数\mathbf{w}的后验概率。
附录
1,高斯函数
\mathcal{N}(\mathbf{x}|\mathbf{m}, \mathbf{\Sigma}) = \frac{1}{(2\pi)^{D/2}|\Sigma|^{1/2}} exp{-\frac{1}{2}(\mathbf{x} - \mathbf{m})^T \Sigma^{-1} (\mathbf{x} - \mathbf{m})}
Relevance Vector Machine 1
内容关于PRML7.2节的
---------------------------------------------------------------------------------------------------------------------------
这个Relevance Vector Machine(RVM)跟SVM差不多,可以处理Regression问题,也可以处理classification问题。这里我们先讨论regression问题。
首先讨论一下什么是regression问题。我们拿到一些训练的样本(\mathbf{x}_i, t_i),希望从中训练出来一个映射关系t=y(\mathbf{x})。在测试的时候,给定一个\mathbf{x},我们就可以估计出来t的数值。其中t一般认为是连续的,\mathbf{x}和\mathbf{t}一般也都是实数。如何求解这个映射关系y,是该问题的重点所在。
在RVM这个模型中,假设t是这样产生的,
p(t|\mathbf{x})=\mathcal{N}(t|y(\mathbf{x}), \beta^-1)$
也就是说,给定了\mathbf{x}之后,通过映射得到y(\mathbf{x}),然后加上一个高斯噪声,输出t。这个高斯噪声的平均值是0,方差是\beta^-1,其中\beta也称之为准确率,未知的。而y(\mathbf{x})的形式假定为线性的,也就是说
y(\mathbf{x}) = \sum_{i = 1}^{M}{w_i \phi_i(\mathbf{x})} = \mathbf{w}^T \phi(\mathbf{x})
这是一种很广义的写法。其中w_i是未知的;M是未知参数的个数;\phi_i(\mathbf{x})是一个预先设置好的函数映射。其实具体在做的时候,\phi_i(\mathbf{x})=k(\mathbf{x}, \mathbf{x}_i)。也就是说
y(\mathbf{x}) = \sum_{n = 1}^N{w_{n}k(\mathbf{x}, \mathbf{x}_n)} + b
其中N是训练样本的个数;k(\cdot, \cdot)是一个核函数,如果不是很清楚什么是核函数的话,姑且认为是一个普通的函数就好,这里的核函数也是预先设置好,不需要求解的;b是一个常数,未知。
实际中用到的是核函数的表达式子,但是以下的推到,也同样适用于广义的写法。所以,我们就直接用y(\mathbf{x})=\mathbf{w}^T \phi(\mathbf{x})的写法。
现在的问题是,如何求解\mathbf{w}和\beta。
RVM中又假定了\mathbf{w}这样的分布性质
p(\mathbf{w}|\mathbf{\alpha}) = \prod_{i = 1}^{M}\mathcal{N}(w_i | 0, \alpha_i^{-1})
也就是说,每一个w_i都是互相独立的,都是符合高斯分布的,而这个分布的均值是0,方差是\alpha_i^{-1}。
再接下来的问题就是,如何估计这个方差\mathbf{\alpha}和\beta。
learning rate adaptation and stopping criterion
最近读了一篇文章,关于Binary Multidimensional Scaling的。原文见下面的链接:
http://tedlab.mit.edu/~dr/Papers/bmds.jou.pdf
其中4.4部分讲到了关于learning rate的设置的一个经验方法,觉得讲得很好。以下谈谈自己的理解。
------------------------------------------------------------------
处理的问题,是一个无约束的优化问题。也就是说,我们希望去找到一个\mathbf{x}能够最小化f(\mathbf{x})。这里的\mathbf{x}是一个向量,如果是1\times1,就是一个标量。如果我们处理的未知数是一个矩阵,那么把这个矩阵中得未知数排成一列之后,也是一个未知的向量。
接下来考虑如何得到这样的\mathbf{x}。其中一个经常用到的方法是梯度下降法。也就是这样的一种迭代算法
\mathbf{x}_{t + 1} = \mathbf{x}_t - s \nabla{f(\mathbf{x}_t)}
这里的\mathbf{x}_t指的是第t次迭代时,\mathbf{x}的值。s是步长,\nabla{f(\mathbf{x}_t)}是函数在\mathbf{x}_t的梯度值。在梯度的相反方向上,可以期望能够找到一个新的\mathbf{x}_{t + 1}使得目标函数值,尽可能的小。这里的问题来了,
如何确定这个步长s?
对这个问题的研究很多。这里我们只讨论一种经验性的简单做法。首先令s = \alpha {\|\mathbf{x}_t\|}/{\|\nabla{f(\mathbf{x}_t)}\|}。这是因为一般情况下,我们很难确定这个梯度值的取值范围。比如说\mathbf{x}的取值范围是在0到1之间,而它的梯度值有可能是在100左右的位置,也可能是在0.01左右的样子。那么这是时候,直接确定s,比较困难。在这个时候,我们在\nabla{f(\mathbf{x}_t)}前面乘以一个标量{\|\mathbf{x}_t\|}/{\|\nabla{f(\mathbf{x}_t)}\|},起到了一个矫正的作用。我们就可以确定,如果当前的\mathbf{x}_t是1,那么这个矫正之后梯度方向的模也是1。接下来就考虑\alpha应该如何确定。
总的来说,是首先给定一个初始值\alpha = 0.2。然后根据情况,对这个\alpha做一定的修改。
初始值0.2是文章中的原话,在最近做的一个项目中,用的是0.1,实验进行的很好。
接下来,我们定义,或者说在实验的过程中,维护两个变量。一个是progress,一个事instability。其中progress的定义为
progress = \frac{S_{t} - S_{t + 1}}{|S_{t}|}
其中S_{t}=f(\mathbf{x}_t)。可以看到,如果progress小于0的话,代表S_{t + 1}比S_{t}小,目标函数值减小了,正是我们所期望的事情。如果很不幸的,progress大于0的话,说明了函数值没有减小,反而变大。这个时候,我们就需要减小一个步长\alpha了。按照文章中的参数,\alpha变为原来的0.75。根据新的\alpha,可以算出来新的\mathbf{x}_{t + 1},从而可以得到新的S_{t + 1}。如果比S_{t}变小了,也就是这个时候progress小于0了,就进入下一个循环。否则的话,继续减小\alpha,直到progress小于0,或者达到了循环停止的条件。
另一个参数是instability,其定义如下
instability = I_{t + 1} = 0.5 (I_{t} + \frac{|P_{t - 1} - P_{t}|}{|P_{t - 1}|})|
可以想象,如果我们的目标函数值能够稳定的下降的话,那么P_{t}将会是一个常数,代表了目标函数值下降的程度。这个时候instability就会趋近于0。也就是说,instability越小,越是我们希望的事情。它的初值设置成10,同时,我们约定,每一次\alpha发生变动的时候,I_{t}都被重置成10。接下来,在考虑,如果这个instability比较大的话,说明不是很稳定,也就是说,目标函数值下降的时快时慢,有可能函数的曲线就是这样子的,很凹凸不平。也有可能是在最优值附近,在最优值附近不停地摆动。但不管怎么说,目标函数值是下降到的,所以尽管instability很大,我们依然不去做任何事情。唯一需要做的是这样的一种情况,instability很小,说明很稳定,但是呢,progress也很小。也就是说我们的目标函数值减小的速度很慢,就像蚂蚁一样。这是情况,说明了步长\alpha比较小,我们需要增大这个数值。具体来说,在progress < 0.02并且instability<0.2的时候,将\alpha乘以1.2。
循环停止的条件,在这里的设置是progress小于0.01,在连续的10个循环过程中。
写在前面的话
计划,这个博客写一些技术相关的博客。领域主要限定在机器学习和计算机视觉,也会有一些跟编程有关的内容。
以读后感,原创为主。督促自己多读书,读好书。不断进取。