自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

打破信息差!一款讓人驚艷的大模型3D可視化工具!

人工智能
無論你是否是技術(shù)愛好者,這個(gè)項(xiàng)目都將給你帶來前所未有的視覺盛宴和認(rèn)知啟迪。讓我們一起來探索這個(gè)令人驚嘆的創(chuàng)作吧!

近日,一位來自新西蘭的小哥Brendan Bycroft在技術(shù)圈掀起了一股熱潮。他創(chuàng)作的一項(xiàng)名為大模型3D可視化的項(xiàng)目,不僅登上了Hacker News的榜首,而且其震撼的效果更是讓人瞠目結(jié)舌。通過這個(gè)項(xiàng)目,你將在短短幾秒鐘內(nèi)完全理解LLM(Large Language Model)的工作原理。

無論你是否是技術(shù)愛好者,這個(gè)項(xiàng)目都將給你帶來前所未有的視覺盛宴和認(rèn)知啟迪。讓我們一起來探索這個(gè)令人驚嘆的創(chuàng)作吧!

簡介

本項(xiàng)目中,Bycroft詳細(xì)解析了OpenAI科學(xué)家Andrej Karpathy開發(fā)的一款輕量級GPT模型,名為Nano-GPT。作為一個(gè)縮小版的GPT模型,該模型僅擁有85000個(gè)參數(shù)。 當(dāng)然,盡管這個(gè)模型比OpenAI的GPT-3或GPT-4小得多,但可謂是“麻雀雖小,五臟俱全”。

Nano-GPT GitHub:https://github.com/karpathy/nanoGPT

為了方便演示Transformer模型每一層,Bycroft為Nano-GPT模型安排了一個(gè)非常簡單的目標(biāo)任務(wù):模型輸入是6個(gè)字母"CBABBC",輸出是按字母順序排好的序列,例如輸出 "ABBBCC".

我們稱每個(gè)字母為token,這些不同的字母構(gòu)成了詞表 vocabulary:

對于這張表格來說,每個(gè)字母分別分配了一個(gè)下標(biāo)token index。 這些下標(biāo)組成的序列可以作為模型的輸入:2 1 0 1 1 2

3D可視化中,每個(gè)綠色的單元代表經(jīng)過計(jì)算的數(shù)字,而每個(gè)藍(lán)色的單元?jiǎng)t表示模型的權(quán)重。

序列處理中,每個(gè)數(shù)字首先會(huì)被轉(zhuǎn)換為一個(gè)C維的向量,這個(gè)過程稱為嵌入(embedding)。在Nano-GPT中,這個(gè)嵌入的維度通常為48維。通過這種嵌入操作,每個(gè)數(shù)字被表示為一個(gè)在C維空間中的向量,從而能夠更好地進(jìn)行后續(xù)的處理和分析。

embedding要經(jīng)過一系列中間的模型層計(jì)算,這中間的模型層一般稱為Transformers,最后到達(dá)底層。

「那么輸出是什么呢?」

模型的輸出是序列的下一個(gè)token。 所以在最后,我們得到了下一個(gè)token是A B C的概率值。

在這個(gè)例子里,第6個(gè)位置模型以較大概率輸出了A。現(xiàn)在我們可以將A作為輸入傳入模型,重復(fù)整個(gè)過程就可以了。

此外還展示了GPT-2和GPT-3可視化效果。

  • GPT-3具有1750億個(gè)參數(shù),模型層足足有8列,密密麻麻沒遍布了整個(gè)屏幕。

  • GPT-2模型的不同參數(shù)版本展現(xiàn)出了巨大的架構(gòu)差異。這里以GPT-2(XL)的150億參數(shù)和GPT-2(Small)的1.24億參數(shù)為例。

需要注意的是,本可視化主要是側(cè)重于模型推理(inference),而不是訓(xùn)練,因此它只是整個(gè)機(jī)器學(xué)習(xí)過程的一小部分。并且,這里假設(shè)模型的權(quán)重已經(jīng)經(jīng)過預(yù)訓(xùn)練,再使用模型推理來生成輸出。

