tech share
  • tech-share
  • Engineering
    • 登录鉴权
    • SSR 页面路由
    • npm 版本号
    • 缓存
    • 数据库容灾
    • 动态效果导出 gif
    • Chrome-devtools
    • C 端 H5 性能优化
    • Docker
    • Monorepo 最佳实践
    • 技术架构演化
    • 项目规范最佳实践
    • snowpack
    • 静态资源重试
    • 前端页面渲染分析
    • Git
    • 前端重构
    • 微前端
    • 项目依赖分析
    • 前端监控原理
    • webpack
    • BS 架构与 CS 架构
    • HTTPS
    • package-lock.json 生成逻辑
    • SVN(Subversion)
    • 数据库分类
    • gulp
    • 前端架构
    • Bundle & Bundless
    • 控制反转 IoC
  • JavaScript
    • Javascript 性能
    • JavaScript 原型(2) - 原型与原型链
    • JavaScript 原型(1) - 构造函数
    • JavaScript - Promise
    • ES6 解构赋值
    • 前端离线化
    • Proxy
    • Object.defineProperty()简介
    • TypeScript
  • MachineLearning
    • GAN生成对抗网络
    • 虚拟对抗训练
    • 深度度量学习
    • 原型网络
    • PyTorch优化器
    • 隐马尔可夫模型2
    • Shapley Value 算法
    • Embarassingly Autoencoder算法
    • AutoRec算法及其后续发展
    • 深度学习常用激活函数
    • 序列预测ConvTran算法
    • 联邦学习
    • 深度学习推荐系统算法整理
    • 隐马尔可夫模型
    • 黎曼优化方法
    • FM算法
    • 机器学习常见评价指标
    • VAE算法
    • Adam优化器详解
    • Transformer算法
    • Self-attention 推荐算法
    • CNN 卷积神经网络
    • 图嵌入
    • 集成学习算法
    • RecBole开源框架
    • NCE-PLRec
    • 深度学习初始化方法
    • RNN循环神经网络
    • PyTorch数据处理
    • PyTorch安装和基本操作
    • XGBoost算法
    • NCF算法与简单MF的对比
    • 计算最佳传输
  • CSS
    • 什么是BFC
    • 纯CSS实现可拖动布局
    • 滚动穿透解决方案
  • React
    • React 生命周期
    • React Ref
    • React Hooks
    • SWR
    • React 数据流
    • React 函数式组件和类组件的区别
  • 可视化
    • OffscreenCanvas
    • Echarts 平滑曲线端点为什么不平滑
    • 颜色空间
    • 词云布局解析
    • 3D 数学基础
    • Canvas 图片处理
    • GLGL ES
    • WebGL 中绘制直线
    • Graphics API
    • 现代计算机图形学基础
    • Canvas 灰度
  • Vue
    • Vue2.x全局挂载整理
    • Vue2.6.x源码阅读
      • Vue2.6.x源码阅读 - 2.目录结构分析
      • Vue2.6.x源码阅读 - 4.源码阅读-platform
      • Vue2.6.x源码阅读 - 1.准备工作
      • Vue2.6.x源码阅读 - 5.源码阅读-core-Vue构造函数
      • Vue2.6.x源码阅读 - 7.源码阅读-core-响应式原理
      • Vue2.6.x源码阅读 - 3.源码阅读-shared
      • Vue2.6.x源码阅读 - 6.源码阅读-core-组件挂载
    • Vue + TypeScript Web应用实践
    • Vue2.x指令
    • nextTick()的使用
    • vue-cli2.x 的使用与项目结构分析
    • Vue响应式原理及总结
    • VueX的使用
    • Electron-Vue + Python 桌面应用实践
    • Vite
    • Vue组件通信整理
    • 记录一个问题的探索过程
  • Linux
    • memcg
  • GameDev
    • 游戏中的几种投影视图
    • 从零开始写软渲染器06
    • 从零开始写软渲染器05
    • 从零开始写软渲染器04
    • 从零开始写软渲染器03
    • 从零开始写软渲染器02
    • 从零开始写软渲染器01
    • 从零开始写软渲染器00
    • 现代游戏常用的几种寻路方案(一)
  • Node
    • NPM Dependency
    • Node 优势
    • Node Stream
    • Node 模块系统
  • HTML
    • html5语义与结构元素
  • 跨端
    • Flutter 介绍
  • Golang
    • Golang 基础
  • AR
    • SceneKit
由 GitBook 提供支持
在本页
  • AutoRec
  • CDAE
  • JCA

这有帮助吗?

  1. MachineLearning

AutoRec算法及其后续发展

上一页Embarassingly Autoencoder算法下一页深度学习常用激活函数

最后更新于4年前

这有帮助吗?

最近在对AutoRec进行复现,并在此基础上尝试做出修改提高性能,因此对原版AutoRec和后续发展起来的几种AutoRec都做了了解,总结如下。

AutoRec

上期已经介绍过AutoRec是将CV领域的autoencoder成果引入到推荐领域的尝试。参见论文

这是一个非常早期的成果,因此可以看出其中还保留了很多非深度学习的算法的影子。文章提出了两种AutoRec,区别只在于用物品点击来表示用户还是用用户点击来表示物品。

