0.2777的循环乘以3.6等于多少?

  •  实例化参数和对象:
# 输入参数x可以是多头注意力机制的输出

  • 它是所有深层网络模型都需要的标准网络层,因为随着网络层数的增加,通过多层的计算后参数可能开始出现过大或过小的情况,这样可能会导致学习过程出现异常,模型可能收敛非常的慢. 因此都会在一定层数后接规范化层进行数值的规范化,使其特征数值在合理范围内.它相当于以前所学习的BN层


"""初始化函数有两个参数, 一个是features, 表示词嵌入的维度, 另一个是eps它是一个足够小的数, 在规范化公式的分母中出现, # 根据features的形状初始化两个参数张量a2,和b2,第一个初始化为1张量, # 也就是里面的元素都是1,第二个初始化为0张量,也就是里面的元素都是0,这两个张量就是规范化层的参数, # 因为直接对上一层得到的结果做规范化公式计算,将改变结果的正常表征,因此就需要有参数作为调节因子, # 使其即能满足规范化要求,又能不改变针对目标的表征.最后使用nn.parameter封装,代表他们是模型的参数。 #这里的a2和b2的初始值分别是1和0,后期随着模型的训练它们的值也在不断的变化 """输入参数x代表来自上一层的输出""" # 在函数中,首先对输入变量x求其最后一个维度的均值,并保持输出维度与输入维度一致.即:mean = x.mean(-1, keepdim=True),其中-1表示最后一个维度,keepdim=True表示保持输出维度与输入维度一致,它的具体含有见下例的演示 # 接着再求最后一个维度的标准差,并保持输出维度与输入维度一致.然后就是根据规范化公式,用x减去均值除以标准差获得规范化的结果, # 最后对结果乘以我们的缩放参数,即a2,*号代表同型点乘,即对应位置进行乘法操作,比如一个2x2的张量和另一个2x2的张量进行点乘,就是对应位置元素作乘法,加上位移参数b2.返回即可. # 输入x来自前馈全连接层的输出

  • 如图所示,输入到每个子层以及规范化层的过程中,还使用了残差链接(也就是跳跃连接,比如说按照正常逻辑,第一层与第二层连接,第二层与第三层连接,即1-->2-->3,但是如果第一层跳过第二层直接与第三层连接,那么称为残差连接),因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构),在每个编码器层中,都有两个子层,这两个子层加上周围的链接结构就形成了两个子层连接结构.


  • 多头注意力层+规范化层+ 残差连接

  • 前馈全连接层+ 规范化层+残差连接

  • 子层连接结构的代码分析:

"""它输入参数有两个, size以及dropout, size一般是都是词嵌入维度的大小, dropout本身是对模型结构中的节点数进行随机抑制的比率, 又因为节点被抑制等效就是该节点的输出都是0,因此也可以把dropout看作是对输出矩阵的随机置0的比率. """前向逻辑函数中, 接收上一个层或者子层的输出作为第一个参数, 将该子层连接中的子层函数作为第二个参数,子层函数可以是前馈层或者多头注意力层等不同的层""" # 我们首先对输出进行规范化,然后将结果传给子层处理,之后再对子层进行dropout操作,dropou的作用是随机停止一些网络中神经元的作用,来防止过拟合. # 最后add,即残差连接,所以是将输入x与dropout后的子层输出结果相加作为最终的子层连接输出 #这里需要注意的是,在上面的示意图中,首先将输出传给子层处理,之后再对子层进行dropout操作,最后进行规范化和add,这跟我们的代码流程不太相同,原因是上面的示意图仅仅是论文中的示意图,而这里的代码实现流程对论文中的过程进行优化, # 令x为位置编码器的输出 # 假设子层中装的是多头注意力层, 实例化这个类

  • 掌握编码器层的实现过程.


  • 作为编码器的组成单元, 每个编码器层完成一次对输入的特征提取过程, 即编码过程.



"""它的初始化函数参数有四个,分别是size,其实就是我们词嵌入维度的大小,它也将作为我们编码器层的大小, 第二个self_attn,之后我们将传入多头自注意力子层实例化对象, 并且是自注意力机制, 第三个是feed_froward, 之后我们将传入前馈全连接层实例化对象, 最后一个是置0比率dropout.""" # 如图所示, 编码器层中有两个子层连接结构, 所以使用clones函数进行克隆 """forward函数中有两个输入参数,x和mask,分别代表上一层的输出张量,和掩码张量mask.""" # 里面就是按照结构图左侧的流程. 首先通过第一个子层连接结构即self.sublayer[0],其中包含多头自注意力子层, # 然后通过第二个子层连接结构即self.sublayer[1],其中包含前馈全连接子层. 最后返回结果.

  • 编码器用于对输入进行指定的特征提取过程, 也称为编码, 它由N个编码器层堆叠而成,编码器的输出成为解码器的输入的一部分.


  • 编码器的结构图:它是由N个编码器层堆叠而成,如下图所示,这里的N=4


