大家好,欢迎来到IT知识分享网。
人工神经网络模型(Artificial Neural Network) 结构
人工神经网络模型起源于人类大脑的生物神经网络,参考人类大脑神经元的工作方式。与其他类型的神经网络相比,ANN 只接受数值化的和结构化的输入数据,而其他数据诸如图像,文本,语音信息等输入数据由 CNN, RNN等模型处理。
与人类的神经元结构不同,ANN 的主要构成部分是感知机 (perceptron)。一个含有多重感知机的网络被称为 ANN。
理论上,一个 ANN 可以含有任意多层,每一层含有自己的神经元 (neuron)。同时,不同的层可以使用不同的激活函数 (activation function)。
ANN 可以用于分类或者回归,这通过设置相应的激活函数来实现。例如,用于二类分类时,可以使用 Sigmoid 激活函数;用于多类分类时,使用 Softmax 激活函数;用于回归时,使用线性激活函数。
ANN 工作流程
ANN 的工作流程分两部分:前向传播 (forward propagation) 和反向传播 (backward propagation),如下图所示:
Forward propagation
模型接受输入数据,由感知机对数据进行处理:乘上权重,加上偏差,经过激活函数的变化,并且将输出传入到下一层。
特征值首先乘上权重,并且加上偏差,这个过程其实是一个线性变换过程:
y=β0+β1×1+β2×2+…+βnxn
其中 xi是输入特征值,βi是权重,β0是偏差。y作为输出,是激活函数作用的对象: f(y)。激活函数的使用加入了非线性变换。常用的激活函数有以下几种:
sigmoid function:
f(x)=11+e−x
tanh function:
f(x)=tanh(x)=ex−e−xex+e−x
ReLU function: 在应用 back propagation 求最优解的时候,ReLU 主要用于防止 vanishing gradient,但同时又可能会导致 exploding gradient。
f(x)=0,x<0
x,x≥0
Backward propagation
是一个按层的反向的优化过程,用于寻找最优的网络权重参数。这是一个迭代过程,通过对损失函数求偏导,并且不断对参数值进行迭代更新来得到参数的最优解。常用的优化算法有:
– 梯度下降法 (Gradient Descent):
wnew=wold+v,v=−α∂L∂w
其中 α是 学习步长 (learning rate),L是损失函数。步长的值越大则表示权值调整动作越大。
– 自适应矩估计 (Adam optimizer):即 Adaptive Moment Estimation,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,每次迭代参数的学习率都有一定的范围,不会因为梯度很大而导致学习率(步长)也变得很大,参数的值相对比较稳定。收敛速度较快,但可能只是收敛到局部最优解。
– Gradient Descent with momentum:加快收敛速度,更多的机会收敛到全局最优解。
wnew=wold+v,v=βv−α∂L∂w
– RMS Prop (Root Mean Square Prop):RMS Prop增加了一个衰减系数来控制历史信息的获取多少。神经网络都是非凸条件下的,RMSProp在非凸条件下结果更好,改变梯度累积为指数衰减的移动平均以丢弃遥远的过去历史。
损失函数和链条法则
假设 L是损失函数,y是之前的线性变换,a是激活函数。在求解过程中,w是未知变量,即需要求解的最优参数。对 w求偏导数:
∂L∂w=∂L∂a⋅∂a∂y⋅∂y∂w
Vanishing Gradient 和 exploding gradient 可以从链条法则中找到原因。
模型性能度量
度量函数用于度量模型的性能,值得注意的是度量函数和损失函数是不同的,后者在求解模型最优权重的过程中使用。
假设 yi是真实的目标值,y^i是模型的预测值,常用的度量函数有:
– Mean squared logrithmic error:
MSLE=1n∑i=1n[(logyi−1)−(logy^i−1)]2
– Root mean squared logrithmic error
RMSLE=1n∑i=1n[(logyi−1)−(logy^i−1)]2−−−−−−−−−−−−−−−−−−−−−−−−−−√
模型主要参数
模型的主要参数有
– epoch个数:当一个完整的数据通过神经网络的依次训练,这个过程被称为一个 epoch。再实际运用中,训练数据可能是非常庞大的数据集,需要分成多个小块,即 mini batch,来进行训练,每次只有一批数据被模型训练。
另外,在神经网络中训练一次完整的数据集是不够的,而是将完整的数据集在同样的神经网络中传递多次。这个次数称为 epoch 个数。随着epoch数量增加,神经网络中的权重的更新次数也在增加,曲线从欠拟合变得过拟合。
– 层数:一般情形下,增加层数可以提高网络的精度,同时带来更大的计算复杂度。通过增加隐藏层节点数的方法同样可以增加网络精度,并且比增加层数更容易实现。
– 激活函数:激活函数的选择依实际情况而定。
– 神经元个数:和层数一样,依靠经验和实际情况决定。一些可借鉴的经验是:隐藏单元的数量不应该超过输入层中单元的两倍;神经元的数量应捕获输入数据集方差的70~90%。
– 初始权重:除了随机指定的初始值,常用的初始值有:在 sigmoid 和 tanh 激活函数时,使用标准差为 1n√
的高斯分布;在 ReLU 初始值时,使用标准差为 2n−−√
的高斯分布。
– 损失函数:选择依实际情况而定。
– 性能度量:选择依实际情况而定。
– 优化算法:
TensorFlow 的程序实现
以 TensoFlow Keras (https://www.tensorflow.org/) 为例,加载软件包:
>>> from tensorflow import keras >>> from tensorflow.keras import layers >>> from tensorflow.keras import callbacks
初始化 ANN 模型
以下例子对模型进行初始化,并建立三个隐藏层 (hidden layer),最后建立输出层。三个隐藏层的神经元数目分别为 128, 128, 64。最后输出的是实数,因此输出层的神经元数目为 1。
>>> model = keras.Sequential([ >>> layers.Dense(128, activation='relu', input_shape=input_shape), >>> layers.Dense(128, activation='relu'), >>> layers.Dense(64, activation='relu'), >>> layers.Dense(1), >>> ])
模型编译
在模型编译步骤中,设置优化算法和损失函数:
>>> model.compile( >>> optimizer='adam', >>> loss='mae')
数据拟合
模型建立以后,用数据对木星进行训练。训练的结果是一个基于数据和 loss function 的最优的模型。这里我们定义 epoch=200, bach_size = 218。假设训练特征值 X 和目标值 y 都已事先读入。
>>> history = model.fit( >>> X, y, >>> batch_size=128, >>> epochs=200)
预测新数据
假设测试数据 test 已经事先读入,用训练好的模型 model 预测新数据的目标值:
>>> predictions = model.predict(test.values)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/83146.html