Transformer中的位置編碼PE(position encoding)

Transformer中的位置編碼PE(position encoding)

1.提出背景

transformer模型的attention機制并沒有包含位置信息,即一句話中詞語在不同的位置時在transformer中是沒有區別的

2.解決背景

給encoder層和decoder層的輸入添加了一個額外的向量Positional Encoding(PE),與embedding維度一致

embedding維度:

  • 句子:詞向量的維度大小,如512
  • 圖片:通道數

實際應用中,會對位置信息向量如[1,2,…,16]先進行位置編碼,位置編碼的維度可以先保持與句子編碼維度一致,如512。再通過一個線性層,將維度降為需要的通道數,最后再進行信息合并。

3. 創建一個位置編碼器PE

需要的輸入設置

  • 序列的最大長度 max_seq_len,如1000
  • 編碼向量的維度 d_model,如512或128

主體邏輯

  1. 計算PE矩陣
  2. 重新定義嵌入層:將嵌入層的權重替換為PE(不可訓練)

PE計算
PE為二維矩陣,大小跟輸入embedding的維度一樣,行表示詞語,列表示詞向量;pos 表示詞語在句子中的位置;dmodel表示詞向量的維度;i表示詞向量的位置。因此,上述公式表示在每個詞語的詞向量的偶數位置添加sin變量,奇數位置添加cos變量,以此來填滿整個PE矩陣,然后加到input embedding中去,這樣便完成位置編碼的引入了。

參考:https://blog.csdn.net/qq_34771726/article/details/102918440

class PositionalEncoding(nn.Module):def __init__(self, max_seq_len: int, d_model: int):super().__init__()# Assume d_model is an even number for convenienceassert d_model % 2 == 0   # 為了編碼方便# ---1.計算PE矩陣# 位置編碼二維矩陣PE的大小: [max_seq_len, d_model]pe = torch.zeros(max_seq_len, d_model)  # 初始化為零矩陣# 行:i向量 [0,1,2,..., 999]  表示每個時間步ti_seq = torch.linspace(0, max_seq_len - 1, max_seq_len)# 列:j向量 [0,2,4,6,8]       表示偶數位j_seq = torch.linspace(0, d_model - 2, d_model // 2)   #(0, 8, 5)# 生成網格數據: 2個矩陣[1000, 5]pos, two_i = torch.meshgrid(i_seq, j_seq)pe_2i = torch.sin(pos / 10000**(two_i / d_model))    # 偶數位sinpe_2i_1 = torch.cos(pos / 10000**(two_i / d_model))  # 奇數位cos# stack拼接到第2個維度[0,1,2],在把3維重塑為2維pe = torch.stack((pe_2i, pe_2i_1), 2).reshape(max_seq_len, d_model)# ---2.定義嵌入層self.embedding = nn.Embedding(max_seq_len, d_model)  # 定義了一個嵌入層self.embedding.weight.data = pe      # 使用位置編碼計算好的嵌入矩陣對其進行初始化self.embedding.requires_grad_(False) # 將其參數設為不可訓練def forward(self, t):# 調用嵌入層方法# t表示抽取的時間點向量: [32, 43, 85, 31, 86, 90, 67, 61, 50, 33, 87, 48, 31, 48, 48, 93]return self.embedding(t)

4.調用位置編碼器PE

  1. 對輸入的位置向量,如[1,2,…,16]. 先經過PE編碼為詞向量長度: [16, 1, 128]
  2. 與原圖x拼接,即x+t
  • 先經過一個線性層,將詞向量維度轉換為與圖片通道數一致
  • 與原圖相加拼接
‘’‘
對輸入時間點的位置編碼
’‘’
# 1. 設置位置編碼器PE
max_seq_len = 1000   # 最大序列長度
d_model = 128        # 編碼向量的維度
pe = PositionalEncoding(max_seq_len, d_model)
pe# 2.隨機抽取時間點
n_steps = 100
batch_size = 16
t1 = torch.randint(0, n_steps, (batch_size, ))    # 隨機抽取16個時間點# 3.對時間點進行PE編碼
p1 = pe(t1)
p1    # 得到位置編碼結果[1000, 128]

