簡單實現Transformer的自注意力

簡單實現Transformer的自注意力

關注{曉理紫|小李子},獲取技術推送信息,如感興趣,請轉發給有需要的同學,謝謝支持!!

如果你感覺對你有所幫助,請關注我。

在這里插入圖片描述
源碼獲取:VX關注并回復chatgpt-0獲得

  • 實現的功能

假如有八個令牌,現在想讓每一個令牌至于其前面的通信,如第5個令牌不與6,7,8位置的令牌通信(這是未來的令牌),只與4,3,2,1位置的令牌通信。因此只能通過以前的上下文信息猜測后面的;一種弱的通信方式是取前面的平局值。如5位置==5,4,3,2,1位置上的平局值。

  • 實現
    • 循環的版本
import torch
from torch.nn import functional as F
import torch.nn as nn
torch.manual_seed(1337)B,T,C = 4,8,2 #batch,time,channels 
x = torch.randn(B,T,C)
xbow = torch.zeros((B,T,C))
print(f'x: {x[0]}')
for b in range(B):for t in range(T):xprev = x[b,:t+1] #()t,Cxbow[b,t] = torch.mean(xprev,0)
print(f'xbow: {xbow[0]}')#結果
x: tensor([[ 0.1808, -0.0700],[-0.3596, -0.9152],[ 0.6258,  0.0255],[ 0.9545,  0.0643],[ 0.3612,  1.1679],[-1.3499, -0.5102],[ 0.2360, -0.2398],[-0.9211,  1.5433]])
xbow: tensor([[ 0.1808, -0.0700],[-0.0894, -0.4926],[ 0.1490, -0.3199],[ 0.3504, -0.2238],[ 0.3525,  0.0545],[ 0.0688, -0.0396],[ 0.0927, -0.0682],[-0.0341,  0.1332]])
# 每一行至于自己以及自己以前的數據進行通信
  • 通過數據矩陣高效實現
a = torch.tril(torch.ones(3,3)) #下三角函數
a = a/torch.sum(a,1,keepdim=True) #對a求平均數
b = torch.randint(0,10,(3,2)).float()
c = a @ bprint(f'a:{a}')
print(f'b:{b}')
print(f'c:{c}')#結果a:tensor([[1.0000, 0.0000, 0.0000],[0.5000, 0.5000, 0.0000],[0.3333, 0.3333, 0.3333]])
b:tensor([[0., 4.],[1., 2.],[5., 5.]])
c:tensor([[0.0000, 4.0000],[0.5000, 3.0000],[2.0000, 3.6667]])
  • 使用Softmax
tril = torch.tril(torch.ones(T,T))  #下三角函數
print(f'tril:{tril}')wei = torch.zeros((T,T))
wei = wei.masked_fill(tril==0,float('-inf'))# mask填充,對于tril為0的填充負無窮大
print(f'wei: {wei}')
wei = F.softmax(wei,dim=-1)# softmax對沒一行的每個元素進行求冪,在求平均數
print(f'wei: {wei}')
xbow3 = wei @ xprint(f'xbow3: {xbow3}')
print(torch.allclose(xbow,xbow3))
  • 單頭自注意力

    • 上面的自注意力是通過相同的方式獲取以往的信息。但是實際上并不希望是統一的方式,因為不同的token標記會發現其他不同的標記。
    • 例如:我是元音,那么也許我正在尋找過去的輔音,或與我想知道這些輔音是什么。希望這些信息流向我,所以我現在想以依賴數據的方式收集過去的信息。這就是自注意力解決的問題。
    • 方式如下:每個節點或每個位置的每個令牌都會發出兩個向量,一個發出查詢query,一個發出鍵key。查詢向量粗略的說就是我要找的東西,鍵向量粗略的講就是我包含什么。
    • 現在在序列中獲取這些標記之間的親和力的方式基本上只是在鍵和查詢之間做一個點乘積。所以我的查詢與所有的其他tokens令牌的所有鍵進行點乘積。并且點積方式變了。如果鍵和查詢有點對齊,它們將交互到非常高的數量,然后我將了解有關特定標記的更多信息,而不是其他不再序列中的任何其他標記。
