李宏毅-Self-attention機制詳解

原視頻鏈接:attention

一. 基本問題分析

1. 模型的input

無論是預測視頻觀看人數還是圖像處理,輸入都可以看作是一個向量,輸出是一個數值或類別。然而,若輸入是一系列向量,長度可能會不同,例如把句子里的單詞都描述為向量,那么模型的輸入就是一個向量集合,并且每個向量的大小都不一樣。解決這個問題的方法是One-hot Encoding以及Word Embedding,其中Word Embedding更能考慮到相似向量的語義信息,如下所示:

2. 模型的output

輸出可以是每個vector都產生個對應的label,即N to N。如:在社交網絡中,推薦某個用戶商品(這個用戶可能會買或者不買);

也可以是N to 1。如:情感分析,給出一句話this is good,輸出positive;反之給出另一段消極的話輸出negative;

也可以是N to M。如:翻譯工作,翻譯到另一個語言可能和原語言單詞長度不一樣

3. attention的引入

比如我們想利用全連接網絡,輸入一個句子,輸出對應單詞的標簽。當一個句子里出現兩個相同的單詞,并且它們的詞性不同(例如:I saw a saw. 我看見一把鋸子),這個時候就需要考慮上下文:利用滑動窗口,每個向量查看窗口中相鄰的其他向量的性質。?但是滑動窗口所觀看的視野是有限的,窗口增大又會計算量增大,且容易過擬合,這就引出了self-attention機制。

二. self-attention機制

輸入整個語句的向量到self-attention中,輸出對應單詞的向量,再將其結果輸入到全連接網絡,最后輸出標簽。以上過程可多次重復,如圖所示:

?1. 初探“self-attention層”內部機理

這里的a1-a4可以是輸入的向量,也可以是隱藏層的輸出,b1-b4都是觀察到全局的信息(即a1-a4)才得到的輸出,如下所示:

?那么這里的b1-b4又是如何產生的呢?b1考慮了a1和這個序列里面哪些是重要的,哪些是次要的。這種重要程度指標通過α表示,即向量之間都有一個相關程度:

?接下來考慮α是如何計算的,下圖有兩種方法,論文用的是第一種(圖左側),因此著重講述。繼續使用上面的例子,綠色方塊代表兩個向量a1和a4,我們想計算它們的相關度,將其分別乘上矩陣Wq與Wk(這兩個矩陣是通過模型學習學到的)得到向量q與k,再將q與k做內積就得到α了。

??這樣我們可以分別計算出a2、a3、a4對應的k2、k3、k4(Wk是這些向量所共享的),我們可以分別計算出a1與a2、a3、a4的相關度α1,2、α1,3、α1,4,當然α1,1是和自己的相關度,也可以算。如下所示:

?有了α后,我們可以考慮b1-b4的計算了,怎么使用這些α抽取關注的特征呢?我們再引入一個矩陣Wv(同樣是學習得到的),分別將a1-a4與Wv相乘得到v1-v4,將v1與α1,1相乘,v2與α1,2相乘...最后相加,即得到了b1。b2、b3、b4是同理的,下圖只畫出來了b1:

?2. 再探“self-attention層”內部機理

看起來可能復雜,但是實際上涉及的參數只有輸入的向量以及Wq、Wk、Wv三個矩陣。運算過程也都是矩陣乘法。我們從矩陣乘法的角度重新理解下,如下圖所示,我們將輸入向量a1-a4拼起來,分別乘Wq、Wk、Wv即得到了q1-a4、k1-k4、v1-v4:

將k1-k4與q1-q4做內積即得到了每個向量與其他三個向量的相關度,如下圖所示,例如第一個向量與其他三個向量的相關度為α1,2、α1,3、α1,4,而α1,1代表和自己的相關度:

將α組成的矩陣記為A,經過softmax處理一下記為A':

