text: 这个系列介绍了在深度学习的大背景下，推荐系统领域所发生的翻天覆地的变化。从召回和排序模型串讲开始，结合论文总结与工程实践，并充分记录了作者在实际工作中所总结的各种经验总结。
  一个推荐系统的架构其实并不复杂，基本上就是召回，排序，规则三个部分。
  召回模型负责根据用户和场景特征，从众多的内容通道中抓取用户可能感兴趣的内容，召回模型可能是多通道并行的，通道与通道之间互不影响。召回模型也叫做触发模型。
  规则部分则是对模型的补充。在实践中主要起到两个方面的作用，
  处理系统对于多样性，实效性等的个性化需求。
  应对一些特殊的，紧急的需求，做hardcode.
  模型很容易理解，首先，我们将Query和Doc词向量（onehot）转化为embedding向量，这里，针对英文输入，原论文中提出了一种特殊的embedding方法，用来显着降低embedding字典规模，称为wordhashing，但是中文中这种方式不是很适用，我们在中文embedding时，使用传统的方式进行embedding即可（wordhashing方法会在下一部分详细介绍）
  经过embedding后的词向量，会喂给DNN进行多层projection，与绝大多数nlp问题一致，我们选择tanh激活函数。之后，Query和Doc向量会进行一次cos相似度计算，得到R(Q,Dn),各个R(Q,Dn)通过softmax归一化后得到最终的指标P(Dn|Q).
  在实际的训练中，我们提出一种类似word2vecnegativesampling的负采样方式进行训练。在每一次迭代中，我们都选取一个正样本和四个负样本，最后的loss计算中，我们取负采样交叉商，P(D+|Q)取正loss，P(D-|Q)取负loss，如下图:
  将不同的对象映射到同一个语义空间中，利用该语义空间中的距离计算相似度。
  在排序学习中，在可变结构中添加pairwiserank损失，变成一个排序模型（具体查看我的另一篇文章：推荐系统与CTR预估（三）:LTR排序模型）
  我们得到了若干个互不相关的user模型，这既浪费空间，又影响性能。
  不同view之间的数据存在的某种联系被我们完全忽略了。
  首先，我们需要构造合适的数据集。我们实际构造的向量是一个(user,itemview)二元对，它包含一个用户点击的itemview及其对应的user信息。在训练时，被选中的itemview进行embedding，其他itemview全部用0向量填充。我们希望优化的目标是，所有P(Item|User)之和最小。其公式如下：
  值得注意的是，理论上说我们可以选择任意的(user,itemview)数据对作为训练样本，但是为了简便，我们通常选择同一个用户集的不同itemview数据进行训练，这样的好处在于：
  一定程度上，抑制user模型大幅震荡，帮助user模型收敛。
  在特征和数据选择上，论文中提出了多种特征降维的方法，比如LSH(LocalsensitiveHashing),Kmeans特征聚类，top1%特征抓取等，在工程实践中，由于我们在之前的LR系统中已经积累了相当的特征工程经验，我们没有采用这些方法，而是复用LR特征，并通过单特征CTR评估法对大量特征进行了复评。
  在数据选择上，我们遵从了论文介绍的方法，对用户集中的每一个user，都逐一筛选了每一个view中的一组数据（实际上，我们只训练了资讯和短视频两组view，这是我们的业务所决定的），并搭配4组（随机选择的）负采样数据。这里，论文中正负采用数据为1:9，我们选择了1:4，原因在于：
  最后，我们仿照论文采用了以下两个重要指标作为评测标准：
  在1：4的训练集中，模型按P(Item|User)将数据排序后，正样本所在位置在全数据集中的平均值。
  在1：4的训练集中，模型按P(Item|User)将数据排序后，正样本排在首位的比例。
  这两个数据指标相互补充，MRR衡量模型排序的平均水平。P@1衡量模型完全正确的优秀率。二者的trade-off在于：
  我们既希望有更多的数据被正确的放在第一位，同时也需要考虑，即使不在第一位，至少排在前三位的概率。
  只有一个UserModel，既节省了空间，同时，也定义了一个更准确的UserModel.（该UserModel是否可以在其他场景复用，是我们计划去测试的一个重要课题）
  这里也引入了另一个问题，就是到底应该一个一个view单独训练，还是将所有view混合训练。从我们的测试情况来看，在模型初期训练时，usermodel还不稳定，这是最好是多个view的数据随机混合训练（增加usermodel对不同view数据的鲁棒性）。当usermodel逐渐稳定后，可以一个一个view单独添加，并不会对模型产生较大影响。（这个问题目前我们还研究的不是很透彻，具体分析可能之后我会再重新深入研究）
  通过共享部分参数，帮助新模型快速收敛。同时，增加共享部分对于复杂数据的鲁棒性。
  数据受限，可能导致数据不充分。
  需要每隔一段时间就重新训练模型，这是非常昂贵的。
  仍然不能很好的解决冷启动问题。
  目前的资讯和视频系统对用户短期兴趣变化的捕捉需求不大。
  另外，Youtube的这篇文章，有很多的工程经验也非常值得参考，有兴趣的朋友可以自行详细阅读。
  如上图，YoutubeDNN的思路可以说是传统协同过滤思路的之间衍化。在传统的协调过滤中，我们强调:
  相似的用户喜欢的物品也相似。
  喜欢A商品的用户，可能也喜欢和A商品相似的其他商品。
  这里，我们实际上是构造了两个向量空间，用户空间和商品空间，我们在任意一个向量空间中找到相似性，再根据这种相似性进行推荐。
  YoutubeDNN在此基础上，做了一下两个重要的改变：
  用一个深度网络对该空间中的向量进行映射，一方面是通过各种映射降低向量的维度，减少最后一步求相似的计算量；另一方面，深度网络同时也是一个高阶特征提取的过程，理论上，我们应该能发现更高阶的用户相似性，作出更准确的判断。
  所有的item向量均通过embedding的方式映射到维度相同的空间中，同一类型的item向量通过average整合成一个向量。
  在训练阶段，我们同样采取正负样本法，去优化所有正样本的概率之和。目标方程如下：
  在应用阶段，我们则通过id找到用户在该向量空间中的对应（item，user）向量，并通过KNN等方式找到附近的（item，user向量），从而完成item召回。
  下一节我们将介绍最基本的DNN排序模型。
  最后，User和Item的特征选择及自动选择特征的FM系列模型，将从第四节开始介绍。