推荐系统学习笔记

将自己有疑惑的地方记录下来,做个笔记,如果有理解有误的地方,希望大家能帮忙指出,感谢 :heartbeat:

1赞

关于embedding的理解:embedding其实是对特征的向量表达形式,它由一个维度的空间向另一个维度空间映射得到,这个映射关系可以是高维向低维进行映射,也可以是低维向高维映射,在推荐中通常做的是降维处理,作用之一是为了解决one-hot编码带来的空间占有率大的问题,解决了其矩阵的稀疏性,使矩阵变得更加稠密,我们通过映射得到的emebdding向量用余弦相似度的方法就可以计算出两个或者多个特征之间的相似性,从而就得到了相似性矩阵。

关于特征交叉的理解:特征交叉本质上是特征组合,用于将两个或多个特征通过相乘,求次方等运算进行交叉,得到新的有价值的特征,比如电商中的性别和日期做交叉,我们把性别为女和日期为双11进行交叉得到新特征。再比如新闻推荐中职业和主题做交叉,我们可以把职业为人工智能算法工程师和深度学习主题做交叉得到新特征。这些交叉后得到的新特征就可以帮助我们更好的做推荐了。

疑问1:什么是深度交叉?如何做深度交叉?
个人理解:随着网络层数不断增加,输入特征通过残差层不断进行特征映射的过程视为深度交叉

疑问2:随着神经网络层数增加,模型拟合效果可能不如浅层网络,是因为过拟合还是因为难以拟合恒等映射导致的网络退化,或是其他的原因?
现在看来网络退化的原因不是因为过拟合,因为过拟合会使得训练中的loss不断降低,但是网络退化的时候loss值发生了反弹,很有可能是因为在这期间发生了梯度消失或者是梯度爆炸导致的网络退化,原因还有待探索。
解决方法:引入残差网络

随着网络层数增加,会发生梯度消失或者梯度爆炸,这是由于反向传播中对sigmoid函数的链式求导造成的,解决方法可以将激活函数换成relu。因为relu导数在参数大于零时,导数为1,小于等于0时,为0,很好的控制了梯度消失和梯度爆炸。

对于前向传播和反向传播的理解:
因为传统的优化损失函数的方法都是需要求出损失函数中要优化参数的梯度,然后将这个梯度放入优化器中去优化,对于机器学习模型来说,因为其节点少,参数不多,我们通常用的手段就是梯度下降来优化,但是对于深度学习来说,深层神经网络的参数非常多,随着层数的加深,参数是以指数级的速度增长的,这就给我们计算偏导数带来了极大的挑战,试想,如果有上亿个参数,那么前向传播中每一个样本进行梯度下降就需要计算上亿个参数的偏导数,这非常消耗资源和时间,这个时候反向传播登场了,传统梯度下降是对每一个参数计算偏导数(计算一次梯度(偏导数)),计算一次偏导数就进行一次前向传播,就更新一次参数,进行一次梯度下降就需要计算上亿个参数的梯度(运行上亿次前向传播),这是非常恐怖的,而反向传播恰恰是解决了这个难题,反向传播能一次性的计算出所有参数的梯度(偏导数),这就相当于加速了上亿倍,效率极大的提高了。反向传播是根据链式求导法则来进行的,一次反向传播计算出所有参数的梯度后,交给优化器去更新参数。

疑惑3:在网络中增加层数为何要拟合成恒等映射?


个人理解:是为降低训练误差,增加层的目的是为了尽可能的拟合我们的目标值,学到更多有效的信息(特征)。

为什么要用残差网络?
个人理解:普通的深层神经网络要拟合的是诸如f(x)=x这样的恒等映射,使k层的准确率达到饱和,去接近目标值,而因为存在了梯度消失和梯度爆炸这样的现象,使得我们难以去拟合恒等映射,这个时候就要用到残差网络的思想,残差网络是由很多残差单元组成,每一个残差单元都是一个跳跃连接(shortcut connections,skip connections),它要去拟合的是一个残差映射,即h(x) =f(x)-x,我们的目标是拟合h(x)=0这一映射。这比拟合f(x) =x这样的恒等映射要容易的多。