深度学习系列:阿里DIN模型的原理和代码实现

2023-11-11

一、前言

今天介绍阿里巴巴的DIN网络,不得不说,阿里妈妈的大佬是真的多,经常都会更新非常多的创造性的东西,比如DIN中使用的自适应正则化技术以及Dice激活函数以及注意力机制的使用,并且值得注意的是DIN网络中使用的注意力机制还挺多的,哈哈哈,下面就来介绍一下阿里妈妈推荐部门大佬们的主要工作吧;

论文地址:https://arxiv.org/abs/1706.06978

代码地址:https://github.com/zhougr1993/DeepInterestNetwork

二、算法原理

(1)深度兴趣网络主要考虑到用户兴趣的变化性,用户当前的兴趣可能只和历史信息中的一部分有关,并且考虑了用户兴趣的广泛性,比如一位用户浏览了运动类食品类书籍类的物品,那么这几类之间的关系就不是很大了,为了解决这类似的问题就提出了DIN网络;

(2)下图介绍了阿里推荐的流程:采集用户历史行为信息;通过matching获得候选广告;排序ranking得到每个广告的概率进行排序;记录用户在当前广告下点击与否作为标签;

模型的整体框架如下:先看一个basemodel吧,basemodel就是将用户特征,进行sum pooling输入给全连接层,和sigmoid函数得到一个输出的结果;

阿里巴巴的模型则是,利用注意力机制对用户的兴趣进行进行一个加权最后再使用一个sum pooling;

其中,va代表的是候选广告的嵌入向量,ej是用户历史中的兴趣;通过注意力机制来表示用户对于不同历史信息中的关注的重点部分;

 

(3)采用的特征:包括用户信息,用户行为信息,商品信息等等;其中包含了很多多值离散特征,多值离散特征就下一篇文章介绍一下怎处理吧;

(4)Dice函数(Data Adaptive Activation Function)是根据Pleakyrelu激活函数演化而来的,它的分割点不是严格的零点,而是根据数据来进行变化的,两者图像如下图所示;

    Dice函数的公式如下所示,其中sigmoid函数中e的指数其实就是批量归一化算法;

(5)自适应正则:在实际的用户数据中,会出现部分用户feature id出现频率很高从而导致噪声的增加,这对训练的结果也是有很大影响的,所以自适应正则的目的就是解决这个问题,方法就是根据用户feature id的出现频次来决定正则化的强度;

根据论文中的公式:公式(4)代表L2正则化,其中D代表embedding的维度,K代表整个特征空间数量,I代表是否x中有特征id j,n_{j}代表特征id j出现的频次;如果n_{j}越小那么正则权重就越大,相应的就达到了将正则强度加大的目的,如果n_{j}越小那么结果则反之,随后的表示则如图中所示;

(6)测试指标:如下是推荐系统中常用的评价指标,

改进后的评价指标公式如下图所示,

经过测试可以得知,第二种评价指标更符合要求一点;

三、算法效果

论文比较了在不同数据集上模型的表现,模型的测试结果如下图所示;

四、代码实现

代码实现部分,只实现了dice函数和注意力机制的部分;

(1)Dice函数实现部分,代码严格按照论文中公式实现;

import tensorflow as tf
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.initializers import Zeros
from tensorflow.python.keras.layers import Layer, BatchNormalization
class Dice(Layer):
    def __init__(self, axis=-1, epsilon=1e-9, **kwargs):
        self.axis = axis
        self.epsilon = epsilon
        super(Dice, self).__init__(**kwargs)
        
    def build(self, inputs_shape, **kwargs):
        self.bn = BatchNormalization(self.axis, self.epsilon)
        self.alphas = self.add_weight(name='dice_bias', shape=(inputs_shape[-1], ), initializer=Zeros(), dtype=tf.float32)
        super(Dice, self).build(inputs_shape)
        
    def call(self, inputs, **kwargs):
        bn_inputs = self.bn(inputs)
        p = tf.sigmoid(bn_inputs)
        return self.alphas * (1 - p) * inputs + p * inputs

(2)如下是din中attention部分

import tensorflow as tf
from tensorflow.python.keras import backend as K

