本文牵扯到了神经网络的本质究竟是什么。理解这个概念对推广到其他模型的帮助非常有帮助。
大家应该看到过所谓RBM,是一个概率分布模型。其实不仅仅是RBM的本质,甚至可以说神经网络的本质,都可以是一个概率模型。怎么理解呢,粗暴的说就是一组条件的情况下,另一组事件发生的概率。
如果一下子不能理解,那我们就从最基础的概念,单个的神经元来看:
结合下面的这个图来看:
在这里我们暂时先不考虑biase以方便理解,图中所示就是一个最最基础的神经元,同时,他也是一个最基础的概率模型:当条件(x1,x2…xn)的时候,y事件发生的概率。
这里,W就是所谓的参数,我们暂时不考虑W的实际意义,只要知道,当X=(x1,x2…xn)这件事发生的时候,给他乘上一个W,就可以得到一个结果a。但是此时a还不是一个概率,而只是X事件下通过运算而对应发生的结果。怎么样才能把所谓的‘结果’,转换成y事件发生的概率呢。
这就是所谓sigmoid激励函数的作用了:sigmoid激励函数的任务就是,把一个事件结果由难以理解的常数表达转换为一个概率,因为它可以将一个实数领域内值投影到(0,1)范围内。换句话说,激励函数本身g(a)的作用是,将事件的结果投影到一个概率域,从而能够从概率的角度来直接的表示,事件y是否有可能发生。而在我们接触到的其他神经网络中会用到各种各样的激励函数,其目的也是类似的,只是在那些场景中,我们需要的y并不是一个事件发生的概率,而是其他内容罢了。
继续之前的话题,我们现在已经知道了y是怎么样产生,以及表达的意义了。但是很可能,我们计算出来的y的概率是0.8,而在实际上y这件事并没有发生(也就是真是值是0)。这时候,我们就需要改进在计算时使用的参数,使得我们计算的y更接近于真实的y了。而这个过程,就是所谓的训练。所以接下来我们要谈谈训练的本质,这里会牵扯到一个概念:极大似然估计。
简单的介绍极大似然估计,用一句话概括,就是当一件/一组事件发生的时候,最可能的参数是什么。举例说明,假设我们丢其中的一枚硬币10次,发现4次朝上6次朝下。请问,我们丢的是哪一枚硬币?
这里的P,就是参数。假设这个方程的解为P,那么P就是这里的极大似然估计。为什么说是估计呢,因为概率和频率不是等同的概念,即使我拿着一个1/100为正面的硬币,依然有可能丢出4个正面的结果,只是概率小而已。所以说,当p为P时,这组事件最有可能发生。
那么类似的,把这个情况想到我们刚刚说的神经网络中,什么样的W最可能发生y等于真实值呢。当前我们还是未知的,但是我们可以通过训练,让我们的W尽可能接近极大似然对应的那组参数W。我们的训练过程,其实就是在参数域中,寻找那个参数组。至于训练方法就多种多样了,不过基本都离不开gradient descent的思路,就是对一个目标函数求导/偏导啦,即在参数域的空间中,从当前点向目标点不断地前进一小步,直至找到最好的那组参数,或者接近它。这就是单个神经元的supervised training的基本思路。
那么我们再看RBM,会发现,他可以看作好多个上述神经元(v1,v2…vn)组成的一个单层网络,同时,(h1,h2…hm)也能有和V层一样的功能。同时还有一点不同于单层神经元的地方就是,我们不提供之前的y值,也就是h层的真实值。
但是当我们知道这两层结点在实际功能上是完全一样的话就知道,这完全不是问题。我们完全可以先用visible的数据得到h层数据H1,然后再通过H1作为H层的数据算回来对应的V层,也就是所谓的reconstruction,这不就可以算偏差了嘛。而这也就是RBM训练的基本思路(虽然其实还是有点偏差的,实际过程要多比这多一轮,计算两次得到hidden layer的偏差)。与此同时,再通过之前说的训练,逼近最好的那个W。
但是,我们应该怎么样来找那个目标函数呢(training要求导,但是你总得给我那个要被求导函数吧)。
任何一篇关于RBM的文章或者ppt一定都会提到这个公式,即观测数据v的概率分布,再粗暴一点说,就是在参数组为时,我们计算得到的V正好是给定的输入V的概率(也就是通过算到hiden layer,再反着算回来依然是V的概率)。这里的推导过程相关文章一定有,这里就不说了。
这里就要用到,我们之前说过的概念,最大似然估计。想想之前硬币的例子然后泛化到这里,就可以得知我们需要所有input对应的P的积尽可能大,也就是我们的最大似然目标函数。
也就是说,我们训练的目标函数就是他,要把它最大化来找出最好的那组。而这里就有个问题,这是好多P函数的积啊!!!这么积的求导可是要人命的,这计算量计算机都扛不住。那么就找个替代的吧,于是聪明的科学家就想到了对数似然函数,就是下面这个式子:
嗯没错,他们在方向性上就是等价的,所以直接用它代替了之前那个积的表达,这样也就解决了多个子函数求导带来的计算量问题。
剩下的工作,就是给数据训练了。