transformer笔记(编码器之前)

来自b站的BV13h411c7hW视频笔记。


位置编码器的效果分析


位置编码器的可视化:

  1. plt.figure(figsize=(15,5)),用来设置plt的画布大小。
  2. plt.legend(),用来设置图例。列表生成式[“dim %d” %p for p in [4,5,6,7]],加上的百分号是格式化的一种方式。
  3. Variable,是装鸡蛋的盒子的意思,而tensor是盒子里的鸡蛋。
  4. plt.plot(x,y),只有将tensor里的数据转化为numpy后才能使用plot,也就是tensor.data.numpy()
  5. 代码

 位置类的笔记知识点:

1.代码不需要记住,位置编码是定死的,直接用就可以。


Mask 机制的代码(掩码张量):
知识点:

1.np.triu(shape,k=1),k>0表示上三角矩阵,k<0表示下三角矩阵。对角线的上下移。这里k=1,实际上形成的是对角线向上移了一格的上三角,这样子第一位就是1了,最后转换一下后,就变成了0,也就是看不到了。这样就表示,第一列全是零,第二列第一个是零,下面全是零,实际意义在于,第一个就是什么都看不到,第二列是只看得到第一个,这样实现了我们的需求,遮住后面的信息。2.np.astype(‘uint8’),用来转换格式



Mask代码演示:

知识点:

1.plt.imshow(二维矩阵)这个[0]代表的是取出原来三维矩阵的第一个,事实上这个三维矩阵的第一个维度,只有1个。

2.torch.from_numpy(),将numpy变成torch。


Attention机制代码部分

 知识点:

1.attention 机制的qkv是外界传入的。

2.attention机制分为这几步,1.q乘以k的转置再除以根号下词嵌入维度。2.mask,将值为零的部分替换为1e-9,的一个很小的数。3.F.softmask在最后一个维度上,获得注意力张量。4.dropout随机置零。5.注意力张量乘以v获得q。6.返回注意力张量和query的注意力表示,向量z。

3.最后一个维度一般是词嵌入维度。

4.mask传入的mask是矩阵,可以是全零的矩阵,一般是向上偏移一位的下三角矩阵。


qkv的三个矩阵形象解释:


多头注意力机制的实现 

 知识点:

1.并没有每个都是dK大小,而是将dK分成不同的头。得到不同的qkv,然后concat,然后线性变换。

2.这个里面的变换矩阵都是方阵,来保证不改变原有张量的尺寸。


多头注意力机制的使用

 知识点:

1.copy.deepcopy()

2.nn.ModuleList(),torch里面专门用来存储模块的地方。


多头注意力机制的类的实现

 MultiHeadAttention知识点

1.init层需要传入头数,词嵌入维度,dropout的比例。

2.assert函数,判断词嵌入维度余头数要为零。

3.需要四个矩阵,Q,K,V还有最后一个拼接矩阵。

4.这里的self.linears其实是一个列表。


attention类中的forward函数

1.forward函数里面需要传入qkv三个矩阵以及mask,也就是用旧的qkv矩阵,里面也会生成新的qkv矩阵,用的是相同的大小。但是不同的内容。

2.前向传播函数需要扩大一个维度,来代表多头中的第n个头。


多头处理环节关键代码:

 知识点:

1.需要传入batch_size,就是query矩阵的第零个维度。

2.原来的qkv传进来以后,用线性变换linear()形成不同的qkv矩阵。这样可以形成多个头。


知识点:

1.可以先view再transpose,但不可以transpose再view,中间必须要有contiguous才行。用了transpose后,张量是不连续的,要用congtiguous将张量变为连续的才能用view。


多头处理机制forward函数

整体代码概览

知识点:

1.最后需要传入最后一个linear乘以x,也就是线性变换。最后一个线性变换完全没有用啊。因为是一个方阵。

2.nn.linear()的作用。

  1. #用来改变最后数组最后一维的维度

  2. #用来缩小或者扩展特征维度



transpose与view是不一样的

transpose不是连续的改变,当把(1,2,3,4)的形状用transpose(1,2)变成(1,3,2,4)以后,它是从第二个维度中每一个里面的第一个变为第一个维度的第一个,每一个第二个维度的第二个变成第一个维度里面的第二个,(2,3)变为(3,2)。总之张量是不连续的。也就对应了之前的transpose之后需要contagious,之后才能使用view。


解码器部分

 整体式用layer是一个大层封装的N遍。

用Encoder来进行封装,每一个encoder用n遍,每一个encoder可以将新的x传入旧的x里面进行更新。(但是无法理解里面的参数是如何更新的呢,本只是做了很多线性变换,但其实如何判断好坏并没有说,是在残差连接里面体现的吗,至少有一个x,但是这里没有做参数更新)

在最前面有一个是前馈全连接层。

Encoder可以里面有两个封装好的子层连接结构。

两个子层两节结构是子层连接结构,一个是MAS多头注意力机制,还有一个是普通的全连接层。

还有一个封装的标规范化层,(x-mean)/方差,只是在最后一个维度上进行标准化。标准化层是在哪些地方可以使用的。主要是在子层连接里面写的。dropout是在哪些地方使用的?前馈全连接层里面使用了dropout,在子层连接里面里面使用了norm和add里面还有使用了relu。

以上是关于编码器的一些整理,有些小乱的笔记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值