自注意力機學習

自注意力機制的核心概念

1. Query, Key 和 Value
  • Query(查詢向量):可以看作是你當前在關注的輸入項。假設你正在閱讀一段文字,這就像你當前在讀的句子。

  • Key(鍵向量):表示其他所有輸入項的標識或特征。這就像你在書中已經讀過的所有句子的摘要或要點。

  • Value(值向量):是與每個Key相關聯的具體信息或內容。就像這些句子帶來的詳細信息。

現實比喻
想象你在圖書館尋找一本特定的書(Query),書架上有很多書,每本書都有一個書名(Key)。根據書名(Key)匹配你的查詢(Query),你從合適的書中獲取詳細內容(Value)。

2. 點積注意力(Dot-Product Attention)

這是計算Query和Key之間相關性的方式。我們通過計算Query和Key的點積來確定它們的關系強度。

比喻
就像在圖書館,你有一本書的部分標題(Query),你對比書架上所有書的書名(Key),看哪個書名最接近你的標題,然后選出最相關的書(Value)。

3. 縮放(Scaling)

為了防止Query和Key之間的點積結果太大導致數值不穩定,我們將結果除以一個常數——通常是Key向量的維度的平方根。這使得計算更加穩定。

比喻
假設你在測試你的記憶力,如果你直接用高分數衡量,可能會出現極端值。所以你需要調整分數范圍,使得評估更合理和穩定。

4. Softmax 歸一化

Softmax函數將一組數值轉換為概率分布,使得它們的總和為1。這意味著每個單詞的注意力權重表示它對當前處理單詞的重要性。

比喻
就像你在評分不同的書,Softmax就像把所有的分數轉換成百分比,這樣你可以看到每本書相對于其他書的重要性。

自注意力機制的工作流程

讓我們更詳細地看看自注意力機制是如何一步一步工作的:

  1. 生成 Query, Key 和 Value 向量

    我們首先通過線性變換將輸入序列的每個單詞轉換成三個不同的向量:Query, Key 和 Value。

    query = W_q * input
    key = W_k * input
    value = W_v * input
    

    比喻:這是把每個單詞變成三個不同的代表,就像給每個單詞生成了三個不同的標簽,用于不同的目的(查詢、匹配和提供信息)。

  2. 計算注意力權重

    通過計算Query和Key的點積,我們得到它們之間的相關性得分。然后,我們將這些得分除以 d k \sqrt{d_k} dk? ? 進行縮放,最后應用Softmax函數來得到權重。

    # 計算點積
    scores = query.dot(key.T) / sqrt(d_k)
    # 使用Softmax函數歸一化
    attention_weights = softmax(scores)
    

    比喻:這就像你比較當前正在讀的句子(Query)和你已經讀過的所有句子(Key),然后根據它們的相似程度打分。接著,你將這些分數標準化,使它們總和為1,表示每個句子的重要性百分比。

  3. 加權求和 Value 向量

    我們將Value向量按照注意力權重進行加權求和,這樣每個Value對最終輸出的貢獻由它的重要性決定。

    # 計算加權的Value
    output = sum(attention_weights * value)
    

    比喻:就像你根據每本書的重要性百分比(注意力權重),從每本書中提取一定量的信息(Value),最終形成你對整個圖書館信息的理解。

示例和實際應用

假設你在處理一句話“我喜歡吃蘋果,因為蘋果很甜”:

  1. Query, Key, Value

    • Query:當前處理的詞是“蘋果”。
    • Key:句子中的所有單詞的表示,如“我”,“喜歡”,“吃”,“蘋果”,“因為”,“很”,“甜”。
    • Value:這些單詞的具體信息,比如它們的詞義或上下文信息。
  2. 點積注意力

    • 你在評估“蘋果”和句子中其他詞的關系,比如“蘋果”與“甜”的關系就很重要,而與“我”關系可能不大。
  3. Softmax 歸一化

    • 將關系得分轉化為一個概率分布,表示每個單詞對當前詞“蘋果”的重要性。
  4. 加權求和

    • 最后,根據重要性權重,從每個單詞中提取信息,生成“蘋果”的最終表示,這樣“蘋果”就包含了它和“甜”的關系。

自注意力機制代碼示例