嵌入Embedding

前面有提到,如何使用一個(gè)簡單的查找表(Lookup Table)將token映射為一串整數(shù)。

這些整數(shù),即標(biāo)記token index,這是模型中第一次也是唯一一次看到整數(shù)。之后,將使用浮點(diǎn)數(shù)(十進(jìn)制數(shù))進(jìn)行運(yùn)算。

這里,以第4個(gè)token(index 3)為例,看看其是如何被用于生成輸入嵌入的第4列向量的。

首先使用token index (這里以B=1為例) 從Token Embedding matrix選擇第二列,得到一個(gè)大小為C=48(48維)的列向量,稱為token嵌入(token embedding)。

再從position embedding matrix選擇第四列(「因?yàn)檫@里主要查看第4個(gè)位置的(t = 3)token B」),同樣地,得到一個(gè)大小為C=48(48維)的列向量,稱為位置嵌入(position embedding)。

需要注意的是,position embeddings和token embeddings都是模型訓(xùn)練得到的(由藍(lán)色表示)?,F(xiàn)在我們得到了這兩個(gè)向量,通過相加我們就可以得到一個(gè)新的大小為C=48的列向量。

接下來,以相同的過程處理序列中的所有token,創(chuàng)建一組包含token值及其位置的向量。

由上圖可以看出,對輸入序列中的所有token運(yùn)行此過程,會(huì)產(chǎn)生一個(gè)大小為TxC的矩陣。其中,T表示序列長度。C表示通道(channel),但也稱為特征或維度或嵌入大小,在這里是48。這個(gè)長度C是模型的幾個(gè)“超參數(shù)”之一,設(shè)計(jì)者選擇它是為了在模型大小和性能之間進(jìn)行權(quán)衡。

這個(gè)維度為TxC的矩陣,即為輸入嵌入(input embedding),并通過模型向下傳遞。

小Tip: 隨意將鼠標(biāo)懸停在input embedding上的單個(gè)單元格上,可以查看計(jì)算及其來源。

層歸一化Layer Norm

前面得到的input embedding矩陣即是Transformer層的輸入。

Transformer層的第一步是對input embedding矩陣進(jìn)行層歸一化處理(layer normalization),這是對輸入矩陣每一列的值分別進(jìn)行歸一化的操作。

歸一化是深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的一個(gè)重要步驟,它有助于提高模型在訓(xùn)練過程中的穩(wěn)定性。

我們可以將矩陣的列單獨(dú)分開來看,下面以第四列為例。

歸一化的目標(biāo)是使得每列的數(shù)值均值為0,標(biāo)準(zhǔn)差為1。為實(shí)現(xiàn)這一目標(biāo),需要計(jì)算每一列的均值和標(biāo)準(zhǔn)差,然后讓每一列減去相應(yīng)均值和除以相應(yīng)標(biāo)準(zhǔn)差。

這里使用E[x]來表示均值, Var[x]來表示方差(標(biāo)準(zhǔn)差的平方)。epsilon(ε = 1×10^-5)是防止出現(xiàn)除0錯(cuò)誤。

計(jì)算并存儲(chǔ)歸一化后的結(jié)果,然后乘以學(xué)習(xí)權(quán)重weight(γ)并加上偏置bias(β),進(jìn)而得到最終的歸一化結(jié)果。

最后,在輸入嵌入矩陣(input embedding matrix)的每一列上執(zhí)行歸一化操作,就得到了歸一化后的輸入嵌入(normalized input embedding),并將其傳遞給自注意力層(self-attention)。

自注意力Self Attention

Self Attention層大概算是Transformer中最核心的部分了,在這個(gè)階段,input embedding中的列可以相互“交流”,而其它階段,各列都是獨(dú)立存在的。

