原文作者:Qiang He, Bo Li, Feifei Chen, John Grundy, Xin Xia, Yun Yang
原文标题:Diversified Third-Party Library Prediction for Mobile App Development
原文来源:IEEE TSE 2020
原文链接:https://ieeexplore.ieee.org/abstract/document/9043686
Diversified Third-Party Library Prediction for Mobile App Development
移动app开发人员同样面临着信息过载的问题:从海量的第三方库中找出能够满足他们开发需求的第三方库。有些研究方法采用协同过滤算法进行预测,作者使用了矩阵分解算法(MF-based)进行预测,但是结果缺乏多样性,一小部分非常流行的第三方库主导了预测结果。较低的多样性限制了预测的可用性。因此作者设计了一个新的MF-based方法,LibSeek。采用了自适应加权机制,抵消第三方库的流行度造成的影响。
研究背景
第三方库(Third-party libraries,TPLs)使得app开发者能实现很多功能。对于开发者来说,在大量的第三方库中找到满足自己需求的库非常费时费力,而且有些库之间还存在着依赖关系,找出这些依赖关系也非常耗时。有些工作(LibRadar,LibD,LibPecker,LibScout)能够分析检测app中使用的TPLs。普遍认为找出有用的TPLs是比较困难的。
作者研究发现,TPLs的使用有一定的参考模式,比如facebook和picasso,一个用于社交,一个用于图像视频的处理,这两个libraries通常一起使用。作者构建了一个MALib的数据集,包括GoolePlay上61722个移动app,725502个app使用libraries的记录,还有这些app使用的827个libraries。选择使用超过10个libraries的app,共31432个app。然后使用SGD、ALS、BPR三种MF-based方法进行TPL预测。结果发现推荐结果的32.12%都是非常流行的libraries,只占1%,作者称之为popularity bias issue。经过研究,作者认为这是有用MALib数据集中的长尾分布造成的:29.91%的app-library使用记录中的libraries占所有libraries的1%。
作者认为,推荐流行的libraries给开发者意义不大,因为开发者很有可能对这些库已经很熟悉了,而且已经明确了这些库对他们的app是否有效。所以推荐的结果需要更丰富的多样性。
作者使用SGD、ALS、BPR三种MF-based方法进行了初步实验,实验结果表明了MF-based方法对于TPLs推荐的有效性,平均召回率达到了37.98%。但是只有一小部分的TPLs被推荐到,很大一部分TPLs几乎没有让开发者看到。这是一个急需解决的问题,因为推荐常见的libraries对于开发者意义不大。
问题定义
使用矩阵M表示app-libraries usage,有m个app,n个libraries。如果 r u , i = 1 r_{u,i} = 1 ru,i=1表示app u使用了libraries i,否则为0。令A为M中的所有app集,L为M中所有的libraries集。目标是对每一个app u,从L中选择k个libraries。
对于矩阵M,矩阵分解在一个隐空间中建模app和libraries,每一个app/libraries表示为一个f维的向量。令向量 x u ∈ R f x_{u} \in \mathbb{R}^{f} xu∈Rf表示一个app,向量 y i ∈ R f y_{i} \in \mathbb{R}^{f} yi∈Rf表示一个library,那么:
r ^ u , i = x u T ⋅ y i {\widehat{r}}_{u,i} = x_{u}^{T} \cdot y_{i} r u,i=xuT⋅yi
写成矩阵就是:
M ≈ X T Y M \approx X^{T}Y M≈XTY
其中, X = { x 1 , x 2 , ⋯ , x m } ∈ R f × m X = \left\{ x_{1},x_{2},\cdots,x_{m} \right\} \in \mathbb{R}_{f \times m} X={ x1,x2,⋯,xm}∈Rf×m, Y = { y 1 , y 2 , ⋯ , y m } ∈ R f × n Y = \left\{ y_{1},y_{2},\cdots,y_{m} \right\} \in \mathbb{R}_{f \times n} Y={ y1,y2,⋯,ym}∈Rf×n。在训练时,矩阵分解方法一般使用的损失函数为:
min X , Y Loss = ∑ r u , i > 0 ( r u , i − x u T y i ) 2 + λ ( ∥ x u ∥ 2 + ∥ y i ∥ 2 ) \min_{X,Y}\text{Loss} = \sum_{r_{u,i} > 0}^{}\left( r_{u,i} - x_{u}^{T}y_{i} \right)^{2} + \lambda\left( \left. \parallel x_{u} \right.\parallel^{2} + \left. \parallel y_{i} \right.\parallel^{2} \right) X,YminLoss=ru,i>0∑(ru,i−xuTyi)2+λ(∥xu∥2+