本博客已經遷往http://www.kemaswill.com/, 博客園這邊也會繼續更新, 歡迎關注~
在機器學習領域, kernel trick是一種非常有效的比較兩個樣本(對象)的方法. 給定兩個對象$x_i, x_j \in \mathcal{X}$, 用$k(x_i, x_j) :=\left <\phi(x_i), \phi(x_j)\right>$來比較兩個對象的特征$\phi(x_i), \phi(x_j)$. kernel trick通過定義一個半正定核矩陣$k$, 可以在不得到$\phi(x_i)$的情況下隱式的得到高維向量$\phi(x_i)$和$\phi(x_j)$的內積, 大大減少計算時間. 但是Weinberger[1]等人提出, 在實際中, 尤其是文本分類領域, 原始的輸入空間幾乎是線性可分的, 但是, 訓練集太大, 特征維度太高. 在這種情況下, 沒必要把輸入向量映射到一個高維的特征空間. 相反的, 有限的內存可能存不下核矩陣. 為此, Langford[2], Qinfeng Shi[3]等人提出了hashing trick, 把高維的輸入向量哈希到一個低維的特征空間$\mathbb{R}^m$.
1. Hashing Trick
最簡單的hashing trick是將原始的每個特征名(或者特征索引)hash到一個低維向量的索引上, 然后將該特征的值累加到該低維向量的索引上:
$\bar{\phi}_j(x) = \sum_{i\in \mathcal{J}; h(i) = j}\phi_i(x)$
其中$\phi(x) \in \mathbb{R}^{\mathcal{J}}$為原始的輸入向量, $h: \mathcal{J} \to {1,..,n}$為哈希函數. 算法偽代碼為:
function hashing_vectorizer(features : array of string, N : integer): x := new vector[N] for f in features: h := hash(f) # f 是特征名, 也可以是特征的索引
x[h mod N] += 1 # 此處累加的是1, 也可以是特征的值
return x
2. Signed Hash Trick
Weinberger等人提出了一個新的變種, 可以稱作signed hash trick. 做法是累加的值不再是固定的1或者特征值, 而是由另外一個哈希函數確定: $\xi : \mathbb{N} \to {\pm 1}$, 這樣的好處是可以得到一個無偏的估計.
$\bar{\phi}_j(x) = \sum_{i\in \mathcal{J}; h(i) = j}\xi(i)\phi_i(x)$
算法偽代碼為:
function hashing_vectorizer(features : array of string, N : integer): x := new vector[N] for f in features: h := hash(f) idx := h mod N if ξ(f) == 1: x[idx] += 1 # 此處累加的是1, 也可以是特征值
else: x[idx] -= 1 # 此處累加的是-1, 也可以是特征值 * -1
return x
3. Multiple Hashing
為了防止哈希沖突(亦即不同的特征被哈希到了相同的索引上)帶來的負面影響, 可以對那些特征值比較大的特征哈希多次, 如果哈希$c$次, 則每個索引需要累加的值為$\frac{1}{\sqrt{c}}\phi_i(x)$[1].
參考文獻:
[1]. Feature Hashing for Large Scale Multitask Learning. K. Weinberger, A. Dasgupta, J. Attenberg, J. Longford, A.Smola. ICML, 2010.
[2]. Vow- pal wabbit online learning project (Technical Report). http://hunch.net/?p=309. Langford, J., Li, L., & Strehl, A. (2007).
[3]. Hash kernels. AISTATS 12. Shi, Q., Petterson, J., Dror, G., Langford, J., Smola, A., Strehl, A., & Vishwanathan, V. (2009).
[4]. Wikipedia: Feature Hashing
[5]. Mahout in Action, page 261. Section 14.3.1 Representing data as a vector: Feature Hashing.