机器学习: 人工神经网络 (ANN)

机器学习: 人工神经网络 (ANN)人工神经网络模型(Artificial Neural Network) 结构人工神经网络模型起源于人类大脑的生物神经网络,参考人类大脑神经元的工

大家好,欢迎来到IT知识分享网。

机器学习: 人工神经网络 (ANN)

人工神经网络模型(Artificial Neural Network) 结构

人工神经网络模型起源于人类大脑的生物神经网络,参考人类大脑神经元的工作方式。与其他类型的神经网络相比,ANN 只接受数值化的和结构化的输入数据,而其他数据诸如图像,文本,语音信息等输入数据由 CNN, RNN等模型处理。

机器学习: 人工神经网络 (ANN)

图1:两层隐藏层的 ANN 结构。

与人类的神经元结构不同,ANN 的主要构成部分是感知机 (perceptron)。一个含有多重感知机的网络被称为 ANN。

理论上,一个 ANN 可以含有任意多层,每一层含有自己的神经元 (neuron)。同时,不同的层可以使用不同的激活函数 (activation function)。

机器学习: 人工神经网络 (ANN)

图2:ANN 的 perceptron 结构,这里的激活函数是 step function。

ANN 可以用于分类或者回归,这通过设置相应的激活函数来实现。例如,用于二类分类时,可以使用 Sigmoid 激活函数;用于多类分类时,使用 Softmax 激活函数;用于回归时,使用线性激活函数。

ANN 工作流程

ANN 的工作流程分两部分:前向传播 (forward propagation) 和反向传播 (backward propagation),如下图所示:

机器学习: 人工神经网络 (ANN)

图3:ANN 的前向传播和后向传播。

Forward propagation

模型接受输入数据,由感知机对数据进行处理:乘上权重,加上偏差,经过激活函数的变化,并且将输出传入到下一层。

特征值首先乘上权重,并且加上偏差,这个过程其实是一个线性变换过程:

y=β0+β1×1+β2×2+…+βnxn

其中 xi是输入特征值,βi是权重,β0是偏差。y作为输出,是激活函数作用的对象: f(y)。激活函数的使用加入了非线性变换。常用的激活函数有以下几种:

sigmoid function:

f(x)=11+e−x

机器学习: 人工神经网络 (ANN)

图4:Sigmoid function

tanh function:

f(x)=tanh(x)=ex−e−xex+e−x

机器学习: 人工神经网络 (ANN)

图5:Tanh function

ReLU function: 在应用 back propagation 求最优解的时候,ReLU 主要用于防止 vanishing gradient,但同时又可能会导致 exploding gradient。

f(x)=0,x<0

x,x≥0

机器学习: 人工神经网络 (ANN)

图6:ReLU function

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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信