SPARK liblinear库

1 篇文章 0 订阅

《原文链接Distributed liblinear 库

一、一些优化方法

截断牛顿方法,也称为无Hessian优化,[1]是一系列优化算法,用于优化具有大量自变量的非线性函数。截断牛顿方法包括重复应用迭代优化算法来近似求解牛顿方程,以确定对函数参数的更新。内部解算器被截断,即仅运行有限次数的迭代。由此得出,对于截断的牛顿方法,内部求解器需要在有限次迭代中产生良好的近似; [2] 共轭梯度已被建议并作为候选内循环进行评估。[1]另一个先决条件是内部算法的良好预处理。

来自 https://en.wikipedia.org/wiki/Truncated_Newton_method

信赖域算法是求解非线性优化问题的一种数值方法,收敛性较好。该算法在每次迭代时强制性地要求新的迭代点与当前的迭代点之间的距离不超过某一控制量. 引入控制步长是因为传统的线搜索方法常常由于步长过大而导致算法失败,特别是当问题是病态时. 控制步长实质上等价于在以当前迭代点为中心的一个邻域内对一个近似于原问题的简单模型求极值. 这种技巧可理解为只在一个邻域内对近似模型信赖,所以此邻域被称为信赖域(trust region)

来自 https://blog.csdn.net/kunlong0909/article/details/8796310

二、tips

efficient computation, communication and memory Usage

• Programming language:
◦ Loop structure
choose the while loop to implement
◦ Data encapsulation
The discussion is based
on two encapsulation implementations: the Class approach
(CA) and the Array approach (AA).

• Operations on RDD:
◦ Using mapPartitions rather than map
◦ Caching intermediate information or not
• Communication:
◦ Using broadcast variables
◦ The cost of the reduce function

如果使用一阶方法,通常使用SGD方法进行求解,涉及到梯度的计算,如果使用二阶方法,通常使用Newton方法进行求解,涉及到梯度和Hessian矩阵的计算,二阶的计算量较大,如果使用近似二阶的方法,通常是LBFGS,也涉及到梯度的计算,因此,LR算法的计算量都在梯度的计算上。而梯度计算通常是可以分开同时计算的

  1. Spark在哪里对LR算法进行了并行化?
    在计算全量样本的梯度时,是可以分开计算的,之后会对分开计算的梯度做聚合。因此在计算梯度的地方就是并行的地方。当然不只是梯度,损失也是同理。
  2. 如何并行化?
    Spark使用了RDD的treeAggregate方法对梯度和损失计算进行了并行计算,首先通过seqOp计算出每个RDD分区内的样本的梯度,之后combOp对所有的分区的结果做聚合,从而得到总体的梯度。

来自 https://blog.csdn.net/u011724402/article/details/79089257

mapPartition

可以倒过来理解,先partition,再把每个partition进行map函数,
适用场景
如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions要比map高效的过。

来自 https://blog.csdn.net/t1dmzks/article/details/71336119?utm_source=itdadao&utm_medium=referral

广播变量

广播变量允许编程人员在每台机器上保持1个只读的缓存变量,而不是传送变量的副本给tasks。
Spark actions通过步骤的集合进行执行,这个集合被分布式的“shuffle” operations分开来执行。在每个步骤中,Spark自动广播tasks所需的通用数据。这意味着,显式地创建广播变量,仅在当tasks跨多个步骤且需要同样的数据或者使用反序列化的缓存数据时显得非常重要。实例:

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

广播变量创建后,它可以运行在集群中的任何function上,而不需要多次传递给集群节点。另外需要记住,不应该修改广播变量,这样才能确保每个节点获取到的值都是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值