![5489a16f78fd1716e4db3cbf7bd326da.png](https://i-blog.csdnimg.cn/blog_migrate/4b292cd9284bb732927037e31ce32d05.jpeg)
本文仅讨论深度学习模型中涉及到的高维特征哈希技巧。
本文首先介绍嵌入技术,引出Hash Trick;其次分析就Hash冲突给出理论和实验证明,给出一个减少冲突的方案;接着就具体的场景给出减少特征Hash冲突或者在有限的参数空间内尽可能地表示高维特征的技巧;最后给出简单结论。
嵌入与Hash Trick
在嵌入技术(Embedding)被广泛使用前,常用的特征编码方式有One-Hot Encoding和CountVectorizer:
![f3a04f80dd6605e5d0a70505443abdaa.png](https://i-blog.csdnimg.cn/blog_migrate/8a3b7f14cfb042954f4766f65c5d0ef2.jpeg)
在高维特征情况下(如ID类特征、单词特征、数量可能高达千万级甚至上亿),上述编码方式在接入深度学习网络(如DNN)存下以下问题:
- 上述编码方式生成的Vector,其长度为总特征数,接入全连接层存在参数爆炸的问题。
- 通常一个样本对应的特征数量有限,远远小于总特征数。特征稀疏,每次更新只有极极极少数权重更新->网络收敛非常慢,有限样本情况下训练不充分。
- 上述编码方式,特征之间的关系始终保持独立,“非此即彼”,无法挖掘特征间的相似性。
嵌入技术是将一个数学结构经映射包含到另一个结构中。嵌入技术有以下几点好处:
- 高维结构,低维表示
- 蕴含信息丰富
- 存储较传统编码方式大大减少
- 可直接对接神经网络训练
特征嵌入技术是将特征用一个低维的向量来表示。对于给定一个特征ID,我们可以通过查表的方式获得这个特征的向量表达。由此构建了一个|V|*dim的Embedding Matrix,|V|表示总特征数,dim表示向量的维度。
![c09ec6a0ea0e99568481699e5d9809fa.png](https://i-blog.csdnimg.cn/blog_migrate/649685ed5f471fe8893ffa55fbc14505.jpeg)
特征数量(词汇、ID)庞⼤导致模型需要训练的参数非常多,通常Embedding参数占据所有参数的90%以上。
为了较少参数量,可以有以下几种方案:
- 从减少特征维度来讲,通过人工剔除无用特征(如词汇中去除停用词、罕见词),或者根据entropy或topK去词/保留词。这种裁剪的方法效果因人而异,比较繁琐。
- 从压缩特征来讲,可以用Hash Trick。
Hash Trick是将原始的unique ID映射在一个[0,B]区间的一个数,⽽而B<<|V|从而达到降低计算参数和内存的目的。
![e032d863bba5c184f5aadce42f7860ad.png](https://i-blog.csdnimg.cn/blog_migrate/99361512fa047bbab4c59df7b40a984c.jpeg)
对于任意⼀个特征,我们用Hash函数找到对应哈希表的位置,然后将该特征对应的值(为⽅便可以理解为word对应的词频)累加到该哈希表位置。
Hash冲突理论
有损压缩必存在特征冲突。所谓特征hash冲突,即两个不同的特征经映射后得相同的特征id,进而得到相同的嵌入向量。
接下来给出哈希冲突理论和实验以及对应结论。
- Hash冲突理论
定义哈希函数
![equation?tex=+h%3A+%5CGamma+%5Cto+%7B1%2C%E2%80%A6%2CB%7D](https://i-blog.csdnimg.cn/blog_migrate/7dc1a7f61153bf7d09fb207809eeecdc.png)
碰撞概率
![equation?tex=+p_%7Bcol%7D](https://i-blog.csdnimg.cn/blog_migrate/106b3388a8074b471ec06943a3420c79.png)
![equation?tex=p_%7Bcol%7D+%3D+1-%281-1%2FB%29%5E%7B%7C%5CGamma%7C-1%7D](https://i-blog.csdnimg.cn/blog_migrate/d8fa5b1b5a2091d5caa1310da87094c0.png)
对于大的压缩值B,我们可以做以下的近似
![equation?tex=p_%7Bcol%7D+%5Capprox+1-+e%5E%7B-%5Cfrac%7B%7C%5CGamma%7C%7D%7BB%7D%7D](https://i-blog.csdnimg.cn/blog_migrate/bbb428dad7d98bf1abf03beef4b26b6d.png)
则发生碰撞的个数理论值为
![equation?tex=+C_%7Btot%7D+%3D+%7C%5CGamma%7Cp_%7Bcol%7D](https://i-blog.csdnimg.cn/blog_migrate/50ea7ae5eed0d066d32c095829fb0770.png)
当使用
![equation?tex=k](https://i-blog.csdnimg.cn/blog_migrate/9d4a1163d2eb1bb72228d1279049c2d8.png)
![equation?tex=h%3A%5CGamma+%5Cto+%7B1%2C2%2C3%2C%E2%80%A6%2CB%5Ek%7D](https://i-blog.csdnimg.cn/blog_migrate/9d2fbc464bebd872a0c9d3b1fd320d3d.png)
![equation?tex=p_%7Bcol%7D+%5Capprox+1-+e%5E%7B-%5Cfrac%7B%7C%5CGamma%7C%7D%7BB%5Ek%7D%7D](https://i-blog.csdnimg.cn/blog_migrate/a6f71eea9659aad73ca9e4542caa64cd.png)
- Hash冲突简单实验
数据集是利用Xorshift伪随机算法生成reps个uint64位随机数,再通过比特位翻转构造随机数据,构造三个不同量级的数据集,简单实验后结果如下:
![6c9b0e45fea7fb822756d859bb024912.png](https://i-blog.csdnimg.cn/blog_migrate/c650d06a948a621ab63282fa9308c1cd.jpeg)
- Hash冲突结论
无压缩情况下,碰撞概率值均在0.63左右,这与理论值相当。
为了降低碰撞冲突,有两种解决方法,一种是增大B,还有一种是增大k。
但因内存受限,不能一味增加B,且后续embedding matrix 的大小 为
![equation?tex=B+%5Ctimes+dim](https://i-blog.csdnimg.cn/blog_migrate/0246b6e84a48df9e33425883bbe1e754.png)
![equation?tex=B+%5Ctimes+dim](https://i-blog.csdnimg.cn/blog_migrate/0246b6e84a48df9e33425883bbe1e754.png)
增加k会大幅度减小碰撞概率,可以看到当k=3时压缩10倍、压缩100倍在10^6 以上量级中实验不存在碰撞情况(理论值也巨小)。但是k的增加使得网络参数计算速度变慢。
结论1:采用2个哈希函数就可以大幅度地减小碰撞;
结论2:特征空间的大小在一定程度上可以指导B的选取,(如百万量级特征中,100倍压缩的碰撞率在1%左右,而千万量级中,100倍压缩碰撞率为0.04%)。
Sign Hash
上述方法存在⼀个问题,有可能两个原始特征的哈希后位置在一起导致词频累加特征值突然变⼤,为解决这个问题,ICML’09 提出hash Trick的变种signed hash trick,即除了原始的均匀哈希函数外,再增加了一个Binary Hash Function,来消除原始hash kernel的偏估计。
https://arxiv.org/pdf/0902.2206.pdfarxiv.org![e5929eff072b554cf50ec3baa2ea5659.png](https://i-blog.csdnimg.cn/blog_migrate/2e8e56c67ff4a080c4c8762d7736a861.jpeg)
![04167d14cd8d20975df3dc85ac0d36b9.png](https://i-blog.csdnimg.cn/blog_migrate/ffbd0f2d47bc915e8dc1a50189075662.jpeg)
Word Hash
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdfwww.microsoft.com![c360fdf22463aefdb751c4d44ce6e925.png](https://i-blog.csdnimg.cn/blog_migrate/103aa3cd16dcd29bdd6568fa28f61e3d.jpeg)
Char-ngrams + hash
https://arxiv.org/abs/1607.04606arxiv.org
![4d3913f4cd448b211f98416b32f363e7.png](https://i-blog.csdnimg.cn/blog_migrate/2df48f13db9af2ded3429f697f0f755d.jpeg)
针对中文搜索短语的分词编码
![5b4b32114efea39bd09bc8f6544ed897.png](https://i-blog.csdnimg.cn/blog_migrate/7aaa7b89f9aea1680b240f8927f3e85e.jpeg)
Hash2Vec
https://arxiv.org/abs/1608.08940arxiv.org![c9cebe029ed1c82c0806a051e6ff8b03.png](https://i-blog.csdnimg.cn/blog_migrate/abccb93c43281505114018510e83eda8.jpeg)
随机编码
原先一个特征只有一个特征id,现在一个特征对应6个特征id,任意两个特征中最多允许有3个1重叠。
![ed5aba86eff5a4aa7ae470a79c3e27ea.png](https://i-blog.csdnimg.cn/blog_migrate/a7d59119015f43f544cf80e5ac9e2f40.jpeg)
挂靠编码
![a55e8ea937c392dc449ffd930ea4c787.png](https://i-blog.csdnimg.cn/blog_migrate/16dd58f6466fa6ebc29b55dedcdb9457.jpeg)
Hash Embedding
一个特征由K个id对应的embedding加权求和表示,具体权重参数是通过神经网络训练得到。
https://github.com/YannDubs/Hash-Embeddingsgithub.com https://github.com/dsv77/hashembeddinggithub.com![84ebf8edd1cf2d84c7c5f11bcb1e91f8.png](https://i-blog.csdnimg.cn/blog_migrate/9cdb9f9bf717c489ac373270c509cf07.png)
![f092c600a23f92989b6be77e6d0851f3.png](https://i-blog.csdnimg.cn/blog_migrate/43517229a972f536fb9498fc72318fae.jpeg)
小结
![4bf0a80daa1435ba0a30a661e1137ce8.png](https://i-blog.csdnimg.cn/blog_migrate/75b63b78c2d25842c1226f94402fa858.jpeg)
![5ac523256040f1a234b88849d08b326c.png](https://i-blog.csdnimg.cn/blog_migrate/f937a8e9526a97d8a46a6524224d5060.jpeg)
![cdb582c93a2224046886d51afdb4d2f2.png](https://i-blog.csdnimg.cn/blog_migrate/7bad678d801ee786e1ade1ae36e8a17b.jpeg)
![3c41462186e5fd0a9b2b7d2637da60ac.png](https://i-blog.csdnimg.cn/blog_migrate/bf66ef0c2a08609feb2eb2da9eb659df.jpeg)