head_size = 16
key = nn.Linear(C,head_size,bias=False)
query = nn.Linear(C,head_size,bias=False)k = key(x) #(B,T,16)
q = key(x) #(B,T,16)
wei = q @ k.transpose(-2,-1) #轉置時最后兩個維度為負 (B,T,16) @ (B,16,T) ---> (B,T,T)tril = torch.tril(torch.ones(T,T))  #下三角函數
wei = wei.masked_fill(tril==0,float('-inf'))# mask填充,對于tril為0的填充負無窮大 主要是為了避免關注后面信息。如果想讓所有節點進行交流刪除詞句。解碼器中保留,編碼器刪除允許所有節點通信
wei = F.softmax(wei,dim=-1)# softmax對沒一行的每個元素進行求冪,在求平均數 主要為了避免關注過小的信息主要是負數
print(f'wei: {wei[0]}')
out = wei @ x
print(f'out:{out.shape}')
  • 但是在真是中并不聚合到x而是計算一個v.x看作為該令牌的私人信息,與不同頭交流的信息存儲在v中
head_size = 16
key = nn.Linear(C,head_size,bias=False)
query = nn.Linear(C,head_size,bias=False)k = key(x) #(B,T,16)
q = key(x) #(B,T,16)
wei = q @ k.transpose(-2,-1) #轉置時最后兩個維度為負 (B,T,16) @ (B,16,T) ---> (B,T,T)tril = torch.tril(torch.ones(T,T))  #下三角函數
wei = wei.masked_fill(tril==0,float('-inf'))# mask填充,對于tril為0的填充負無窮大 主要是為了避免關注后面信息。如果想讓所有節點進行交流刪除詞句。解碼器中保留,編碼器刪除允許所有節點通信
wei = F.softmax(wei,dim=-1)# softmax對沒一行的每個元素進行求冪,在求平均數 主要為了避免關注過小的信息主要是負數
print(f'wei: {wei[0]}')
value = nn.Linear(C,head_size,bias=False)
v = value(x)
out = wei @ v
print(f'out:{out.shape}')

簡單實現自注意力

關注{曉理紫|小李子},獲取技術推送信息,如感興趣,請轉發給有需要的同學,謝謝支持!!

如果你感覺對你有所幫助,請關注我。

在這里插入圖片描述

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

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

相關文章

二叉樹的右視圖,力扣

目錄 題目: 我們直接看題解吧: 快速理解解題思路小建議: 審題目事例提示: 解題方法: 解題分析: 解題思路: 代碼實現(DFS): 代碼1: 補充說明: 代碼2&#xff1…

Vue.js中的$nextTick

其實目前在我現有的開發經歷中,我還沒有實際運用過$nextTick,今天在看書時,學習到了這個東西,所以做個筆記記錄一下。 一、$nextTick是什么? $nextTick 是 Vue提供的一個方法,用于在 DOM 更新之后執行回調…

AI:148-開發一種智能語音助手,能夠理解和執行復雜任務

??點擊這里跳轉到本專欄,可查閱專欄頂置最新的指南寶典~ ?????? 你的技術旅程將在這里啟航! 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶關鍵代碼,詳細講解供大家學習,希望…

淺談鉤子方法

何為鉤子方法 鉤子方法(Hook methods)是一種在面向對象編程中常用的設計模式,也被稱為模板方法模式。在這種模式中,父類定義了一個算法的框架,并且將一些步驟的實現延遲到子類中。子類可以通過重寫這些“鉤子方法”來改…

[技巧]Arcgis之圖斑四至點批量計算

前言 上一篇介紹了arcgis之圖斑四至范圍計算,這里介紹的圖斑四至點的計算及獲取,兩者之間還是有差異的。 [技巧]Arcgis之圖斑四至范圍計算 這里說的四至點指的是圖斑最東、最西、最南、最北的四個地理位置點坐標,如下圖: 四至點…

青山隱隱,敗葉蕭蕭

