转载自:http://blog.csdn.net/u013166160/article/details/17539427

本文,讨论batch-gradient和stochastic gradient descent的并行化。

首先来看batch-gradient。batch-gradient的每次更新都要在整个训练集上计算获得。比如,logistic regression的更新公式为:

(1)
图片来自coursera上的《Machine Learning》截屏

因此若训练集很大(m很大),这种做法是十分耗时的。那何做到并行化呢?Andrew ng 在《Machine Learning》中便提到了机器学习的并行化:如果机器学习算法能表示成training set上函数的sum的形式(即上面公式),那么一个好的并行化选择是使用Map-reduce。一个Map-reduce job分两个阶段进行:map阶段和reduce阶段。因此可以将原本的sum公式(1)分解成几个小的sum公式,each由不同map task分别计算,最后由reduce task把map得到的结果进一步加和。

好,看来batch-gradient的并行化不是个很大的问题。但batch-gradient本身有缺陷:若机器学习算法(比如矩阵分解问题)面临的是一个非convex的算法,那么使用batch-gradient会使算法收敛很慢[2],并且很可能陷入局部最优解(local optimum)。因此,实际中使用的是SGD(Stochastic Gradient Descent)——随机梯度下降。SGD的主要思想是:不同于以往利用整个training set更新一次参数,SGD随机从training set 中挑选出一个样本进行更新,直到算法收敛。 [1]指出KDD Cup 2011(track 1)的前三名都使用了SGD。SGD有算法converge 快,不容易陷入局部最优解的优点。

但是SGD内在本身是序列化的,因而不容易并行化。但不是不能,基本思想是:若为选定的一个评分r_ij,算法对应要更新的用户feature向量p_i和物品feature向量q_j,也就确定了。因此,评分矩阵中,所有即不同行又不同列的评分都可以同时更新。台湾国立大学的团队提出了一种快速的基于内存共享的并行SGD算——FPSGD。根据评测,它超出了现有被认为最好的shared-memory SGD并行算法CCD++。[13]指出,以往的SGD并行化算法面临两个问题:①缓存命中率低和②等待问题。首先,缓存命中率低是由算法内在的随机选取引起的。而等待问题是由数据的imbalance引起的。比如评分预测问题中,有的用户评分多,有的用户评分少,因此整个评分矩阵是imbalanced的。若使用DSGD(详见[1]),则所有节点要等待最慢的那个节点处理完(“最慢”可能是因为它被分配的block是最密集的)。

针对问题②,可以在执行DSGD之前random shuffle整个评分矩阵。但作者不满意这样方法,它指出不同线程的执行时间还会有差异。于是作者提出给空闲线程分配任务的方法:将整个矩阵分成(s+1)×(s+1)块,让s个线程同时执行。这样一个线程处理完一个block之后,必定有其他的block是free的(free是指不与其他线程处理的block共享用户或物品feature向量)。算法则为其分配更新次数最少的free block——为了使所有block的更新次数都差不多。论文显示,这样的方法使DoI在a few iteration之接近zero。(见论文)。

针对问题①,作者提出了partial random method:即更新块的选择是随机,而块内的更新是有序的。同时为了增加随机性,算法将评分矩阵分成了比(s+1)×(s+1)更多的块。

最后值得指出的是,作者将改算法实现并开源了,enjoy!

参考文献:

[1] A Fast Parallel SGD for Matrix Factorization in Shared Memory Systems

[2] Efficient Top-N Recommendation for Very Large Scale Binary Rated Datasets

