帮助自己理解FM算法的一些小点

我一开始接触FM算法,看的是文章:

https://www.cnblogs.com/wkang/p/9588360.html

这篇文章,已经写的接近完美,我感觉已经没有必要把别人写的很完美的东西,再重新整理一遍,我现在做的工作,是把某些点写的更细致一些,便于我下次瞬间看明白它,同时再加上我自己的一点感悟

1、我自己理解的,FM算法的核心如下:

假如一个样本有n个特征,那么针对任意两个特征生成一个交叉项,将会出现C^2_n=\frac{1}{2}n(n-1)个参数,参数复杂度就是o(n^2),但是如果只是针对每一个特征,存在一个隐向量v,每个隐向量的维度是k,我们用隐向量的乘积作为交叉项的参数,可以将向量的每一个维度作为参数,那么参数的个数就是k*n,复杂度就是o(n),特别对于样本的特征很多,再加之特征进行离散化和one-hot编码处理,特征就更多了,那么参数复杂度就非常高了啊,所以FM算法,一下子就把参数复杂度降下来了,使基于交叉项的这种算法,变得可行。

2、这篇文章一开始并没有说,一个特征对应一个隐向量,所以乍一看,会有些费劲,我是看了文章

https://blog.csdn.net/g11d111/article/details/77430095   才知道的。

3、5.1 寻找交叉项是整个FM算法的核心,虽然只看结论,后面的也都能看懂

3、对于5.4,我觉得有几处不对:

a、iter_2不用再平方了

b、对于python 代码 np.multiply(i),实际是会报错的,应该是 np.multiply(i, i),表示i矩阵和i矩阵对应位相乘

我知道作者只是笔误,因为后面作者贴出来的源代码已经证明了这一切,我写出来,是怕时间长了,忘记,然后在这里耗时间,现在粘贴出来作者的这部分源码:

# xi·vi,xi与vi的矩阵点积
inter_1 = dataMatrix[x] * v
# xi与xi的对应位置乘积   与   xi^2与vi^2对应位置的乘积    的点积
inter_2 = multiply(dataMatrix[x], dataMatrix[x]) * multiply(v, v)  # multiply对应元素相乘
# 完成交叉项,xi*vi*xi*vi - xi^2*vi^2
interaction = sum(multiply(inter_1, inter_1) - inter_2) / 2

我自己写的伪代码如下,比较简洁

import numpy as np
#类似于神经网络的正向传播
iter_1=i.V
result_1=np.multiply(iter_1, iter_1)
iter_2=np.multiply(i, i).np.multiply(V, V)
1/2(np.sum(result_1-iter_2))

注意,这里面i是单样本,是行向量,扩展成多样本,只需要对i进行竖向堆叠就可以了

4、坦白的讲,第6节,二分类那里,\hat{y}^{(i)}的取值应该是取+1和-1吧,但我一般不习惯这么写,所以我按照自己的习惯写交叉熵损失,其中x和i是一样的,都表示单个样本,是行向量,关于导数的一些符号是按照吴恩达老师,深度学习里面的符号格式写的

