为了提高模型对数据复杂关系的拟合能力,在做特征工程时常常对一些特征进行组合,构成高阶特征。
以逻辑回归为例,假设数据特征向量为 X = ( x 1 , x 2 , . . . , x k ) X = (x_1, x_2, ..., x_k) X=(x1,x2,...,xk),则有
Y = s i g m o i d ( ∑ i ∑ j w i j < x i , x j > ) Y = sigmoid(\sum_{i} \sum_{j} w_{ij} < x_i, x_j >) Y=sigmoid(i∑j∑wij<xi,xj>)
其中 < x i , x j > < x_i, x_j > <xi,xj>表示 x i x_i xi与 x j x_j xj的组合特征。第 i , j i, j i,j个特征的取值个数为 ∣ x i ∣ , ∣ x j ∣ |x_i|, |x_j| ∣xi∣,∣xj∣,那么 w i j w_{ij} wij的维度大小为 ∣ x i ∣ ⋅ ∣ x j ∣ |x_i|·|x_j| ∣xi∣⋅∣xj∣。当 x i x_i xi或 x j x_j xj为ID类特征,例如user id有m个,item id有n个,那么 w i j w_{ij} wij的参数规模为 m ∗ n m*n m∗n,生产环境中,uid和nid可达百万级,几乎无法学习 m ∗ n m*n m∗n规模的参数。
一种行之有效的方法是将 w i j w_{ij} wij进行矩阵分解,由 m ∗ n m*n m∗n分解为两个 m ∗ k m*k m∗k、 n ∗ k n*k n∗k的矩阵乘法, k < < m , k < < n k << m, k << n k<<m,k<<n。此时 w i j = x i ′ ⋅ x j ′ w_{ij} = x_i^{'} · x_j^{'} wij=xi′⋅xj′,这样需要学习的参数规模为 ( m + n ) ∗ k (m+n)*k (m+n)∗k,其实类似于embedding的形式。
欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~