龙空技术网

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

昌华量化 373

前言:

今天我们对“cnn等于ann”大致比较注重,我们都想要分析一些“cnn等于ann”的相关内容。那么小编同时在网摘上网罗了一些关于“cnn等于ann””的相关知识,希望朋友们能喜欢,兄弟们快快来学习一下吧!

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

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

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

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

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

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

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

ANN 工作流程

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

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

Forward propagation

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

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

y=β0+β1x1+β2x2+...+βnxn

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

sigmoid function:

f(x)=11+e−x

图4:Sigmoid function

tanh function:

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

图5:Tanh function

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

f(x)=0,x<0

x,x≥0

图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 () 为例,加载软件包:

>>> 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)

标签: #cnn等于ann