import torch
import torch.nn as nn
import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, self).__init__()self.embed_size = embed_sizeself.heads = headsself.head_dim = embed_size // headsassert (self.head_dim * heads == embed_size), "Embedding size needs to be divisible by heads"self.values = nn.Linear(self.head_dim, embed_size, bias=False)self.keys = nn.Linear(self.head_dim, embed_size, bias=False)self.queries = nn.Linear(self.head_dim, embed_size, bias=False)self.fc_out = nn.Linear(embed_size, embed_size)def forward(self, values, keys, query, mask):N = query.shape[0]value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]# 1. 生成 Query, Key 和 Value 向量values = values.reshape(N, value_len, self.heads, self.head_dim)keys = keys.reshape(N, key_len, self.heads, self.head_dim)queries = query.reshape(N, query_len, self.heads, self.head_dim)# 2. 計算注意力權重energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])if mask is not None:energy = energy.masked_fill(mask == 0, float("-1e20"))attention = torch.softmax(energy / (self.embed_size ** (1 / 2)), dim=3)# 3. 加權求和 Value 向量out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.embed_size)out = self.fc_out(out)return out

關鍵概念總結

  1. 自注意力機制:允許模型在處理一個輸入時,同時關注到整個輸入序列中的所有其他輸入。提高了捕捉長距離依賴關系的能力。

  2. Query, Key 和 Value:分別代表當前處理的焦點、其他輸入的標識和它們攜帶的信息。

  3. 點積注意力:通過計算Query和Key的相似性來確定它們之間的關系強度。

  4. 縮放:對點積結果進行調整,防止數值過大導致計算不穩定。

  5. Softmax 歸一化:將相似性得分轉化為概率分布,表示每個輸入的重要性。

通過這些步驟,自注意力機制能夠幫助模型在處理每一個輸入時同時考慮整個序列,從而更好地理解上下文和詞語之間的關系。

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

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

相關文章

保姆級 | MySQL的安裝配置教程(非常詳細)

一、下載Mysql 官網步驟 MySQLhttps://www.mysql.com/進入官網首頁 點擊DOWNLOADS 點擊MySQL Community (GPL) Downloads 點擊 小頁面直接進入 MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/點擊“Download”下載最新版本,其他…

【吊打面試官系列】MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?

大家好,我是鋒哥。今天分享關于 【MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?】面試題,希望對大家有幫助; MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別&#xf…

碳素鋼化學成分分析 螺紋鋼材質鑒定 鋼材維氏硬度檢測

碳素鋼的品種主要有圓鋼、扁鋼、方鋼等。經冷、熱加工后鋼材的表面不得有裂縫、結疤、夾雜、折疊和發紋等缺陷。尺寸和允許公差必須符合相應品種國家標準的要求。 具體分類、按化學成分分類 : 碳素鋼按化學成分(即以含碳量)可分為低碳鋼、中…

機器學習筆記 - stable diffusion web-ui安裝教程

一、Stable Diffusion WEB UI 屌絲勁發作了,所以本地調試了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,網絡上各種打包套件什么的好像很火。國內的也就這個層次了,老外搞創新,國內跟著屁股后面搞搞應用層,就叫大神了。 不扯閑篇了,我們這里從git源碼直接…

問題:11單位內部人員對行政機關作出的行政處分不服,可申請行政復議. #其他#微信

問題:11單位內部人員對行政機關作出的行政處分不服,可申請行政復議. 參考答案如圖所示

問題:脾梗塞時,下列情況最符合的是 #職場發展#知識分享#媒體

問題:脾梗塞時,下列情況最符合的是 A、脾腫大 B、脾區摩擦感 C、兩者均有 D、兩者均無 參考答案如圖所示

uniapp視頻組件層級太高,解決方法使用subNvue原生子體窗口

目錄 前言 先看一下uniapp官網的原話: subNvue的一些參數介紹 subNvues使用方法: 綁定id 顯示 subNvue 彈出層 subNvue.show() 參數信息 subNvue.hide() 參數信息 在使用subNvue 原生子體窗口 遇到的一些問題 前言 nvue 兼容性 以及使用方式 控…

基于 中間件 的 數據交換平臺 的實現

一、介紹 A. 背景和目的 隨著云計算、大數據和物聯網等技術的快速發展,企業面臨著越來越多的數據交換和集成需求。不同系統之間的數據交換變得越來越復雜,而且數據量也越來越大,這對傳統的數據交換方式提出了更高的要求。 中間件作為一種能…

把ROS程序作為桌面圖標雙擊啟動

1 寫launch文件 把ROS程序寫成一個launch文件&#xff0c;例如 powerline_with_rviz.launch <launch><!-- Load camera parameters --><rosparam file"$(find choose_powerline)/config/camera_params.yaml" command"load"/><!-- …

深入理解并應用KTT求解約束性極值問題

