diff --git a/docs/algo/gbdt_on_angel.md b/docs/algo/gbdt_on_angel.md index 05e9f3e1c..7cacd76d5 100644 --- a/docs/algo/gbdt_on_angel.md +++ b/docs/algo/gbdt_on_angel.md @@ -1,27 +1,28 @@ # GBDT on Angel -**GBDT(Gradient Boosting Decision Tree):梯度提升决策树 [1][2]**,是一种集成使用多个弱分类器(决策树)来提升分类效果的机器学习算法,在很多分类和回归的场景中,都有不错的效果。 +> **GBDT(Gradient Boosting Decision Tree):梯度提升决策树 [1][2]**,是一种集成使用多个弱分类器(决策树)来提升分类效果的机器学习算法,在很多分类和回归的场景中,都有不错的效果。 -## 算法场景 +## 1. 算法介绍 ![fileUsersandyyehooDocumentsMy20Work201703Angel开源文档GBDT-on-Angelgbdt-on-angel-1.png](/tdw/angel/uploads/A54C332C8CA44EF181B7B0E6854B9228/fileUsersandyyehooDocumentsMy20Work201703Angel开源文档GBDT-on-Angelgbdt-on-angel-1.png) 如图1所示,这是是对一群消费者的消费力进行预测的例子。简单来说,处理流程为: - 1. 在第一棵树中,根节点选取的特征是年龄,年龄小于30的被分为左子节点,年龄大于30的被分为右叶子节点,右叶子节点的预测值为1; - 2. 第一棵树的左一节点继续分裂,分裂特征是月薪,小于10K划分为左叶子节点,预测值为5;工资大于10k的划分右叶子节点,预测值为10 - 2. 建立完第一棵树之后,C、D和E的预测值被更新为1,A为5,B为10 - 3. 根据新的预测值,开始建立第二棵树,第二棵树的根节点的性别,女性预测值为0.5,男性预测值为1.5 - 4. 建立完第二棵树之后,将第二棵树的预测值加到每个消费者已有的预测值上,比如A的预测值为两棵树的预测值之和:5+0.5=5.5 - 5. 通过这种方式,不断地优化预测准确率。 +1. 在第一棵树中,根节点选取的特征是年龄,年龄小于30的被分为左子节点,年龄大于30的被分为右叶子节点,右叶子节点的预测值为1; +2. 第一棵树的左一节点继续分裂,分裂特征是月薪,小于10K划分为左叶子节点,预测值为5;工资大于10k的划分右叶子节点,预测值为10 +2. 建立完第一棵树之后,C、D和E的预测值被更新为1,A为5,B为10 +3. 根据新的预测值,开始建立第二棵树,第二棵树的根节点的性别,女性预测值为0.5,男性预测值为1.5 +4. 建立完第二棵树之后,将第二棵树的预测值加到每个消费者已有的预测值上,比如A的预测值为两棵树的预测值之和:5+0.5=5.5 +5. 通过这种方式,不断地优化预测准确率。 -## **实现逻辑** -### 1. 参数存储 -![fileUsersandyyehooDocumentsMy20Work201703Angel开源文档GBDT-on-Angelgbdt-on-angel-2.png](/tdw/angel/uploads/1F19EF3B9ABD49BBBAC2D8CF4D71EDC3/fileUsersandyyehooDocumentsMy20Work201703Angel开源文档GBDT-on-Angelgbdt-on-angel-2.png) +## 2. 分布式实现 on Angel + +--- +### 1. 参数存储 如图2所示,为了优化算法性能,在参数服务器上,需要存储如下几个参数矩阵,包括: @@ -61,10 +62,7 @@ GBDT的流程包括几大步骤 4. **分裂树节点:** PS并将分裂特征、分裂特征值和目标函数增益返回给Workder。Worker根据计算得到的最佳分裂点,创建叶子节点,将本节点的训练数据切分到两个叶子节点上。如果树的高度没有达到最大限制,则将两个叶子节点加入到待处理树节点的队列。 ![fileUsersandyyehooDocumentsMy20Work201703Angel开源文档GBDT-on-Angelgbdt-on-angel-4.png](/tdw/angel/uploads/F93D941F7E6C4779A7E3F69E215A3EEE/fileUsersandyyehooDocumentsMy20Work201703Angel开源文档GBDT-on-Angelgbdt-on-angel-4.png) - - -### 4. Angel的优势 - + 从上面的算法逻辑剖析可以看出,GBDT这个算法,存在这大量的模型更新和同步操作,非常适合PS和Angel。具体来说,包括: @@ -75,5 +73,11 @@ GBDT的流程包括几大步骤 3. **分布式训练:**最佳决策分裂点的技术,可以在多个PS服务器节点上并行进行,然后再同步给Worker,互不干扰 整体来看,Angel的PS优势,使得它在这个算法上,性能远远超越了Spark版本的GBDT实现,而和MPI版本的xgBoost也略胜一筹。 + +## 3. 运行 & 性能 + +### 输入格式 +### 参数 +### 性能 diff --git a/docs/algo/kmeans_on_angel.md b/docs/algo/kmeans_on_angel.md index 78df78d08..29dd8050b 100644 --- a/docs/algo/kmeans_on_angel.md +++ b/docs/algo/kmeans_on_angel.md @@ -1,6 +1,10 @@ # KMeans -## KMeans算法 -KMeans是一种简单的聚类算法,将数据集划分为多个簇,K为簇的个数,是一个提前设定的值。每个样本被划分到距离最近的簇。每个簇所有样本的几何中心为这个簇的簇心,样本到簇心的距离为样本到簇的距离。Kmeans算法一般以迭代的方式训练,如下所示: + +> KMeans是一种简单的聚类算法,将数据集划分为多个簇,K为簇的个数。传统的KMeans算法,有一定的性能瓶颈,通过PS实现的KMeans,在准确率一致的情况下,性能更佳。 + +## 1. 算法介绍 + +每个样本被划分到距离最近的簇。每个簇所有样本的几何中心为这个簇的簇心,样本到簇心的距离为样本到簇的距离。Kmeans算法一般以迭代的方式训练,如下所示:
![image.png](/tdw/angel/uploads/89523DACE2E547E385C1797297714B35/image.png)
其中:![xi.gif](/tdw/angel/uploads/574113621AFC4E36A47AEAB98DD66A58/xi.gif)代表第i个样本,![ci.gif](/tdw/angel/uploads/E809FF8E555442719B551C778935A579/ci.gif)代表与第i个样本距离最近的簇,![miui.gif](/tdw/angel/uploads/D080E78FD43346D7A698C9CFF7458F33/miui.gif)代表第j个簇的簇心。 @@ -9,16 +13,24 @@ KMeans是一种简单的聚类算法,将数据集划分为多个簇,K为簇 "Web-Scale K-Means Clustering"提出一种在朴素KMeans算法基础上改进的KMeans算法,用mini-batch方法训练,每次迭代选择一个mini-batch的样本更新簇心,如下所示:
![minibatchkmeans.png](/tdw/angel/uploads/9EDED211A2444A85913D7A6CF302A2E5/minibatchkmeans.png)
-## KMeans on Angel +## 2. 分布式实现 on Angel + ### 模型存储 Angel实现的KMeans算法将K个簇心存储在ParameterServer上,用一个K×N维的矩阵表示,其中:K为簇心的个数,N为数据的维度,即特征的个数。 + ### 模型更新 KMeans on Angel以迭代的方式训练,每次训练以上文提到的mini-batch KMeans算法更新簇心。 + ### 算法逻辑 KMeans on Angel的算法流程如下图所示:
![KMeansonAngel.png](/tdw/angel/uploads/6D56A5EAC512408DB980F8B53DB26B3B/KMeansonAngel.png)
-### 参数 -输入输出参数 + + +## 3. 运行 & 性能 + +### 输入格式 + +### 参数 * IO参数 * angel.train.data.path:输入数据路径 * ml.feature.num:数据特征个数 @@ -29,3 +41,5 @@ KMeans on Angel的算法流程如下图所示: * ml.kmeans.center.num:K值,即簇的个数 * ml.kmeans.sample.ratio.perbath:每次迭代选择mini-batch样本的采样率 * ml.kmeans.c:学习速率参数 + +### 性能 diff --git a/docs/algo/lda_on_angel.md b/docs/algo/lda_on_angel.md index 63f98ec7e..698d63765 100644 --- a/docs/algo/lda_on_angel.md +++ b/docs/algo/lda_on_angel.md @@ -1,8 +1,12 @@ -# Latent Dirichlet Allocation +# LDA(Latent Dirichlet Allocation) +> LDA是一种常见的主题模型算法。简单来说它是一个贝叶斯概率生成模型,用于对文档集进行降维或者潜在语义分析。 -## LDA 模型 -LDA是一个贝叶斯概率生成模型,用于对文档集进行降维或者潜在语义分析。 + + +## 1. 算法介绍 + +### 整体说明 给定一个语料库``$ C $``,该语料库由一系列文档`` $ \{D_1, \cdots, D_{M}\} $``构成。 每个文档``$ D_i $`` 则由一个序列的词构成,``$ D_i = (t_1, t_2, \cdots, t_{N_i}) $``。 语料库中的词整体构成了一个词汇表``$ V $``。 @@ -18,7 +22,7 @@ LDA模型对每个文档的生成过程进行了建模。 中采样出该词的话题``$ z_{dn} $``, 然后再从多项分布``$ Mult(\phi_{z_{dn}}) $``中采样出单词``$ w_{dn} \in V $``。 -## Gibbs Sampling +### Gibbs Sampling 求解LDA模型的过程通常使用Gibbs Sampling方法,通过采样出大量符合后验分布的样本``$ z_{dn} $``, 从而对每个文档的话题分布和话题的词分布进行估计估计。 目前对LDA的Gibbs Sampling方法有大概6中,包括Collapsed Gibbs Sampling(CGS),SparseLDA, @@ -48,7 +52,8 @@ F+LDA通过将概率公式进行了分解成两部分``$ C_{dk} \frac{C_{wk} + \ 对于另一个部分,F+LDA采用F+树来进行查找,可以将复杂度降低到O(logK)。 从而F+LDA的复杂度为``$ O(K_d) $``,``$ K_d $``是文档-话题矩阵中非零元素的个数。 -## 分布式训练 +## 2. 分布式训练 on Angel + 在Angel中进行LDA模型的训练,整体的框架如下图所示。 对于LDA模型中的两个较大的矩阵``$ C_w $``和``$ C_d $``, 我们将C_d矩阵划分到不同的worker上,将C_w矩阵划分到不同的server上。 @@ -57,7 +62,17 @@ F+LDA通过将概率公式进行了分解成两部分``$ C_{dk} \frac{C_{wk} + \ ![Architecture for LDA on Angel](../img/lda_ps.png) -## 参数和数据格式 +## 3. 运行 & 性能 + +### 输入格式 + +输入数据分为多行,每行是一个文档,每个文档由一系列的词id构成,词id之间由空格隔开 + +```math + wid_0, wid_1, ..., wid_n +``` + +### 参数 * 数据参数 * angel.train.data.path: 输入数据路径 @@ -68,7 +83,5 @@ F+LDA通过将概率公式进行了分解成两部分``$ C_{dk} \frac{C_{wk} + \ * angel.lda.topic.num:话题个数 * angel.lda.worker.parallel.num:worker内部并行度 -输入数据分为多行,每行是一个文档,每个文档由一系列的词id构成,词id之间由空格隔开 -```math -wid_0, wid_1, ..., wid_n -``` \ No newline at end of file +### 性能 + diff --git a/docs/algo/lr_on_angel.md b/docs/algo/lr_on_angel.md index 4d447a1cf..1c7a685f7 100644 --- a/docs/algo/lr_on_angel.md +++ b/docs/algo/lr_on_angel.md @@ -1,5 +1,9 @@ -# LogisticRegression -## 逻辑回归模型 +# LogisticRegression + +> 逻辑回归模型(logistic regression model)是一种分类模型。它是最常见和常用的一种分类方法,在传统的广告推荐中被大量使用,朴实但有效。 + +## 1. 算法介绍 + 逻辑回归模型(logistic regression model)是一种分类模型。样本x属于类别y的概率P(y|x)服从logistic分布:
![](http://i.imgur.com/5UZuenh.gif)
综合两种情况,有: @@ -8,12 +12,36 @@
![3.png](/tdw/angel/uploads/3A11081478244509AFB192FBC8C19283/3.png)
其中:![](http://i.imgur.com/c0AJnPE.gif) 为L2正则项。 -## Gradient Descent LR on Angel +## 2. 分布式实现 on Angel + Angel MLLib提供了用mini-batch gradient descent优化方法求解的Logistic Regression算法,算法逻辑如下 -
![sgdCode.png](/tdw/angel/uploads/9875CF7F229C478BBB5CEB366B33E83E/sgdCode.png)
-学习速率在迭代过程中衰减,其中N为迭代次数,α为衰减系数,T为迭代次数:![6.gif](/tdw/angel/uploads/D31BABAED76C49C0B69D9C0C8FAB38FC/6.gif)。 +
![sgdCode.png](/tdw/angel/uploads/9875CF7F229C478BBB5CEB366B33E83E/sgdCode.png)
+ +学习速率在迭代过程中衰减,其中 + +* N为迭代次数 +* α为衰减系数 +* T为迭代次数 + +![6.gif](/tdw/angel/uploads/D31BABAED76C49C0B69D9C0C8FAB38FC/6.gif) -### Gradient Descent LR 参数 +## 3. 运行 & 性能 + +### 输入格式 + +数据的格式通过“ml.data.type”参数设置;数据特征的个数,即特征向量的维度通过参数“ml.feature.num”设置。 + +LR on Angel支持“libsvm”、“dummy”两种数据格式,分别如下所示: + +* **dummy格式** + +每行文本表示一个样本,每个样本的格式为"y index1 index2 index3 ..."。其中:index特征的ID;训练数据的y为样本的类别,可以取1、-1两个值;预测数据的y为样本的ID值。比如,属于正类的样本[2.0, 3.1, 0.0, 0.0, -1, 2.2]的文本表示为“1 0 1 4 5”,其中“1”为类别,“0 1 4 5”表示特征向量的第0、1、4、5个维度的值不为0。同理,属于负类的样本[2.0, 0.0, 0.1, 0.0, 0.0, 0.0]被表示为“-1 0 2”。 + + * **libsvm格式** + +每行文本表示一个样本,每个样本的格式为"y index1:value1 index2:value1 index3:value3 ..."。其中:index为特征的ID,value为对应的特征值;训练数据的y为样本的类别,可以取1、-1两个值;预测数据的y为样本的ID值。比如,属于正类的样本[2.0, 3.1, 0.0, 0.0, -1, 2.2]的文本表示为“1 0:2.0 1:3.1 4:-1 5:2.2”,其中“1”为类别,"0:2.0"表示第0个特征的值为2.0。同理,属于负类的样本[2.0, 0.0, 0.1, 0.0, 0.0, 0.0]被表示为“-1 0:2.0 2:0.1”。 + +### 参数 * 算法参数 * ml.epochnum:迭代次数 * ml.batch.sample.ratio:每次迭代的样本采样率 @@ -23,16 +51,7 @@ Angel MLLib提供了用mini-batch gradient descent优化方法求解的Logistic * ml.learn.decay:学习速率衰减系数 * ml.reg.l2:L2惩罚项系数 -## ADMM LR on Angel -## 其它 -* 数据格式 - 数据的格式通过“ml.data.type”参数设置;数据特征的个数,即特征向量的维度通过参数“ml.feature.num”设置。 -LR on Angel支持“libsvm”、“dummy”两种数据格式,分别如下所示: - * dummy格式: - 每行文本表示一个样本,每个样本的格式为"y index1 index2 index3 ..."。其中:index特征的ID;训练数据的y为样本的类别,可以取1、-1两个值;预测数据的y为样本的ID值。比如,属于正类的样本[2.0, 3.1, 0.0, 0.0, -1, 2.2]的文本表示为“1 0 1 4 5”,其中“1”为类别,“0 1 4 5”表示特征向量的第0、1、4、5个维度的值不为0。同理,属于负类的样本[2.0, 0.0, 0.1, 0.0, 0.0, 0.0]被表示为“-1 0 2”。 - * libsvm格式: - 每行文本表示一个样本,每个样本的格式为"y index1:value1 index2:value1 index3:value3 ..."。其中:index为特征的ID,value为对应的特征值;训练数据的y为样本的类别,可以取1、-1两个值;预测数据的y为样本的ID值。比如,属于正类的样本[2.0, 3.1, 0.0, 0.0, -1, 2.2]的文本表示为“1 0:2.0 1:3.1 4:-1 5:2.2”,其中“1”为类别,"0:2.0"表示第0个特征的值为2.0。同理,属于负类的样本[2.0, 0.0, 0.1, 0.0, 0.0, 0.0]被表示为“-1 0:2.0 2:0.1”。 * 输入输出参数 * angel.train.data.path:输入数据路径 @@ -47,10 +66,9 @@ LR on Angel支持“libsvm”、“dummy”两种数据格式,分别如下所 * angel.worker.task.number:每个Worker上的task的个数,默认为1 * angel.ps.number:PS个数 * angel.ps.memory.mb:PS申请内存大小! - -* 其它参数配置 - * 模型输出路径删除: - 为了防止误删除模型,Angel默认不自动删除模型输出路径的文件。如果需要删除,要在Angel参数框内填入angel.output.path.deleteonexist=true + + +### 性能 diff --git a/docs/algo/mf_on_angel.md b/docs/algo/mf_on_angel.md index f2c2f17ce..06f161124 100644 --- a/docs/algo/mf_on_angel.md +++ b/docs/algo/mf_on_angel.md @@ -1,6 +1,12 @@ # Matrix Factorization -## Matrix Factorizaiton模型 -Matrix Factorizaiton是推荐系统中常用的一种矩阵分解的算法,为表示方便简称为MF。MF的主要思想是把用户、商品的特征抽象为k维向量表示。 + +> Matrix Factorizaiton是推荐系统中常用的一种矩阵分解的算法,为表示方便简称为MF。它是一种在推荐系统中,非常常用的算法。 + +## 1. 算法介绍 +--- + +MF的主要思想是把用户、商品的特征抽象为k维向量表示。 + 用户-商品评分矩阵(简称评分矩阵),是推荐系统中常用的数据表示方法,用一个矩阵表示用户对商品的打分。矩阵的每行代表一个用户,每列代表一个商品,每个元素代表对应用户对商品的评分,如图一所示。在大多数情况下商品数量巨大,每个用户只对极小部分商品有评分,所以评分矩阵一般非常稀疏,即评分矩阵中的绝大多数元素为0。MF算法把评分矩阵分解为用户-特征矩阵(简称用户矩阵)和特征-商品矩阵(简称商品矩阵)。
![1.png](/tdw/angel/uploads/41EFDBCC6F0548E1BA4240118A989355/1.png)
设数据集有M个用户,N个商品:评分矩阵用Y表示,Y的维度为:M×N,![yij.png](/tdw/angel/uploads/5303BCB37772422C965811336815E717/yij.png)表示第i个用户对第j个商品的评分;MF算法把评分矩阵Y分解为用户矩阵U和商品矩阵V的乘积,U的维度为M×k,每一行代表一个用户![ui.png](/tdw/angel/uploads/007ACE90A9AB4F3CA89D94F239953F17/ui.png),![ui.png](/tdw/angel/uploads/007ACE90A9AB4F3CA89D94F239953F17/ui.png)是一个k维特征向量;V的维度为k×N,每一列代表一个商品![vj.png](/tdw/angel/uploads/49109016B0C943A38B99FF6D2DD730B7/vj.png), ![vj.png](/tdw/angel/uploads/49109016B0C943A38B99FF6D2DD730B7/vj.png)是一个k维特征向量;k是MF算法指定的值,代表特征向量的维度。我们以用户向量![ui.png](/tdw/angel/uploads/007ACE90A9AB4F3CA89D94F239953F17/ui.png)和商品向量![vj.png](/tdw/angel/uploads/49109016B0C943A38B99FF6D2DD730B7/vj.png)的乘积作为用户i对商品j评分的预测值,记为![yij.png](/tdw/angel/uploads/5303BCB37772422C965811336815E717/yij.png)。 @@ -18,29 +24,49 @@ MF算法的学习目标是最小化预测评分与真实评分之间的差距:
![updateu.png](/tdw/angel/uploads/ED34DF3E8EDE443DA78EF8DAC1AD3177/updateu.png)
![update_v.png](/tdw/angel/uploads/C8ECE56829D641159476ECA86DF9791A/update_v.png)
-## Matrix Factorization on Angel - +## 2. 分布式实现 on Angel +--- ### 模型存储 * 商品矩阵存放在PS,用户矩阵存放在Worker,PS和Worker间传输商品矩阵V即可,不需要传输用户矩阵U。 * 由用户向量的更新公式可知,用户向量的计算只和这个用户的评分数据有关,用户间相互独立,因此我们把用户矩阵U按照用户切分成多个子块存储在多个Worker,每个Worker只计算自己训练数据相关的用户的向量,记为:U-part,维度是:这个Worker分配到的用户数×k。 ### 模型计算 Angel用梯度下降法学习MF模型,为了减少计算量和网络通信、提高计算效率,对算法做了以下设计: + * 因为商品向量的计算只和对它的评分相关,Worker上的训练数据可能只包含商品集合中的一部分商品的评分信息,这个Worker只能计算出这部分商品向量的梯度值,对无评分的商品计算的梯度值永远等于0,所以每次迭代只从PS拉取有评分的商品的向量即可,是整个商品矩阵的一个子集,记为V-sub矩阵。 + * 当商品数量很大且k是一个比较大的值时,V-sub矩阵仍然可能超过了单个Worker的内存,而商品向量之间的更新相互独立,所以我们设计分批更新V-sub矩阵。每次迭代分成多个批计算,每批只从PS获取V-sub的一部分,用这部分商品向量更新Worker的用户矩阵,计算这部分商品向量的更新值推送给PS。 +
![计算.png](/tdw/angel/uploads/6B5AE537F6BA46FA9443EBDABCBA3A92/计算.png)
### 算法逻辑 + Matrix Factorization on Angel的算法逻辑如下所示:
![code.png](/tdw/angel/uploads/A5D331880D334CD49174D563BE0FE020/code.png)
-## 其它 -### 数据格式 -训练数据的格式为“用户ID,商品ID:评分,…,商品:评分”,一个用户的所有评分存储在一行。如下图所示:ID为0的用户对ID为1、66、99、1001的商品评分分别为4、2、4、1;ID为1的用户对ID为77的商品评分为3 + +## 3. 运行 & 性能 + +--- + +### 输入格式 + +MF训练数据的格式: + +``` + 用户ID,商品ID:评分,…,商品:评分 +``` + +一个用户的所有评分存储在一行。 + +如下图所示: + +* ID为0的用户对ID为1、66、99、1001的商品评分分别为4、2、4、1 +* ID为1的用户对ID为77的商品评分为3
![data.png](/tdw/angel/uploads/D9458B653F7D4F47AA506CC9F9EAFF6C/data.png)
### 参数 -* 算法IO参数 +* IO参数 * angel.train.data.path:输入数据路径 * angel.save.modelPath:商品特征矩阵保存路径 * angel.ml.mf.usermodel.output:用户特征矩阵保存路径 @@ -51,3 +77,6 @@ Matrix Factorization on Angel的算法逻辑如下所示: * ml.mf.lambda:正则化系数 * ml.mf.eta:学习速率 * ml.mf.row.batch.num:每次迭代的batch数 + + +### 性能对比 \ No newline at end of file diff --git a/docs/algo/svm_on_angel.md b/docs/algo/svm_on_angel.md index 16368f93d..8a03d3a72 100644 --- a/docs/algo/svm_on_angel.md +++ b/docs/algo/svm_on_angel.md @@ -1 +1,11 @@ -# Support Vector Machine(SVM) \ No newline at end of file +# Support Vector Machine(SVM) + +> 算法简要介绍 + +## 1. 算法介绍 +## 2. 分布式实现 on Angel +## 3. 运行 & 性能 + +### 输入格式 +### 参数 +### 性能