您的位置:首页 > 其它

hash trick在机器学习中的使用

2016-01-05 15:59 267 查看
普通的哈希算法暂且不讲了,我们探讨下哈希技术的各种应用。具体细节在以后博文中会有讲述。

1、一致性哈希。在分布式系统用途广泛。

2、局部敏感哈希LSH:simhash和minhash。可以用于相似度检测等。谷歌有篇文章利用LSH进行网页去重。

3、布隆过滤器。判断一个元素是否在一个集合中。

4、在数据流算法中哈希算法应用更是广泛。比如数据流中独立元素计数等。

5、特征哈希。近几年在nips等机器学习会议上,将特征使用minhash进行压缩,降低数据量。这里可以对minhash进行改进,比如b-bit minhash。

一、为什么需要hash trick?

在工业界,数据经常不仅是量大,而且维度也很高,所以出现很多具体的大规模的机器学习问题,比如点击率预测问题。在CTR中,特征涉及到广告主和用户等。大多特征都可以看做categorical。对categorical feature一般使用1-of-c编码方式(统计里称为dummy coding)。对于取值为实数的特征我们可以进行离散化处理(实际应用中一般也不直接把连续值的特征直接交由模型处理)。可能有的特征对应的取值非常多,所以这种编码方式就容易导致维度非常高(维数灾难问题)。当然也有其他原因造成该问题维度很高,比如将不同特征做笛卡尔积产生新的特征(参考链接6中提到很多广告公司宣称使用的几十上百亿特征都是用这个方法搞出来的)。

那如何降维呢?我们可以首先去除特征中不频繁的值,这样特征对应的取值减少,维数会降低。但是这种方法需要对数据进行预处理。至于PCA等常见的降维方法,由于数据量实在太大而不太适合使用。而hash trick是一种越来越受欢迎的降维方法。它不需要进行数据预处理,实现简单直接。

对于一些非线性问题,我们可以将输入空间映射到高维的特征的空间,使问题变成一个线性问题。使用kernel trick可以通过低维度的样本点的核函数计算得到高维度中向量的内积。但是在文本分类问题中,就会碰到一个问题。文本分类问题也是一个典型的高维问题,而且由于手工添加的一些非线性特征,原始的输入空间就线性可分,这样就没必要在将输入映射到更高位的特征空间了。而是需要使用降维方法。hash trick和kernel trick的作用相反。

二、hash trick的实现过程

哈希技巧具体实现时,可以有两个策略:

1.对每个特征f均进行转换,结果为

。这样最终总共维度为:



2、对所有特征哈希到同一个空间。这里假设原本有n维,最后输出为d维。如果n < d ,我们称之为压缩表示(compressed representation),此时肯定有多个原始维度冲突的情形,但实验表明这对问题求解影响不大(参考链接1提到)。

首先讲Count-Min sketch算法的使用。第一次接触Count-min算法还是用在数据流中做统计频繁元素出现次数。这里只涉及count步,没涉及min步。最终的结果向量里面每一位的取值就是哈希到该位的原始特征数目。

我们将特征向量u每一位哈希到k个桶(也就是k维向量w)中,哈希后的值就是该桶里元素的总和。这里Pr(h(i)=j)=1/k,其中j={1,2,…,k}。我们假设

。则最终w的每一位的取值为



上面这种是简单的版本。可以基于此做些许修改,一般称为Vowpal Wabbit。其中

是将i均匀哈希到{-1,1}中的每个元素。



这种降维方法是否会损失原始特征的表达能力呢?这个实际实验效果最能说明问题。

注:在论文里和博客会提到修改版本是简单版本的无偏估计的改进。他们所说的无偏估计是把count-min sketch或者Vowpal Wabbit作为估计两个高维向量内积来说的,跟这里应用到特征哈希问题关系不大。

三、基于最小哈希的hash trick的实现。

这里再介绍一种基于最小哈希Min Hash的hash trick。这种方法要求数据必须是binary data。对特征向量x进行随机转换进行一次MinHash,得到哈希结果,取哈希结果(二进制表示)的最后b位。就是b-bit Min Hash的过程。该过程重复k次。这样每个样本就可以用k*b位进行表示。一般选k>=200,b>=8时效果接近原本方法,但处理的时间和空间要求大大降低。

举个例子,如果k=3,某个样本的最小哈希的结果为{12013,25964,20191},二进制表示为{10111011101101,110010101101100,100111011011111}。设b=2,则只取哈希结果最后两位,{01,00,11},十进制就是{1,0,3}。接着把每个b-bit哈希的结果拓展成2^b=4位,也就是{0010,0001,1000},一共需要k*2^b=12位。我们把最终得到的{0010,0001,1000}喂给一些分类器(Liblinear等)即可。

四、总结

整体来讲,hash trick可以作为一种降维方法,实现简单,所需计算量小,效果较好。hash trick可以保持原有特征的稀疏性(preserve sparsity)。缺点是哈希后学习到的模型很难检验,无法对模型参数做解释。

五、参考链接

1.Simple and scalable response prediction for display advertising 。

2.Feature Hashing for large scale multitask learning。经典。

