transformer学习笔记

class Embeddings(nn.Module):
def init(self, d_model, vocab):
“”“类的初始化函数, 有两个参数, d_model: 指词嵌入的维度, vocab: 指词表的大小.”“”
# 接着就是使用super的方式指明继承nn.Module的初始化函数, 我们自己实现的所有层都会这样去写.
super(Embeddings, self).init()
# 之后就是调用nn中的预定义层Embedding, 获得一个词嵌入对象self.lut
self.lut = nn.Embedding(vocab, d_model)
# 最后就是将d_model传入类中
self.d_model = d_model

super(Embeddings, self).init()
#使用super的方式指明继承Embeddings父类(nn.Module)的初始化函数
也就是继承nn.module的init函数

  1. input = t.arange(0, 6).view(3, 2).long() # 3个句子,每句子有2个词
    input = t.autograd.Variable(input)
    class torch.autograd.Variable:为什么要引入Variable?首先回答为什么引入Tensor。仅仅使用numpy也可以实现前向反向传播,但numpy不支持GPU运算。而Pytorch的Tensor提供多种操作运算,此外Tensor支持GPU。问来了,两三个网络可以推公式写反向传播,当网络很复杂的时需要自动化。autograd可以帮助我们,当利用autograd时,前向传播会定义一个计算图,图中的节点就是Tensor。图中的变就是函数。当我们将Tensor塞(Variable(tensor,…))到Variable时,Variable就变成了节点。若x为一个Variable,那么x.data即为Tensor,x.grad也为一个Variable。那么x.grad.data就为梯度的值。总结:Pytorch Variable与Pytorch Tensor有着相同的API,Tensor上的所有操作几乎都可用在Variable上。两者不同之处在于利用Variable定义一个计算图,可以实现自动求导。

总之更有利于求导和反向传播

3.>>> embedding = nn.Embedding(10, 3) #代表建立一个可以将10个字,转化为10个3维的向量

input = torch.LongTensor([[1,2,4,5],[4,3,2,9]]) # 两行代表2个句子,四列代表每个句子有4个词
embedding(input)
tensor([[[-0.0251, -1.6902, 0.7172],#1 每行代表每个字 列代表1 的一二三 维
[-0.6431, 0.0748, 0.6969],#2
[ 1.4970, 1.3448, -0.9685],#4
[-0.3677, -2.7265, -0.1685]],#5

    [[ 1.4970,  1.3448, -0.9685],#4
     [ 0.4362, -0.4004,  0.9400],#3
     [-0.6431,  0.0748,  0.6969],#2
     [ 0.9124, -2.3616,  1.1151]]])#9

([[1,2,4,5],[4,3,2,9]])

4.向量与矩阵的区别
创建一个向量
import numpy as np
#创建一个行向量
vector_row = np.array([1,2,3])
#创建一个列向量
vector_column = np.array([[1],[2],[3]])
print(vector_row)
print(vector_column)
out:
[1 2 3]
[[1]
[2]
[3]]

创建一个矩阵
import numpy as np
#创建一个矩阵
matrix = np.array([[1,2],[1,2],[1,2]])
print(matrix)
out:
array([[1, 2],
[1, 2],
[1, 2]])

可以看出向量和矩阵都是用数组array组成
区别在于向量是二维行或列向量
[[1]
[2]
[3]]
矩阵是二维行和列向量
array([[1, 2],
[1, 2],
[1, 2]])
都可以用np.array表示

列表list不可以进行数学四则运算,数组array可以进行数学四则运算;
lis1=[1,2,3,4] #lis1是列表类型
a = np.array([1,2,3,4]) #a是数组类型

二阶n维张量可以理解为n ∗ n 的矩阵,就像n维向量可以理解为n ∗ 1的矩阵一样
列向量就是只有一列的矩阵,可以用来表示向量
7.
tensor 与array数组的区别(基本一致只不过用于神经网络需要用tensor)
可以简单理解为,tensor可以用于神经网络
张量是就是神经网络里的数组,叫它张量而不是数组是因为它有自己的特质,它是神经网络计算的基本单元,tensor可以轻易地进行卷积,激活,上下采样,微分求导等操作,而numpy数组就不行,普通的数组要先转化为tensor格式才行。
8.
向量和矩阵都是二维数组 特点:两个方括号’[]’
b = np.random.randn(1,5) #1行5列的行向量
print(b)
[[ 0.16572125 0.61840102 -0.06370723 -0.56107341 1.04560651]]
n维向量可以理解为n ∗ 1的矩阵,1行5列的行向量理解为1 ∗ 5的矩阵
[[[1]]]即使有三个括号依旧是标量
9.
x = np.array([[[12]]])
b = np.arange(1,5)
print(b)
print(x*b)

[1 2 3 4]
[[[12 24 36 48]]]

Process finished with exit code 0
总之大部分情况可以根据方括号数量判断,但是本质上讲与括号多少无关系

接着,我们获得一个batch_size的变量,他是query尺寸的第1个数字,代表有多少条样本.

    batch_size = query.size(0)

query尺寸的第1个数字,代表有多少条样本.
意思是query(2x8x512) 则size(0)为 2
例子:
在这里插入图片描述
在这里插入图片描述

11.谈谈我对encoder的理解
就相当于人读书,然后理解后将其读的结果存到记忆里(memory)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
李宏毅是一位著名的机器学习和深度学习专家,他在教学视频中也提到了Transformer模型。下面是一些关于李宏毅关于Transformer笔记总结: 1. Transformer 是一种基于注意力机制(attention mechanism)的序列到序列(sequence-to-sequence)模型。它在自然语言处理任务中取得了很大的成功。 2. Transformer 模型的核心思想是完全摒弃了传统的循环神经网络(RNN)结构,而是采用了自注意力机制(self-attention mechanism)来建模输入序列之间的依赖关系。 3. 自注意力机制能够将输入序列中的每个位置与其他位置建立联系,从而捕捉到全局上下文的信息。它能够解决传统的RNN模型在处理长序列时的梯度消失和梯度爆炸问题。 4. Transformer 模型由编码器(Encoder)和解码器(Decoder)两部分组成。编码器负责将输入序列表示为高维向量,解码器则根据编码器的输出生成目标序列。 5. 编码器和解码器由多个层堆叠而成,每一层都包含了多头自注意力机制和前馈神经网络。多头自注意力机制可以并行地学习输入序列中不同位置之间的关系。 6. Transformer 模型还引入了残差连接(residual connection)和层归一化(layer normalization)来帮助模型更好地进行训练和优化。 这些是李宏毅关于Transformer的一些主要笔记总结,希望对你有所帮助。注意,这些总结仅代表了我对李宏毅在其教学视频中所讲述内容的理解,如有误差请以李宏毅本人的观点为准。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值