如何使基于梯度下降的机器学习并行化相关推荐

  1. 吴恩达机器学习(十四)推荐系统(基于梯度下降的协同过滤算法)

    目录 0. 前言 1. 基于内容的推荐算法(Content-based recommendations) 2. 计算电影特征 3. 基于梯度下降的协同过滤算法(Collaborative filter ...

  2. 基于梯度下降的变压器铁心柱横截面设计算法

    基于梯度下降的变压器铁心柱横截面设计算法 一.应用背景 二.实现思路 1.数学模型建立 2.梯度下降算法 三.实现代码 四.一点总结 一.应用背景 变压器铁心柱横截面通常为多级矩形,本算法旨在当给定铁 ...

  3. 机器学习--详解基于梯度下降的Logistic回归算法原理

    先给出Logistic回归的sigmod函数数学表达式: 很简单的表达式,再看看它的性质,当时,,因此 当时,,因此 Logistic回归之所以称为Logistic是因为只有两个状态即0和1,这也是数 ...

  4. 机器学习中为什么需要梯度下降_机器学习101:一文带你读懂梯度下降

    原标题 | Machine Learning 101: An Intuitive Introduction to Gradient Descent 作者 | Thalles Silva 译者 | 汪鹏 ...

  5. 机器学习中为什么需要梯度下降_机器学习,梯度下降算法,问题引入

    知乎视频​www.zhihu.com 今天讲解的内容是梯度下降算法. 梯度下降算法在机器学习中的应用十分广泛,该算法的最主要目的是通过迭代的方法找到目标函数的最小值,经常用来解决线性回归和逻辑回归等相 ...

  6. 3. 机器学习中为什么需要梯度下降_机器学习中一些模型为什么要对数据归一化?...

    一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释: 1)归一化后加快了梯度下降求最优解的速度 蓝 ...

  7. 机器学习中为什么需要梯度下降_机器学习 —— 多元梯度下降

    一.多维特征 前面所述的房价预测的线性模型,只用到了一维特征,即size,房屋尺寸,要用这个特征量来预测房屋价格: 当数据集的信息不止一种时,便有了多维特征,比如: 上图有四个X,即四个特征,来预测房 ...

  8. 多元函数梯度下降 java_机器学习知识点(五)梯度下降法Java实现

    梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代(步长)能使待优化的目标函数逐步减小.梯度下降法是2范数下的最速下降法,用来求解函数的最小值,无约束优化. 看数学定义都晦涩,网 ...

  9. 吴恩达机器学习之逻辑回归:逻辑回归的假说表示、判定边界、代价函数、简化的成本函数和梯度下降、高级悠哈、多类别分类之一对多(详细笔记,建议收藏,已有专栏)

    吴恩达机器学习栏目清单 专栏直达:https://blog.csdn.net/qq_35456045/category_9762715.html 文章目录 6.逻辑回归(Logistic Regres ...

最新文章

  1. Hadoop 伪分布式 配置文件详情
  2. 微软算法面试题(2)
  3. Atitit.dart语言的特性  编译时js语言大总结
  4. c ringbuffer 源码_Python Ring Buffer的实现
  5. 中国知网 博硕士论文 PDF下载 及书签自动生成
  6. matlab自适应高斯核
  7. 【黑苹果教程】说点闲话
  8. 关于then()方法的理解
  9. 一文详解bundle adjustment
  10. 百度将严厉打击熊掌号发布大量与号领域不匹配的内容
  11. utools:比everything更好用的集成工具
  12. php+剧影评系统 毕业设计-附源码140859
  13. Java怎么顺序 或 逆序排序数组
  14. appuim+python+MUMU模拟器连接方法
  15. Java开发常用英语单词表
  16. php 5.3.1 preg_quote
  17. 锂离子电池热失控预警资料整理(一)
  18. 使用天意upan工具 slitaz备份ubuntu
  19. python爬取酷狗音乐排行榜
  20. matlab编写识别手写数字_MATLAB--数字图像处理 车牌识别之简易识别程序

热门文章

  1. Android系统启动流程源码分析
  2. 零基础编译ffmpeg到wasm
  3. android之sqlite操作
  4. linux服务器知识学习:linux简介与linux的发行版
  5. matlab 子函数句柄,matlab-函数句柄程序.ppt
  6. 接收二进制数据_漫话TCP/IP:数据链路层-以太网(1)
  7. python dlib gpu ubuntu conda_Ubuntu 下编译支持 GPU 的 TensorFlow 和 Dlib
  8. excelexportentity中设置null不显示的方法_如何在 Creator3D 中切换模型贴图,超级简单!...
  9. 选中一行的快捷键_常用文字编辑快捷键,学会之后,天天可以提前下班
  10. python按位处理二进制文件_对如何在python shell中对16位二进制数执行按位运算感到困惑...