class din_att(Layer):
    def __init__(self, **kwargs):
        super(din_att, self).__init__(**kwargs)
    
    def call(self, inputs, **kwargs):
        query, keys, keys_len= inputs#(batch, 1, embed_size), (batch, T, embed_size), (batch)中的值其实是T;
        keys_len = keys.get_shape()[1]
        
        querys = K.repeat_elements(query, keys_len, axis=1)
        #din中原始代码的实现方法;
        atten_input = tf.concat([querys, keys, querys - keys, querys * keys], axis=-1)#(batch, T, 4 * embed_size)
        #经过三层全连接层;
        dnn1 = tf.layers.dense(atten_input, 80, activation=tf.nn.sigmoid, name='dnn1')
        dnn2 = tf.layers.dense(dnn1, 40, activation=tf.nn.sigmoid, name='dnn2')
        dnn3 = tf.layers.dense(dnn2, 1, activation=None, name='dnn3')#(batch, T, 1)
        
        outputs = tf.transpose(dnn3, (0, 2, 1))#(batch, 1, T)
        
        #mask
        keys_mask = tf.sequence_mask(keys_len, tf.shape(keys)[1])#(batch, T), bool;
        keys_mask = tf.expand_dims(keys_mask, axis=1)#(batch, 1, T)
        padding = tf.ones_like(outputs) * (-2 ** 32 + 1)#(batch, 1, T)
        outputs = tf.where(keys_mask, outputs, padding)#the position of padding is set as a small num;
        
        #scale
        outputs = outputs / (tf.shape(keys)[-1] ** 0.5)
        outputs = tf.nn.softmax(outputs)#(batch, 1, T)
        
        #weighted sum_pooling
        outputs = tf.matmul(outputs, keys) #(batch, 1, embedding)
        return outputs

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习系列:阿里DIN模型的原理和代码实现 的相关文章

  • 本机如何传文件到VMware 中

    本机传文件到VMware 中可以使用2种方法 1 安装tools 直接拖拽过去 2 实现文件共享 在VMware中没有安装解压文件的应用时 使用tools会不再适用 这时可以选择共享文件夹的方式 直接在本机解压文件 共享文件夹到VMware
  • C#中的Dispose模式

    声明 本文中的内容属于个人总结整理而来 个人水平有限 对于部分细节难免有理解错误及遗漏之处 如果您在阅读过程中有所发现 希望您能指正 同时文章中的部分内容也参考了其它大神的文章 如果文章中的内容侵犯了您的权益 表示非常歉意 请您指出 我将尽
  • C++职工管理系统

    C 演讲比赛流程管理系统 1 职工管理系统的需求 2 功能实现 2 1 创建管理类 2 2退出功能 2 3增加联系人信息 2 4显示职工信息 2 5删除离职职工 2 6修改职工信息 2 7查找职工信息 2 8按照编号排序 2 9清空所有文档
  • access建立er图_5G SA注册流程(2)- RRC连接建立

    导读 在正式讨论SA注册的相关NAS流程之前 笔者觉得有必要先讨论下SA下的RRC连接的建立流程 毕竟这是终端与网络交互的连接基础 同时也会讨论下不同场景下的RRC建立流程中信令内容的异同 RRC连接建立流程 SA注册流程主要是终端与5GC

