自编码器
UFLDL教程中中对自编器的解释是:自编码神经网络尝试学习一个的函数。换句话说,它尝试逼近一个恒等函数,从而使得输出接近于输入x 。
过程如下:a.首先让x经过一个hidden layer
(1)
b.对y进行解码,W'是W的转置
(2)
这个过程也叫做重构,产生的误差叫重构误差,常用的右
平方误差
交叉熵
学习的过程就是使重构误差最小(对于来自相同分布的输入,有较低的重构误差).
y应该是沿着协方差的主轴的(协方差最大的方向),类似于PCA。
如果有个线性的hidden layer,其中右k个hidden units,题么提取出的是k个主成份。
如果是非线性的,我们可以捕捉到输入中的多模态成分(multi-modal )
如果对让hidden layer的输入=input,直观上会学习到恒等函数,但是事实并非如此,我们仍然可以得到有用的表示,一个直观的解释是,一个具有 early stopping 的随机梯度下降相当于对参数的L2正则化,为了更好的对输入进行重构,我们假设一个只有一层hidden layer的非线性自编器,它第一层的W应该非常小(这样就会具有某些线性特征),第二层非常大。对于二值输入,我们想需要非常大的W来获得较小的重构误差。而这样会使得规范化项非常大。所以算法只能朝着近似输入的方向去优化参数。这意味着,我们的学习过程是一个对训练集的随机表示,而不是对输入的进行来复制。
(early stopping,摘自wiki:is a form of regularization used to avoid overfitting when training a learner with an iterative method, such as gradient descent.)
上面是直译的,更好理解,其实就是 regularized auto-encoder
而且一般也是直接加上L2正则项
避免获得恒等函数的其他方法
1.加上稀疏性(使hidden units 的激活值接近0):稀疏自编码器,见UFLDL
2.在从输入到重构的转换过程中加入一些随机噪声
Denoising Autoencoders
原理就是给input(eg.随机将一些输入置为0)加入一些corrupted vision过程:1.对输入进行编码
2.去除对输入的随机腐蚀
以下函数的过程就是随机把一些输入变成0,denoising au-encoder试图从未被破坏的数据中还原出被破坏的数据,然后得到这些样本的参数的联合概率分布,这时一个gibbs采样的过程。
gibbs采样解释:
LDA-math-MCMC 和 Gibbs Sampling(1)
LDA-math-MCMC 和 Gibbs Sampling(2)
def get_corrupted_input(self, input, corruption_level):
"""
binomial 是theano 库里的函数
Sample n times with probability of success p for each trial and
return the number of successes.
应该是对input里面的每个元素以概率p进行采样,每个n次,
实际上是是模拟来gibbs采样的过程
reutrn:本程序中N=1,所以返回一个0-1矩阵,0代表该元素以corruption_level的概率被腐蚀,1代表1-corruption_level的概率被腐蚀
"""
return self.theano_rng.binomial(size=input.shape, n=1,
p=1 - corruption_level,
dtype=theano.config.floatX) * input
这个函数不太懂,有时间回来看看对binomial(n, p, size=None)函数的解释
对一个具有特定参数的二项分布进行采样,判别n次,每次判断成功的概率为p,参看MCMC,Gibbs采样:RBM。
返回:一个矩阵(ndarray)或者标量(scalar),每个元素的值都属于[0,n]
举个栗子,一个公司要钻9个油井,其中每个油井存储石油的概率为0.1,那么这些油井都没有石油的概率是多少?
我们可以作2000次实验,然后数以下产生结果为0的个数
sum(np.random.binomial(9, 0.1, 20000) == 0)/20000.
答案是
0.38885
而MCMC方法中
判断是否接受为
if ((u[i] <= p_accept))
{
x[i] = y
print("accept")
}
else
{
x[i] = x[i-1]
print("reject")
}