3.Hashing algorithm for large scale learning。介绍最小哈希在特征哈希的作用。

4.http://www.cnblogs.com/kemaswill/p/3903099.html。

5.http://hunch.net/~jl/projects/hash_reps/。有微博大牛转发过这条链接。是hash trick应用在机器学习中论文总结。

6.https://breezedeus.github.io/2014/11/20/breezedeus-feature-hashing.html。结合实际项目谈在multi-task中的应用,总结的挺好。

这篇文字主要写MinHash和SimHash的区别、联系、在工业界使用等,不涉及MinHash和SimHash的详细基础介绍,相关资料参考资料里给出。

一、相同点

提到哈希我们想到很多应用,最常见的话就是用于提高查询效率,还可用于加密方面。本篇文章要介绍的MinHash和SimHash由于具有一些特殊的特性在降维,查重和聚类等方面应用广泛。

1.它们都具有一般哈希方法所没有的局部敏感的性质(局部敏感哈希LSH是一类哈希函数)。比如MD5算法会使两个相差不大的文档的哈希结果差异很大,而MinHash和SimHash会使两个相差不大的文档的哈希结果很相似。


-敏感的LSH函数族的公式化描述如下图。其中Sim(x,y)代表x和y两点的相似度。Pr(
h(x) = h(y) )表示x和y两点哈希结果相同(产生冲突)的概率。



对于

-敏感的LSH函数族,对于近邻搜索问题,查询时间和

相关。

度量给定LSH的查询效率,值越小越好。

2.它们都有降维的作用。可以将一个高维的向量转化为比如64位的0/1串(称为指纹或者签名都可以)。

二、不同点

1.相关相似度度量介绍

首先讲下Jaccard相似度和余弦相似度联系。如果有一个全集,



表示子集,用取值均为0或1向量表示(指示相应元素是否出现)。设:



则余弦相似度为:



Jaccard相似度为:



两者都是常用的相似度度量,所有两者具有相关性。在我们这种情况下余弦相似度和Jaccard相似度关系如下。相当于为Jaccard相似度设定了上下界。在大多数情况下 ,由于一般



大小差距不大,上界和Jaccard很接近。而只有相似度较高的情况下,下界才会和Jaccard接近(相似度低的情况下,下界估计很保守)。



2.效果比较

容易理解,使用MinHash发生冲突的概率等于



的Jaccard相似度。根据上面LSH的定义,可以知道,MinHash属于

-敏感LSH函数族,基于Jaccard相似度。



而使用SimHash发生冲突的概率怎么计算呢?SimHash可以这么定义:

。x和y发生冲突的概率和x和y之间的余弦相似度有关。根据上面LSH的定义,可以知道,SimHash属于

-敏感LSH函数族,基于余弦相似度。



对于实际应用中如何选择MinHash还是SimHash的问题,我们是根据判断使用Jaccard相似度还是余弦相似度来判断??我们之前提到使用余弦相似度可以对Jaccard相似度进行上下界的估计。由此我们得到,基于余弦相似度的MinHash属于

-敏感LSH族(很出人意料的地方)。根据实验计算

的区别发现在binary
data的情况下MinHash效率要比SimHash好。

三、两者的应用

这两篇文章有点老(07年WWW),不过里面很多的想法还是值得参考的。

1.谷歌新闻推荐论文中使用到了Min hash。这里涉及推荐,使用用户看过的所有的新闻集合表示用户。这里每个用户可以用一个取值0/1的向量表示(每个维度代表新闻,取值代表是否看过该新闻)。这里选用的方法是Min Hash。文章将Min Hash看作是聚类算法,因为哈希后的不同桶可以看做不同的簇。

具体算法是对用户看过的新闻集合进行随机排列,第一个新闻的序号就是最小哈希的结果。但是由于新闻集合太大,显示的随机排列是不可取的。文章里面用哈希的方法模拟随机排列的过程,将每个新闻哈希到0到N,取哈希结果最小的那篇新闻的序号即可。

2.谷歌网页去重论文中使用到了Sim hash。这里用一个高维向量表示表示一个网页。这里每维度的值是一个实数(不是binary)故选用SimHash。使用SimHash将高维向量降维成64位0/1的指纹。之后文章提出了如何找出指纹库中与给定指纹相差最多3位的所有指纹,查询效率关于时间和空间的权衡,非常有意思。

附录:

1.关于MinHash的资料参见《mining massive dataset》(也就《互联网大规模数据挖掘和分布式数据处理》)中相似项发现一章。

2.《Google News Personalization : Scalable Online collaborative Filtering》。

3.关于SimHash的资料参见http://wenku.baidu.com/view/7981bb1e59eef8c75fbfb3e0.html。这个是关于网页去重论文《Detecting Near-Duplicates for Web Crawling》的PPT讲解。里面介绍SimHash的slide很清晰的描述了其过程。或者http://www.lanceyan.com/tech/arch/simhash_hamming_distance_similarity.html也说得挺好的。

4.《In Defense of MinHash over SimHash》。该篇文章作者发了包括b-bit 最小哈希和机器学习中特征哈希等的文章,对于工程方面非常有实践意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: