在可预见的未来,数据的增长速度仍会大幅超过计算机性能进步的速度。在处理大数据时,需要将很多台计算机联结起来组成一个巨大的分布式计算集群,将收集到的数据分散地存储在这些机器上。
如果每台机器上独立地运行梯度下降法,是可以得到一系列“临时”的参数估计值,但根据这些临时的估计值,我们无法得到正确的参数估值。因此,机器学习的分布式实现并不是那么直接,需要更加精细的分析和设计。
Spark
Spark是由Scala开发的第三方工具包,Spark的python API有个专有名字叫PySpark,基于spark,我们可以很方便地在分布式系统里清洗数据,提取特征和搭建模型。涉及到流式实时计算、ETL(数据仓库技术)、机器学习等。
从MapReduce到spark
纯技术角度讲,大数据涉及两个方面,分布式存储和分布式计算框架,前者的理论基础是谷歌文件系统(GoogleFS),后者的理论基础是MapReduce。
MapReduce里的map步骤是在不同机器上独立且同步运行的,它的主要目的是将数据转换为key-value的形式;而reduce步骤是做聚合运算,它也是在不同机器上独立且同步运行的。map和reduce夹杂着一步数据移动,即shuffle,这步操作会涉及数量巨大的网络传输(network I/O),需要消耗大量时间。spark改进这一点,在训练时将数据存放在内存里,算法性能大幅提高,也称为内存运算。
运行spark
两种运行方式:本地运行模型和集群运行模式,由参数“--master”控制。
spark dataframe
spark dataframe的读写
sparksession类是运行spark dataframe的基础
创建dataframe的方法有三种:读取特定格式的数据(json,parquet);读取数据库里的数据;将本地Python内的数据转成dataframe。
保存方法有两种:将数据保存为特定格式的数据;将数据保存到外部数据库,如HIVE
spark dataframe的操作
- 选择数据中的一列或多列
- 在已有dataframe基础上增加一列(withcolumn)
- 对dataframe里的数据筛选(filter)
- 对数据做聚合运算(min,max)
- spark的运行架构
spark将机器分为两类driver和executor
- 一个spark程序只有一个driver,其他都是executor
- pyspark里不仅有JVM进程还有Python进程
- 当pyspark脚本提交driver后,driver上的Python进程会将代码中需要分步执行的部分编码后传给JVM
- JVM将需要分布执行的任务分发给各executor,并监控运行情况
- executor会根据任务的具体内容决定在哪里执行相应的运算,JVM或python 进程
最优化问题的分布式解法
分布式机器学习的原理
绝大多数的机器学习模型,损失函数都可以写成和的形式,根据梯度下降法的迭代公式为
将梯度下降法用分布式计算框架MapReduce实现
- map将第i个数据转换为单点损失梯度
- reduce将map的结果进行加和
- MapReduce运算完成以后,用得到的结果去更新参数估计值,并进入下一步迭代。
大数据模型的两个维度
数据量维度:数据集很大,只能依靠集群的力量分布式训练
模型数量维度:需要训练的模型数量很多,每个模型都比较“小”(模型超参数调试)
开源工具的弱点
使用开源工具时,是使用者为所用工具的准确性负责。