【深度学习BookNote】多层感知器(multi-layer perceptron)

多层感知器(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. 全连接神经网络的缺点

偏导的链式法则 : 利用全连接神经网络计算的话,网络层次越深,付出的计算代价就越大,并且由于一个网络层不单单一个神经元,可能会有多个神经元,当多个神经元的输入作为下一级神经元的输入时,就会形成多个复杂的嵌套关系, 卷积神经网络也就应用而生,下一次继续分享~

参考链接

激活函数 - 志光 - 博客园 (cnblogs.com)

https://www.cnblogs.com/tianqizhi/p/9570975.html

(2条消息) 常用激活函数(激励函数)理解与总结_tyhj_sf的博客-CSDN博客_激活函数

https://blog.csdn.net/tyhj_sf/article/details/79932893

(2条消息) 几种常见激活函数(笔记整理)_TWLS的博客-CSDN博客_激活函数

https://blog.csdn.net/u010513327/article/details/81019522?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-1-81019522-blog-79932893.pc_relevant_blogantidownloadv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-1-81019522-blog-79932893.pc_relevant_blogantidownloadv1&utm_relevant_index=2

如何快速训练多层神经网络(MLP)? - 知乎 (zhihu.com)

https://zhuanlan.zhihu.com/p/31598308

B站:3Blue1Brown

【官方双语】深度学习之神经网络的结构 Part 1 ver 2.0_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1bx411M7Zx?spm_id_from=333.999.0.0&vd_source=20b7c99504617dfb7367e2eeec513974

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值