文章目录
引入
一些记号
记号 | 含义 | 其他 |
---|---|---|
n n n | 总人数 | |
m m m | 总样本数 | |
k k k | 特征数 | |
y i ( j ) y_{i}^{(j)} yi(j) | 第 j j j个人对第 i i i个样本的评分 | y i , j ∈ [ 0 , 1 ] y_{i,j} \in [0,1] yi,j∈[0,1],若未评分则为 n o n e none none |
x ( i ) x^{(i)} x(i) | 第 i i i个样本的特征向量 | |
w ( j ) w^{(j)} w(j), b ( j ) b^{(j)} b(j) | 第 j j j个人的超参数 | |
λ \lambda λ | 正则化参数 |
原理
用已有的样本集拟合第 j j j个人的兴趣曲线 f ( j ) ( x ) = w ( j ) ⋅ x + b ( j ) f^{(j)}(x) = w^{(j)}\cdot x + b^{(j)} f(j)(x)=w(j)⋅x+b(j)
第 j j j个人的损失函数为:
J ( w ( j ) , b ( j ) ) = 1 2 ∑ i : y i ( j ) ≠ n o n e ( f ( j ) ( x ( i ) ) − y i ( j ) ) 2 + λ 2 ∣ ∣ w ( j ) ∣ ∣ J(w^{(j)},b^{(j)})=\frac{1}{2}\sum_{i: y_{i}^{(j)} ≠ none}(f^{(j)}(x^{(i)})-y_{i}^{(j)})^{2}+\frac{\lambda}{2}||w^{(j)}|| J(w(j),b(j))=21∑i:yi(j)=none(f(j)(x(i))−yi(j))2+2λ∣∣w(j)∣∣,其中 ∣ ∣ ⋅ ∣ ∣ ||\cdot|| ∣∣⋅∣∣为某范数
我们可以将 n n n个人统一起来一起拟合出总损失函数:
J ( w ( 1 ) w ( 2 ) . . . w n b ( 1 ) b ( 2 ) . . . b n ) = ∑ j = 1 n J ( w ( j ) , b ( j ) ) = ∑ j = 1 n ( 1 2 ∑ i : y i ( j ) ≠ n o n e ( w ( j ) ⋅ x ( i ) + b ( j ) − y i ( j ) ) 2 + λ 2 ∣ ∣ w ( j ) ∣ ∣ ) J\begin{pmatrix} w^{(1)} & w^{(2)} & ... & w^{n}\\ b^{(1)} & b^{(2)} & ... & b^{n}\end{pmatrix} =\sum_{j=1}^{n}J(w^{(j)},b^{(j)})=\sum_{j=1}^{n}(\frac{1}{2}\sum_{i: y_{i}^{(j)} ≠ none}(w^{(j)}\cdot x^{(i)}+b^{(j)}-y_{i}^{(j)})^{2}+\frac{\lambda}{2}||w^{(j)}||) J(w(1)b(1)w(2)b(2)......wnbn)=∑j=1nJ(w(j),b(j))=∑j=1n(21∑i:yi(j)=none(w(j)⋅x(i)+b(j)−yi(j))2+2λ∣∣w(j)∣∣)
最后,用梯度下降等方法使损失函数最小化,得到 w w w和 b b b
注意,该算法假设了我们知道每一个样本的所有特征 x i x_{i} xi
协同过滤算法
假设我们已经有了一些人的评分 y y y和他们的超参数 w w w和 b b b,我们可以反过来预测样本的特征 x x x。使用同样的方法:
J ( x i ) = 1 2 ∑ j : y i ( j ) ≠ n o n e ( w ( j ) ⋅ x ( i ) + b ( j ) − y i ( j ) ) 2 + λ 2 ∣ ∣ x ( i ) ∣ ∣ J(x_{i})=\frac{1}{2}\sum_{j: y_{i}^{(j)} ≠ none}(w^{(j)} \cdot x^{(i)} + b^{(j)}-y_{i}^{(j)})^{2}+\frac{\lambda}{2}||x^{(i)}|| J(xi)=21∑j:yi(j)=none(w(j)⋅x(i)+b(j)−yi(j))2+2λ∣∣x(i)∣∣
J ( x 1 , x 2 , . . . , x m ) = ∑ i = 1 m J ( x i ) = ∑ i = 1 m ( 1 2 ∑ j : y i ( j ) ≠ n o n e ( w ( j ) ⋅ x ( i ) + b ( j ) − y i ( j ) ) 2 + λ 2 ∣ ∣ x ( i ) ∣ ∣ ) J(x_{1}, x_{2}, ..., x_{m}) = \sum_{i=1}^{m}J(x_{i})=\sum_{i=1}^{m}(\frac{1}{2}\sum_{j: y_{i}^{(j)} ≠ none}(w^{(j)} \cdot x^{(i)} + b^{(j)}-y_{i}^{(j)})^{2}+\frac{\lambda}{2}||x^{(i)}||) J(x1,x2,...,xm)=∑i=1mJ(xi)=∑i=1m(21∑j:yi(j)=none(w(j)⋅x(i)+b(j)−yi(j))2+2λ∣∣x(i)∣∣)
合并一下,在这里我们其实最开始能获取的数据只有每个人对每个样本的评分,所以 w w w, b b b, x x x都是超参数,我们可以一起计算:
J = 1 2 ∑ ( i , j ) : y i ( j ) ≠ n o n e ( w ( j ) ⋅ x ( i ) + b ( j ) − y i ( j ) ) 2 + λ 1 2 ∑ j = 1 n ∣ ∣ w ( j ) ∣ ∣ + λ 2 2 ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ J=\frac{1}{2}\sum_{(i, j): y_{i}^{(j)}≠none}(w^{(j)}\cdot x^{(i)}+b^{(j)}-y_{i}^{(j)})^{2}+\frac{\lambda_{1}}{2}\sum_{j=1}^{n}||w^{(j)}||+\frac{\lambda_{2}}{2}\sum_{i=1}^{m}||x^{(i)}|| J=21∑(i,j):yi(j)=none(w(j)⋅x(i)+b(j)−yi(j))2+2λ1∑j=1n∣∣w(j)∣∣+2λ2∑i=1m∣∣x(i)∣∣
注意,这样计算后得到的特征参数 x x x可能会很难得到实际解释,但的确是某些样本的共同特征。此外,协同过滤算法很难冷启动,即在很少用户参与评分的情况下很难取得好的效果。
使用
我们的最终目标是预测出为 n o n e none none的部分,来决定是否为用户推荐这些内容。
将用户的 w w w和 b b b以及内容的特征 x x x输入进模型,我们得到值 z = w ⋅ x + b z=w \cdot x + b z=w⋅x+b,采用激活函数 g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1得到 P ( y = 1 ∣ w , b , x ) P(y=1|w,b,x) P(y=1∣w,b,x)。
此外,我们可以调整一下损失函数的形式,来适应这个激活函数:
原先: L i ( j ) = g ( f ( w ( j ) , b ( j ) , x i ) ) − y i ( j ) = g ( w ( j ) ⋅ x ( i ) + b ( j ) ) − y i ( j ) L_{i}^{(j)} = g(f(w^{(j)}, b^{(j)}, x_{i})) - y_{i}^{(j)} = g(w^{(j)}\cdot x^{(i)} + b^{(j)}) - y_{i}^{(j)} Li(j)=g(f(w(j),b(j),xi))−yi(j)=g(w(j)⋅x(i)+b(j))−yi(j)
现在: L i ( j ) = − y i ( j ) l o g ( f ( w ( j ) , b ( j ) , x ( i ) ) ) − ( 1 − y i ( j ) ) l o g ( 1 − f ( w ( j ) , b ( j ) , x ( i ) ) ) L_{i}^{(j)} = -y_{i}^{(j)}log(f(w^{(j)}, b^{(j)}, x^{(i)}))-(1-y_{i}^{(j)})log(1-f(w^{(j)}, b^{(j)}, x^{(i)})) Li(j)=−yi(j)log(f(w(j),b(j),x(i)))−(1−yi(j))log(1−f(w(j),b(j),x(i)))
损失函数变为: J ( w , b , x ) = ∑ ( i , j ) : y i ( j ) ≠ n o n e L i ( j ) J(w,b,x) = \sum_{(i, j): y_{i}^{(j)}≠none} L_{i}^{(j)} J(w,b,x)=∑(i,j):yi(j)=noneLi(j)
均值归一化
对于样本 i i i,我们对它的所有评分取均值得到 u i : = m e a n { y i ( j ) ≠ n o n e } u_{i}:=mean\left \{ y_{i}^{(j)} ≠ none \right \} ui:=mean{yi(j)=none},然后,在线性拟合函数中加入归一化操作 f ( w ( j ) , b ( j ) , x ( i ) ) = w ( j ) ⋅ x ( i ) + b ( j ) + u i f(w^{(j)},b^{(j)},x^{(i)}) = w^{(j)} \cdot x^{(i)}+b^{(j)} + u_{i} f(w(j),b(j),x(i))=w(j)⋅x(i)+b(j)+ui
这样做可以简化梯度计算,更显著的变化是,如果人没有为任何样本打分,那代入TA的初始参数 w = 0 ⃗ w=\vec{0} w=0 和 b = 0 b=0 b=0后,每个样本的得分会变成其他人打分的平均值,更符合实际用途。
基于内容的推荐
原理
根据用户的信息,我们训练一个模型来预测他们的喜好 v u v_{u} vu:
基于样本的信息,我们训练一个模型来预测它们的特征 v m v_{m} vm
然后,用激活函数 g ( v u ⋅ v m ) g(v_{u} \cdot v_{m}) g(vu⋅vm)来判断是否要将样本推荐给该用户。
构造损失函数 J = ∑ ( i , j ) : y i ( j ) ≠ n o n e ( v u ( j ) ⋅ v m ( i ) − y i ( j ) ) 2 + NN regularzation term J = \sum_{(i, j): y_{i}^{(j)} ≠ none}(v_{u}^{(j)}\cdot v_{m}^{(i)}-y_{i}^{(j)})^{2}+\text{NN regularzation term} J=∑(i,j):yi(j)=none(vu(j)⋅vm(i)−yi(j))2+NN regularzation term
寻找与样本 i i i相似的样本: m i n ∣ ∣ v m ( k ) − v m ( i ) ∣ ∣ min \ ||v_{m}^{(k)} - v_{m}^{(i)}|| min ∣∣vm(k)−vm(i)∣∣
基于TensorFlow的代码
从大目录里推荐
当样本量很大时,每一次都完整跑一遍内积非常费时间,通常在实际应用中,会进行以下两个操作:检索 和排名
检索
检索 (Retrieval)步骤的目的是从庞大的候选集合中快速筛选出一小部分最有可能满足用户需求的项目。这个步骤通常需要高效且能够处理大规模数据。常见的检索方法包括:
(1)倒排索引 (Inverted Index):倒排索引是一种数据结构,用于快速查找包含某个特定词的文档。它将每个词映射到包含该词的文档列表。
(2)哈希 (Hashing):通过哈希函数将高维数据映射到低维空间,以便快速查找相似的项目。
(3)近似最近邻搜索 (Approximate Nearest Neighbor Search, ANNS):通过近似算法(如LSH、HNSW等)在高维空间中快速找到最接近的邻居。
(4)机器学习模型(如DSSM、BERT等):使用深度学习模型对用户查询和候选项目进行编码,计算相似度并进行排序。
我们需要做的是平衡检索样本的数量,检索越多的样本会使准确度提高,但会使时间成本增加。
排名
使用上述模型计算样本与用户喜好之间的相似度,并进行排名