随机推荐

  • 8X8X8光立方整体框架设计&技术细节

    从一师兄那拿来的 东西是师兄自己做的 觉得特有才一人 只是进了互联网公司 感觉做嵌入式更适合他 Powered by lihui Liusheng 2012 Shenyang 太过技术了 写给自己留着看的 不懂的可绕行 确实有些头大 在对最
  • OA权限树搭建 代码

    ul ul
  • Android下拉刷新效果实现

    本文主要包括以下内容 自定义实现pulltorefreshView 使用google官方SwipeRefreshLayout 下拉刷新大致原理 判断当前是否在最上面而且是向下滑的 如果是的话 则加载数据 并更新界面 自定义实现pulltor
  • Matlab中dir使用中遇到的一些问题

    今天调程序时遇到一个bug 感觉有点意思 也许有人会遇到类似的问题吧 问题 说手上有一段代码 原本是希望在一个文件夹中读取出其中所有音频文件的 tdir dir fullfile SoundDir SoundFileName NumSoun
  • 出现command 'gcc' failed with exit status 1 解决方案

    在centos7 上用pip 安装psutil的时候很不幸的出现了如下错误 pip install psutil Collecting psutil Using cached psutil 5 3 1 tar gz Installing c
  • python 角度判断_大牛带你打牢Python基础,看看这10语法

    都说Python简单 易懂 但是有时候却又很深奥 许多人都觉的自己学会了 却老是写不出项目来 对很多常用包的使用也并不熟悉 学海无涯 我们先来了解一些Python中最基本的内容 1 数值 数值包括整型和浮点型 分别对应整数和浮点数 后者精度
  • Python3 列表笔记

    列表 使用 括起来的一个个元素的集合 1 列表的元素使用 进行分割 2 列表的元素可以是任意数据类型 1 创建列表 list huarzil 32 3 14 True zhuangsan lisi 32 29 30 name height
  • linux学习笔记--网络编程

    目录 概念 协议 网络应用设计模式 分层模型 协议格式 TCP状态 网络名词 socket编程 套接字 字节序 函数 socket bind listen accept connect C S模型 server client 封装 高并发服
  • iview 数据表格 固定列拉倒底部后刷新出现错行问题

    很多小伙伴肯定遇到过这个组件问题 下面只需要一行即可搞定 vue方法 首先我们在mixin js里封装一个方法 pageSizeChange pageSize 每页显示数量变更 this searchParams limit pageSiz
  • C#中,浮点数的比较和decimal

    浮点数 C 的浮点数类型 float double 当我们定义一个浮点数可以 可以使用var 关键字 可以做类型推断 定义float类型 数字末尾需要加上 F或者是f 定义一个double类型 double a1 1 1 var a2 1
  • <转>企业应用架构 --- 分层

    系统架构师 基础到企业应用架构 分层 上篇 一 前言 大家好 接近一年的时间没有怎么书写博客了 一方面是工作上比较忙 同时生活上也步入正轨 事情比较繁多 目前总算是趋于稳定 可以有时间来完善以前没有写完的系列 也算是对自己这段时间工作和生活
  • 程序流程图是什么?基本流程图讲解

    程序流程图是什么 程序流程图是流程图的其中一种分类 又称程序框图 指用特定图形符号加上对应的文字描述表示程序中所需要的各项操作或判断的图示 程序流程图除了说明程序的流程顺序外 着重于说明程序的逻辑性 一 程序流程图特点 当程序流程中有较多循
  • 动态规划经典例题-国王的金矿问题

    金矿问题 问题概述 有一位国王拥有5座金矿 每座金矿的黄金储量不同 需要参与挖掘的工人人数也不同 例如有的金矿储量是500kg黄金 需 要5个工人来挖掘 有的金矿储量是200kg黄金 需要3个工人来挖 掘 如果参与挖矿的工人的总数是10 每
  • 转:FindBugs,第 2 部分: 编写自定义检测器

    FindBugs 第 2 部分 编写自定义检测器 如何编写自定义检测器以查找特定于应用程序的问题 FindBugs 是一种可以扩展和定制以满足自己团队独特要求的静态分析工具 在本系列的第 2 部分中 高级软件工程师 Chris Grinds
  • odoo12 用户(users) 权限管理界面分析

    起因 由于需要了解 odoo的权限管理 去看了下 odoo 是如何给用户赋权限的 发现好多不能理解 因此 打算从 user 的xml开始 看里面到底是什么意思 第一步 肯定查看user的xml 找user源码 odoo odoo addon
  • delphi xe 10.3 访问 linux 7 mysql 5.7.20

    下载 https cdn mysql com archives mysql 5 7 mysql 5 7 34 win32 zip 解压 并复制lib目录下的所有文件到 X Program Files x86 Embarcadero Stud
  • MySQL崩溃修复案例

    问题描述 研究MySQL源代码 调试并压测MySQL源代码时 MySQL崩溃了 问题是它竟然崩溃了 而且还损坏了InnoDB文件 还好是在调试环境下发生的 赶紧看看如何解决这个问题 经过一系列的查阅资料 验证 对比 MySQL源码调试跟踪
  • 单线程的Redis为什么这么快

    一 为什么Redis是单线程的 Redis 是基于内存的操作 而CPU 不是 Redis 的瓶颈 Redis 的瓶颈最有可能是机器内存的 大小或者网络带宽 同时 单线程的实现更加简单和经济 采用单线程可以使指令串行 不用额外 维护锁机制 避
  • java通过反射创建对象的两种方式

    我个人觉得我自己是个比较粗心的人 所以各位大佬发现有什么不对的地方还请留言告知 在java中 通过反射创建对象有两种方式 使用Class对象的newInstance 方法来创建对象 具体步骤是 1 获取类的Class对象 有三种方式可以获取
  • 深度学习系列:阿里DIN模型的原理和代码实现

    一 前言 今天介绍阿里巴巴的DIN网络 不得不说 阿里妈妈的大佬是真的多 经常都会更新非常多的创造性的东西 比如DIN中使用的自适应正则化技术以及Dice激活函数以及注意力机制的使用 并且值得注意的是DIN网络中使用的注意力机制还挺多的 哈