?v1-v4組成矩陣V,與A'相乘,根據矩陣乘法,V與A'的第一列相乘再相加的結果即為b1,同理可得b2-b4,b1-b4組成的矩陣就是最終的輸出了:

?3. 總結?

  • 階段1:根據Q和K計算兩者的相似性或者相關性
  • 階段2:對第一階段的原始分值進行歸一化處理
  • 階段3:根據權重系數A'對V進行加權求和,得到最終的輸出

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

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

相關文章

C 深入指針(4)

目錄 一、字符指針變量 1 初始化 2 與字符串數組的區別 二、數組指針變量 1 初始化 2 二維數組傳參本質 三、函數指針變量 1 初始化 2 用法 四、typedef關鍵字 五、函數指針數組 一、字符指針變量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

機器人非線性阻抗控制系統

機器人非線性控制系統本質上是一個復雜的控制系統&#xff0c;其狀態變量和輸出變量相對于輸入變量的運動特性不能用線性關系來描述。這種系統的形成基于兩類原因&#xff1a;一是被控系統中包含有不能忽略的非線性因素&#xff0c;二是為提高控制性能或簡化控制系統結構而人為…

人形機器人場景應用全解析,2024睿抗 AI ROBOT創新挑戰賽火熱報名中!

人工智能&#xff08;AI&#xff09;已成為推動科技革命和產業變革的關鍵力量。隨著大模型等AIGC技術的迅猛發展&#xff0c;AI正深刻改變我們的生活并重新定義生產方式。越來越多人期望將AI技術從純粹的思維和計算擴展到與物理世界的互動中&#xff0c;即發展具身智能。 為了推…

探索中國文本到視頻AI模型——Vidu

引言 隨著人工智能技術的不斷進步&#xff0c;我們見證了從文本到視頻內容生成的革命。最近&#xff0c;一個名為Vidu的中國文本到視頻AI模型引起了全球的關注。由清華大學和中國AI初創公司聲書科技聯合開發的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它聲稱能夠生成高…

測試周期記錄

測試周期是軟件開發生命周期中的一個重要環節&#xff0c;它包括單元測試、集成測試、系統測試和驗收測試等階段。本文將詳細介紹測試周期的各個階段及其重要性&#xff0c;幫助讀者更好地理解測試周期在軟件開發過程中的作用。 一、單元測試 單元測試是測試周期中的第一個階段…

個人工控方面收藏網址記錄(持續更新中)

1、OPC類 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物聯網IoT協議之OPC UA快速入門教程 | 源碼先生的調試人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根據集群具體數量修改pod數&#xff0c;官方推薦比例為5/1&#xff0c;即有15臺服務器最好是3個pod。 2.coredns會繼承pod所在主機的dns解析,修改了主機的dns解析之后&#xff0c;coredns有一段時間的緩存&#xff0c;重啟coredns才會在集群內部立刻生效該解析。 …

SpringBoot3集成WebSocket

標簽&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、簡介 WebSocket通過一個TCP連接在客戶端和服務器之間建立一個全雙工、雙向的通信通道&#xff0c;使得客戶端和服務器之間的數據交換變得更加簡單&#xff0c;允許服務端主動向客戶端推送數據&#xf…

003_PyCharm的安裝與使用

如果你正在學習PyQt&#xff0c;本系列教程完全可以帶你入門直至入土。 所謂從零開始&#xff0c;就是從軟件安裝、環境配置開始。 不跳過一個細節&#xff0c;不漏掉一行代碼&#xff0c;不省略一個例圖。 IDE 開始學習一個編程語言&#xff0c;我們肯定是首先得安裝好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模擬耗時計算std::this_thread::sleep_for(std::chrono::seconds(2));// 設置結果到 promise 中promiseObj.set_value(42); }i…

信息系統項目管理師——十大管理過程輸入、工具和技術、輸出(論文篇)二