Self Attention層由多個(gè)個(gè)自注意力頭組成,本例中有三個(gè)自注意力頭。每個(gè)頭的輸入是input embedding的1/3部分,我們現(xiàn)在只關(guān)注其中一個(gè)。

第一步是從normalized input embedding matrix的C列中為每一列生成3個(gè)向量,分別是QKV:

  • Q: 查詢向量Query vector
  • K: 鍵向量Key vector
  • V: 值向量Value vector

要生成這些向量,需要采用矩陣-向量乘法,外加偏置。每個(gè)輸出單元都是輸入向量的線性組合。

例如,對于查詢向量,即是由Q權(quán)重矩陣的一行和輸入矩陣的一列之間的點(diǎn)積運(yùn)算完成的。

點(diǎn)積的操作很簡單,就是對應(yīng)元素相乘然后相加。

這是一種確保每個(gè)輸出元素都能受到輸入向量中所有元素影響的通用而簡單的方法(這種影響由權(quán)重決定)。因此,它經(jīng)常出現(xiàn)在神經(jīng)網(wǎng)絡(luò)中。

在神經(jīng)網(wǎng)絡(luò)中,這種機(jī)制經(jīng)常出現(xiàn)是因?yàn)樗试S模型在處理數(shù)據(jù)時(shí)考慮到輸入序列的每個(gè)部分。這種全面的注意力機(jī)制是許多現(xiàn)代神經(jīng)網(wǎng)絡(luò)架構(gòu)的核心,特別是在處理序列數(shù)據(jù)(如文本或時(shí)間序列)時(shí)。

我們對Q, K, V向量中的每個(gè)輸出單元重復(fù)此操作:

我們?nèi)绾问褂梦覀兊?Q(查詢)、K(鍵)和 V(值)向量呢?它們的命名給了我們一個(gè)提示:‘鍵’和‘值’讓人想起字典類型,鍵映射到值。然后‘查詢’是我們用來查找值的手段。

在Self Attention的情況下,我們不是返回單個(gè)向量(詞條),而是返回向量(詞條)的某種加權(quán)組合。為了找到這個(gè)權(quán)重,我們計(jì)算一個(gè)Q向量與每個(gè)K向量之間的點(diǎn)積,再加權(quán)歸一化,最后用它與相應(yīng)的V向量相乘,再將它們相加。

以第6列為例(t=5),將從這一列開始查詢:

由于attention matrix的存在,KV的前6列是可以被查詢到的,Q值是當(dāng)前時(shí)間。

首先計(jì)算當(dāng)前列(t=5)的Q向量與之前各列(前6列)的K向量之間的點(diǎn)積。然后將其存儲(chǔ)在注意力矩陣的相應(yīng)行(t=5)中。

點(diǎn)積的大小衡量了兩個(gè)向量間的相似度,點(diǎn)積越大越相似。

而只將Q向量與過去的K向量進(jìn)行運(yùn)算,使得它成為因果自注意力。也就是說,token無法‘看到未來的信息’。

因此,在求出點(diǎn)積之后,要除以sqrt(A),其中A是QKV向量的長度,進(jìn)行這種縮放是為了防止大值在下一步的歸一化(softmax)中占主導(dǎo)地位。

接下來,又經(jīng)過了softmax操作,將值域范圍縮小到了0到1。

最后,就可以得出這一列(t=5)的輸出向量。查看歸一化attention matrix的(t=5)行,并將每個(gè)元素與其他列的相應(yīng)V向量相乘。

然后,我們可以將這些向量相加,得出輸出向量。因此,輸出向量將以高分列的V向量為主。

現(xiàn)在我們應(yīng)用到所有列上。

這就是Self Attention層中一個(gè)頭的處理過程?!敢虼?,Self Attention的主要目標(biāo)是每一列都想從其他列中找到相關(guān)信息并提取其值,它通過將其 Query 向量與那些其他列的 Key 進(jìn)行比較來實(shí)現(xiàn)這一點(diǎn)。增加的限制是它只能向過去看?!?/p>

