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 提供支持
在本页
  • 基本概念
  • 康托洛维奇松弛
  • 应用
  • 图形处理中的应用
  • 推荐系统中的应用
  • 代码实现

这有帮助吗?

  1. MachineLearning

计算最佳传输

上一页NCF算法与简单MF的对比下一页CSS

最后更新于4年前

这有帮助吗?

最佳传输(Optimal Transport—)是一种广泛应用在多个交叉领域的问题。尤其是在计算机图形学、计算机视觉、医学图像处理以及深度学习等方面取得了显著效果。以法国数学家蒙日(Monge)在二百多年前给出的问题为例:当给定两个沙盘时(每盘沙子可以代表一个概率分布),可以通过很多方式将一个沙盘传输(Transport or Reshape)到另一个沙盘。基于传输单个沙粒的局部花费,每一种传输方法均对应一个全局花费。

在实际应用中,最佳传输最常见的应用是计算机视觉领域的图形匹配、图形检索、图形分类等算法研究中。

基本概念

以蒙日提出的问题,可以得到最佳传输问题的基本表示。假设a和b分别表示两个不同的离散分布。可以用概率值或者直方图的形式将这两个分布表示为数值向量,即:

传输就是从一个直方图a转移到另一个直方图b的方法。显然在这种情况下,无法定义何种方法最佳,因此引入一个形状为X*Y的矩阵c来表示每个位置x到位置y的运输代价。

而将ai传输给bj的代价是不同的。因此最佳传输问题就是要计算代价最小的转移映射。

可以将问题表示为如下公式:

其中x表示初始分布的位置,T是一个映射,将源位置映射到目标位置。alpha和beta表示源分布和目标分布的直方图。

蒙日问题的主要缺点是要找到这样的解,必须保证源分布和目标分布能够找到合适的分割方式。因为在这种设定下无法对初始的直方图中每个位置的权重进行分割。

用通俗的方法解释就是,只能将城市A的煤炭整个运到城市B,而不能一半分到城市B、一半分到城市C。

此外蒙日问题还被证明是非凸的,解决起来具有很大困难。

康托洛维奇松弛

康托洛维奇(Kantorovich)在上世纪40年代提出的一种松弛形式的最佳传输问题形式,在之后得到了很大发展。它将T映射转化成一个传输矩阵P。

传输矩阵P的每一个点Pij表示从位置i向位置j传输的份额。

同时P矩阵还必须满足,行求和等于alpha分布,列求和等于beta分布。用图的形式表示则是:

解决上述问题已经提出了不少算法。其中主要的一种是sinkhorn算法,表示为:

其中,先通过Cij的变幻计算K,然后再通过两个迭代公式,不断迭代u和v向量,直到收敛。最后通过

  • diag(u)K diag(v)

计算出最佳传输矩阵P。

应用

最佳传输问题的应用非常广泛。主要是因为其中的两个矩阵C和P可以根据需要赋予不同的意义。例如相似度、差异程度、距离矩阵等等。笔者目前有所涉及的是在图像和推荐中的应用。

图形处理中的应用

图形处理中主要用最佳传输来学习两张图像之间的匹配或者迁移关系。

CV中可以很轻易的通过常见的卷积神经网络将二维的像素点数据转化成一维的特征向量。然后很自然地就会使用两个图片的特征向量之间的相似程度构造出cost矩阵,从而得到一个最佳传输问题。

然后可以通过计算出的P进行一些分析。例如寻找一张图片中和另一张图片最为相关的部分,这可以用在人脸试别,OCR技术等。

推荐系统中的应用

推荐系统中的应用尚在探索中。但很容易就可以将cost矩阵和推荐领域常见的相似度矩阵、评分矩阵等结合起来。同时也可以利用物品的流行度等信息构造直方图。

最佳传输P矩阵则可以解释为用户对各个物品的喜好程度,从而作为推荐排序的依据。不过此方面的算法目前尚没有较好的成果出现,还需要研究人员的进一步优化和探索。

代码实现

代码实现方面主要谈些笔者在实验中遇到的问题。Python中目前已有最佳传输算法库POT存在。然而该库的代码水平只能作为参考,还不能成为scipy、sklearn那样具有较高权威性的算法实现。主要问题有:

  1. 虽然这个库可以让使用者通过ot.sinkhorn()这样简单的语句计算最佳传输,但是算法的效率较低,尤其是在矩阵尺寸较大情况下,时间消耗大,内存负载也很大。

  2. 与深度学习耦合度低。库中只有很少一些接口借助cupy实现了gpu运算,主要算法只能在cpu上计算,更不用说和传统深度学习框架结合进行反向传播等操作。

  3. 框架的整体鲁棒性较低。笔者在使用时常常出现由于输入的矩阵存在问题,或者正则化系数过小过大造成代码报错。但是POT库只会像报告warning那样报告一个“除以0错误”却不会详细给出解决方法。同时在github社区中也几乎搜索不到该框架的报错和解决方案。

综上还是建议参考该库自己实现OT算法,这样也方便对算法细节进行修改,或者将其并入已有模型中整体求导优化。

ot_a
ot_problem
kantorovich_relaxation
kantorovich
sinkhorn