KT 很簡單&#xff0c;口訣記心端&#xff0c;等式求最優&#xff0c;不等式驗證——小飛打油 以后每期嘗試編一句口訣&#xff0c;幫助大家記憶&#xff0c;可以是打油詩&#xff0c;也可以是類似“奇變偶不變&#xff0c;符號看象限”的口訣&#xff0c;如果編的不好&#xf…

2024年6月7日第十五周下午學習英語六級大綱

下午學習英語六級大綱的內容可以歸納為以下幾個主要方面&#xff1a; 一、考試概述 六級考試的對象&#xff1a;修完大學英語相應階段課程的在校大學生。考試目的&#xff1a;參照《大學英語教學指南》設定的教學目標&#xff0c;對我國大學生英語綜合運用能力進行科學測量&a…

Docker 常用命令以及鏡像選擇

目錄 1.Docker基本組成 2.鏡像選擇 2.1、鏡像推薦選擇方案 2.2版本選擇 3.Docker 命令 3.1鏡像管理 拉取鏡像&#xff1a; 列出鏡像&#xff1a; 刪除鏡像&#xff1a; 構建鏡像&#xff1a; 3.2容器管理 運行容器 列出運行中的容器和所有容器 停止容器 啟動重啟…

【Qt】QPushButton 與 QAction 的區別

1. QPushButton QPushButton 是一個界面控件&#xff0c;能顯示到界面上的。QPushButton 是 QWidget的一個子類&#xff0c;是一個表示按鈕的界面控件。它用于在GUI中提供一個標準的按鈕&#xff0c;用戶可以點擊它來觸發一個即時的動作或命令。按鈕可以顯示文本、圖標或兩者都…

為什么要將Modbus轉成MQTT

什么是Modbus Modbus 是一種串行通信協議&#xff0c;最初由Modicon&#xff08;現在的施耐德電氣Schneider Electric&#xff09;于1979年開發&#xff0c;用于可編程邏輯控制器&#xff08;PLC&#xff09;之間的通信。Modbus協議設計簡單&#xff0c;易于部署和維護&#xf…

從零入手人工智能(2)——搭建開發環境

1.前言 作為一名單片機工程師&#xff0c;想要轉型到人工智能開發領域的道路確實充滿了挑戰與未知。記得當我剛開始這段旅程時&#xff0c;心中充滿了迷茫和困惑。面對全新的領域&#xff0c;我既不清楚如何入手&#xff0c;也不知道能用人工智能干什么。正是這些迷茫和困惑&a…

用Python實現奇怪的瘋狂按鍵需求

項目背景 說起來好笑,假設有一個奇怪需求 — 僅僅是假設,不代表我有這個需求,雖然可以想象有人會有這個需求,但是這個人不是我,我也不認識任何這樣的人 — 瘋狂向某個程序輸出按鍵,比如,一會兒瘋狂輸入f,一會兒瘋狂輸入q。 如果是兩個按鍵需求,我想要設置一個最簡單…

M1Pro 使用跳板機

Mac (M1 Pro) 通過Iterm2 使用跳板機 1、由于堡壘機&#xff08;跳板機&#xff09;不能支持mac系統終端工具&#xff0c;只支持xshell等win生態。所以我們需要先安裝iterm2 裝iterms教程 這里頭對rz、sz的配置不詳細。我們可以這樣配置&#xff1a; where iterm2-send-zmod…

Windows 11中刪除分區的幾種方法,總有一種適合你

序言 想從Windows 11 PC中刪除一個分區,以便將空間重新分配給現有分區或創建一個新分區嗎?我們將為你介紹刪除Windows 11分區的多種方法。 刪除Windows上的分區時會發生什么 刪除分區時,Windows會擦除該分區的內容,并將該分區從電腦上的任何位置刪除。你將丟失保存在該分…

Github 2024-06-05 C開源項目日報 Top10

根據Github Trendings的統計,今日(2024-06-05統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量C項目10C++項目2Python項目1我的電視 - 安卓電視直播軟件 創建周期:40 天開發語言:CStar數量:649 個Fork數量:124 次關注人數:649 人貢獻人…

單元測試覆蓋率

什么是單元測試覆蓋率 關于其定義&#xff0c;先來看一下維基百科上的一段描述&#xff1a; 代碼覆蓋&#xff08;Code coverage&#xff09;是軟件測試中的一種度量&#xff0c;描述程序中源代碼被測試的比例和程度&#xff0c;所得比例稱為代碼覆蓋率。 簡單來理解&#xff…