论文题目:FashionNet: Personalized Outfit Recommendation with Deep Neural Network 论文地址:https://www.ijcai.org/proceedings/2017/0239.pdf
将推荐加入到搭配中,实现个性化搭配的推荐。采用的也是深度学习的算法-- CNN 模型,具体实现就是用 VGG-16 网络模型作为基础,实现 FashionNet 模型,一个 FashionNet 模型包括两个网络,特征提取网络和实现搭配的匹配网络,这部分作者设计了 3 种网络结构,并做了对比实验,而在训练上采用的两阶段训练策略,即先训练一个通用的搭配模型,然后加入用户信息来微调网络模型,此外网络的最终结构如下所示,输入两套搭配,正样本是训练集 polyvore ,也就是用户自己上传的搭配,负样本就是随机选择衣服的搭配,分别通过 FashionNet,然后计算 RankLoss。
个性化搭配推荐
基于深度学习,以 VGGNet 为基础,设计了一个 FashionNet 网络模型
利用 CNN 进行特征提取,然后采用 FC 层进行衣服的匹配性计算,训练上采用两阶段训练,先训练一个通用的搭配模型,再加入用户信息微调模型。
时尚搭配的需求越来越高,分类、检测、分割等都有在研究,其中搭配推荐的研究和需求也是非常大;
之前对于搭配的研究,大部分还处于学习任何两个单品之间的匹配性,以及学习比较通用的搭配模型,并没有考虑个性化推荐;最近开始有一个研究个性化搭配推荐,但还是通过手动设计特征的方法;
而在推荐方面,开始应用深度学习的网络,但推荐的都是单独的物品,并没有尝试推荐搭配这样的做法;
- 度量学习,搭配的学习,类似于度量学习,设计中也是会学习任意两个单品之间的匹配性;
- learn to rank,排序问题
- 利用用户数据进行微调模型,那似乎就是每个用户训练得到一个模型,用户越多,模型也就越多,这还是有些问题;
- 加入用户数据,是否能很好学习到用户的个人信息,仅凭 FC 层的微调?
- 通用的搭配规则或者搭配常识,比如衬衫会选择牛仔裤进行搭配;
本文研究的问题类似于度量学习,度量学习需要学习的是物体间的距离,或者说是相似性,而搭配需要学会的是衣服之间的匹配性;
设计了三种网络结构,如下图所示。
第一种网络结构,输入的时候将一套搭配里的衣服图片在颜色通道上进行concat,得到的就是一个 w*h*9
的输入图片,然后输入 VGGNet 网络,提取特征,接着是 1 个 FC(全连接)层+ softmax,输出两个数值,表示喜欢和不喜欢的概率;
这个网络的特点就是将特征学习和匹配性衡量都集成在一起;
第二种网络结构,输入的时候并不会将搭配中的衣服图片 concat 起来,而是分别传入单独的 VGGNet 中,但每种衣服经过的网络都是相同的,也就是都被影射到共同的隐空间中,然后提取到的特征 concat 起来,后面跟着 3 个 FC 层 + softmax。
前两个网络的问题:
- 在获取高阶关系的时候会有困难;
- 造成数据空间的扩大(原始数据或者特征空间),这要求大量的训练样本,但实际上并没有足够数量的训练样本;
因此,第三种网络结构,特征提取部分和 FashionNet B 是一样的,但是之后则是将任意的两个衣服提取到的特征 concat,经过各自的匹配网络(3FC+softmax),匹配网络的数量就和搭配数量有关系了;不同的匹配网络应用于不同类型衣服对,比如上装-鞋子,上装-下装对等,匹配网络的结果会累加起来得到搭配的最终得分 s。
最终训练的网络结构如下图所示,
个性化搭配推荐不仅仅涉及到度量学习,还是是一个排序学习(learning-to-rank )问题,输入是正负样本对,分别输入一个 FashionNet ,网络输出的评分 s ,再采用 rank loss 计算 Loss。公式如下图所示:
![](/Users/luocai/Nutstore Files/Study-Notes/paper_reading/images/FashionNet/FashionNet_rank_loss.png)
采用两阶段训练策略的原因有:
- 每个用户的搭配数量是比较少的,特别是如果需要训练一个性能很好的神经网络;
- 很多用户的搭配都比较相似,这些相似的搭配数量并不少;
- 尽管每个用户的搭配审美都不完全相同,但还是存在很多通用的搭配尝试,比如衬衫通常都会搭配牛仔裤
基于以上的原因,选择两阶段训练网络的策略。
第一阶段的训练是学习一个通用的搭配网络模型,在这一步,会丢弃用户信息,将所有的搭配都混合在一起,然后训练网络。一个训练样本是正样本和负样本的搭配对,采用在 ImageNet 上预训练好的参数初始化 VGGNet,其他的网络层参数则是通过高斯分布进行初始化;
第二阶段是训练用户特定的模型(user-specific model)来进行个性化推荐。初始化是用第一步训练好的网络模型参数,接着使用每个用户的数据来微调网络。
对于上述的 3 种网络结构在第二阶段的微调,是这样设置的:
- FashionNet A 的微调是对整个网络都微调(特征提取和匹配网络);
- 对于 B 和 C 两个网络,有两种策略:
- 微调整个网络,特征提取网络和匹配网络都会有个性化的参数,也就是对不同的用户,同样的衣服会有不同的特征表示;
- 固定特征提取网络,仅微调匹配网络。这种做法会加快训练速度,实际应用中更多的微调都是这种做法。
三种网络结构的参数设置情况如下所示:
采用的 Polyvore 数据集,包含来自 800 个用户上传的搭配数据,每套搭配是三件衣服--上装、下装和鞋子,将 polyvore 作为正样本,负样本则是随机选择上装、下装和鞋子得到的搭配。
数据集分为训练集、验证集和测试集,在每个集合中,每个用户的正样本数量分别是 202,46 和 62,而负样本则是正样本的 6 倍,也就是 1212,276 和 372。
NDCG 评价标准,用来评价一个排序的列表,其公式如下所示,第 m 个位置的 NDCG 是:
NDCG 的最优数值是 1;
Mean NDCG 是 NDCG@m (m=1,....M,表示排序的长度)的均值;
最终采用的指标:
- mean NDCG:所有用户的 mean NDCG@m,也就是先计算不同m数值的NDCG,然后求平均,再除以用户数量;
- average of NDCG @m:所有用户的NDCG@m,不同m值的均值(仅除以用户数量)
- top-k 结果中正样本的数量(特定的 k 数量)
使用的框架是 Caffe,batch 为 30,epoch 是 18。
学习率的策略参考论文《Return of the devil in the details: Delving deep into convolutional nets》。
实验结果如下图所示:
上图中,Initial
是采用初始化参数的结果,也就是预训练模型的结果,Stage one
就是训练好第一阶段的模型,Stage two (partial)
和 Stage two(whole)
就是第二阶段的微调的两种策略,前者就是固定特征提取网络,微调匹配网络,后者就是整个网络都微调;Stage two(direct)
是不经过第一阶段的训练,直接微调网络的结果,应该就是直接用每个用户的数据来训练一个网络模型的结果。
通过实验结果的对比,可以得到这四个结论:
- FashionNet A vs B、C 前者是将特征提取和匹配计算都放在一个网络中,而后面两种网络是分开这两种功能,实验结果表明采用不同网络实现不同的功能,可以取得更好的性能;
- FashionNet B vs C 两个网络的区别是在匹配网络的设计,前者是仅设计了一个匹配网络,后者是任何两种不同类别的衣服的特征进行 concat 后,输入一个单独的匹配网络,实验结果是后者的效果更好,这表明将高阶关系分开成一系列成对组合是更佳的解决办法;
- 两阶段训练策略 对比第一阶段和第二阶段的结果,后者效果更好,这也说明微调是非常有用的技术;
- **
Stage two (partial)
vsStage two(whole)
** 实验结果表明后者的效果更好,这表明学习一个特定用户的特征表示对于推荐任务很有帮助,但这种策略的训练时间会更久,它需要重新计算所有衣服的特征,因此,实际应用会采用效果稍差的第一种方法,仅仅微调匹配网络。