六、項目風險管理 規劃風險管理 在撰寫關于“規劃風險管理”的論文時&#xff0c;這個過程是項目風險管理的第一步&#xff0c;旨在建立風險管理的框架&#xff0c;為整個項目周期內的風險識別、分析、應對和監控奠定基礎。以下是規劃風險管理過程中可能涉及的輸入、工具和技…

Python學習(五)異常處理

異常概念 異常的捕獲方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出現異常了&#xff0c;因為文件不存在&#xff0c;我將open的模式&#xff0c;改為w模式去打開") f open("D:/abc.txt&qu…

Python代碼:十、字符串連接

1、題目 小明有兩個最好的朋友&#xff0c;他們的名字分別用input讀入記錄在兩個字符串中&#xff0c;請使用字符串連接&#xff08;&#xff09;幫助牛牛將兩個朋友的名字依次連接在一個字符串中輸出。 2、代碼 import sysstr1 input() str2 input() str3 str1 str2 pr…

從0到1:使用HuggingFace的管線加載Diffusion模型生成第一張圖像!

Hugging Face系列1&#xff1a;詳細剖析Hugging Face網站資源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型簡介1.1.2 制作模型卡片1.1.3 模型下載和上傳1.1.4 模型應用 1.2 數據集1.2.1 數據集簡介1.2.2 調用代碼1.2.3 AutoTrain在線微調 1.3 Space應用1.3.1 內容…

理解 Python 中的 `super()` 與 `__init__()` 方法

在 Python 的面向對象編程中&#xff0c;super() 函數和 __init__() 方法是兩個非常重要的概念。它們在類的繼承和初始化過程中扮演著關鍵的角色。本文將深入探討這兩個概念的工作原理&#xff0c;并通過示例代碼來展示它們的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件總線:EventBus與$bus的比較詳解與實戰應用

EventBus實例&#xff1a; var EventBus new Vue() 會創建一個名為EventBus的Vue實例&#xff0c;并將其存儲在變量EventBus中。Vue.prototype.$bus new Vue() 則直接在Vue的原型上創建一個新的Vue實例&#xff0c;并將其賦值給$bus屬性。 使用方式&#xff1a; var EventBus…

C# 結合 JavaScript 對 Web 控件進行數據輸入驗證

目錄 關于數據驗證 范例運行環境 驗證設計 JavaScript 方法 設計 實現 調用示例 C# 方法 設計 實現 調用示例 小結 關于數據驗證 在 Web 應用的錄入界面&#xff0c;數據驗證是一項重要的實現功能&#xff0c;數據驗證是指確認 Web 控件輸入或選擇的數據&#xff…

類對象作為類成員

在C中&#xff0c;類對象可以作為另一個類的成員變量。這種設計方式可以用于創建復雜的對象結構&#xff0c;使得一個類的對象能夠包含另一個類的對象。這種嵌套類的組合方式可以增強代碼的可重用性和模塊化。 類對象作為類成員的示例 讓我們通過一個示例來解釋這一概念。假設…

武漢信息系統建設和服務能力評估CS認證咨詢

很多企業在咨詢信息系統建設和服務能力評估的時候喜歡百度搜索&#xff0c;不管是本地咨詢機構還是外地咨詢機構只要價格便宜就找誰&#xff0c;這個在低等級的CS1是可以這么操作的&#xff0c;一旦上升到CS2級別及以上的&#xff0c;我們一般不推薦找外地咨詢機構&#xff0c;…

【文末附gpt升級方案】字節跳動發布豆包大模型:AI領域的革新與引領

隨著科技的飛速進步&#xff0c;人工智能&#xff08;AI&#xff09;已逐漸成為推動社會發展的重要力量。在這一背景下&#xff0c;字節跳動公司以其前瞻性的眼光和創新能力&#xff0c;于XXXX年XX月XX日正式發布了豆包大模型&#xff0c;這一舉動無疑在AI領域掀起了新一輪的浪…