从这里,书上就引出了什么是泛化能力,什么是记忆能力,由此来引出Wide & Deeo 模型,这个模型就是结合同时两个能力都有,然后后面再改进一下,把Wide改一下变成Cross & Deep模型。使得模型不仅能够快速处理并记忆大量的历史行为特征,并且具有强大的表达能力
1. 泛化能力 和 记忆能力
记忆能力被理解为模型直接学习并利用历史数据中物品和特征的“共现频率”的能力。 就像协同过滤一样,模型非常简单, 原始数据可以直接影响推荐结果,产生类似于“如果点击A,就推荐B”的现象,也就是模型直接记住了历史数据的分布,根据历史数据的特性来进行推荐
以谷歌APP推荐场景为例理解一下:
假设在Google Play推荐模型训练过程中, 设置如下组合特征: AND(user_installed_app=netflix, impression_app=pandora), 它代表了用户安装了netflix这款应用, 而且曾在应用商店中看到过pandora这款应用。 如果以“最终是否安装pandora”为标签,可以轻而易举的统计netfilx&pandora这个特征与安装pandora标签之间的共现频率。比如二者的共现频率高达10%, 那么在设计模型的时候, 就希望模型只要发现这一特征,就推荐pandora这款应用(像一个深刻记忆点一样印在脑海), 这就是所谓的“记忆能力”。
像逻辑回归这样的模型, 发现这样的强特, 就会加大权重, 对这种特征直接记忆。
但是对于神经网络这样的模型来说, 特征会被多层处理, 不断与其他特征进行交叉, 因此模型这个强特记忆反而没有简单模型的深刻。
泛化能力 就是被理解为模型传递特征的相关性, 以及发掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力。例如矩阵分解的时候引入了隐向量,还有Embedding,是的数据稀少的用户或者物品也成隐向量从而获得由数据支撑的推荐得分。还有就是神经网络通过特征的多次自动组合,可以深度发掘数据中的潜在模式,即使是非常稀疏的特征向量输入,也能获得较稳定平滑的推荐概率。
2. Wide & Deep 模型
WD模型把单输入层的Wide部分由 Embedding层和多隐层组成的Deep部分组成起来, 一起输入最终的输出层得到预测结果。
单层的wide层善于处理大量的稀疏的id类特征,Deep部分利用深层的特征交叉, 挖掘在特征背后的数据模式。
最终, 利用逻辑回归, 输出层部分将Wide和Deep组合起来, 形成统一的模型。
3. Wide的部分
Wide部分就是一个简单的模型,用来记忆用户行为特征中的信息,并根据此类信息直接影响推荐结果。有什么是用户行为特征呢?例如用户点了喜欢的商品,用户已经安装的应用,还有当前推荐给用户的应用类表,这些都是直接和用户强相关的,也就是我们通过这个Wide部分去处理,提取这里面用户最喜欢的出来,然后利用Wide框架的特点,就是记忆力强,让模型直接粗暴地记住用户是喜欢啥的
wide模型是一个线性模型,x就是输入特征,它接受多个特征进行处理,有的是原始特征,有的是离散的id类特征,有的是经过处理后的特征,其中有一个处理比较重要,称为交叉积变换:
, 其中 的取值要么是0,要么是1
cki是一个布尔量,当第i哥特征属于第k个组合时,cki的值等于1,否则等于0(例如“性别=女”且“语言=英语”时,AND(性别=女,语言=英语)=1,其他情况均为0,这捕获了二元特征之间的相互作用,并为广义线性模型增加了非线性特征。
(这里我看到别的博客是写了在联合训练的时候采用的优化器,和强哥这里写的好像有一点出入,等考完期末考我回来考古一下)对于wide部分训练时候使用的优化器是带正则的FTRL算法(Follow-the-regularized-leader),我们可以把FTRL当作一个稀疏性很好,精度又不错的随机梯度下降方法, 该算法是非常注重模型稀疏性质的。
也就是说W&D模型采用L1 FTRL是想让Wide部分变得更加的稀疏,即Wide部分的大部分参数都为0,这就大大压缩了模型权重及特征向量的维度。Wide部分模型训练完之后留下来的特征都是非常重要的,那么模型的“记忆能力”就可以理解为发现"直接的",“暴力的”,“显然的”关联规则的能力。
这里再补充一点上面wide部分使用FTRL算法的原因, 也就是为啥这边要注重模型稀疏性质的原因, 上面的压缩模型权重,减少服务的时候存储压力是其一, 还有一个是来自工业上的经验, 就是对模型的实时更新更加有利, 能够在实时更新的时候, 尽量的加大实时的那部分数据对于参数更新的响应速度,不至于用实时数据更新好久也没有更新动原来的大模型。毕竟它注重稀疏性质,一旦察觉到新来的这部分数据某些特征变了, 就立即加大权重或者直接置为0, 这样就能只记住实时数据的关键特征了, 使得模型能够更好的实时服务。 deep端的这种普通梯度下降的方式是不行的,这种都是一般使用类似L2正则的方式, 更新参数的时候尽量的慢慢减小所有的w参数, 更新起来是会很慢的, 不太能反应实时变化。 像FTRL这种, 用的类似于L1正则的方式, 这俩的区别是显然的了。(这里是用强哥的笔记,太贴合实际情况了,但是自己还没有实战经验,写抄录下来后面复习有用)
4. Deep的部分
书上的介绍十分简单,就是一句经过Embedding层转换特征,然后再将它们给拼接起来,再依次过三遍Relu全链接层,最终和wide部分一起输出到 LogLoss 输出层。
其中输入的特征有两类,一种是 数值型特征,一种是 类别型特征,随着我们加深Deep的层数,模型的泛化能力回越好,其中用的优化器是AdaGrad。
5. Wide & Deep
书上的原话,拿到了 Deep和Wide的输出后,一同参与最后的目标拟合。这里的意思是两部分输出的结果联合一起训练,将两部分的输出重新使用一个逻辑回归模型做最终的预测,也就是两部分结果乘一个权重后再相加,最后再做一个sigmod。
6. Deep & Cross
这个网络结构是在WD模型的基础上进行改良的,作者用一个Cross网络替代原来的Wide部分
从上图我们可以看到一个大致的流程,稠密的特征铺平了,然后将稀疏的特征用Embedding进行转换,稠密的特征一块铺平了。这才是真正的输入。
其中:, 是EMbedding矩阵里面, 肯定是就是OneHot编码了,然后 是第个i个的embedding向量 ,这里需要在补充一下Embedding究竟是怎么玩的文章才行。
7. Cross 网络
书上给出的原话,Cross网络的目的就是增加特征之间的交互力度,使用多层交叉曾对输入向量进行特征交叉,假设第L层交叉层的输出向量为,那么第L+1层的输出向量就是:
前面的一部分有点像PNN的外积操作呀,才此基础上增加了外积操作的权重向量,以及原输入向量 和 bias向量。其中 就是初始值哈!
可以看出,交叉层在增加参数方面还是比较“克制”的,每一层增加了一个n维的权重向量而已,并且在每一层均包保留了输入向量,因此输出和输入之间的变化不会特别明显,由多层交叉网络组成的Cross网络在WD模型中的Wide部分的基础上进行特征的自动化及哦啊差,避免了更多人工特征组合,使得模型由更强的非线性学习能力。
8. Deep
Deep的部分没有动:三层Relu
9. 输出
训练完Cross和Deep后,就把结果也给摊平了(图上的),然后这个stack再走一遍全连接,最后通过sigmod去激活,最后用交叉熵损失函数去做损失函数
以上就是Cross&Deep网络了,融合了传统模型的记忆能力和深度学习模型的泛化能力,可以线上修改,并且也应该比较能够快速收到反馈