"""初始化函数的两个参数分别代表编码器层和编码器层的个数""" # 再初始化一个规范化层, 它将用在编码器的最后面.layer.size是编码器层的一个实例属性,代表是词嵌入维度 """forward函数的输入和编码器层相同, x代表上一层的输出, mask代表掩码张量""" # 首先就是对我们克隆的编码器层进行循环,每次都会得到一个新的x, # 这个循环的过程,就相当于输出的x经过了N个编码器层的处理. # 最后再通过规范化层的对象self.norm进行处理,返回编码器的最终结果.
# 第一个实例化参数layer, 它是一个编码器层的实例化对象, 因此需要传入编码器层的参数
# 又因为编码器层中的子层是不共享的, 因此需要使用深度拷贝各个对象.
# 编码器中编码器层的个数N
 

 
 
 

 
  • 由N个解码器层堆叠而成

  • 每个解码器层由三个子层连接结构组成

  • 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接

  • 第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接

  • 第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接

 

  • 解码器层中的各个部分,如,多头注意力机制,规范化层,前馈全连接网络,子层连接结构都与编码器中的实现相同. 因此这里可以直接拿来构建解码器层.

 
 

 
  • 作为解码器的组成单元, 每个解码器层根据给定的输入向目标方向进行特征提取操作,即解码过程.

 

 
 """初始化函数的参数有5个, 分别是size,代表词嵌入的维度大小, 同时也代表解码器层的尺寸,
 第二个是self_attn,多头自注意力机制对象,也就是说这个注意力机制需要Q=K=V, 
 第三个是src_attn,常规的多头注意力机制对象,这里Q!=K=V, 第四个是前馈全连接层对象,最后就是droupout置0比率.
 # 在初始化函数中, 主要就是将这些输入传到类中
 # 按照结构图使用clones函数克隆三个子层连接对象.
 """forward函数中的参数有4个,分别是来自上一层的输入x,
 来自编码器层的语义存储变量mermory(也就是编码器的输出), 以及源数据掩码张量和目标数据掩码张量.
 # 将memory表示成m方便之后使用
 # 将x传入第一个子层结构(即多头自注意力机制子层结构),第一个子层结构的输入分别是x和self-attn函数,因为是自注意力机制,所以Q,K,V都是x,
 # 最后一个参数是目标数据掩码张量,这时要对目标数据进行遮掩,因为此时模型可能还没有生成任何目标数据,
 # 比如在解码器准备生成第一个字符或词汇时,我们其实已经传入了第一个字符以便计算损失,
 # 但是我们不希望在生成第一个字符时模型能利用这个信息(也就是说我们不希望在模型开始生成第一个字符前,模型已将提前知道了这个字符),因此我们会将其遮掩,同样生成第二个字符或词汇时,
 # 模型只能看见和使用第一个字符或词汇信息,第二个字符以及之后的信息都不允许被模型看到和使用.
 # 接着进入第二个子层,这个子层中采用常规的注意力机制(也就是说此时Q,K,V 不一定全都相等),q是输入x; k,v是编码层输出memory, 
 # 同样也传入source_mask,但是进行源数据遮掩的原因跟对目标数据的遮掩的原因是不同的,它并非是抑制未来的信息泄漏,而是遮蔽掉对结果没有意义的字符而产生的注意力值(也就是说遮蔽掉对结果没有意义的字符而将注意力集中在有意义的词上面),比如说,对于一句话:“我爱美丽的中国”,我们要提取句子的主要部分,即"我爱中国",而屏蔽掉对结果没有意义的字符,比如"美丽"这个修饰词
 # 以此提升模型效果和训练速度. 这样就完成了第二个子层的处理.
 # 最后一个子层就是前馈全连接子层,经过它的处理后就可以返回结果.这就是我们的解码器层结构.
 
 
