Transformer代码详解与项目实战之Position Encoding

因为Transformer模型并不包括任何的循环(recurrence)或卷积,所以给模型添加位置编码,为模型提供一些关于单词在句子中相对位置的信息。
位置信息实现方式有两种:1、在模型中训练得到;2、直接使用公式计算。论文中使用的第二种方式,此处对第二种方式进行解析。
在这里插入图片描述
如图所示:pos代表单词在句子中的位置,i代表单词向量中每一个数值的位置。一般,句子长度使用seq_len表示,词向量长度使用num_units或depth表示。
具体实现代码如下:

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

def positional_encoding(seq_len, num_units, visualization=False):
	"""
	:param seq_len: 语句的长度
	:param num_units: 词向量的长度
	:param visualization: 是否画图展示位置编码内容
	:return: [1,seq_len,num_units]
	"""
	def __get_angles(pos, i, d_model):
		"""
		:param pos: 单词在语句中的位置序列,为[seq_len,1]矩阵
		:param i: 词向量中的位置序列,为[1,d_model]矩阵
		:param d_model: 词向量的长度
		:return: [seq_len,d_model]
		"""
		angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model))
		return pos * angle_rates

	#np.arange(seq_len)[:, np.newaxis]:使用seq_len长度序列产生向量,然后扩展一维,变成两维向量
	pos_encoding = __get_angles(np.arange(seq_len)[:, np.newaxis],
							  np.arange(num_units)[np.newaxis, :],
							  num_units)

	#分别对奇数位置和偶数位置的数据进行sin和cos计算
	#方法一、双层遍历的方法
	# for i in range(pos_encoding.shape[0]):
	# 	for j in range(pos_encoding.shape[1]):
	# 		if j % 2 == 0:
	# 			pos_encoding[i][j] = np.sin(pos_encoding[i][j])
	# 		else:
	# 			pos_encoding[i][j] = np.cos(pos_encoding[i][j])

	#方法二:第二维按层计算
	pos_encoding[:, 0::2] = np.sin(pos_encoding[:, 0::2])
	pos_encoding[:, 1::2] = np.cos(pos_encoding[:, 1::2])

	pos_encoding = pos_encoding[np.newaxis, ...]

	if visualization:
		plt.figure(figsize=(12, 8))
		plt.pcolormesh(pos_encoding[0], cmap='RdBu')
		plt.xlabel('Depth')
		plt.xlim((0, num_units))
		plt.ylabel('Position')
		plt.colorbar()
		plt.show()

	return tf.cast(pos_encoding, tf.float32)

if "__main__" == __name__:

    positional_encoding(5, 8, visualization=True)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer发轫于NLP(自然语言处理),并跨界应用到CV(计算机视觉)领域。目前已成为深度学习的新范式,影响力和应用前景巨大。  本课程对Transformer的原理和PyTorch代码进行精讲,来帮助大家掌握其详细原理和具体实现。  原理精讲部分包括:注意力机制和自注意力机制、Transformer的架构概述、Encoder的多头注意力(Multi-Head Attention)、Encoder的位置编码(Positional Encoding)、残差链接、层规范化(Layer Normalization)、FFN(Feed Forward Network)、Transformer的训练及性能、Transformer的机器翻译工作流程。   代码精讲部分使用Jupyter Notebook对Transformer的PyTorch代码进行逐行解读,包括:安装PyTorch、Transformer的Encoder代码解读、Transformer的Decoder代码解读、Transformer的超参设置代码解读、Transformer的训练示例(人为随机数据)代码解读、Transformer的训练示例(德语-英语机器翻译)代码解读。相关课程: 《Transformer原理与代码精讲(PyTorch)》https://edu.csdn.net/course/detail/36697《Transformer原理与代码精讲(TensorFlow)》https://edu.csdn.net/course/detail/36699《ViT(Vision Transformer)原理与代码精讲》https://edu.csdn.net/course/detail/36719《DETR原理与代码精讲》https://edu.csdn.net/course/detail/36768《Swin Transformer实战目标检测:训练自己的数据集》https://edu.csdn.net/course/detail/36585《Swin Transformer实战实例分割:训练自己的数据集》https://edu.csdn.net/course/detail/36586《Swin Transformer原理与代码精讲》 https://download.csdn.net/course/detail/37045

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值