多层感知器(multi-layer perceptron)
神经网络的变种目前有很多,如误差反向传播(Back Propagation,BP)神经网路、概率神经网络、卷积神经网络(Convolutional Neural Network ,CNN-适用于图像识别)、时间递归神经网络(Long short-term Memory Network ,LSTM-适用于语音识别)等。但最简单且原汁原味的神经网络则是多层感知器(Multi-Layer Perception ,MLP),只有理解经典的原版,才能更好的去理解功能更加强大的现代变种。
0. 摘要
(1)神经网络主要有三个基本要素:权重、偏置和激活函数。
(2)常见的激活函数包括Sigmoid,Tanh,ReLU,Softmax。
1. MLP原理
在网络结构上,输入输出层的神经元个数由给定的问题决定。因此,MLP结构设计上只需要考虑一共有多少隐藏层,每一个隐层有多少个神经元这两个超参数即可。
2. 激活函数
**激活函数,并不是去激活什么,而是指如何把“激活的神经元的特征”通过函数把特征保留并映射出来,即负责将神经元的输入映射到输出端。**如果不用激活函数,在这种情况下每一层输出都是上层输入的线性函数,而线性模型在很多情况下都不够用。容易验证,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。因此,隐藏层的激活函数必须要是非线性的(不再是输入的线性组合,可以逼近任意函数)。
常见的激活函数包括Sigmoid,Tanh,ReLU,Leaky (听说这个比较新哎) ReLU,ELU,Maxout,Softmax。
2.1 选择ReLu的原因
Relu其实就是个取最大值的函数,模仿了生物学上的神经元什么时候会激发,即在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。
第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现 梯度消失 的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
第三,ReLu会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
3. 简单代码案例
# 第一步,import
import tensorflow as tf # 导入模块
from sklearn import datasets # 从sklearn中导入数据集
import numpy as np # 导入科学计算模块
import keras
# 第二步,train, test
x_train = datasets.load_iris().data # 导入iris数据集的输入
y_train = datasets.load_iris().target # 导入iris数据集的标签
np.random.seed(120) # 设置随机种子,让每次结果都一样,方便对照
np.random.shuffle(x_train) # 使用shuffle()方法,让输入x_train乱序
np.random.seed(120) # 设置随机种子,让每次结果都一样,方便对照
np.random.shuffle(y_train) # 使用shuffle()方法,让输入y_train乱序
tf.random.set_seed(120) # 让tensorflow中的种子数设置为120
# 第三步,models.Sequential()
model = tf.keras.models.Sequential([ # 使用models.Sequential()来搭建神经网络
tf.keras.layers.Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2())
# 全连接层,三个神经元,激活函数为softmax,使用l2正则化
])
# 第四步,model.compile()
model.compile( # 使用model.compile()方法来配置训练方法
optimizer=tf.keras.optimizers.SGD(lr=0.1), # 使用SGD优化器,学习率为0.1
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 配置损失函数
metrics=['sparse_categorical_accuracy'] # 标注网络评价指标
)
# 第五步,model.fit()
model.fit( # 使用model.fit()方法来执行训练过程,
x_train, y_train, # 告知训练集的输入以及标签,
batch_size=32, # 每一批batch的大小为32,
epochs=500, # 迭代次数epochs为500
validation_split=0.2, # 从测试集中划分80%给训练集
validation_freq=20 # 测试的间隔次数为20
)
# 第六步,model.summary()
model.summary() # 打印神经网络结构,统计参数数目
4. 全连接神经网络的缺点
偏导的链式法则 : 利用全连接神经网络计算的话,网络层次越深,付出的计算代价就越大,并且由于一个网络层不单单一个神经元,可能会有多个神经元,当多个神经元的输入作为下一级神经元的输入时,就会形成多个复杂的嵌套关系, 卷积神经网络也就应用而生,下一次继续分享~
参考链接
https://www.cnblogs.com/tianqizhi/p/9570975.html
(2条消息) 常用激活函数(激励函数)理解与总结_tyhj_sf的博客-CSDN博客_激活函数
https://blog.csdn.net/tyhj_sf/article/details/79932893
(2条消息) 几种常见激活函数(笔记整理)_TWLS的博客-CSDN博客_激活函数
如何快速训练多层神经网络(MLP)? - 知乎 (zhihu.com)
https://zhuanlan.zhihu.com/p/31598308
B站:3Blue1Brown