简介
神经网络模型也被称为人工神经网络(Artificial Neural Network,ANN),它是一类非线性模型,用来在给定输入变量集合的情况下,对输出进行预测。其最早的例子可以追溯到20世纪40年代早期,当时用它来解决分类问题。可以说,它是一类非线性的回归方法。最近几年在深度学习中应用很广泛,本篇文章抱着学习其原理的心态,参考书籍,力图用Java语言实现一个神经网络。
由于网上有太多介绍神经网络的文章,这里对它的原理这种关键点描述,不在展开他们的细节,直接探究其实现方法,如果不了解这些知识点请自行Google。
- 多层前向传播网络
- 激活函数
- 反向传播算法(Backpropagation Algorithm)
建立ANN
构造激活函数
这里主要使用Simgod和tanh函数,主要是因为他们的范围可控,并且导数易求(神经网络中的导数往往要简单到可以由f(x)求得,主要是因为f(x)的值常常被记录下来,利用将极大提高效率)。也可以自己实现一个激活函数。
1 | package com.chengsluo.ann; |
构建单层
这里在构建网络层的时候,为了简化起见,给每一个层配置了相同的激活函数,这常常是默认的做法。
1 | package com.chengsluo.ann; |
组织成网络
1 | package com.chengsluo.ann; |
提升性能(利用冲量构造单层)
这里层的实现不在使用前面讲的基本方法来更新权值,而是使用单独的矩阵来存储权重delta值。
1 | package com.chengsluo.ann; |
测试ANN
训练一个异或模型
1 | package com.chengsluo.ann; |
时间序列测试
1 | package com.chengsluo.ann; |
### 冲量层加速测试
1 | package com.chengsluo.ann; |
参考资料
拜伦·埃利斯. 实时分析[M]. 机械工业出版社, 2016.
CS231n: Convolutional Neural Networks for Visual Recognition
http://cs231n.stanford.edu
SourceCode
https://github.com/chengsluo/code-java/tree/master/ArtificialNeuralNetwork