9.7.1 编码器
编码器是一个没有输出的RNN
这里的nn.Embbeding
见下
下面我们用一个具体的例子说明 PyTorch 中 nn.Embedding
的输出。假设:
import torch
import torch.nn as nn
# 创建嵌入层
# 参数说明:
# num_embeddings=3 → 词汇表大小 (3个词)
# embedding_dim=4 → 每个词的向量维度 (4维)
embedding = nn.Embedding(num_embeddings=3, embedding_dim=4)
# 查看初始化的权重矩阵
print("Embedding 权重矩阵:")
print(embedding.weight)
# 输出类似:
# tensor([[ 0.6614, 0.2669, 0.0617, 0.6213], → 索引0对应的向量
# [-0.4519, -0.1661, -1.5228, 0.3817], → 索引1对应的向量
# [-1.0276, -0.7251, -0.0233, 0.2224]], → 索引2对应的向量
# requires_grad=True)
# 输入张量 (假设我们有2个样本,每个样本包含3个词的索引)
input_indices = torch.LongTensor([[0, 1, 2], [2, 1, 0]])
# 通过嵌入层
output = embedding(input_indices)
print("\n输出结果:")
print(output)
输出结果示例:
输出结果:
tensor([[[ 0.6614, 0.2669, 0.0617, 0.6213], # 对应索引0的向量
[-0.4519, -0.1661, -1.5228, 0.3817], # 对应索引1的向量
[-1.0276, -0.7251, -0.0233, 0.2224]], # 对应索引2的向量
[[-1.0276, -0.7251, -0.0233, 0.2224], # 对应索引2的向量
[-0.4519, -0.1661, -1.5228, 0.3817], # 对应索引1的向量
[ 0.6614, 0.2669, 0.0617, 0.6213]]], # 对应索引0的向量
grad_fn=<EmbeddingBackward>)
关键点说明:
- 输入形状:
[2, 3]
(batch_size=2, sequence_length=3) - 输出形状:
[2, 3, 4]
(最后一个维度是嵌入维度) - 每个输入索引被替换为对应的嵌入向量:
- 0 → [0.6614, 0.2669, 0.0617, 0.6213]
- 1 → [-0.4519, -0.1661, -1.5228, 0.3817]
- 2 → [-1.0276, -0.7251, -0.0233, 0.2224]
- 权重矩阵本质是一个查找表:
embedding.weight.data
的形状是[3,4]
应用场景示例:假设我们有一个简单的词汇表:
- 0 → "apple"
- 1 → "banana"
- 2 → "orange"
经过嵌入层后,每个水果词都会被转换为一个4维的连续向量表示,这些向量会在模型训练过程中自动学习调整,最终相似的词会有相近的向量表示。
也就是类似于独热编码
permute
这个函数就是改变维度的顺序而已,将X
的维度从(batch_size,num_steps,embed_size)
变成(num_steps,batch_size,embed_size)
这里output
和state
的区别是什么?前者是最后一层的每一个时间步的隐状态(注意,GRU只会输出隐状态),后者是每一层的最后一个时间步的隐状态
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2024-02-13 连续攻击游戏
2024-02-13 捉迷藏
2024-02-13 路径覆盖与二分图匹配一一对应
2024-02-13 会议