神经网络(NeuralNet)是由大量的处理单元相互连接形成的网络。神经元是神经网络的最小单元,神经网络由若干个神经元组成。一个神经元的结构如下:
上面的神经元x1,x2,x3和1是输入,hw,b(x)是输出。
其中f(x)是激活函数,常用的激活函数有sigmoid函数和tanh(双曲正切)函数。
sigmoid函数:
tanh(双曲正切)函数:
神经网络由若干个层次,相邻层次之间的神经元存在输入的关系。第一层称为输入层,最后一层称为输出层,中间的层次称为隐含层。
设神经网络有n层,第1层为L1,第2层为L2,第n层为Ln,第p(p=1,2,...n)层的神经元节点数量是mp。aj(k)表示第k层第j个节点的输出值。则对于L1(也就是输入层),有
第(k+1)层第j个神经元的输出
设一个训练样本的误差为
整体误差函数
为了防止过拟合,增加了第二项L2正则化。
目标是求(w,b),使得J(w,b)最小。为此使用梯度下降法,每次迭代按照下面的公式对w和b进行更新
第n层(也就是输出层)的输出神经元j,其残差为
第k层第i个节点的残差为
求解(w,b)的过程如下:
1)对于所有的k,令w(k):=0,b(k):=0;
2)信号前向传播,根据每个样本的输入值和w(k)、w(k),逐层计算出hw,b(x);
3)误差反向传播,逐层计算出每一层每个神经元的残差;
4)对w和b的值进行更新。
反复进行步骤(2)~(4),直到完成指定的迭代次数为止。
MLlib的神经网络类是NerualNet。主要参数包括:
Size:Array[Int],神经网络每一层的节点数量;
Layer:神经网络的层数;
Activation_function:激活函数,可以是sigm或tanh
Ouput_function:输出函数,可以是sigm、softmax或linear。