例如在I-AutoRec中,用户被直接表示为长度为item_nums的向量,每个位置是用户对对应位置物品的评分,如果没有评分则置空。

输入向量经过autoencoder后会重构出一个输出的向量。这个输出向量就表示用户对所有物品的实际评分。用输出和输出向量取差值计算loss就可以对网络进行训练。

注意在计算loss时只会计算该用户在训练集中有评分的那些物品,未评分的物品则需要进行mask处理。

该算法的PyTorch实现如下:

import torch
import torch.nn as nn


class Autorec(nn.Module):
    def __init__(self, args, num_users, num_items):
        super(Autorec, self).__init__()

        self.args = args
        self.num_users = num_users
        self.num_items = num_items
        self.hidden_units = args.hidden_units

        self.encoder = nn.Sequential(
            nn.Linear(self.num_items, self.hidden_units),
            nn.Sigmoid
        )

        self.decoder = nn.Sequential(
            nn.Linear(self.hidden_units, self.num_items),
        )

    def forward(self,torch_input, users):

        encoder = self.encoder(torch_input)
        output = self.decoder(encoder)

        return (output > 0).float()

论文中对encoder和decoder末尾使用的激活函数也进行了对比实验,最后得出结论是在encoder末尾使用sigmoid函数,在decoder末尾使用符号函数(大于0输出1,小于0输出0)。然而在之后ReLU算法被证明在深度学习中有着比sigmoid更佳的效果,因此被后续的研究者用以替换sigmoid。

值得注意的是该文章原文是用RMSE指标来体现算法的优越性,显然和当下的潮流不符。不过只需要稍加改动就可以根据新的指标对AutoRec进行评估。

  • 在autoencoder的输出位置加上sigmoid以保证输出结果是0-1之间

  • 可以考虑使用cross_entropy损失函数替代MAE损失函数(存疑,待验证)

  • 在测试时只对那些训练集中不存在的用户物品交互进行打分排序

此外,论文中提出的AutoRec分为I-AutoRec(以评分矩阵中每一列的Item对应所有User的评分作为输入)和U-AutoRec(以评分矩阵中每一行User对应所有Item的评分作为输入),两者在不同的数据集中呈现出不同的performance。

CDAE

改动主要有以下几点: 1. 更改激活函数,encoder的激活函数改为ReLU函数,decoder的激活函数改为sigmoid函数。 2. 在输入multi-hot特征时进行drop out操作,也就是随机去除掉一定比例的特征。这个操作被称作Denoise,由此模型称为DAE。 3. 在模型中添加一个自训练的,由one-hot的user id产生的embedding向量,这个被称作CDAE。

可以看出CDAE试图去除掉CDAE中将全部记录都用于训练的噪音,这主要是为了适应explicit feedback到implicit feedback的场景变换。此外one-hot embedding这一设计和后面的NCF中提出的对user、item的embedding训练处理暗合。

PyTorch实现如下:

import torch
import torch.nn as nn


class CDAE(nn.Module):
    def __init__(self, args, num_users, num_items):
        super(CDAE, self).__init__()

        self.args = args
        self.num_users = num_users
        self.num_items = num_items
        self.hidden_units = args.hidden_units
        self.drop_out = args.drop_out

        self.encoder = nn.Sequential(
            nn.Dropout(self.drop_out),
            nn.Linear(self.num_items, self.hidden_units),
            nn.ReLU()
        )

        self.user_embed = nn.Embedding(num_users, self.hidden_units)

        self.decoder = nn.Sequential(
            nn.Linear(self.hidden_units, self.num_items),
            nn.Sigmoid()
        )

    def forward(self,torch_input, users):

        encoder = self.encoder(torch_input)
        user_embeddings = self.user_embed(users)

        output = self.decoder(encoder + user_embeddings)

        return output

JCA

其对模型的改变其实只是将I-AutoRec和U-AutoRec的预测结果取一个平均数,以达到两者兼顾。此外,还添加了一个基于item的可学习的正则化层。

模型如下所示:

对训练过程的第一个优化在于pointwise变为pairwise,也就是利用BPR或者metric learning中的一些思路。将目标函数转化为三元组的triplet loss.

即 minimize(max(0, ruj-rui+margin))

第二个优化是基于AutoRec的一个很明显的缺陷。即每个batch中都要将完整的multihot vector传入模型,这意味着模型的参数数量也会取决于user或item数量。一旦面对user和item数量都非常大的数据集,不仅显存或内存消耗过大,噪声也会非常显著。

JCA采取的办法是每个mini batch将整个rating_matrix划分成小的大小相等的方阵,使用滑窗采样的方式使得每个用户每个物品都会被取到。这种方法有些类似于卷积神经网络的卷积操作。

CDAE是在AutoRec上添加一定的去噪和更多的表示能力的算法,参加论文

JCA是2019年WWW会议上提出的比较新的算法,但其实对AutoRec的修改比较少,笔者认为其主要创新在于从训练方法上对AutoRec的优化,参见。

Collaborative Denoising Auto-Encoders for Top-N Recommender Systems
Improving Top-K Recommendation via Joint Collaborative Autoencoders
AutoRec: Autoencoders Meet Collaborative Filtering
AutoRec
JCA