本周学习情况
2017年,由哈尔滨工业大学和华为公司联合提出的DeepFM,是将FM结构与Wide&Deep模型进行了整合。用FM替换了原来的Wide部分,加强了浅层网络部分特征组合的能力。
同年,新加坡国立大学研究人员提出了NFM模型,就是把FM结构和深度神经网络结合起来的一种尝试。
DeepFM 利用了 Wide&Deep 组合模型的思想,用 FM 替换了 Wide&Deep 左边的 Wide 部分,加强了浅层网络部分特征组合的能力,而右边的部分跟 Wide&Deep 的 Deep 部分一样,主要利用多层神经网络进行所有特征的深层处理,最后的输出层是把 FM 部分的输出和 Deep 部分的输出综合起来,产生最后的预估结果。这就是 DeepFM 的结构。
① 特征交叉新方法:元素积操作Bi-Interaction Pooling Layer 翻译成中文就是“两两特征交叉池化层”。具体操作为:
其中 ⊙ 运算代表两个向量的元素积(Element-wise Product)操作,即两个长度相同的向量对应维相乘得到元素积向量。在进行两两特征 Embedding 向量的元素积操作后,再求取所有交叉特征向量之和,我们就得到了池化层的输出向量。接着,我们再把该向量输入上层的多层全连接神经网络,就能得出最后的预测得分。
② 特点:1)NFM 并没有使用内积操作来进行特征 Embedding 向量的交叉,而是使用元素积的操作。2)在得到交叉特征向量之后,也没有使用 concatenate 操作把它们连接起来,而是采用了求和的池化操作,把它们叠加起来。
① 数值型特征是否可以用于特征交叉?
按照DeepFM原论文,数值型特征是不参与特征交叉的,因为特征交叉的操作是在两个embedding向量间进行的。
如果可以把通过分桶操作把连续型特征处理成离散型特征,然后再加Embedding层,就可以让数值型特征也参与特征交叉。这是一个可行的方案。
② FM与DeepFM交叉权重区别?
原FM中内积作为权重,然后还要乘以特征本身的值。但在DeepFM中,所有的参与交叉的特征都先转换成了embedding,而且由于是one-hot,所以特征的值就是1,参不参与交叉都无所谓。所以直接使用embedding的内积作为交叉后的值就可以了
③ FM与MF的区别:
结构上来说,因子分解机会引入除了user id和item id的其他特征,而且FM是有一阶部分的,不只是做特征交叉。
MF就是一个只利用user id和item Id的双塔模型。
MF有多种的求解方式,比如奇异值分解(SVD)、特征值分解(ED)、梯度下降法。
“注意力机制”来源于人类天生的“选择性注意”的习惯。最典型的例子是用户在浏览网页时,会有选择性地注意页面的特定区域,而忽视其他区域。
近年来,注意力机制广泛应用在深度学习的各个领域,无论是自然语言处理、语音识别还是计算机视觉领域,注意力模型都取得了巨大的成功。从2017年开始,推荐领域也开始尝试把注意力机制引入推荐模型。
2017年,阿里巴巴提出了深度兴趣网络(Deep Interest Network,DIN)。
2019年,提出了其演进版本深度兴趣进化网络(Deep Interest Evolution Network,DIEN)。
这两个网络都是CTR预估网络。
DIN的基础模型结构:是一个典型的 Embedding MLP 的结构。它的输入特征有用户属性特征(User Proflie Features)、用户行为特征(User Behaviors)、候选广告特征(Candidate Ad)和场景特征(Context Features)。
① 用户行为特征是由一系列用户购买过的商品组成的,也就是图上的 Goods 1 到 Goods N,而每个商品又包含了三个子特征,也就是图中的三个彩色点,其中红色代表商品 ID,蓝色是商铺 ID,粉色是商品类别 ID。同时,候选广告特征也包含了这三个 ID 型的子特征,因为这里的候选广告也是一个阿里平台上的商品。
② 把三个 ID 转换成了对应的 Embedding,然后把这些 Embedding 连接起来组成了当前商品的 Embedding。
③ 用户的行为序列是一组商品的序列,这个序列可长可短,但是神经网络的输入向量的维度必须是固定的。SUM Pooling 层的结构直接把这些商品的 Embedding 叠加起来,然后再把叠加后的 Embedding 跟其他所有特征的连接结果输入 MLP。
④ 问题来了:SUM Pooling 的 Embedding 叠加操作其实是把所有历史行为一视同仁,没有任何重点地加起来,这其实并不符合我们购物的习惯。
⑤ DIN模型结构图
与 Base Model 相比,DIN 为每个用户的历史购买商品加上了一个激活单元(Activation Unit),这个激活单元生成了一个权重,这个权重就是用户对这个历史商品的注意力得分,权重的大小对应用户注意力的高低。
⑥ 激活单元:它的输入是当前这个历史行为商品的 Embedding,以及候选广告商品的 Embedding。我们把这两个输入 Embedding,与它们的外积结果连接起来形成一个向量,再输入给激活单元的 MLP 层,最终会生成一个注意力权重,这就是激活单元的结构。简单来说,激活单元就相当于一个小的深度学习模型,它利用两个商品的 Embedding,生成了代表它们关联程度的注意力权重。
① 无论是电商购买行为,还是视频网站的观看行为,或是新闻应用的阅读行为,特定用户的历史行为都是一个随时间排序的序列。既然是和时间相关的序列,就一定存在前后行为的依赖关系,这样的序列信息对于推荐过程是非常有价值的
② 深度兴趣进化网络 DIEN(Deep Interest Evolution Network)模型正好弥补了 DIN 模型没有对行为序列进行建模的缺陷,它围绕兴趣进化这个点进一步对 DIN 模型做了改进。
③ DIEN架构:整体上仍然是一个 Embedding MLP 的模型结构。与 DIN 不同的是,DIEN 用“兴趣进化网络”,也就是图中的彩色部分,替换掉了原来带有激活单元的用户历史行为部分。这部分虽然复杂,但它的输出只是一个 h’(T) 的 Embedding 向量,它代表了用户当前的兴趣向量。有了这个兴趣向量之后,再把它与其他特征连接在一起,DIEN 就能通过 MLP 作出最后的预测了
④ 兴趣进化网络
最下面一层是行为序列层(Behavior Layer,灰绿色部分)。它的主要作用和一个普通的 Embedding 层是一样的,负责把原始的 ID 类行为序列转换成 Embedding 行为序列。
再上一层是兴趣抽取层(Interest Extractor Layer,浅黄色部分)。它的主要作用是利用 GRU 组成的序列模型,来模拟用户兴趣迁移过程,抽取出每个商品节点对应的用户兴趣。
最上面一层是兴趣进化层(Interest Evolving Layer,浅红色部分)。它的主要作用是利用 AUGRU(GRU with Attention Update Gate) 组成的序列模型,在兴趣抽取层基础上加入注意力机制,模拟与当前目标广告(Target Ad)相关的兴趣进化过程,兴趣进化层的最后一个状态的输出就是用户当前的兴趣向量 h’(T)。
⑤ 序列模型结构
兴趣抽取层和兴趣进化层都用到了序列模型的结构(如下图是RNN模型的典型结构)。
根据序列模型神经元结构的不同,最经典的有RNN、LSTM、GRU这 3 种,结构图如下:
⑥ 在 DIEN 模型中,神经元的输入就是商品 ID 或者前一层序列模型的 Embedding 向量,而输出就是商品的 Embedding 或者兴趣 Embedding,除此之外,每个神经元还会与后续神经元进行连接,用于预测下一个状态,放到 DIEN 里就是为了预测用户的下一个兴趣。这就是序列模型的结构和作用。
① 有没有更实用的注意力权重计算方式?
可以借鉴FM及DeepFM中特征交叉的计算方式,对两个向量直接计算内积
先通过Embedding层转换成维度相等的Embedding再求内积
可以像双塔结构一样,设计一个历史行为物品塔和广告物品塔,在塔的最后通过求内积或者拼接后用全连接层输出权重
② DIN激活单元用到了外积,有什么意图?
本质上内积和外积都是做特征交叉,计算相似性的方式,一般来说,外积因为输出是一个向量,所以表达能力更强一些
③ DIN模型在工业界的排序阶段使用的多吗?
DIN比DIEN的使用场景要求低很多,很多在用DIN的思路来构建自己的模型。attention机制是非常有价值的
④ GRU这种提取序列信息的方式肯定会被Transformer取代?
已经有不少的paper介绍Transformer替代GRU,最近提的比较多的是bert for rec。
⑤ 广告的内容和商城的内容(包含用户行为)是不一样的,这时候还可以用DIN的注意力机制吗?
可以的,因为广告内容和商城内容从经验上来说也会有一定的相关性。以DeepFM的思路来说,其实可以做任意两个特征之间的交叉。对于注意力机制,当然也可以学任意两个特征间的注意力。
⑥ 推荐模型的NN隐层数量都比较少(相对cv),业界常用的MLP隐层数量和神经元数量,有没有一个大致的取值范围?
隐层数量大致在1到5之间,确实在推荐问题上再提高隐层数量效果上意义不大,inference延迟还大,得不偿失。
相比CV动辄上百的隐层数量,推荐模型是比较“浅”的了。CV的输入特征都是稠密的数值特征,相比推荐来说,特征维度就比较大,所以需要更深的网络来做特征提取。
同时,推荐模型大多数特征都是结构化的数据,因此只能用全连接来对特征进行提取,而过深的全连接层会带来大量的参数,使得模型训练效率低等问题;对于CV来说,其主要考虑的是三维数据的空间特征提取,CNN中卷积核是权重共享的,这就解决全连接层参数爆炸的问题。
⑦ transformer中有position encoding,而在推荐的领域中,点击的序列中同样有时间间隔的因素,例如取用户最近若干次点击,可能每次间隔时间不等。这个间隔时间应该是有信息可以揭示用户兴趣的变迁速率等信息的吧?但是如何将其引入到推荐序列中呢?是类似于transformer中 position learned encoding这样么?
这是一个很好的idea。但说实话我还没有见到非常成功的案例说能够很好的利用event interval然后取得很大的收益。也许是这个信号本身不够强,带来的收益有限。
⑧ 查阅了关于外积的资料,向量外积一般只定义在3维空间,对于高于3维空间的向量如何计算其外积呢?我在DIN作者的开源项目中发现作者自己没有使用外积运算,而是使用了元素相减和元素相乘,不知道老师在DIN或相关实践中是否会使用外积操作来进行向量的融合呢?
我也不喜欢用外积操作,我比较喜欢inner product和element wise操作。外积我始终没法得到更好的效果。DIN的paper中加入了外积操作,也许身体是诚实的,还是用了传统的交互操作。没必要纠结这些,自己实践中哪个好用用哪个。
强化学习也被称为增强学习,它在模型实时更新、用户行为快速反馈等方向上拥有巨大的优势。自从 2018 年开始,它就被大量应用在了推荐系统中,短短几年时间内,微软、美团、阿里等多家一线公司都已经有了强化学习的成功应用案例。
基本原理:就是一个智能体通过与环境进行交互,不断学习强化自己的智力,来指导自己的下一步行动,以取得最大化的预期利益。
为了把强化学习技术落地,只清楚它的基本原理显然是不够的,我们需要清晰地定义出强化学习中的每个关键变量,形成一套通用的技术框架。对于一个通用的强化学习框架来说,有这么六个元素是必须要有的:
智能体(Agent):强化学习的主体也就是作出决定的“大脑”;
环境(Environment):智能体所在的环境,智能体交互的对象;
行动(Action):由智能体做出的行动;
奖励(Reward):智能体作出行动后,该行动带来的奖励;
状态(State):智能体自身当前所处的状态;
目标(Objective):指智能体希望达成的目标。
通用过程描述:一个智能体身处在不断变化的环境之中,为了达成某个目标,它需要不断作出行动,行动会带来好或者不好的奖励,智能体收集起这些奖励反馈进行自我学习,改变自己所处的状态,再进行下一步的行动,然后智能体会持续这个“行动 - 奖励 - 更新状态”的循环,不断优化自身,直到达成设定的目标。
① 深度强化学习网络DRN(Deep Reinforcement Learning Network),是微软在 2018 年提出的,它被应用在了新闻推荐的场景上。深度强化学习推荐系统框架图如下:
② DRN学习过程:
第一步是初始化推荐系统,主要初始化的是推荐模型,我们可以利用离线训练好的模型作为初始化模型,其他的还包括我们之前讲过的特征存储、推荐服务器等等。
接下来,推荐系统作为智能体会根据当前已收集的用户行为数据,也就是当前的状态,对新闻进行排序这样的行动,并在新闻网站或者 App 这些环境中推送给用户。
用户收到新闻推荐列表之后,可能会产生点击或者忽略推荐结果的反馈。这些反馈都会作为正向或者负向奖励再反馈给推荐系统。
推荐系统收到奖励之后,会根据它改变、更新当前的状态,并进行模型训练来更新模型。接着,就是推荐系统不断重复“排序 - 推送 - 反馈”的步骤,直到达成提高新闻的整体点击率或者用户留存等目的为止。
③ 强化学习六要素与推荐系统的关系总结:
④ 强化学习推荐系统的特点:始终在强调持续学习和实时训练。它不断利用新学到的知识更新自己,做出最及时的调整,这也正是将强化学习应用于推荐系统的收益所在。
① 智能体是强化学习框架的核心,作为推荐系统这一智能体来说,推荐模型就是推荐系统的“大脑”。在 DRN 框架中,扮演“大脑”角色的是 Deep Q-Network (深度 Q 网络,DQN)。其中,Q 是 Quality 的简称,指通过对行动进行质量评估,得到行动的效用得分,来进行行动决策。
② DQN模型结构:如下图所示,它就是一个典型的双塔结构。用户塔的输入特征是用户特征和环境特征,物品塔的输入向量是所有的用户、环境、用户 - 新闻交叉特征和新闻特征。
③ 在强化学习的框架下,用户塔特征向量因为代表了用户当前所处的状态,所以也可被视为状态向量。物品塔特征向量则代表了系统下一步要选择的新闻,这个选择新闻的过程就是智能体的“行动”,所以物品塔特征向量也被称为行动向量。
④ 双塔模型通过对状态向量和行动向量分别进行 MLP 处理,再用互操作层生成了最终的行动质量得分 Q(s,a),智能体正是通过这一得分的高低,来选择到底做出哪些行动,也就是推荐哪些新闻给用户的。
⑤ DRN学习过程
离线部分初始化:DRN 根据历史数据训练好 DQN 模型,作为智能体的初始化模型。
在线t1->t2时间段:DRN 利用初始化模型进行一段时间的推送服务,积累反馈数据
t2时间点:DRN 利用 t1 到 t2 阶段积累的用户点击数据,进行模型微更新(Minor update),基于新的在线训练方法,Dueling Bandit Gradient Descent algorithm(竞争梯度下降算法)
t4时间点:DRN 利用 t1 到 t4 阶段的用户点击数据及用户活跃度数据,进行模型的主更新(Major update),可以理解为:利用历史数据的重新训练,用训练好的模型来替代现有模型。
重复t1->t4阶段的操作
⑥ 在线学习方法:竞争梯度下降算法
主要包括三步:
第一步:对于已经训练好的当前网络 Q,对其模型参数 W 添加一个较小的随机扰动,得到一个新的模型参数,这里我们称对应的网络为探索网络 Q~,产生随机扰动公式如下:
Δ W = α ⋅ r a n d ( − 1 , 1 ) ⋅ W ΔW=α·rand(-1, 1) · WΔW=α⋅rand(−1,1)⋅W
$ α$ 是一个探索因子,决定探索力度的大小。$rand(-1,1) 产 生 的 是 一 个 产生的是一个产生的是一个[-1,1]$之间的随机数。
第二步:对于当前网络 Q 和探索网络 Q~,分别生成推荐列表 L 和 L~,再将两个推荐列表用间隔穿插(Interleaving)的方式融合,组合成一个推荐列表后推送给用户。
最后一步是实时收集用户反馈。如果探索网络 Q~生成内容的效果好于当前网络 Q,我们就用探索网络代替当前网络,进入下一轮迭代。反之,我们就保留当前网络。
最大的改进就是把模型推断、模型更新、推荐系统工程整个一体化了,让整个模型学习的过程变得更高效,能根据用户的实时奖励学到新知识,做出最实时的反馈。
但同时,也正是因为工程和模型紧紧地耦合在一起,让强化学习在推荐系统中的落地并不容易。
① 竞争梯度下降算法的弊端是什么?
每个参数的更新方向是随机的,而不是像随机下降算法一样,是沿着梯度更新的。随机更新可能导致的结果就是:1.收敛是缓慢的。2.很难收敛到全局最优值。
② 如何判断竞争网络效果?
在实际实现中做一小段实践的数据收集,再根据这个batch的效果进行探索网络和当前网络的选择。这部分在实际的工程中一般是在flink等流计算平台上实现的。
③ 历史数据重新训练指的是从零训练吗?使用竞争梯度下降算法吗?
主更新不使用竞争梯度下降算法。实际工程中可视为一次正常的模型更新,使用的是全量历史样本,当然这其中包括了最近收集到的样本。
④ 增加实时性上采用FTRL进行在线学习和强化学习在最终结果上有什么区别,如何判断选择?
online learning其实可以看作强化学习的一个子集,或者说是子类。所以FTRL做在线学习本质上就是强化学习的一种。
SGD是比较普通的优化器(其实SDG也挺好的)
Momentum是SGD的升级版,代码里可看到和SGD用的也是同一个函数,只是加了动量
RMSprop是Momentum的升级版
Adam是RMSprop的升级版
四种优化器的对比:
import torch
import torch.nn
import torch.utils.data as Data
import matplotlib.pyplot as plt
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
# 搭建神经网络
class Net(torch.nn.Module):
def __init__(self, n_input, n_hidden, n_output):
super(Net, self).__init__() # 继承init的功能
self.hidden_layer = torch.nn.Linear(n_input, n_hidden)
self.output_layer = torch.nn.Linear(n_hidden, n_output)
def forward(self, input):
x = torch.relu(self.hidden_layer(input))
output = self.output_layer(x)
return output
# 超参数
LR = 0.01
batch_size = 10
epoches = 3
torch.manual_seed(15)
# 准备数据
x = torch.unsqueeze(torch.linspace(-1, 1, 1000), dim=1)
y = x.pow(2)
plt.scatter(x.numpy(), y.numpy())
plt.show()
dataset = Data.TensorDataset(x, y)
loader = Data.DataLoader(
dataset=dataset,
batch_size=batch_size,
shuffle=True,
num_workers=2)
def train():
net_SGD = Net(1, 20, 1)
net_Momentum = Net(1, 20, 1)
net_RMSprop = Net(1, 20, 1)
net_Adam = Net(1, 20, 1)
nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam]
# 定义优化器
optimizer_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
optimizer_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
optimizer_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
optimizer_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
optimizers = [optimizer_SGD, optimizer_Momentum, optimizer_RMSprop, optimizer_Adam]
# 定义损失函数
loss_function = torch.nn.MSELoss()
losses = [[], [], [], []]
for epoch in range(epoches):
for step, (batch_x, batch_y) in enumerate(loader):
for net, optimizer, loss_list in zip(nets, optimizers, losses):
pred_y = net(batch_x)
loss = loss_function(pred_y, batch_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_list.append(loss.data.numpy())
labels = ['SGD', 'Momentum', 'RMSprop', 'Adam']
for i, loss in enumerate(losses):
plt.plot(loss, label=labels[i])
plt.legend(loc='best')
plt.xlabel('Steps')
plt.ylabel('Loss')
plt.ylim((0, 0.2))
plt.show()
if __name__ == "__main__":
train()
对比结果图:
SGD 是最普通的优化器, 也可以说没有加速效果, 而 Momentum 是 SGD 的改良版, 它加入了动量原则. 后面的 RMSprop 又是 Momentum 的升级版. 而 Adam 又是 RMSprop 的升级版. 不过从这个结果中我们看到, Adam 的效果似乎比 RMSprop 要差一点. 所以说并不是越先进的优化器, 结果越佳。
代码实现:
def preprocessData(data):
feature=np.array(data.iloc[:,:-1]) #取特征
label=data.iloc[:,-1].map(lambda x: 1 if x==1 else -1) #取标签并转化为 +1,-1
#将数组按行进行归一化
zmax, zmin = feature.max(axis=0), feature.min(axis=0)
feature = (feature - zmin) / (zmax - zmin)
label=np.array(label)
return feature,label
#定义激活函数
def sigmoid(inx):
# return 1. / (1. + exp(-max(min(inx, 15.), -15.)))
return 1.0 / (1 + exp(-inx))
def SGD_FM(dataMatrix, classLabels, k, iter):
'''
:param dataMatrix: 特征矩阵
:param classLabels: 类别矩阵
:param k: 辅助向量的大小
:param iter: 迭代次数
:return:
'''
# dataMatrix用的是mat, classLabels是列表
m, n = shape(dataMatrix) #矩阵的行列数,即样本数和特征数
print(m, n)
alpha = 0.01
# 初始化参数
# w = random.randn(n, 1)#其中n是特征的个数
w = zeros((n, 1)) #一阶特征的系数
w_0 = 0.00
v = normalvariate(0, 0.2) * ones((n, k)) #即生成辅助向量,用来训练二阶交叉特征的系数
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 # 计算预测的输出,即FM的全部项之和
loss = 1-sigmoid(classLabels[x] * p[0, 0]) #计算损失
w_0 = w_0 +alpha * loss * classLabels[x]
for i in range(n):
if dataMatrix[x, i] != 0:
w[i, 0] = w[i, 0] +alpha * loss * classLabels[x] * dataMatrix[x, i]
for j in range(k):
v[i, j] = v[i, j]+ alpha * loss * classLabels[x] * (
dataMatrix[x, i] * inter_1[0, j] - v[i, j] * dataMatrix[x, i] * dataMatrix[x, i])
print("第{}次迭代后的损失为{}".format(it, loss))
return w_0, w, v
def getAccuracy(dataMatrix, classLabels, w_0, w, v):
m, n = shape(dataMatrix)
allItem = 0
error = 0
result = []
for x in range(m): #计算每一个样本的误差
allItem += 1
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 # 计算预测的输出
pre = sigmoid(p[0, 0])
print(p)
result.append(pre)
if pre < 0.5 and classLabels[x] == 1.0:
error += 1
elif pre >= 0.5 and classLabels[x] == -1.0:
error += 1
else:
continue
plt.plot(p, pre, color="r", linestyle="-", linewidth=1)
plt.show()
return float(error) / allItem
深度学习推荐模型没有好坏之分,不同的模型在引入特征向量,改变特征交叉方式上做出来的改变,在带来一定收益的同时,也丢失了一部分特征数据。所以对于一个推荐系统模型,重要的是根据自己的数据集调参,对比。选择合适的深度学习推荐模型。但本周学习的内容确实有些思想比较好,比如引入注意力机制,时间序列。用户在一段时间可能对某个物品感兴趣,这是存在时间相关行的,就比如说要买一件篮球服,那可能我一周都在看篮球服,那对数据引入LSTM或者GRU进行处理。强化学习的思想创新我感觉他在一个更新操作上,它分为在线学习和离线学习两部分,它是动态的可以在线更新,始终在强调持续学习和实时训练。它不断利用新学到的知识更新自己,做出最及时的调整。
通过学习本周内容收获还是很多的,比如之前学习的模型也就是前深度学习时代,还是深度学习时代的模型,跟cv方向的模型相比都要简单一点。而且模型的改进感觉都是在原有的模型上进行改进,比如根据FM发展起来的NFM DFM AFM都是在改进FM中的特征交叉存在的问题。推荐系统模型隐层数量大致在1到5之间,在推荐问题上再提高隐层数量效果上意义不大,inference延迟还大,得不偿失。相比CV动辄上百的隐层数量,推荐模型是比较“浅”的了。CV的输入特征都是稠密的数值特征,相比推荐来说,特征维度就比较大,所以需要更深的网络来做特征提取。同时,推荐模型大多数特征都是结构化的数据,因此只能用全连接来对特征进行提取,而过深的全连接层会带来大量的参数,使得模型训练效率低等问题;对于CV来说,其主要考虑的是三维数据的空间特征提取,CNN中卷积核是权重共享的,这就解决全连接层参数爆炸的问题。
用户上周买了一个篮球鞋,那它这周浏览的商品里多了了一个机械键盘,用户刚买过篮球鞋,那它这周再买一双篮球鞋的希望肯定不大,但是它很可能这周买一个机械键盘,这个问题引入时间序列模型可以解决问题。用户的兴趣变迁问题怎么解决,是不是可以通过用户的点击间隔来反映一下,比如前几天我喜欢篮球那我可能看到篮球的推荐就点击进入并且认真看看这个商品的详情介绍,我的点击率 点击间隔会很高,但我买了一双之后,我再看到篮球推荐,可能我也点击进去,但我不会浏览太长时间,因为我这个时候没有购买需求了,但也可能我还要买一双那就看这次的商品点击间隔信息和上次的有什么区别。如何将这个信息引入推荐序列中呢?是类似于transformer中 position learned encoding这样么?