將編碼后的時間與原圖進行拼接

‘’‘
將編碼后的時間與原圖進行拼接
’‘’
pe_dim = 128   # 詞向量維度
channel = 1    # 圖片通道數C
n = 16   # 圖片批量大小(也就是上面時間t的步數)# 1.先經過一個線性層,將詞向量維度轉換為與圖片通道數一致
# 設置映射空間層
pe_linear = nn.Sequential(nn.Linear(pe_dim, channel), nn.ReLU(),nn.Linear(channel, channel))
# 將128的詞詞向量維度轉換為1的圖片通道數
pe_v = pe_linear(p1).reshape(n, -1, 1, 1)  # (1, 128) -> (1,1) -> (1,1,1)
# pe_linear: 降維 128 -> 1 通道數
# reshape: 整理維度 [n, C, 1, 1]# 2.將整理后的位置編碼與圖片連接
# 原圖
x = torch.randn(1, 28, 28) # 拼接
x + pe_v  
# [16, 1, 28, 28]  
# 16: 數據批量大小(時間點的個數 - batch_size)
# 1: 通道數
# 28*28: 圖片大小

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20572.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

平移數據c++

題目描述 將a數組中第一個元素移到數組末尾,其余數據依次往前平移一個位置。 輸入 第一行為數組a的元素個數n; 第二行為n個小于1000的正整數。 輸出 平移后的數組元素,每個數用一個空格隔開。 樣例輸入 10 1 2 3 4 5 6 7 8 9 10 樣例輸出 2 3 …

【專利 超音速】一種光伏檢測系統

申請號CN202410053901.0公開號(公開)CN118032774A申請日2024.01.12申請人(公開)超音速人工智能科技股份有限公司發明人(公開)張俊峰(總); 葉長春(總); 許春夏 摘要 本發明公開一種光伏檢測系統&#xff0…

iotdb時序庫在火電設備鍋爐場景下的實踐【原創文字,IoTDB社區可進行使用與傳播】

一.概述 1.1 說明 本文章主要介紹iotdb數據庫在電站鍋爐工業場景下,對輔助智能分析與預警的使用介紹。 【原創文字,IoTDB社區可進行使用與傳播】 1.2 項目背景 隨著人工智能算法在電力領域的發展,以及燃煤鍋爐設備精細化調整需求的增加&…

Java基礎八股

Java基礎八股 Java語言Java語言有什么特點Java與C區別Java如何實現跨平臺JVMvsJDKvsJRE標識符和關鍵字的區別是什么自增自減運算符移位運算符continue,break,return的區別是什么final,finally,finalize的區別final關鍵字的作用時什么 變量 Java語言 Java語言有什么特點 Java是…

LED燈編程:一步步探索光的魔法

LED燈編程:一步步探索光的魔法 在數字時代,LED燈早已超越了傳統的照明功能,成為編程與創意結合的完美載體。那么,LED燈怎么編程呢?本文將分四個方面、五個方面、六個方面和七個方面,帶您走進LED燈編程的奇…

如何在Python中管理內存

在Python中,內存管理主要是由解釋器自動處理的,這包括對象的分配和回收。Python使用引用計數和垃圾回收機制來管理內存,這大大簡化了開發者的工作,因為他們通常不需要手動管理內存。 然而,盡管Python自動管理內存&…

數據結構——經典鏈表OJ(二)

樂觀學習,樂觀生活,才能不斷前進啊!!! 我的主頁:optimistic_chen 我的專欄:c語言 點擊主頁:optimistic_chen和專欄:c語言, 創作不易,大佬們點贊鼓…

chatgpt之api的調用問題

