本文英文原文出自这里, 这个博客里面的内容是Java开源, 分布式深度学习项目deeplearning4j的介绍学习文档.
简介:
一般来说, 神经网络常被用来做无监督学习, 分类, 以及回归. 也就是说, 神经网络可以帮助对未标记数据进行分组, 对数据进行分类, 或者在有监督训练之后输出连续的值. 典型的神经网络在分类方面的应用, 会在网络的最后一层使用逻辑回归分类器(之类)的将连续(continue)的值转换成为离散值如: 0/1, 比如, 给定一个人的身高, 体重, 以及年龄, 你可以给出它有心脏病或者没有心脏病的判断. 而真正的回归是将一组连续的输入映射到另一组连续的输出.
例如, 给定一座房子的房龄, 面积, 以及到一所好学校的距离, 你将对这座房子的价格进行预测: 这就是连续型输入映射到连续性输出. 这里面没有分类任务中的0/1, 而仅仅是将独立变量 x 映射到连续的输出y.
NN-Regression结构:
在上图中, x表示输入, 特征在网络前面的层进行前向传播, 很多x's与最后隐层的每个神经元相连接, 每个x将会乘上一个相应的权重w. 这些乘积之和再加上一个偏置, 被送到一个激活函数ReLU(=max(x,0)), 这个一个被广泛应用的激活函数, 它不会像sigmoid激活函数那样出现饱和. 对于每个隐层神经元, ReLUctant输入一个激活值a, 在网络的输出节点, 计算这些激活值之和作为最后的输出. 也就是说, 利用神经网络来做回归将有一个输出节点, 而且这个节点仅是对前面节点的激活值进行相加. 得到的 ŷ就是由你所有的x映射得到的独立变量.
训练过程:
为了进行网络的反向传播以及网络的训练, 你可以简单地使用网络的输出ŷ与真实值y进行比较, 通过调整权重和偏置使得网络的error达到最小. 可以使用Root-means-squared-error(RMSE)作为loss函数.
可以使用Deeplearning4j来建立多层神经网络, 在网络的最后增加一个输出层, 具体的代码参考如下:
//Create output layer
.layer()
.nIn($NumberOfInputFeatures)
.nOut()
.activationFunction('identity')
.lossFunction(LossFunctions.LossFunction.RMSE)
其中, nOut输出层的神经元数目, nIn为特征向量的维度, 在上图中, 这应该设置为4, activationFunction应该被设置为'identity'.
我的问题:
- 如果要输出多个值, 怎么做? 训练多个模型?
- 还有没有其他的方式做回归?