《动手学深度学习 Pytorch版》学习笔记
文章平均质量分 82
此专栏为学习《动手学深度学习 Pytorch版》过程中所作笔记,包括代码和课后习题。
AncilunKiang
好好学习,天天向上。
展开
-
《动手学深度学习 Pytorch版》 10.7 Transformer
自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。原创 2023-10-27 21:36:39 · 833 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码
在注意力机制中,每个查询都会关注所有的键-值对并生成一个注意力输出。由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention),也被称为内部注意力(intra-attention)。本节将使用自注意力进行序列编码,以及使用序列的顺序作为补充信息。原创 2023-10-26 21:54:14 · 1134 阅读 · 1 评论 -
《动手学深度学习 Pytorch版》 10.5 多头注意力
多头注意力(multihead attention):用独立学习得到的 h 组不同的线性投影(linear projections)来变换查询、键和值,然后并行地送到注意力汇聚中。最后,将这 h 个注意力汇聚的输出拼接在一起,并且通过另一个可以学习的线性投影进行变换,以产生最终输出。对于 h 个注意力汇聚输出,每一个注意力汇聚都被称作一个头(head)。原创 2023-10-26 11:49:29 · 853 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力
AttentionDecoder 类定义了带有注意力机制解码器的基本接口#@save"""带有注意力机制解码器的基本接口"""@property在 Seq2SeqAttentionDecoder 类中实现带有 Bahdanau 注意力的循环神经网络解码器。初始化解码器的状态,需要下面的输入:编码器在所有时间步的最终层隐状态,将作为注意力的键和值;上一时间步的编码器全层隐状态,将作为初始化解码器的隐状态;编码器有效长度(排除在注意力池中填充词元)。原创 2023-10-25 20:32:07 · 661 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 10.3 注意力评分函数
上一节使用的高斯核的指数部分可以视为注意力评分函数(attention scoring function),简称评分函数(scoring function)。后续把评分函数的输出结果输入到softmax函数中进行运算。最后,注意力汇聚的输出就是基于这些注意力权重的值的加权和。该过程可描述为下图:fqk1v1kmvm))i1∑mαqkivi∈Rv其中查询q和键ki的注意力权重(标量)是通过注意力评分函数aαqk。原创 2023-10-25 17:40:10 · 608 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 10.2 注意力汇聚:Nadaraya-Watson 核回归
queries和attention_weights的形状为(查询个数,“键-值”对个数)# values的形状为(查询个数,“键-值”对个数)原创 2023-10-24 16:02:21 · 1032 阅读 · 1 评论 -
《动手学深度学习 Pytorch版》 10.1 注意力提示
美国心理学之父” 威廉·詹姆斯提出的双组件(two-component)框架:非自主性提示:基于环境中物体的突出性和易见性自主性提示:受到了认知和意识的控制。原创 2023-10-23 21:22:24 · 535 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.8 束搜索
本节将介绍几大:贪心搜索(greedy search)策略穷举搜索(exhaustive search)束搜索(beam search)原创 2023-10-21 15:18:10 · 349 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.7 序列到序列学习(seq2seq)
循环神经网络编码器使用长度可变的序列作为输入,将其编码到循环神经网络编码器固定形状的隐状态中。为了连续生成输出序列的词元,独立的循环神经网络解码器是基于输入序列的编码信息和输出序列已经看见的或者生成的词元来预测下一个词元。要点:“<eos>”表示序列结束词元,一旦输出序列生成此词元,模型就会停止预测。“<bos>”表示序列开始词元,它是解码器的输入序列的第一个词元。使用循环神经网络编码器最终的隐状态来初始化解码器的隐状态。允许标签成为原始的输出序列。原创 2023-10-21 10:26:34 · 993 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.6 编码器-解码器架构
为了处理这种长度可变的输入和输出, 可以设计一个包含两个主要组件的编码器-解码器(encoder-decoder)架构:编码器(encoder):它接受一个长度可变的序列作为输入,并将其转换为具有固定形状的编码状态。解码器(decoder):它将固定形状的编码状态映射到长度可变的序列。原创 2023-10-20 14:22:54 · 549 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.5 机器翻译与数据集
机器翻译(machine translation)指的是将序列从一种语言自动翻译成另一种语言,基于神经网络的方法通常被称为神经机器翻译(neural machine translation)。原创 2023-10-20 09:09:30 · 887 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.4 双向循环神经网络
之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模,然而也存在需要后文预测前文的情况。数学推导太复杂了,略。双向循环神经网络(bidirectional RNNs)添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。前向和反向隐状态的更新如下:H→t=ϕl(XtWxh(f)+H→t−1Whh(f)+bh(f))H←t=ϕl(XtWxh(b)+H←t−1Whh(b)+bh(b))\overrightarrow{\boldsymbol{H}}_t=\phi_l(\boldsymbol{X}_原创 2023-10-20 07:43:47 · 568 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.3 深度循环神经网络
将多层循环神经网络堆叠在一起,通过对几个简单层的组合,产生一个灵活的机制。其中的数据可能与不同层的堆叠有关。原创 2023-10-19 17:46:24 · 632 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.2 长短期记忆网络(LSTM)
return (torch.zeros((batch_size, num_hiddens), device=device), # 隐状态需要返回一个额外的单元的值为0形状为(批量大小,隐藏单元数)记忆元I = torch.sigmoid((X @ W_xi) + (H @ W_hi) + b_i) # 输入门运算F = torch.sigmoid((X @ W_xf) + (H @ W_hf) + b_f) # 遗忘门运算。原创 2023-10-19 09:59:29 · 788 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 9.1 门控循环单元(GRU)
def init_gru_state(batch_size, num_hiddens, device): # 隐状态初始化H, = state # 优雅,逗号解包Z = torch.sigmoid((X @ W_xz) + (H @ W_hz) + b_z) # 更新门运算 @符号做哈达玛积R = torch.sigmoid((X @ W_xr) + (H @ W_hr) + b_r) # 重置门运算。原创 2023-10-18 08:37:49 · 699 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.7 通过时间反向传播
htotfxtht−1whghtwot表示时间步ht表示时间步t的隐状态xt表示输入ot表示输出wh表示隐藏层权重wo表示输出层权重f表示隐藏层变换g表示输出层权重前向传播相当简单,一次一个时间步的遍历三元组xthtot,然后通过一个目标函数在所有T个时间步内评估输出ot和对应的标签ytLx1xTy1yTw。原创 2023-10-17 21:40:45 · 1020 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.6 循环神经网络的简洁实现
state.shape # (隐藏层数,批量大小,隐藏单元数)通过一个隐状态和一个输入可以用更新后的隐状态计算输出。需要强调的是,rnn_layer的“输出”(Y)不涉及输出层的计算:它是指每个时间步的隐状态,这些隐状态可以用作后续输出层的输入。#@save"""循环神经网络模型"""# 如果RNN是双向的(之后将介绍),num_directions应该是2,否则应该是1else:# 全连接层首先将Y的形状改为(时间步数*批量大小,隐藏单元数)原创 2023-10-14 23:43:42 · 862 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.5 循环神经网络的从零开始实现
one_hot 函数将这样一个小批量数据转换成形状为(时间步数,批量大小,词表大小)的输出。由于下一个小批量数据中的序列样本 与当前子序列样本相邻,因此当前小批量数据最后一个样本的隐状态将用于初始化下一个小批量数据第一个样本的隐状态。这个函数返回的是一个全用 0 填充的张量,张量形状为(批量大小,隐藏单元数)。在循环遍历 prefix 中的开始字符时,不断地将隐状态传递到下一个时间步,但是不生成任何输出。当使用随机抽样时,因为每个样本都是在一个随机位置抽样的,因此需要为每个迭代周期重新初始化隐状态。原创 2023-10-13 16:09:11 · 557 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.4 循环神经网络
对于无隐藏装态的神经网络来说,给定一个小批量样本X∈Rn×d,则隐藏层的输出H∈Rn×hHϕXWxhbhϕndWxh∈Rd×hbh∈R1×hh接下来将隐藏变量HOHWhqbqO∈Rn×qHWhq∈Rh×qbq∈R1×q如果是分类问题,则可以用softmaxO计算输出的概率分布,此处无需多言。原创 2023-10-12 10:27:01 · 658 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.3 语言模型和数据集
依靠在 8.1 节中对序列模型的分析,可以在单词级别对文本数据进行词元化。原创 2023-10-11 08:12:40 · 483 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.2 文本预处理
解析文本的常见预处理步骤:将文本作为字符串加载到内存中。将字符串拆分为词元(如单词和字符)。建立一个词表,将拆分的词元映射到数字索引。将文本转换为数字索引序列,方便模型操作。原创 2023-10-10 14:29:40 · 425 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 8.1 序列模型
到目前为止,我们遇到的数据主要是表格数据和图像数据,并且所有样本都是独立同分布的。然而,大多数的数据并非如此。比如语句中的单词、视频中的帧以及音频信号,都是有顺序的。简言之,如果说卷积神经网络可以有效地处理空间信息,那么本章的循环神经网络(recurrent neural network,RNN)则可以更好地处理序列信息。循环神经网络通过引入状态变量存储过去的信息和当前的输入,从而可以确定当前的输出。原创 2023-10-09 08:56:03 · 119 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 7.7 稠密连接网络
DenseNet 可以视为 ResNet 的逻辑扩展。ResNet 将函数展开为fxxgx,即一个简单的线性项和一个复杂的非线性项。若将f拓展成超过两部分,则 DenseNet 便是其中一种方案。这即是 DenseNet 和 ResNet 的主要区别。DenseNet 这个名字由变量之间的“稠密连接”而得来。主要由两部分构成:稠密块:定义如何连接输入和输出。过渡层:控制通道数量,使其不会太复杂。何为稠密连接?即最后一层与之前的所有层紧密相连,DenseNet 输出是连接执行从xx。原创 2023-09-24 07:52:23 · 198 阅读 · 2 评论 -
《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)
ResNet 在后面使用了 4 个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。(4)在 ResNet 的后续版本中,作者将“卷积层、批量规范化层和激活层”架构更改为“批量规范化层、激活层和卷积层”架构。如果把模型看作一个函数,我们设计的更强大的模型则可以看作范围更大的函数。,这里的加法会更有益于靠近数据端的层的训练,因为乘法中的梯度波动会极大的影响链式法则的结果,而在残差块中输入可以通过加法通路更快的前向传播。只有当较复杂的函数类包含较小的函数类时,我们才能确保提高它们的性能。原创 2023-09-23 08:28:06 · 452 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 7.5 批量规范化
训练神经网络的实际问题:数据预处理的方式会对最终结果产生巨大影响。训练时,多层感知机的中间层变量可能具有更广的变化范围。更深层的网络很复杂容易过拟合。批量规范化对小批量的大小有要求,只有批量大小足够大时批量规范化才是有效的。用x∈B表示一个来自小批量B的输入;$\hat{\boldsymbol{\mu}}_B $ 表示小批量B的样本均值;σB表示小批量B的样本标准差;批量规范化 BN 根据以下表达式转换xBNxγ⊙σBxμBβ。原创 2023-09-22 18:53:57 · 417 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)
(3)将AlexNet、VGG 和 NiN 的模型参数大小与 GoogLeNet 进行比较。GoogLNet 中的基本卷积块叫做 Inception 块(大概率得名于盗梦空间),由 4 条并行路径组成。回避了用哪种卷积核的问题,小孩子才做选择,Google全部都要。(2)使用 GoogLeNet 的最小图像大小是多少?Inception块之间的最大汇聚层可降低维度。卷积,以减少通道数,从而降低模型的复杂度;全局平均汇聚层避免了在最后使用全连接层。的卷积数取代全连接层让参数变小。大小的图像才能使输出大于零。原创 2023-09-21 07:52:47 · 499 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 7.3 网络中的网络(NiN)
LeNet、AlexNet和VGG的设计模式都是先用卷积层与汇聚层提取特征,然后用全连接层对特征进行处理。AlexNet和VGG对LeNet的改进主要在于扩大和加深这两个模块。网络中的网络(NiN)则是在每个像素的通道上分别使用多层感知机。原创 2023-09-20 08:48:32 · 294 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 7.2 使用块的网络(VGG)
AlexNet 没有提供一个通用的模板来指导后续的研究人员设计新的网络,如今研究人员转向了块的角度思考问题。通过使用循环和子程序,可以很容易地在任何现代深度学习框架的代码中实现这些重复的架构。(2)与 AlexNet 相比,VGG 的计算要慢得多,而且还需要更多的显存。(1)打印层的尺寸时,我们只看到 8 个结果,而不是 11 个结果。VGG 块与之类似,由一系列卷积层组成,再加上用于空间降采样的汇聚层。简言之,卷积层深度的影响要大于卷积核大小的影响。因为 3 到 8 层是以两两一组的块的形式显示的。原创 2023-09-19 15:48:36 · 257 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)
深度卷积神经网络的突破出现在2012年。原创 2023-09-18 08:27:56 · 572 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 6.6 卷积神经网络
(4)显示不同输入(例如,毛衣和外套)时 LetNet 第一层和第二层的激活值。(2)尝试构建一个基于 LeNet 的更复杂网络,以提高其精准性。(3)在 MNIST 数据集上尝试以上改进后的网络。(1)将平均汇聚层替换为最大汇聚层,会发生什么?原创 2023-09-17 21:04:58 · 625 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 6.5 汇聚层
汇聚层和卷积层类似,区别在于汇聚层不带包含参数,汇聚操作是确定性的,通常计算汇聚窗口中所有元素的最大值或平均值,即最大汇聚和平均汇聚。(6)除了平均汇聚层和最大汇聚层,是否还有其他函数可以考虑?)为什么它就不流行?汇聚层在每个通道上单独计算,也就是说输入通道数和输出通道数相同。汇聚层和卷积层一样可以通过填充和步幅获得所需的输出形状。(4)为什么最大汇聚层和平均汇聚层的工作方式不同?(1)尝试将平均汇聚层作为卷积层的特例情况实现。(2)尝试将最大汇聚层作为卷积层的特例情况实现。(3)假设汇聚层的输入大小为。原创 2023-09-17 21:02:28 · 569 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 6.4 多输入多输出通道
的卷积失去了卷积层在高度和宽度维度上识别相邻元素间相互作用的能力。可以将其看作再每个像素位置的全连接层。(5)本节最后一个示例中的变量 Y1 和 Y2 是否完全相同?的数量加倍,计算量会增加多少?如果我们把填充数翻一番会怎么样?简言之,多通道即为单通道之推广,各参数对上即可。(1)假设我们有两个卷积核,大小分别为。的数量加倍则计算量会增加 4 倍。(4)如果卷积核的高度和宽度是。时,如何使用矩阵乘法实现卷积?(中间没有非线性激活函数)。,前向传播的计算复杂的是多少?(3)如果我们将输入通道。原创 2023-09-17 21:01:58 · 542 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 6.3 填充和步幅
虽然我们用的卷积核较小,每次只会丢失几像素,但是如果应用多层连续的卷积层,累积的像素丢失就会很多。解决此问题的方法为填充。填充后的输出形状将为nh−khph1×nw−kwpw1。原创 2023-09-17 21:01:15 · 339 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 6.2 图像卷积
的卷积核 K,进行互相关计算时,如果水平相邻两元素相同则输出为零,否则输出为非零。卷积层被训练的参数是卷积核和标量偏置。如之前一样,卷积核权重也采用随机初始化。如下,构造一个简单的黑白图像,0为黑色像素,1为白色像素。(3)如何通过改变输入张量和卷积核张量,将互相关运算表示为矩阵乘法?(2)在我们创建的 Conv2D 自动求导时,会收到什么错误消息?简单应用卷积:通过找到像素变化位置来检测图像中不同颜色的边缘。以后不可能永远手动设计卷积核,卷积核权重应该是可学习的。没明白,上面实现的就是用矩阵乘法。原创 2023-09-17 21:00:44 · 398 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 6.1 从全连接层到卷积
平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。原创 2023-09-17 21:00:11 · 475 阅读 · 1 评论 -
《动手学深度学习 Pytorch版》 5.6 GPU
(3)测量计算 1000 个 100*100 矩阵乘法所需的时间,并记录输出矩阵的弗罗贝尼乌斯范数,一次记录一个结果,而不是在GPU上保存日志并进传输最终结果。(1)尝试一个计算量很大的任务,比如大矩阵的乘法,看看CPU和GPU的速度差异。(4)测量同时在两个 GPU 上执行两个矩阵乘法与在一个 GPU 上按顺序执行两个矩阵乘法所需的时间。需要执行运算的数据需要在同一块GPU上,如果不在则可以复制过去。谨慎复制,并行化的瓶颈在于数据传输而不是运算速度。(2)我们应该如何在GPU上读写模型参数?原创 2023-09-17 08:26:26 · 387 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 5.5 读写文件
(2)假设我们只想复用网络的一部分,已将其合并到不同的网络架构中。例如想在一个新的网络中使用之前网络的前两层,该怎么做?(1)即使不需要将经过训练的模型部署到不同的设备上,保存的模型参数还有什么实际的好处?(3)如何同时保存网络架构和参数?需要对架构加上什么限制?用作备份或备为下一步处理均可。原创 2023-09-17 08:25:43 · 347 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 5.4 自定义层
(2)设计一个返回输入数据的傅里叶系数前半部分的层。(1)设计一个接收输入并计算张量降维的层,它返回。原创 2023-09-16 09:15:31 · 726 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 5.3 延后初始化
下面实例化的多层感知机的输入维度是未知的,因此框架尚未初始化任何参数,显示为“UninitializedParameter”。一旦指定了输入维度,框架就可以一层一层的延迟初始化。原创 2023-09-16 09:14:59 · 532 阅读 · 0 评论 -
《动手学深度学习 Pytorch版》 5.2 参数管理
由 Sequential 类定义的模型可以通过索引访问其任意层,就像一个列表一样,每层的参数都在其属性中。如下所示的第二个全连接层的参数。参数名称唯一的标识该参数。PyTorch 的 nn.init 模块提供了很多内置初始化的方法。(3)构建包含共享参数层的多元感知机并对其进行训练。在训练过程中,观察模型各层的参数和梯度。框架提供默认的随机初始化,也允许我们创建自定义的初始化方法。(1)使用 FancyMLP 模型访问各个层的参数。(2)查看初始化模块文档以了解不同的初始方法。参数表示为参数类的实例。原创 2023-09-15 16:38:34 · 634 阅读 · 0 评论