动手学深度学习-李沐(视频):10 多层感知机 + 代码实现 - 动手学深度学习v2_哔哩哔哩_bilibili
动手学深度学习-李沐(网页):4. 多层感知机 — 动手学深度学习 2.0.0 documentation (d2l.ai)
⭐这是jupyter与torch结合的笔记!!!
目录
5.1. VC维(Vapnik-Chervonenkis Dimension)
1. 感知机
1.1. 概念
(1)感知机是一种二元线性分类器,是最简单形式的前馈式人工神经网络(不同于softmax多分类)
(2)例子
1.2. 训练感知机
(1)训练步骤
①初始化w = 0, b = 0(和之前随机定义w不一样)
②重复判断 yi * (<w,xi>+b) 是否小于等于0(意思是yi是真实的种类的值,如1或-1,而<w,xi>+b是我们预测出来的种类1或-1,如果预测对了两个就都是同号,会得到大于0的值,错了则负值)
③如果预测错误(上面那个为负值进循环),则更新数据w←w+yixi,b←b+yi
④直到正确,退出循环
(2)等价于使用批量大小为1的梯度下降,并使用如下的损失函数(分类对了没梯度,错了才有)
(3)收敛定理
(4)感知机不能解决异或(XOR)问题,因为它不能用一根线把异或点分开
2. 多层感知机
2.1. 多层分类
(1)解决XOR问题
(2)隐藏层(可以单层也可以多层,不过最好一个比一个小,不然太大了)
(3)单隐藏层的单分类
σ激活函数很重要,这样才能真正实现多层。如果去掉σ的话,o实际上可以变为以下表示方法。这样就又回归单层感知机了
3. 激活函数
3.1. 激活函数的意义
(1)Change the erformance of deep learning networks (Bingham & Miikkulainen, 2022).
(2)使神经网络跳出单层线性转换
3.2. 常见激活函数
(1)ReLU(Rectified Linear Unit)
①公式
②用matplotlib画图
import matplotlib as mpl
import matplotlib.pyplot as plt
import torch
"""就是麻烦在这个点"""
fig, ax = plt.subplots()
x = torch.arange(-5,5,0.1)
y = torch.relu(x)
ax.plot(x,y)
③用李沐的d2l包画图
import torch
x = torch.arange(-5,5,0.1)
y = torch.relu(x)
d2l.plot(x,y)
④李沐的书上的
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.relu(x)
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 2.5))
⑤ReLU的导数图像和我自己的简洁代码
x = torch.arange(-5,5,0.1,requires_grad=True)
y = torch.relu(x)
y.backward(torch.ones_like(x))
d2l.plot(x.detach(),x.grad)
(2)Sigmoid
①公式
②代码和图像
x = torch.arange(-5,5,0.1,requires_grad=False)
"""纯纯调库罢了懒得写了"""
y = torch.sigmoid(x)
d2l.plot(x,y)
③导数公式(非常神奇的导数)
(3)tanh
①公式
②图像
③导数
4. 多层感知机的代码实现
4.1. 从零实现
(1)相当于自己写激活函数公式的函数吧... 我觉得没有太大的必要
4.2. 简洁实现
(1)代码
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10))
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
5. 模型选择、欠拟合和过拟合
5.1. VC维(Vapnik-Chervonenkis Dimension)
(1)概念:对于n维的数据,需要VC(n+1)维的分类函数就可以把其中任意数据分类
(2)一些多层感知机的VC维是O(Nlog2N)
6. 权重衰退
6.1. 限制内容
(1)使用均方范数硬性限制参数值的选择范围来控制模型容量
(2)通常不限制b,因为影响不大
(3)小的θ通常意味着更强的正则项
(4)也可以使用均方范数作为柔性限制
6.2. 参数更新法则
(1)计算梯度(其中λ是超参数)
(2)时间t更新参数
(3)通常ηλ<1,在深度学习中叫权重衰退
7. 丢弃法(Dropout)
7.1. 意义
(1)在层之间加入噪音,使得机器的泛化能力更强
7.2. 方式
(1)无偏差加入噪音,随机丢弃
8. 数值稳定性
8.1. 神经网络的梯度
(1)计算
(2)问题
①梯度爆炸:超出值域无法计算。同时它会对学习率非常敏感,学习率太大导致更大的梯度,学习率太小导致训练没有进展。因此需要不断调整学习率
②梯度消失:梯度可能变成0,训练不会有进展,仅仅顶层训练还好,但是无法让神经网络更深
(3)计算例子(这个不会算!!所以第二行和第三行到底是什么!)
9. 模型初始化和激活函数
9.1. 设置方差
(1)将每层的输出和梯度都看作随机变量
(2)让它们的均值和方差都保持一致
9.2. 权重初始化
(1)使用N(0,0.01)来初始化权重可能对小网络没问题,但没办法保证深度神经网络
(2)一般来说越靠近最优解的地方梯度越平
9.3. 方差
(1)正向方差(......)
(2)反向均值和方差
9.4. Xavier初始
(1)方法:根据输入输出改变权重
10. Reference List
Bingham, G. & Miikkulainen, R. (2022) 'Discovering Parametric Activation Functions', Neural Networks, vol. 148, pp. 48-65. doi: Redirecting