多层感知机 pytorch学习
多层感知机
MLP
把许多全连接层堆叠在一起,每一层都输出到上面的层
argmax
argmax返回的是最大数的索引.argmax有一个参数axis,默认是0,
== 对数据类型敏感,需要转换成相同类型
class Accumulator:
"""在n个变量上累加"""
def __init__(self, n):
self.data = [0.0] * n
def add(self, *args):
self.data = [a + float(b) for a, b in zip(self.data, args)]
def reset(self):
self.data = [0.0] * len(self.data)
def __getitem__(self, idx):
return self.data[idx]
? 首先在初始化的时候会根据传进来的n的大小来创建n个空间,且初始化全部为0.0。
? 接着在使用.add()的时候情况下,虽然*args代表这里可以传入任意个参数,但是因为要和初始化的个数相同不然要报错。for a,b in zip(self.data,args)是把原来类中对应位置的data和新传入的args做 a + float(b)加法操作然后重新赋给该位置的data。从而达到累加器的累加效果。
? reset函数即重新设置空间大小并初始化。
? __getitem__实现类似数组的取操作。
防止过拟合现象
权重衰减:L2正则化
为了惩罚权重向量的大小, 我们必须以某种方式在损失函数中添加
∥
w
∥
2
∥w∥^2
∥w∥2, 但是模型应该如何平衡这个新的额外惩罚的损失? 实际上,我们通过正则化常数λλ来描述这种权衡, 这是一个非负超参数,我们使用验证数据拟合:
L
(
w
,
b
)
+
λ
2
∥
w
∥
2
,
L(w,b)+\frac{λ}{2}∥w∥^2,
L(w,b)+2λ?∥w∥2,
trainer = torch.optim.SGD([
{"params":net[0].weight,'weight_decay': wd},
{"params":net[0].bias}], lr=lr)
pytorch中实现是在weight_decay中指定weight decay 超参数
- 正则化是处理过拟合的常用方法:在训练集的损失函数中加入惩罚项,以降低学习到的模型的复杂度。
- 保持模型简单的一个特别的选择是使用
L
2
L_2
L2?惩罚的权重衰减。这会导致学习算法更新步骤中的权重衰减。
- 权重衰减功能在深度学习框架的优化器中提供。
- 在同一训练代码实现中,不同的参数集可以有不同的更新行为。
Dropout
暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。 这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃(drop out)一些神经元。 在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。
对于深度学习框架的高级API,我们只需在每个全连接层之后添加一个Dropout 层, 将暂退概率作为唯一的参数传递给它的构造函数。 在训练时,Dropout 层将根据指定的暂退概率随机丢弃上一层的输出(相当于下一层的输入)。 在测试时,Dropout 层仅传递数据。
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
nn.Dropout(dropout1),
nn.Linear(256, 256),
nn.ReLU(),
nn.Dropout(dropout2),
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);
- 暂退法在前向传播过程中,计算每一内部层的同时丢弃一些神经元。
- 暂退法可以避免过拟合,它通常与控制权重向量的维数和大小结合使用的。
- 暂退法将活性值h替换为具有期望值h的随机变量。
- 暂退法仅在训练期间使用。
稳定性和初始化
- 梯度消失和梯度爆炸是深度网络中常见的问题。在参数初始化时需要非常小心,以确保梯度和参数可以得到很好的控制。
- 需要用启发式的初始化方法来确保初始梯度既不太大也不太小。
- ReLU激活函数缓解了梯度消失问题,这样可以加速收敛。
- 随机初始化是保证在进行优化前打破对称性的关键。
- Xavier初始化表明,对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。
分布偏移
- 在许多情况下,训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。
- 真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而,这个数据总体通常是无法获得的。经验风险是训练数据的平均损失,用于近似真实风险。在实践中,我们进行经验风险最小化。
- 在相应的假设条件下,可以在测试时检测并纠正协变量偏移和标签偏移。在测试时,不考虑这种偏移可能会成为问题。
|