1.調用api過程中,出現如下報錯內容 先寫一個測試樣例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根據自己所在地區和key情況進行completion openai.ChatCompletion.create(model"g…

【intro】GNN中異構圖(heterogeneous graph)綜述

本篇博客內容是讀兩篇論文,兩篇論文連接如下: Heterogeneous graph neural networks analysis: a survey of techniques, evaluations and applications A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources …

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南 瓦羅蘭特作為當今游戲圈頂流的一款熱門FPS。游戲,作為拳頭游戲公司劃時代的一款游戲。游戲不僅延續了傳統FPS游戲的玩法,還添加許多新玩法,這也是游戲可以吸引大批量玩家的原因之…

Flink面試整理-對Flink的高級特性如CEP(復雜事件處理)、狀態后端選擇和調優等有所了解

Apache Flink 提供了一系列高級特性,使其成為一個強大的實時數據處理框架,特別適用于復雜的數據處理場景。其中,復雜事件處理(CEP)、狀態后端的選擇和調優是其中重要的幾個方面。 復雜事件處理(CEP) CEP 概念:CEP 是用于在數據流中識別復雜模式的技術。它允許用戶指定事…

基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真。輸出MPPT跟蹤后的系統電流,電壓以及功率。 2.系統仿真結果 3.核心程序與模型 版本:MAT…

cocos creator 3.x實現手機虛擬操作桿

簡介 在許多移動游戲中,虛擬操縱桿是一個重要的用戶界面元素,用于控制角色或物體的移動。本文將介紹如何在Unity中實現虛擬操縱桿,提供了一段用于移動控制的代碼。我們將討論不同類型的虛擬操縱桿,如固定和跟隨,以及如…

Go常見語法題目解析

1、寫出下面代碼輸出內容。 package mainimport ("fmt" )func main() {defer_call() }func defer_call() {defer func() { fmt.Println("打印前") }()defer func() { fmt.Println("打印中") }()defer func() { fmt.Println("打印后")…

快速冪

a^b % q 給定整數 a b q, 求 a 的 b 次方 mod q 根據題目數字取值范圍,不能暴力處理。 會有兩個問題: 1、計算 a 的次方會超出范圍 2、不能循環 b 次計算 a 的乘積,會超時 處理問題1: 每計算一次 a 的乘積&#xf…

視頻匯聚平臺EasyCVR對接GA/T 1400視圖庫結構化數據:人員/人臉、非/機動車、物品

在信息化浪潮席卷全球的背景下,公安信息化建設日益成為提升社會治理能力和維護社會穩定的關鍵手段。其中,GA/T 1400標準作為公安視頻圖像信息應用系統的核心規范,以其結構化數據處理與應用能力,為公安信息化建設注入了強大的動力。…

【圖解IO與Netty系列】Reactor模型

Reactor模型 Reactor模型簡介三類事件與三類角色Reactor模型整體流程 各種Reactor模型單Reactor單線程模型單Reactor多線程模型主從Reactor模型 Reactor模型簡介 Reactor模型是服務器端用于處理高并發網絡IO請求的編程模型,與傳統的一請求一線程的同步式編程模型不…

翼龍面板是什么,如何進行搭建

翼龍面板是一個開源的,用于游戲服務器管理的程序,可以方便地在網頁界面中創建Minecraft,起源引擎游戲和Teamspeak3 服務器。 它使用前后端程序,因此可以創建多后端節點,對游戲服務器和服務器節點進行統一管理。 對游戲…

Vue進階之Vue無代碼可視化項目(二)

Vue無代碼可視化項目 項目初始化路由子路由錯誤示范正確示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts項目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由樣式App.vue進一步的App.vue項目初始化 路由 router i…

synchronized 鎖的到底是什么?

通過8種情況演示鎖運行案例,看看我們到底鎖的是什么 1鎖相關的8種案例演示code package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 題目:談談你對多線程鎖的理解,8鎖案例說明* 口訣:線程 操作 資源類* 8…