給定序列需滿足二個條件:本身是質數,相鄰二項之和仍為質數 首先一個偶數2*n不能通過2*k(k取整數)得到質數。 奇數2*n-12*k2*(nk)-1,可能得到質數 那么若序列中存在偶數,一定不滿足第一個條件(特判0,2&am…

STM32進階筆記——復位、時鐘與滴答定時器

本專欄爭取每周三更新直到更新完成,期待大家的訂閱關注,歡迎互相學習交流。 目錄 一、復位1.1 軟件復位1.2 低功耗管理復位 二、時鐘2.1 系統時鐘(SYSCLK)選擇2.2 系統時鐘初始化 三、滴答定時器(Systick)3.1 SysTick部分寄存器3.…

部署bpmn項目實現activiti流程圖的在線繪制

本教程基于centos7.6環境中完成 github開源項目: https://github.com/Yiuman/bpmn-vue-activiti軟件:git、docker 1. 下載源代碼 git clone https://github.com/Yiuman/bpmn-vue-activiti.git2. 修改Dockerfile文件 聲明基礎鏡像,將項目打包&#xff…

EasyRecovery數據恢復軟件有什么優勢呢?

EasyRecovery數據恢復軟件具有以下優勢: 強大的恢復能力:EasyRecovery采用先進的掃描和恢復技術,能夠深度掃描存儲設備,尋找并恢復因各種原因丟失的數據。無論是誤刪除、格式化、分區損壞還是病毒感染,它都能提供有效…

設計模式(十一)策略模式

請直接看原文:設計模式(十一)策略模式_某移動支付系統在實現賬戶資金轉入和轉出時需要進行身份驗證,該系統為用戶提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…

LeetCode01 - 35.搜索插入位置

一、題目要求 給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示…

SpringMVC 學習(十一)之數據校驗

目錄 1 數據校驗介紹 2 普通校驗 3 分組校驗 4 參考文檔 1 數據校驗介紹 在實際的項目中,一般會有兩種校驗數據的方式:客戶端校驗和服務端校驗 客戶端校驗:這種校驗一般是在前端頁面使用 JS 代碼進行校驗,主要是驗證輸入數據…

文物預防性保護系統方案的需求分析

沒有文物保存環境監測,就不能實施有效的文物預防性保護。因此要建立文物預防性保護體系,一定要先有良好的文物狀態監測制度,進而進行科學有效的文物保護管理。所以,導入文物預防性保護監測與調控系統,首先就是要針對文物進行全年溫度、濕度、光照等關鍵參…

使用Zint庫生成一維碼/條形碼

下面代碼是是使用 Zint 庫生成 Code 128 類型的條形碼&#xff0c;并將生成的條形碼保存為 output.bmp 文件。下面是對代碼的詳細解釋&#xff1a; #include 和 #include <zint.h>&#xff1a;這兩行代碼包含了所需的頭文件&#xff0c;分別是標準輸入輸出流的頭文件和 Z…

LeetCode---【鏈表的操作】

目錄 206反轉鏈表【鏈表結構基礎】21合并兩個有序鏈表【遞歸】我的答案【錯誤】自己修改【超出時間限制】在官方那里學到的【然后自己復寫,錯誤】對照官方【自己修改】 160相交鏈表【未理解題目目的】在b站up那里學到的【然后自己復寫,錯誤】【超出時間限制】對照官方【自己修改…

(C語言)qsort函數模擬實現

前言 我們需先了解qsort函數 qsort函數詳解&#xff1a;http://t.csdnimg.cn/rTNv9 qsort函數可以排序多種數據類型&#xff0c;很是神奇&#xff0c;這是為什么&#xff0c;我們在里模擬實現這樣的功能 目錄 1. qsort函數模擬實現 2. 我們使用bubble_sort函數排序整形數…

探究前端的.less樣式文件 css的增強版

前言 .less 文件是一種層疊樣式表&#xff08;CSS&#xff09;預處理器語言的文件格式&#xff0c;簡稱 LESS&#xff08;Leaner Style Sheets&#xff09;。它擴展了 CSS 語言&#xff0c;增加了變量、混合、函數和許多其他技術&#xff0c;使得 CSS 更加易于維護和擴展。 與…

AntDesignVue之a-table中key不唯一問題處理的多種方式

AntDesignVue2之a-table中key不唯一問題處理的多種方式 文章目錄 AntDesignVue2之a-table中key不唯一問題處理的多種方式1. key不唯一問題1. 問題描述2. 解決方法1. 帶冒號的rowKey2 . 帶冒號的rowKey綁定表達式3. 不帶冒號的rowKey屬性 1. key不唯一問題 1. 問題描述 antdv: …

Sunshine v0.21.0 安裝卡住,閃退的問題解決

上期博客講了如何利用 Sunshine 和 Moonlight 實現 iPad 當作 Windows 副屏&#xff0c;用官方 Windows installer 安裝 Sunshine 過程中&#xff0c;遇到了安裝卡住&#xff08;這個是因為需要國外網絡環境&#xff09;&#xff0c;安裝后運行閃退的問題。 Sunshine 下載地址…

OpenCV 4基礎篇| OpenCV圖像的裁切

目錄 1. Numpy切片1.1 注意事項1.2 代碼示例 2. cv2.selectROI()2.1 語法結構2.2 注意事項2.3 代碼示例 3. Pillow.crop3.1 語法結構3.2 注意事項3.3 代碼示例 4. 擴展示例&#xff1a;單張大圖裁切成多張小圖5. 總結 1. Numpy切片 語法結構&#xff1a; retval img[y:yh, x…