感知机
给定输入x,权重w,偏移b,感知机输出:
就是一个二分类问题,对比线性回归,线性回归输出实数,感知机输出离散的类;对比softmax,它有n个类的话,输出n个元素,可以是多分类,回归输出的是概率
initialize w=0 and b=0
repeat
if yi[<w,xi>+b]<=0 then #两者异号说明分类错误
w <- w+yixi and b <- b+yi
end if
until all classified correctly
可视为用批量大小为1的梯度下降,损失函数为 ,分对了损失就是0.
XOR问题
感知机不能拟合XOR函数(x·y>0为一类,x·y<0为一类),它只能产生线性分割面。也就有了之后的多层感知机。
多层感知机
输入:(n个样本,每个样本有d个特征)
隐藏层:
输出层:,输出q类
是按元素如果没有激活函数,输出总是一个线性函数,也就是一个线性模型。的激活函数
y=softmax(o) (多类分类的感知机再加上softmax)
多类分类感知机与softmax的区别就是多了一层隐藏层,
- 多隐藏层
超参数:隐藏层数,每层隐藏层大小
多隐藏层设计思路:1.输入慢慢压缩 2.可先增加隐藏层个数,再压缩,反之,就会损失数据 3.cnn中有先压缩再扩张,可以避免overfitting
Sigmoid激活函数
输出在(0,1)上,在隐藏层中已经较少使用, 它在大部分时候被更简单、更容易训练的ReLU所取代。 循环神经网络中,可用sigmoid单元来控制时序信息流的架构。当输入接近0时,它近似于线性变换。
Tanh激活函数
投影到[-1,1],当输入在0附近时,tanh函数接近线性变换。 函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称
ReLU函数
仅保留正元素并丢弃所有负元素,它求导表现得特别好:要么让参数消失,要么让参数通过。 这使得优化表现得更好,并且ReLU减轻了困扰以往神经网络的梯度消失问题,ReLU函数有许多变体,包括参数化ReLU(Parameterized ReLU,pReLU)。 该变体为ReLU添加了一个线性项,因此即使参数是负的。
import torch
from torch import nn
from d2l import torch as d2l
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);
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
模型选择
K折交叉验证
原始训练数据被分成K个不重叠的子集。 然后执行KK次模型训练和验证,每次在K−1个子集上进行训练, 并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证,最后,通过对K次实验的结果取平均来估计训练和验证误差。
欠拟合和过拟合
如果模型不能降低训练误差,这可能意味着模型过于简单(即表达能力不足), 无法捕获试图学习的模式。 此外,由于我们的训练和验证误差之间的泛化误差很小, 我们有理由相信可以用一个更复杂的模型降低训练误差。 这种现象被称为欠拟合(underfitting)。
另一方面,当我们的训练误差明显低于验证误差时要小心, 这表明严重的过拟合(overfitting)。 注意,过拟合并不总是一件坏事。 特别是在深度学习领域,众所周知, 最好的预测模型在训练数据上的表现往往比在保留(验证)数据上好得多。 最终,我们通常更关心验证误差,而不是训练误差和验证误差之间的差距。
权重衰减
是最广泛使用的正则化的技术之一, 它通常也被称为L2正则化,这项技术通过函数与零的距离来衡量函数的复杂度
- 使用均方范数作为硬性限制
通过限制参数值的选择范围来控制模型容量
1.通常不限制b,没啥区别
2.更小的意味更强的正则项
- 使用均方范数作为柔性限制
通过正则化常数λ来平衡这个新的额外惩罚的损失,使损失不要过低,降低模型复杂度
L2正则化线性模型构成经典的岭回归(ridge regression)算法, L1正则化线性回归被称为套索回归(lasso regression)。 使用L2范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。 这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。 相比之下,L1惩罚会导致模型将权重集中在一小部分特征上, 而将其他权重清除为零。 这称为特征选择(feature selection),这可能是其他场景下需要的。
丢弃法Dropout
好的模型需要对输入数据的扰动鲁棒,丢弃法就是在层之间加入噪声。
对x加入噪声得到,但我们希望。因此,丢弃法对每个元素做如下改动:
,
丢弃法用在隐藏全连接层的输出上,正则项只在训练中使用,因它们影响模型参数的更新;在推理过程中,丢弃法直接返回输入,也保证了确定性的输出
前向传播
按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
中间变量z通过激活函数得到输出o
损失
正则化项Frobenius范数是将矩阵展平为向量后应用的L2L2范数
正则化损失
J为目标函数
反向传播
计算神经网络参数梯度的方法。 简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。
第一步是计算目标函数J=L+s相对于损失项L和正则项s的梯度
目标函数关于输出层变量o的梯度
正则化项相对于两个参数的梯度
在训练神经网络时,在初始化模型参数后, 我们交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。 反向传播重复利用前向传播中存储的中间值,以避免重复计算。 带来的影响之一是我们需要保留中间值,直到反向传播完成。 这也是训练比单纯的预测需要更多的内存(显存)的原因之一。 此外,这些中间值的大小与网络层的数量和批量的大小大致成正比。 因此,使用更大的批量来训练更深层次的网络更容易导致内存不足(out of memory)错误。
梯度消失和梯度爆炸
o关于任何一组参数W(l)的梯度:
换言之,该梯度是L−l个矩阵 M(L)⋅…⋅M(l+1)与梯度向量 v(l)的乘积,因此,容易受到数值下溢问题的影响.不稳定梯度威胁到优化算法的稳定性。 要么是梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛; 要么是梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习,这对底部层尤为严重,无法让神经网络更深。对学习率会很敏感,可能要在训练过程中不断调整学习率。
当sigmoid函数的输入很大或是很小时,它的梯度都会消失
权重初始化
在合理值区间里随机初始参数,训练开始的时候更容易有数值不稳定(远离最优解的地方损失函数表面可能很复杂,最优解附件表面会比较平。
Xavier初始化
从均值为零,方差的高斯分布中采样权重