多模态和跨模态的文章博主在之前的都整理过了,最近对多样性比较感兴趣,但是发现做这个方向的人确实太少了(虽然在推荐里面做的人还是挺多的)。暂时把目前看到觉得还不错的文章整理一下。
Diversity
在推荐系统的目标主要是Exploitation 和 Exploration。每一模块如上图,多样性在用户体验中还是十分重要的部分。其中的多样性可分为:
- 个体多样性:从单个用户的角度来衡量的推荐系统多样性,主要考察系统能够找到用户喜欢的冷门项目的能力。(衡量方法仍然是item之间)
- 总体多样性:主要强调对不同用户有不同的推荐。可以通过长尾理论考察推荐系统多样性对产品销售的影响。多样性程度高的系统可以带动不太流行的商品的销量。(主要侧重user list之间的差异)
- 时序多样性:推荐随着用户偏好(随时间)变化而改变
D i v e r s i t y = 1 − ∑ s ( i , j ) 1 2 ∣ R ( u ) ( ∣ R ( ) u ∣ − 1 ) Diversity=1-\frac{\sum s(i,j)}{\frac{1}{2} |R(u)(|R()u|-1)} Diversity=1−21∣R(u)(∣R()u∣−1)∑s(i,j) D i v e r s i t y = 1 ∣ U ∣ ∑ D i v e r s i t y ( R ( U ) ) Diversity=\frac{1}{|U|}\sum Diversity(R(U)) Diversity=∣U∣1∑Diversity(R(U))
不过在检索方面,由于不存在用户和时序这种,更多是偏向于item的总体多样性,即返回的list要尽可能的多样化。
特别是在检索过程中,用户并不总是对自己的需求有一个明确的想法。当他们的目标不属于大多数相似结果所处的主要类别时,检索效率将急剧下降。多样性图像检索,以保证检索结果不仅与查询相关,而且尽可能涵盖查询的各个方面。
[WSDM2014] Latent Dirichlet Allocation based Diversified Retrieval for E-commerce Search
对于普通的检索系统来说,在不优化多样性的情况下会导致属于同一产品的冗余项杂乱,即比如搜苹果,将全部得到同样的结果,而不能识别其多样的语义。
年限比较早了,这篇论文作者的主要想法是使用LDA模型发现查询query的隐藏用户意图,然后通过在相关性+信息新颖性之间进行权衡来对用户意图进行排序(即MMR,两者之间的λ线性组合,一方面需要检索到相关的内容,另一方面需要保证多样性),最后为每个用户意图选择最具代表性的项目来显示。
Maximal Marginal Relevance,公式中S是已经被选中的集合,Sim是计算相似度。前项指的是不在S中的文档即多样性,后项是在S的文档即相关性,两者通过λ来平衡重要程度。
def MMR(itemScoreDict, similarityMatrix, lambdaConstant=0.5, topN=20):
s, r = [], list(itemScoreDict.keys())
while len(r) > 0:
score = 0
selectOne = None
for i in r:
firstPart = itemScoreDict[i]
secondPart = 0
for j in s:
sim2 = similarityMatrix[i][j]
if sim2 > second_part:
secondPart = sim2
equationScore = lambdaConstant * (firstPart - (1 - lambdaConstant) * secondPart)
if equationScore > score:
score = equationScore
selectOne = i
if selectOne == None:
selectOne = i
r.remove(selectOne)
s.append(selectOne)
return (s, s[:topN])[topN > len(s)]
最后对于多样性的度量方式:一般使用平均满意度。用户的意图出现在了list中则为1,没有则为0,用户多次点击的结果作为最后的度量。另外带topic标记的指标(后面的论文会有很多集中在主题topic上的文章)主要有三个:
- MAP-IA:基于用户查询意图的评价指标。在MAP的基础上单独计算每个子主题用户意图的MAP再加权。
- alpha-nDCG:在DCG的指标上扩展的,该方法奖励发现新主题惩罚主题冗余,alpha是惩罚因子。
- ERR-IA@k:在评价结果的某文档时,根据排在前面文档的相关性计算。与MAP-IA相似,也是单独对每个主题算然后加权。
也有人使用对子主题的Precision-IA and Subtopic Recall等等。
[NIPS02018] Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity
说到MMR,自然就有DPP了,Determinantal Point Process,即基于行列式点过程的方法。DPP通过最大后验概率估计,找到商品集中相关性和多样性最大的子集,从而作为推荐给用户的商品集,即寻找离散集合中每一个子集出现的概率。
但是建模所有子集的概率太麻烦,所以需要将复杂的概率计算转换成简单的行列式计算,并通过核矩阵的行列式计算每一个子集的概率,这样做不仅减少了计算量,而且提高了运行效率。
DPP简单来说就是建模点间斥力,让子集上的分布能够使得选择两个相似项的概率是(反)相关的。即把每个item都是向量,向量长就是item与用户的相关度,夹角是item内的相互独度,DDP认为任意k个围成的面积最大即为最优。实际操作中只需要每次加item使L行列式最大就行。
而L是在z中所有元素构成的半正定矩阵,其构造方法如下:
因为半正定,所以行列式中的各个列向量自然就是的平行多面体体积的平方了。L越大,商品与用户之间相关性越大,且商品之间多样性越丰富。伪代码中的c和d是Cholesky优化后的求解解法,推导可参照知乎。
import numpy as np
import math
class DPPModel(object):
def __init__(self, **kwargs):
self.item_count = kwargs['item_count']
self.item_embed_size = kwargs['item_embed_size']
self.max_iter = kwargs['max_iter']
self.epsilon = kwargs['epsilon']
def build_kernel_matrix(self):
rank_score = np.random.random(size=(self.item_count)) # 用户和每个item的相关性
item_embedding = np.random.randn(self.item_count, self.item_embed_size) # item的embedding
item_embedding = item_embedding / np.linalg.norm(item_embedding, axis=1, keepdims=True)
sim_matrix = np.dot(item_embedding, item_embedding.T) # item之间的相似度矩阵
self.kernel_matrix = rank_score.reshape((self.item_count, 1)) \
* sim_matrix * rank_score.reshape((1, self.item_count))
def dpp(self):
c = np.zeros((self.max_iter, self.item_count))
d = np.copy(np.diag(self.kernel_matrix))
j = np.argmax(d)
Yg = [j]
iter = 0
Z = list(range(self.item_count))
while len(Yg) < self.max_iter:
Z_Y = set(Z).difference(set(Yg))
for i in Z_Y:
if iter == 0:
ei = self.kernel_matrix[j, i] / np.sqrt(d[j])
else:
ei = (self.kernel_matrix[j, i] - np.dot(c[:iter, j], c[:iter, i])) / np.sqrt(d[j])
c[iter, i] = ei
d[i] = d[i] - ei * ei
d[j] = 0
j = np.argmax(d)
if d[j] < self.epsilon:
break
Yg.append(j)
iter += 1
return Yg
if __name__ == "__main__":
kwargs = {
'item_count': 100,
'item_embed_size': 100,
'max_iter': 100,
'epsilon': 0.01
}
dpp_model = DPPModel(**kwargs)
dpp_model.build_kernel_matrix()
print(dpp_model.dpp())
原文code:https://github.com/DamianStraszak/FairDiverseDPPSampling
[Neurocomputing2019] Diversified textual features based image retrieval
对于跨模态(主要讨论文本,图像)来说,对于查询的query,系统需要返回对应语义上的尽可能广泛的图片。本文作者发现文本中的许多单词被大多数图像共享,即不同的对象可能共享类似的文本特征,那么基于这些词的文本特征将淹没图像的个体属性,这将阻碍文本特征准确地反映图像之间的关系。
这篇文章就是主要在主题上进行挖掘了。模型架构如上图,作者也是用LDA构造视觉主题,然后利用文本信息来提高主题的一致性(值得注意的是这里会分为,不同图像描述的公共词和特殊词),最后构建相似图之后完成重排序。结果如上图,经过重排序后可以使检索的图像的主题更加的多样化。
[CIKM2020] Diversifying Search Results using Self-Attention Network
现有的监督方法大多贪婪地将每个候选文档与选定的文档序列进行比较,并选择下一个局部最优文档,但每个候选文档的信息效用并不相互独立,于是作者想建模文档间的关系。
但用户的query是短的,需要通过返回不同信息需求的多样化文档列表来解决上述问题。但现有方法需要贪婪的选择,忽视了关系将导致次优的排序。于是作者提出用自注意力来建模关系,并通过这种match的方法,不用再依赖贪婪的选择。
模型图如上,图中的relevance是因为文章还是做的检索文档,所以还是加入BM25等等的特征,但是思路用来做跨模态同样是可以的。最后值得注意的是这篇文章是有监督的(有理想的list标定lable)。
[ICIP2020] GRAPH PATTERN LOSS BASED DIVERSIFIED ATTENTION NETWORK FOR CROSS-MODAL RETRIEVAL
模型架构如上,图片和文本都被处理成k个特征,这里是用不同的注意力得到的k。文章主要的贡献在于,与其应用昂贵的计算整个实例空间中的所有距离(即相似度的计算),作者使用图模式loss(只是叫这个名字,实质上并不会用到Graph算法)来优化模型,即:
L
=
L
p
d
l
+
α
L
u
d
p
+
β
L
m
d
p
L=L_{pdl}+\alpha L_{udp}+\beta L_{mdp}
L=Lpdl+αLudp+βLmdp
- Loss的第一项是成对损失反映图像-文本的相似性。 L p d l = l p ( v i , t i ) L_{pdl}=l_p(v_i,t_i) Lpdl=lp(vi,ti)
- 第二项是未配对距离,不配对包括统一模态也包括不同模态的“不匹配”。即如果是i和j的序号意味是不是匹配的对。 l u n p = 1 n ∑ ( l p ( x i , y i ) − d ) l_{unp}=\frac{1}{n} \sum (l_p(x_i,y_i)-d) lunp=n1∑(lp(xi,yi)−d) L u d p = l u n p ( v i , T ) + l u n p ( v i , V ) + l u n p ( t i , T ) L_{udp}=l_{unp}(v_i,T)+l_{unp}(v_i,V)+l_{unp}(t_i,T) Ludp=lunp(vi,T)+lunp(vi,V)+lunp(ti,T)
- 第三项是相互距离保持损失,即三种未配对的之间的距离保持一致,以进一步强调跨模态实例之间的关系。 L m d p = ∣ l p ( v i , t j ) − l p ( v i , v j ) ∣ + ∣ l p ( v i , t j ) − l p ( t i , t j ) ∣ + ∣ l p ( v i , v j ) − l p ( t i , t j ) ∣ L_{mdp}=|l_p(v_i,t_j)-l_p(v_i,v_j)|+|l_p(v_i,t_j)-l_p(t_i,t_j)|+|l_p(v_i,v_j)-l_p(t_i,t_j)| Lmdp=∣lp(vi,tj)−lp(vi,vj)∣+∣lp(vi,tj)−lp(ti,tj)∣+∣lp(vi,vj)−lp(ti,tj)∣
常用数据集
[TNNLS2022] Keyword-Based Diverse Image Retrieval with Variational Multiple Instance Graph
补一篇TNNLS2022的多样性图像检索的文章。作者们提出了Variational Multiple Instance Graph(VMIG)方案,尝试从语义层面上就学习query-image的一对多分布,而不是一对一的单点嵌入来建模多样性,因此引入了多实例学习。
把多样性学习的问题抽象为多实例学习问题,这意味着每个查询/图像都被视为一个实例包,而其不同的语义特征们将被视为包中的多个实例。该任务十分适合多实例学习的原因在于,文本和图像的多语义中,只要有某一对语义实例是匹配的,那么两者将会是匹配的,即被认为是正例包对。这对于用户的泛查询来说,只要有某个语义是对应了用户期待,那么应该被呈现给用户。
模型架构如上图,包括主要包括三个组件:1)语义特征投影器;2)跨模态多样性生成器;3)语义空间约束器。语义特征投影器提取图像特征并投影到语义空间中。跨模态多样性生成器通过学习一对多语义的分布以产生多个实例,并执行跨模态多实例图。语义空间约束器则设计了多种损失函数来约束跨模态语义空间。
paper: https://ieeexplore.ieee.org/document/9764824