机器学习的网络们
- [1. 线性神经网络](#1. 线性神经网络)
-
- [1.1 线性回归](#1.1 线性回归)
- [1.2 softmax 回归](#1.2 softmax 回归)
- [2. 多层感知机](#2. 多层感知机)
- [3. 卷积神经网络](#3. 卷积神经网络)
- [4. 现代神经网络](#4. 现代神经网络)
申明:资料大部分来源于d2l,如有错误还望指正
1. 线性神经网络
1.1 线性回归
线性网络,对应的就是基础的线性函数
网络结构大概如下所示,输出的内容则主要是0,1两个数字,
实现代码
python
def linreg(X, w, b): #@save
"""线性回归模型"""
return torch.matmul(X, w) + b
1.2 softmax 回归
从线性回归到了多分类回归,可以输出多个结果
表达式
实现的代码
python
def softmax(X):
X_exp = torch.exp(X)
partition = X_exp.sum(1, keepdim=True)
return X_exp / partition # 这里应用了广播机制
2. 多层感知机
类似下图这样的两个颜色的点就无法成功拟合出来
2.1 多层感知机
单分类
此处引入激活函数
通过激活函数引入非线性的特性,从而更加方便的提升复杂度,拟合曲线
多分类
增加softmax函数从而增加多分类的可能性
多隐藏层
3. 卷积神经网络
3.1 卷积核
在处理图片的任务的时候,全连接会带来参数过多的问题,通过卷积的方式去解决。
个人理解:全连接是将二维数据一维化之后,再处理。在维度变化的时候,也去除了很多二维本身带来的关联信息,所以在处理数据时候,还是需要用二维的方式来处理,也就引出了大名鼎鼎的卷积层。
下面这个图是图像处理中常用的一些卷积矩阵,,这些矩阵可以实现对图像的特征提取
多输入输出通道
多输入
多输出
多输出在图生图的时候会有较大的作用
3.2 池化层
基于像素的卷积会对特定的位置敏感,所以需要一个对位置不那么敏感的方法。所以就选出了池化层。
所谓最大池化就是在一个矩阵中去选个最大值,放入下个矩阵中去,它最大的特点是将之前卷积层的矩阵乘法简化成了求最大值,简化了数十倍的计算量
常见的池化方法有最大池化,和平均池化
整个神经网络,似乎就是不断的增加复杂度,然后寻找一些降低复杂度的方法。再增加复杂度,再寻找降低复杂度的方法,不断的循环。
3.3 卷积神经网络(LeNet 1998)
我们对原始模型做了一点小改动,去掉了最后一层的高斯激活。除此之外,这个网络与最初的LeNet-5一致
python
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
4. 现代神经网络
4.1 深度卷积神经网络(AlexNet 2012)
图7.1.2 从LeNet(左)到AlexNet(右)
一些细节
1.激活函数 sigmoid 到 ReLu 减缓了梯度消失
-
隐藏全连接层后增加了丢弃层
-
数据增强
-
最大池化层
-
模型并行:将模型分成多个快,每个GPU计算一部分结果。
第一点的改变,可以类比成模拟信号,降低了放大倍数,减小了削顶失真和削底失真,使得模拟量有了更多的输出,而不是直接输出0,1两个数值。由此可见使用模拟的方式来实现计算,是否能够大大加强计算速度?或者太多的失真值后,可以给个错误信号,从而重新计算。
第二点,增加丢弃层后会有改善,证明有部分网络,负优化了参数。而准确的找到负优化的点,或者拆分模型分别计算,再混合结果,兴许有更好的概率,但会增加计算复杂度。
4.2 使用块网络(VGG 2014)
VGG 将单个的层,封装成了特定的网络块。然后再加几层全连接层输出。
4.3 网络中的网络(NIN)
NIN 算是比较特殊的VGG快?
卷积之后加了两个全连接层,
双全连接层在alexnet 中已经验证过,会比价有作用。
总结:
NIN 快使用卷积层,加两个1*1 卷积层,卷积层添加了非线性
NIN 使用全局平均池化层来代替VGG和AlexNet中的全连接层----不容易过拟合,更少的参数个数
4.4 GoogleLeNet 2014
在2014年的ImageNet竞赛中夺得了冠军,在随后的两年中一直在改进,形成了Inception V2、Inception V3、Inception V4等版本。
这是单独的一个网络块,使用了多通道去抽取特征,然后将结果合并,也验证了多通道能提升识别准确程度的佐证。
后续的变种
排名
4.5 ResNet 残差网络
现在遇到的问题是,增加了更多的网络,反而没有能训练出性能更好的网络,所以引入了残差块的概念
所谓残差块,也许可以理解为反馈电路中的正反馈,通过反馈来实现提升精度。现在负反馈尚未出现,所以也许可以试试负反馈的方式,也许能有意想不到的性能。