我是靠谱客的博主 呆萌美女,最近开发中收集的这篇文章主要介绍推荐系统系列:AFM模型算法原理和代码实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、前言

发表于2017年的ijcai文章,主要采用了FM结合注意力机制进行物品的推荐,也取得了较好的效果;

论文地址为:https://www.ijcai.org/proceedings/2017/0435.pdf

二、算法原理

(1)首先介绍一下模型的整体框架对于因子分解的结果赋予一个权重,这个权重通过学习获得,来表示对不同特征交叉之间的关注度;

(2)整个模型可以通过如下公式来表述;其中包含一阶部分和有注意力机制的二阶部分;

(3)注意力部分的实现,下面是注意力机制实现的一种方式,叫做乘性注意力机制,具体实现可以参考代码,然后同通过一个softmax层,进行归一化之后得到一个权重;

(4)模型中采用的损失函数如下所示;

 

(5)模型的改进策略,查看过其他大佬的文章,由于二次项部分的特征交叉之后没有通过一个DNN层,可能没有更好的学习到更深层的交叉特征,所以可以添加一个DNN层,可能会得到一个更好的结果;

三、实验效果

实验对比了不同的模型的实验效果,如下图为原论文中的收敛效果示意图;

论文中说明了deepcross在这里边效果是最差的,分析了原因为可能是因为层数较深,模型复杂度高已经出现了过拟合的问题,

所以在有时候并不是模型深度越深效果就是越好的;

四、代码实现

代码实现部分只实现核心部分的注意力机制这块,其他部分需要自行补充;

from tensorflow.python.keras.layers import Layer
from tensorflow.python.keras.initializers import glorot_normal, Zeros
import tensorflow as tf
import itertools

class afm(Layer):
    def __init__(self, attention_size=4, seed=1024, **kwargs):
        self.seed = seed
        self.attention_size = attention_size
        super(afm, self).__init__(**kwargs)
        
    def build(self, input_shape):
        embed_size = input_shape[-1].value
        self.att_w = self.add_weight(name='att weights', shape=(embed_size, self.attention_size), initializer=glorot_normal(self.seed))
        self.att_b = self.add_weight(name='att bias', shape=(self.attention_size, ), initializer=Zeros())
        self.projection_h = self.add_weight(name='projection_h', shape=(self.attention_size, 1), initializer=glorot_normal(self.seed))
        self.projection_p = self.add_weight(name='projection_p', shape=(embed_size, 1), initializer=Zeros())
        self.tensordot = tf.keras.layers.Lambda(lambda x : tf.tensordot(x[0], x[1], axes=(-1, 0)))
        super(afm, self).build(input_shape)
        
    def call(self, inputs):
        embed_vec_list = inputs
        row = []
        col = []
        for r, w in itertools.combinations(embed_vec_list, 2):
            row.append(r)
            col.append(w)
        p = tf.concat(row, axis=1)
        q = tf.concat(col, axis=1)
        inner_product = p * q
        att_tmp = tf.nn.relu(tf.nn.bias_add(tf.tensordot(inner_product, self.att_w, axes=(-1, 0)), self.att_b))
        self.att_normalized = tf.nn.softmax(tf.tensordot(att_tmp, self.projection_h, axes=[-1, 0]), dim=1)
        att_output = tf.reduce_sum(self.att_normalized * inner_product, axis=1)
        att_output = tf.keras.layers.Dropout(0.2, seed=self.seed)
        afm_out = tf.tensordot(att_output, self.projection_p)
        return afm_out

 

最后

以上就是呆萌美女为你收集整理的推荐系统系列:AFM模型算法原理和代码实现的全部内容,希望文章能够帮你解决推荐系统系列:AFM模型算法原理和代码实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部