下面我們講解transformer網路中到底是怎麼計算的,裡面的維度是咋變化的。
大體流程咱們先走一遍,咱們以encoder輸入為例。首先輸入的是乙個長度為m的序列x = (x1, x2, x3, ……,xm)。在輸入到encoder之前,我們需要對輸入x進行一頓操作,即新增標誌符號在序列前端新增標誌符,在序列末端新增標誌符號。不同的**書寫符號可能並不相同,但是他們的意義是完全相同的。經過預處理我們得到了輸入序列x,也就是下圖中的inputs,接下來我們一步一步進行解析(我們先不考慮batch_size)。
圖1第一步,輸入序列x(seq_len為m)經過input embedding,進行乙個查表操作後,x變成了(seq_len, embedding_len)向量矩陣。
第二步,x(seq_len, embedding_len)經過positional encoding,即位置編碼,使得x對應加上位置資訊向量矩陣,由於兩者維度相同,所以得到x維度不變,依然是(seq_len, embedding_len)。
第三步,由圖1左我們可以看出來,在x向上輸入的過程中,其中有一條路直接通到了add&norm,這是為了後面的殘差連線操作。另一條路分為三叉,分別乘以wq,wk,wv,變成了我們所熟悉的q,k,v。這裡我們需要知道wq和wk的維度要相同,wv的維度要和embedding的維度保持一致。經過公式一的運算之後得到的結果與x進行殘差連線並且進行層歸一化處理,也就是add&norm操作。經過6層操作,最終的輸入到decoder的向量矩陣維度為(seq_len, embedding),然後帶入到decoder中進行運算,運算過程大致相同。
公式一我們在這裡詳細的講解一下多頭注意力是如何拆開和合併的。
首先我們的輸入q(batch_size, seq_len, dk), k(batch_size, seq_len, dk), v(batch_size, seq_len, dv)。由於模型是8頭注意力,所以我們對q,k,v進行處理得到q(batch_size, seq_len, 8, dk//8), k(batch_size, seq_len,8, dk//8), v(batch_size, seq_len, 8,dv//8)。然後咱們根據公式一進行展示。
首先是q
然後對(batch_size, seq_len, 8, 8)乘以乙個因子操作並進行softmax,此過程並不改變維度。
最終點乘v,同樣使用了tf.matmul操作。即(batch_size, seq_len, 8, 8) * (batch_size, seq_len, 8, dv//8),這樣8進行抵消,得到的結果為(batch_size, seq_len, 8, dv//8)。
操作結束後我們進行了concat操作,這樣(batch_size, seq_len, 8, dv//8)最終變成了(batch_size, seq_len, dv)。這裡的dv就是embedding_size。
不得了的const
eg int const ca 10 ca 20 error ca 10 error int const cb error 區域性變數預設隨機值 eg int const ca 0 const int cb 0 ca和cb是等價的 const int cb 10 cb 20 error eg int...
不得了啦,生病啦!
去年8月 生病 今天一模一樣,估計是急性腸炎。早上還好,過了中午就不對了,渾身乏力,兩次大便後屁股劇痛,前車之鑑後事之師,完全沒猶豫請了假就衝醫院輸液。上次把我搞慘了,這次我可不想熬到晚上惡化,蹲在格格上感天動地的痛哭流涕。很自覺主動的就殺向醫院。上次去的估計是私立醫院,這次去的是省立醫院,便宜30...
考完駕照 激動得不得了。
今天上午考完科目三,駕照到手了。從上車的那天算起來有40天的時間了。雖然每次考試都緊張的不得了,包括法培考試,樁考,場內路考和今天的科目三考試。每次都很緊張,但畢竟考試過關了。其實在上學的時候同宿舍的幾個同學都去學車了。那時候 還便宜,時間也充足。但那時候我覺得買車是很遠的事情,真沒想到三年後我已經...