-------------Single Sample Matrix--------------\\ z=\mathbf{\theta}^\mathrm{T}x+\frac{1}{2}np.sum((x.V)^2-x^2.V^2)\\ \hat{y}=\sigma(z)=\frac{1}{1+e^{-z}}\\ L(y,\hat{y})=-(yln\hat{y}+(1-yln(1-\hat{y})\\

这个是单个样本的FM算法的正向传播,而且只需要将x样本竖向堆叠,就可以一次性,算出一批样本的\hat y值,因为文中已经给出了对单个v_{if}的梯度下降,然后我试图给出所有的v_{if}的梯度下降,然后再进一步写多样本的,多样本的,我放弃了,感觉写不出来矩阵形式,下面是对单个样本的v_{if}的梯度下降的矩阵形式

d_{\hat{y}}=\frac{1-y}{1-\hat{y}}-\frac{y}{\hat{y}}\\ d_z=d_{\hat{y}}.\frac{d_{\hat{y}}}{d_z}=\hat{y}-y\\ d_V=d_z.\frac{d_z}{d_V}=(\hat{y}-y)\times(x^T.(x.V)-{(x^2)}^T\times V)\\

\times是按位相乘,可能会用到python广播,然后重点解释下\frac{d_z}{d_V},我以每个样本3个特征为例:

\frac{d_z}{d_V}=(x^T.(x.V)-{(x^2)}^T\times V)\\ =( \left\{ \begin{matrix} x_1\\ x_2\\ x_3 \end{matrix} \right\} . (\left\{ \begin{matrix} x_1 & x_2 & x_3\\ \end{matrix} \right\}. \left\{ \begin{matrix} v_{11} & v_{12} & v_{13}\\ v_{21} & v_{22} & v_{23}\\ v_{31} & v_{32} & v_{33}\\ \end{matrix} \right\})- \left\{ \begin{matrix} x_1^2\\ x_2^2\\ x_3^2 \end{matrix} \right\} \times \left\{ \begin{matrix} v_{11} & v_{12} & v_{13}\\ v_{21} & v_{22} & v_{23}\\ v_{31} & v_{32} & v_{33}\\ \end{matrix} \right\})

= (\left\{ \begin{matrix} x_1\\ x_2\\ x_3 \end{matrix} \right\}. \left\{ \begin{matrix} \sum\limits_{i=1}^{3}v_{i1}x_i & \sum\limits_{i=1}^{3}v_{i2}x_i & \sum\limits_{i=1}^{3}v_{i3}x_i\\ \end{matrix} \right\}- \left\{ \begin{matrix} x_1^2v_{11} & x_1^2v_{12} & x_1^2v_{13}\\ x_2^2v_{21} & x_2^2v_{22} & x_2^2v_{23}\\ x_3^2v_{31} & x_3^2v_{32} & x_3^2v_{33}\\ \end{matrix} \right\}))\\ =\left\{ \begin{matrix} x_1\sum\limits_{i=1}^{3}v_{i1}x_i & x_1\sum\limits_{i=1}^{3}v_{i2}x_i & x_1\sum\limits_{i=1}^{3}v_{i3}x_i\\ x_2\sum\limits_{i=1}^{3}v_{i1}x_i & x_2\sum\limits_{i=1}^{3}v_{i2}x_i & x_2\sum\limits_{i=1}^{3}v_{i3}x_i\\ x_3\sum\limits_{i=1}^{3}v_{i1}x_i & x_3\sum\limits_{i=1}^{3}v_{i2}x_i & x_3\sum\limits_{i=1}^{3}v_{i3}x_i\\ \end{matrix} \right\}- \left\{ \begin{matrix} x_1^2v_{11} & x_1^2v_{12} & x_1^2v_{13}\\ x_2^2v_{21} & x_2^2v_{22} & x_2^2v_{23}\\ x_3^2v_{31} & x_3^2v_{32} & x_3^2v_{33}\\ \end{matrix} \right\}

= \left\{ \begin{matrix} x_1\sum\limits_{i=1}^{3}v_{i1}x_i-x_1^2v_{11} & x_1\sum\limits_{i=1}^{3}v_{i2}x_i-x_1^2v_{12} & x_1\sum\limits_{i=1}^{3}v_{i3}x_i-x_1^2v_{13}\\ x_2\sum\limits_{i=1}^{3}v_{i1}x_i-x_2^2v_{21} & x_2\sum\limits_{i=1}^{3}v_{i2}x_i-x_2^2v_{22} & x_2\sum\limits_{i=1}^{3}v_{i3}x_i-x_2^2v_{23}\\ x_3\sum\limits_{i=1}^{3}v_{i1}x_i-x_3^2v_{31} & x_3\sum\limits_{i=1}^{3}v_{i2}x_i-x_3^2v_{32} & x_3\sum\limits_{i=1}^{3}v_{i3}x_i-x_3^2v_{33}\\ \end{matrix} \right\} \\= \left\{ \begin{matrix} \frac{d_z}{d_{v_{11}}} & \frac{d_z}{d_{v_{12}}} & \frac{d_z}{d_{v_{13}}}\\ \frac{d_z}{d_{v_{21}}} & \frac{d_z}{d_{v_{22}}} & \frac{d_z}{d_{v_{23}}}\\ \frac{d_z}{d_{v_{31}}} & \frac{d_z}{d_{v_{32}}} & \frac{d_z}{d_{v_{33}}} \end{matrix} \right\}

以上就是,对单个样本v_{if}梯度下降 矩阵化的全过程,这个都是我看完文章之后,延伸出来的一些东西,或许还有更好的矩阵化方法,甚至可以实现多样本的梯度下降,就像逻辑回归一样,现在先这样了,有空了再把作者写的FM源码看一下,哈哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值