artificial neural network in spark MLLib
神经网络模型
每个node包含两种操作:线性变换(仿射变换)和激发函数(activation function)。
其中仿射变换是通用的,而激发函数可以很多种,如下图。
MLLib中实现ANN
使用两层(Layer)来对应模型中的一层:
- AffineLayer 仿射变换: output = W · input + b
- 如果是最后一层,使用
SoftmaxLayerWithCrossEntropyLoss
或者SigmoidLayerWithSquaredError
;如果是中间层,则使用functionalLayer(new SigmoidFunction())
. 目前MLlib只支持sigmoid函数,实际上ReLU激发函数更普遍
BP算法计算Gradient的四个步骤:
对照BP算法的步骤,可以发现分隔成Affine和Activation的好处。BP1和BP2中的计算,不同的activation函数有不同的计算形式,将affine变换和activation函数解耦方便组合,进而方便形成各种类型的神经网络。
MLLib FeedForward Trainer
训练器重要模块如下:
ANN模型中每层对应AffineLayer
+ FunctionalLayerModel
OR SofrmaxLayerModelWIthCrossEntropyLoss
每个LayerModel实现三个函数:eval
, computePrevDelta
, grad
, 作为输出层的SoftmaxLayerModel有些特殊,额外具有LossFunction
特性。
可验证affine+activation LayerModel的计算组合跟BP1-4一致。
AffineLayerModel (仿射变换层)
eval
\(\text{output} = W \cdot \text{input} + b\)computePrevDelta
\(prev\delta = W * \delta\)grad
$\dot{W} = input \cdot \delta^l / \text{data size} $
input is \(a^{l-1}\),前一层的激发函数输出
\(\dot{b} = \delta^l / \text{data size}\)
FunctionalLayerModel(activate function \(\sigma\))
作为affineModel的activation model,只影响prev\(\delta\) 的计算,grad不计算
eval
\(\text{output} = \sigma (\text{input})\)computePrevDelta
\(\delta :=\delta * \sigma'(\text{input})\)grad
pass
SoftmaxLayerModelWithCrossEntropyLoss
作为最后一层激发函数,这一层很特殊。
eval
计算参见手写公式。computePrevDelta
不计算grad
不计算loss
计算\(\delta^L\),公式推导参见手写公式,代码如下:
ApplyInPlace(output, target, delta, (o: Double, t: Double) => o - t)
返回loss
Softmax输出层的激发函数:
\(a^L_j = \frac{e^{z^L_j}}{\sum_k e^{z^L_k}}\)
计算BP1:\(\delta^L_j = a^L_j -y_j\)
训练mnist手写数字识别
import org.apache.spark.ml.classification.MultilayerPerceptronClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
object ann extends App {
val spark = SparkSession
.builder
.appName("ANN for MNIST")
.master("local[3]")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
import spark.implicits._
// Load the data stored in text as a DataFrame.
val dataRdd: DataFrame= spark.sparkContext.textFile("handson-ml/data/train.csv")
.map {
line =>
val linesp = line.split(",")
val linespDouble = linesp.map(f => f.toDouble)
(linespDouble.head, Vectors.dense(linespDouble.takeRight(linespDouble.length - 1)))
}.toDF("label","features")
val data = dataRdd
// Split the data into train and test
val splits: Array[DataFrame] = data.randomSplit(Array(0.6, 0.4), seed = 1234L)
val train: Dataset[Row] = splits(0)
val test: Dataset[Row] = splits(1)
val layers = Array[Int](28*28, 300, 100, 10)
// create the trainer and set its parameters
val trainer = new MultilayerPerceptronClassifier()
.setLayers(layers)
.setBlockSize(128)
.setSeed(1234L)
.setMaxIter(100)
.setLabelCol("label")
.setFeaturesCol("features")
// train the model
val model = trainer.fit(train)
// compute accuracy on the test set
val result = model.transform(test)
val predictionAndLabels = result.select("prediction", "label")
val evaluator = new MulticlassClassificationEvaluator()
.setMetricName("accuracy")
println("Test set accuracy = " + evaluator.evaluate(predictionAndLabels))
}
后记
测试集结果精度为96.68%。实际上并不高,同样的数据集使用TensorFlow训练,activation function选择ReLU,同样使用Softmax作为输出,结果可以达到98%以上。Sigmoid函数容易带来vanishing gradients问题,导致学习曲线变平。
artificial neural network in spark MLLib的更多相关文章
- 人工神经网络 Artificial Neural Network
2017-12-18 23:42:33 一.什么是深度学习 深度学习(deep neural network)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高 ...
- 吴恩达深度学习第1课第4周-任意层人工神经网络(Artificial Neural Network,即ANN)(向量化)手写推导过程(我觉得已经很详细了)
学习了吴恩达老师深度学习工程师第一门课,受益匪浅,尤其是吴老师所用的符号系统,准确且易区分. 遵循吴老师的符号系统,我对任意层神经网络模型进行了详细的推导,形成笔记. 有人说推导任意层MLP很容易,我 ...
- Neural Network and Artificial Neural Network
神经网络的基本单元为神经元neuron,也称为process unit,可以做一些基本的运算操作. 人脑和动物大脑的发育,依赖于经验的积累和学习.神经网络就是一个用来仿照人脑进行学习的机器,其包含 ...
- What is “Neural Network”
Modern neuroscientists often discuss the brain as a type of computer. Neural networks aim to do the ...
- 论文笔记系列-Neural Network Search :A Survey
论文笔记系列-Neural Network Search :A Survey 论文 笔记 NAS automl survey review reinforcement learning Bayesia ...
- 机器学习之Artificial Neural Networks
人类通过模仿自然界中的生物,已经发明了很多东西,比如飞机,就是模仿鸟翼,但最终,这些东西会和原来的东西有些许差异,artificial neural networks (ANNs)就是模仿动物大脑的神 ...
- Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1
3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 ...
- Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2
3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 ...
- Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.3
3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.3 http://blog.csdn.net/sunbow0 ...
随机推荐
- django数据库多对多修改对应关系
obj = models.Book.objects.get(id=1) #添加对应关系,给书添加作者# obj.m.add(3)# obj.m.add(2,4)# obj.m.add(*[1,2,3, ...
- Spring ApplicationContext(六)BeanPostProcessor
Spring ApplicationContext(六)BeanPostProcessor 产生回顾一下 ApplicationContext 初始化的几个步骤:第一步是刷新环境变量:第二步是刷新 b ...
- Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器
一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...
- IOS 小新兵
2017-07-02 lipo -info BaiduOAuthSDK.a 查看a文件支持的架构 第一个坎: 报错: 未找到模块baiduLogin对应的类BaiduLoginModule.若是自 ...
- web API分类
什么是Web API? Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. 分类 ...
- CSS-尺寸与边框
1.基础选择器的优先级 权值:标识当前选择器的重要程度,权值越大优先级越高. 元素选择器 1 类选择器 10 伪类选择器 10 ID选择器 100 内联样式 1000 选择器的权值加到一起,大的优先 ...
- kbmmw 中JSON 操作入门
现在各种系统中JSON 用的越来越多.delphi 也自身支持JSON 处理. 今天简要说一下kbmmw 内部如何使用和操作JSON. kbmmw 中json的操作是以TkbmMWJSONStream ...
- 35、输入框(UITextField)密码明暗文切换
- (IBAction)pwdTextSwitch:(UIButton *)sender { // 前提:在xib中设置按钮的默认与选中状态的背景图 // 切换按钮的状态 sender.selecte ...
- 前端之 js的介绍和javascript的基础使用
一 javasvript的介绍 JavaScript概述 1 JavaScript发展史 1.1 1992年Nombas开发出C-minus-minus(--)的嵌入式的脚本语言(最初绑定在CEnvi ...
- mac os 下 Android Studio设置真机调试
http://www.cnblogs.com/developer-wang/p/6719555.html 如果没有 .bash_profile 只需要创建 .bash_profile,然后增加andr ...