# 类的实例化参数与解码器层类似, 相比多出了src_attn, 但是和self_attn是同一个类.
#为了便于演示,我们将自注意力机制和常规注意力机制都采用多头注意力机制
# 前馈全连接层也和之前相同 
# x是来自目标数据的词嵌入表示, 但形式和源数据的词嵌入表示相同, 这里使用per充当.
# memory是来自编码器的输出
 

 
 
 

 
  • 掌握解码器的实现过程.

 

 
    • 根据编码器的结果以及上一次预测的结果(解码器是逐个字符进行解码), 对下一次可能出现的'值'进行特征表示.

  • 解码器的结构图:它是由N个解码器层堆叠而成,如下图所示,这里的N=4

 

 
 """初始化函数的参数有两个,第一个就是解码器层layer,第二个是解码器层的个数N."""
 # 首先使用clones方法克隆了N个layer,然后实例化了一个规范化层. 
 # 因为数据走过了所有的解码器层后最后要做规范化处理. 
 """forward函数中的参数有4个,x代表目标数据的嵌入表示(即上一层的输出结果),memory是编码器层的输出,
 # 然后就是对每个层进行循环,当然这个循环就是变量x通过每一个层的处理,
 # 得出最后的结果,再进行一次规范化返回即可. 
 
 
# 分别是解码器层layer和解码器层的个数N
#为了便于演示,我们将自注意力机制和常规注意力机制都拷贝多头自注意力机制
# 输入参数与解码器层的输入参数相同
#memory是编码器层的输出
 

 
 
 

 
 

 
 
  • 通过对上一步的线性变化得到指定维度的输出, 也就是转换维度的作用.

 

 
 
  • 使最后一维的向量中的数字缩放到0-1的概率值域内, 并满足他们的和为1.

 

 
  • 线性层和softmax层的代码分析:

 
# nn.functional工具包装载了网络层中那些只进行计算, 而没有参数的层
# 将线性层和softmax计算层一起实现, 因为二者的共同目标是生成最后的结构
 # 首先就是使用nn中的预定义线性层进行实例化, 得到一个对象self.project等待使用, 
 # 这个线性层的参数有两个, 就是初始化函数传进来的两个参数: d_model(词嵌入维度), vocab_size(词表大小)
 """前向逻辑函数中输入是上一层的输出张量x"""
 # 在函数中, 首先使用上一步得到的self.project对x进行线性变化, 
 # 然后使用F中已经实现的log_softmax对最后一个维度进行softmax处理这里的最后一个维度是 vocab_size(词表大小),对它进行softmax得到的是当讲预测的词输入词表中各个词的概率值,也就是说,经过softmax后,最后一个维度是vocab_size个概率值,我们选择概率最大的值所对应的词汇作为预测值
 # 在这里之所以使用log_softmax是因为和我们这个pytorch版本的损失函数实现有关, 在其他版本中将修复.
 # log_softmax就是对softmax的结果又取了对数, 因为对数函数是单调递增函数, 
 # 因此对最终我们取最大的概率值没有影响. 最后返回结果即可.
 
 
# 词嵌入维度是512维
# 输入x是上一层网络的输出, 我们使用来自解码器层的输出
 

 
 
 

 
  • 通过上面的小节, 我们已经完成了所有组成部分的实现, 接下来就来实现完整的编码器-解码器结构.

 

 
 

编码器-解码器结构的代码实现

 
 """初始化函数中有5个参数, 分别是编码器对象, 解码器对象, 
 源数据嵌入函数, 目标数据嵌入函数, 以及输出部分的类别生成器对象
 #定义源数据嵌入函数,它的作用是对源数据进行词嵌入
 #定义目标数据嵌入函数,它的作用是对目标数据进行词嵌入
 
#将编码器实例化对象en赋值给encoder
#将解码器实例化对象de赋值给decoder
# 假设源数据与目标数据相同, 实际中并不相同
 

 
 
  • 接着将基于以上结构构建用于训练的模型.

 

 

Tansformer模型构建过程的代码分析

 
 """该函数用来构建模型, 有7个参数,分别是源数据特征(词汇)总数,目标数据特征(词汇)总数,
 编码器和解码器堆叠数,词嵌入维度,前馈全连接网络中变换矩阵的维度,
 多头注意力结构中的多头数,以及置零比率dropout."""
 # 首先得到一个深度拷贝命令,接下来很多结构都需要进行深度拷贝,
 # 来保证他们彼此之间相互独立,不受干扰.
 # 实例化了多头注意力类,得到对象attn
 # 然后实例化前馈全连接类,得到对象ff 
 # 实例化位置编码类,得到对象position
 # 分别是编码器层,解码器层,源数据Embedding层和位置编码组成的有序结构,
 # 目标数据Embedding层和位置编码组成的有序结构,以及类别生成器层. 
 # 在编码器层中有attention子层以及前馈全连接子层,
 # 在解码器层中有两个attention子层以及前馈全连接层.
 #这里的 nn.Sequential()中存放的是两个实例化对象,在程序执行过程中,它会按照先后顺序依次执行,本例中数据先通过词嵌入层,再通过位置编码层
 # 模型结构完成后,接下来就是初始化模型中的参数,比如线性层中的变换矩阵
 # 这里一但判断参数的维度大于1,则会将其初始化成一个服从均匀分布的矩阵,如果是单一的维度,就直接初始化为0
 
# 其他参数都使用默认值 
 

 
 
# 根据Transformer结构图构建的最终模型结构
 
 
    • 类的初始化函数传入5个参数, 分别是编码器对象, 解码器对象, 源数据嵌入函数, 目标数据嵌入函数, 以及输出部分的类别生成器对象.


    • 有7个参数,分别是源数据特征(词汇)总数,目标数据特征(词汇)总数,编码器和解码器堆叠数,词向量映射维度,前馈全连接网络中变换矩阵的维度,多头注意力结构中的多头数,以及置零比率dropout.

    • 该函数最后返回一个构建好的模型对象.


以下文字资料是由(历史新知网)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

共回答了16个问题采纳率:93.8%

你用1000米除以(60分乘60秒)就得了,答案是:0.米

用分数计算比较好,牵涉到两者换算时,出题的人早就想好了,不会很麻烦,不是18的倍数就是5的倍数!

我要回帖

更多关于 0.3的循环乘以3等于多少 的文章

 

随机推荐