动手学深度学习

感知机

给定输入x,权重w,偏移b,感知机输出:

o=\sigma \left ( \left \langle w,x \right \rangle+b \right )\sigma \left ( x \right )=\left\{\begin{matrix} 1& if x>0\\ -1 & otherwise \end{matrix}\right.

就是一个二分类问题,对比线性回归,线性回归输出实数,感知机输出离散的类;对比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的梯度下降,损失函数为l(y,x,w) = max(0,-y<w,x>) ,分对了损失就是0.

XOR问题

感知机不能拟合XOR函数(x·y>0为一类,x·y<0为一类),它只能产生线性分割面。也就有了之后的多层感知机。

多层感知机

 输入:(n个样本,每个样本有d个特征)

隐藏层:

输出层:,输出q类

 \sigma是按元素如果没有激活函数,输出总是一个线性函数,也就是一个线性模型。的激活函数

y=softmax(o)  (多类分类的感知机再加上softmax)

多类分类感知机与softmax的区别就是多了一层隐藏层,

  • 多隐藏层

h1=\sigma \left ( W1x +b1 \right )

h2=\sigma \left ( W1h1 +b2 \right )

h3=\sigma \left ( W3h3 +b3 \right )

o=W4h3+b4

超参数:隐藏层数,每层隐藏层大小

多隐藏层设计思路: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正则化,这项技术通过函数与零的距离来衡量函数的复杂度

  • 使用均方范数作为硬性限制

通过限制参数值的选择范围来控制模型容量

min l(w,b)      \parallel w\parallel ^{2} <=\Theta 

1.通常不限制b,没啥区别

2.更小的\Theta意味更强的正则项

  • 使用均方范数作为柔性限制

 通过正则化常数λ来平衡这个新的额外惩罚的损失,使损失不要过低,降低模型复杂度

L2正则化线性模型构成经典的岭回归(ridge regression)算法, L1正则化线性回归被称为套索回归(lasso regression)。 使用L2范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。 这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。 相比之下,L1惩罚会导致模型将权重集中在一小部分特征上, 而将其他权重清除为零。 这称为特征选择(feature selection),这可能是其他场景下需要的。

丢弃法Dropout

好的模型需要对输入数据的扰动鲁棒,丢弃法就是在层之间加入噪声。

对x加入噪声得到,但我们希望。因此,丢弃法对每个元素做如下改动:

E[h^{^{'}}]=0*p+\frac{h}{1-p}*(1-p)=h

丢弃法用在隐藏全连接层的输出上,正则项只在训练中使用,因它们影响模型参数的更新;在推理过程中,丢弃法直接返回输入h=dropout\left ( h \right ),也保证了确定性的输出

前向传播

按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。

中间变量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初始化

 从均值为零,方差的高斯分布中采样权重

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《动手深度习 v2》是一本介绍深度习的教材,通过动手实践的方式帮助读者深入理解深度习的理论和实践。这本书由李沐等人共同编写,内容包含了深度习的基本概念、算法原理以及实际应用等方面。 这本书的优点之一是注重实践,通过大量的案例和代码实现,读者可以亲自动手搭建深度习模型,并通过实际操作来理解算法的工作原理。此外,书中还涵盖了一些最新的深度习技术和应用,帮助读者跟上深度习领域的最新发展。 《动手深度习 v2》也具有一定的难度,对于初者来说需要一定的数和编程基础才能更好地理解和实践。但是,书中的难点都有详细的解答和说明,读者可以在遇到困难时查看相关解析,提升习效果。 总的来说,《动手深度习 v2》是一本非常实用的深度习教材,适合有一定基础的读者习和实践。通过阅读这本书,读者可以系统地习深度习的基本概念和算法,掌握如何应用深度习解决实际问题,进而在深度习领域有更深入的理解和应用。 ### 回答2: 《动手深度习 v2》pdf是一本深度习入门的教程,适合初习深度习的理论和实践。这本教程由作者李沐、阿斯顿·张剑锋等人合作撰写,涵盖了深度习的基本概念、神经网络的构建、常见深度习模型、计算机视觉、自然语言处理等领域的应用。 这本教程的特点是注重实践,每个章节都提供了大量的代码示例和实验指导,让读者可以动手实践,巩固所知识。同时,教程还配有相应的代码库和数据集,读者可以下载使用。 教程通过讲解深度习的基本概念和原理,帮助读者建立起对深度习的整体认识。然后,通过实例演示和实践,教会读者如何使用深度习框架搭建神经网络,并进行训练和优化。 另外,这本教程也介绍了一些常见的应用领域,如计算机视觉和自然语言处理。读者可以习到如何使用深度习来解决图像分类、目标检测、文本生成等问题。 最后,这本教程还提供了一些深度习的进阶内容,如深度生成模型和强化习等,供读者深入习和拓展。 总的来说,《动手深度习 v2》pdf是一本很好的深度习入门教程,通过动手实践和实例演示,帮助读者快速入门和掌握深度习的基本知识和应用技巧。对于想要习深度习的初者来说,是一本非常有价值的教材。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值