导读:上篇文章推荐算法|FM模型原理简介中我们介绍了FM模型原理,本次我们通过python进行实例展示。为了提升模型性能,本次代码同步引入加入L2正则及Adagrad。
1
概念回顾
我们首先来回顾一下梯度下降法、Adagrad的概念。
假设损失函数为:
则对于每个参数其梯度表达式为:
进而得到参数的更新函数:
其中alpha为学习率。
梯度下降中有学习率参数,合适的学习率会影响模型训练效率及准确性。Adagrad的核心思想就是随着迭代次数增加,让学习率变小。加入后,参数的迭代变为:
其中
为初始学习率,g为参数对应的梯度。
2
代码逻辑
本例中我们通过梯度下降来训练一个二分类FM模型。
对于二分类问题,我们取logit作为损失函数:
我们的目标就是使得上述损失函数最小的最优化问题。假设共有N个参数,并且在损失函数中加入L2正则以减少过拟合,则最优化问题变为:
在FM模型中,参数的梯度为:
其中
根据Adagrad更新学习率,就得到最终计算方法。整个过程伪代码如下:
3
python实现
此处仅展示核心代码,获得完整代码方法在文末。
def FM_function_L2_Adagrad(dataMatrix, classLabels, k, iter):
lamda = 1 #正则化参数
m, n = shape(dataMatrix)
alpha = 1
#1、初始化参数
w = zeros((n, 1))
w_0 = 0.
v = normalvariate(0, 0.2) * ones((n, k))
w0_ada = 1.
w_ada = 1.
v_ada = 1.
w0_grad = 0.
w_grad = 0.
v_grad = 0.
alpha_w0 = alpha
alpha_w = alpha
alpha_v = alpha
#2、训练
for it in range(iter):
for x in range(m):
inter_1 = dataMatrix[x] * v
inter_2 = multiply(dataMatrix[x], dataMatrix[x]) * multiply(v, v)
#完成交叉项
interaction = sum(multiply(inter_1, inter_1) - inter_2) / 2.
p = w_0 + dataMatrix[x] * w + interaction
loss = classLabels[x] * p[0, 0] - 1
#加入adagrad
w0_grad += (loss* classLabels[x] +w_0*lamda) ** 2
w_0 -= alpha_w0 * (loss* classLabels[x] *+w_0*lamda)
for i in range(n):
if dataMatrix[x, i] != 0:
#加入adagrad
w_grad += (loss* classLabels[x] +w[i, 0]*lamda) ** 2
w[i, 0] -= alpha_w * (loss* classLabels[x] * dataMatrix[x, i] + w[i, 0]*lamda)
for j in range(k):
#加入adagrad
v_grad += (loss * classLabels[x]* (dataMatrix[x, i] * inter_1[0, j] - v[i, j] * dataMatrix[x, i] * dataMatrix[x, i]) + v[i, j]*lamda) ** 2
v[i, j] -= alpha_v * (loss *classLabels[x] * (dataMatrix[x, i] * inter_1[0, j] - v[i, j] * dataMatrix[x, i] * dataMatrix[x, i]) + v[i, j]*lamda)
w0_ada = np.sqrt(w0_grad)
w_ada = np.sqrt(w_grad)
v_ada = np.sqrt(v_grad)
alpha_w0 = alpha/w0_ada
alpha_w = alpha/w_ada
alpha_v = alpha/v_ada
return w_0, w, v
后台回复“FM”可获得相关材料