投影Projection

在Self Attention操作之后,我們會(huì)從每個(gè)頭得到一個(gè)輸出。這些輸出是受Q和K向量影響而適當(dāng)混合的V向量。要合并每個(gè)頭的輸出向量,我們只需將它們堆疊在一起即可。因此,在t=4時(shí),我們將從3個(gè)長度為A=16的向量疊加形成1個(gè)長度為C=48的向量。

值得注意的是,在GPT中,頭(A=16)內(nèi)向量的長度等于 C/num_heads。這確保了當(dāng)我們將它們重新堆疊在一起時(shí),能得到原來的長度C。

在此基礎(chǔ)上,我們進(jìn)行投影,得到該層的輸出。這是一個(gè)簡單的矩陣-向量乘法,以每列為單位,并加上偏置。

現(xiàn)在我們有了Self Attention的輸出。

我們沒有將這個(gè)輸出直接傳遞到下一階段,而是將它以元素的方式添加到input embedding中。 這個(gè)過程,用綠色垂直箭頭表示,被稱為殘差連接(residual connection)或殘差路徑(residual pathway)。

與Layer Normalization一樣,殘差網(wǎng)絡(luò)對于實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的有效學(xué)習(xí)至關(guān)重要。

現(xiàn)在有了self-attention的結(jié)果,我們可以將其傳遞到Transformer的下一層:前饋網(wǎng)絡(luò)。

多層感知機(jī)MLP

在Self Attention之后,Transformer模塊的下一部分是MLP(多層感知機(jī)),在這里它是一個(gè)有兩層的簡單神經(jīng)網(wǎng)絡(luò)。

與Self Attention一樣,在向量進(jìn)入MLP之前,我們需進(jìn)行層歸一化處理。

同時(shí),在MLP中,還需對每個(gè)長度為C=48的列向量(獨(dú)立地)進(jìn)行以下處理:

  • 添加帶偏置的線性變換(也就是矩陣-向量乘法并加上偏置的運(yùn)算),轉(zhuǎn)換為長度為 4 * C 的向量。
  • GELU 激活函數(shù)(逐元素應(yīng)用)。
  • 進(jìn)行帶偏置的線性變換,再變回長度為 C 的向量。

讓我們追蹤其中一個(gè)向量:

MLP具體處理如下:

首先進(jìn)行矩陣-向量乘法運(yùn)算并加上偏置,將向量擴(kuò)展為長度為 4*C 的矩陣。(注意這里的輸出矩陣是經(jīng)過轉(zhuǎn)置的,為了形象化)

接下來,對向量的每個(gè)元素應(yīng)用GELU激活函數(shù)。這是任何神經(jīng)網(wǎng)絡(luò)的關(guān)鍵部分,我們需要在模型中引入了一些非線性。所使用的具體函數(shù) GELU,看起來很像 ReLU 函數(shù) max(0, x),但它有一個(gè)平滑的曲線,而不是尖銳的角。

然后,通過另一個(gè)帶偏置的矩陣-向量乘法,將向量投影回長度C。

這里也有一個(gè)殘差網(wǎng)絡(luò),與自注意力+投影部分一樣,我們將MLP的結(jié)果按元素順序添加到input中。

重復(fù)這些操作。

MLP層到此就結(jié)束了,我們最后也得到了transformer的輸出。

Transformer

這就是一個(gè)完整的Transformer模塊!

這些若干個(gè)模塊構(gòu)成了任何 GPT 模型的主體,每個(gè)模塊的輸出都是下一個(gè)模塊的輸入。

正如在深度學(xué)習(xí)中常見的,很難準(zhǔn)確說出這些層各自在做什么,但我們有一些大致的想法:較早的層傾向于專注于學(xué)習(xí)低級特征和模式,而后面的層則學(xué)習(xí)識(shí)別和理解更高級的抽象和關(guān)系。在自然語言處理的背景下,較低的層可能學(xué)習(xí)語法、句法和簡單的詞匯關(guān)聯(lián),而較高的層可能捕捉更復(fù)雜的語義關(guān)系、話語結(jié)構(gòu)和上下文依賴的含義。

Softmax

最后就是softmax操作,輸出每個(gè)token的預(yù)測概率。

輸出Output

最終,我們到達(dá)了模型的尾端。最后一個(gè)Transfomer的輸出經(jīng)過一層正則化處理,隨后進(jìn)行一次無偏置的線性變換。

這一最終變換將我們的每個(gè)列向量從長度C轉(zhuǎn)換為詞匯量大小的長度nvocab。因此,它實(shí)際上是為詞匯表中的每個(gè)單詞生成一個(gè)得分logits。

為了將這些得分轉(zhuǎn)換為更加直觀的概率值,需要先通過softmax來進(jìn)行處理。如此一來,對于每一列,我們都得到了模型分配給詞匯表中每個(gè)單詞的概率。

在這個(gè)特定模型中,它實(shí)際上已經(jīng)學(xué)會(huì)了所有關(guān)于如何對三個(gè)字母進(jìn)行排序的答案,因此概率極大地傾向于正確答案。

當(dāng)我們讓模型隨時(shí)間推進(jìn)時(shí),需要使用最后一列的概率來決定序列中下一個(gè)添加的token。例如,如果我們向模型中輸入了六個(gè)token ,我們會(huì)使用第六列的輸出概率。

這一列的輸出是一系列概率值,我們實(shí)際上需要從中選出一個(gè)作為序列中的下一個(gè)token 。我們通過「從分布中采樣」來實(shí)現(xiàn)這一點(diǎn),即根據(jù)其概率隨機(jī)選擇一個(gè)token 。例如,概率為0.9的token會(huì)被選擇的概率是90%。然而,我們也有其他選擇,例如總是選擇概率最高的 token 。

我們還可以通過使用溫度參數(shù)來控制分布的「平滑度」。較高的溫度會(huì)使分布更均勻,而較低的溫度則會(huì)使其更集中于概率最高的token 。

我們通過在應(yīng)用softmax之前,用溫度參數(shù)來調(diào)整logits(線性變換的輸出),因?yàn)閟oftmax中的指數(shù)化對較大數(shù)值有顯著的放大效果,使所有數(shù)值更接近將減少這種效果。

圖片圖片

責(zé)任編輯:趙寧寧 來源: 郭小喵玩AI
相關(guān)推薦

2022-08-15 08:02:09

Go程序函數(shù)

2022-07-12 09:35:59

JSON可視化工具

2013-04-12 09:32:16

微軟3D數(shù)據(jù)可視化工具插件GeoFlow

2020-03-24 09:50:33

工具代碼開發(fā)

2024-02-26 12:02:37

Python數(shù)據(jù)可視化D3blocks

2019-06-11 09:35:34

可視化工具圖形

2022-09-17 09:05:28

3D可視化工具

2021-04-14 16:20:39

可視化大數(shù)據(jù)工具

2022-09-14 08:49:01

Kubernetes

2021-04-11 09:51:25

Redis可視化工具

2015-12-02 09:44:04

Python視化工具

2023-08-18 06:59:58

2019-12-23 14:17:46

數(shù)據(jù)可視化工具

2021-03-08 09:25:48

神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)圖形

2021-06-11 17:45:57

大數(shù)據(jù)可視化工具

2018-05-31 08:25:13

誤區(qū)工具可視化

2025-03-17 09:19:45

2019-11-25 15:54:54

數(shù)據(jù)可視化可視化工具開發(fā)

2020-07-16 15:10:46

工具可視化Python

2022-01-17 11:09:46

數(shù)據(jù)可視化工具開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號