1. 程式人生 > 其它 >重學transformer【學習筆記】

重學transformer【學習筆記】

以前對transformer的瞭解只能說個大概 你要說會吧 會的不徹底  不會吧 還能扯一頓。

來源:B站 老弓的學習筆記

 

 這一步講 decoder的工作原理 怎麼感覺像個序列的?一會需要多注意

 

 

 分批的時候是按照批次內的最長 我記得不是可設定嗎 填充到多少?

 

拿一個batch舉例

 

 input不需要處理 ,tar需要處理

 

 為什麼要做這個處理呢 原因如下

 

 還有個建立mask的過程(要我看就跟 就是分段似的 )就是對不起來的符號置1 原來的還是0

 

 這裡要仔細看原圖。看看 decoder_padding_mask是怎麼來的 

【輸入層】embedding這裡用最原始的embedding 比如說 將每個字用一個4維的向量表示

 

 【位置編碼】

 

 embedding的結果加上這個位置編碼。因為transformer平行計算 沒理解到位置資訊

位置編碼公式:

 

 所得的位置向量和embedding相加

 

 在每個字的維度中 sin cos是交錯的。

特點:1 當d_model 跟seq_length確定時候,位置編碼即可確定(d_model按照自己通常的理解就是 每個字的維度長,seq_len則是句子長)2.同時引入了絕對位置資訊與相對位置資訊。

 

 絕對位置:每個橫框相當於一個 向量 可以看到是獨一無二的

相對位置:週期性變化規律

 

 改進方向:也就是說存在缺陷

現存缺點:相對位置資訊在self-attention線性變化後消失(為什麼消失??

 縮放 希望是embedding佔絕大部分

 

 【Encoder部分】

 

 self-attention

 

 self-attention大致過程

 

 

 

 【scaled dot-product attention縮放點積注意力】

原因:1 前向傳播角度 2.反向傳播角度

前向傳播角度

 

 為什麼q*k之後均值是0 方差是dk了呢?

相當於求這塊的唄

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 (自注:終於從方差角度講清楚了 居然還聽懂了 嘿嘿)

 反向傳播角度

 

 (自注 為啥會梯度消失 )

 

 為0也不行

 

 【Multi head】

理論上

 

 實際上

用同一套W引數  然後將QKV拆分

 

 

 

 

 

 為什麼要使用多頭:

保證了transformer可以注意到不同子空間的資訊,捕捉到更加豐富的特徵資訊

11【padding 掩碼】消除padding的影響 具體就產生在softmax處

 

 如果沒有掩碼 那綠色的0專案也會產生對應權重。

 【add & norm】

add實際上是殘差網路

 

 這個add殘差 就是 這個Inp輸入經過多頭注意力後 在與這個inp相加

作用:能使訓練層數達到比較深的層次。

這裡作者主要講述了原因:(ps:以前自己只知道面上的作用,並不瞭解其原理)

 

 仔細看圖中的1是哪來的,y=XA+XC所以 為1.

 

 有了1這項保證,無論第二項怎麼樣 也不會造成梯度消失。

 

 

 這個視訊有專門去講

什麼是batchnorm 對每個特徵求一個均值 方差。對每個值減去均值 除以 標準差

 

 什麼是layernorm?

 

 為什麼用layernorm而不用batchnorm

首先最直觀的原因是batchnorm在nlp領域效果不好

 

 如圖所示,你這個batchnorm加了padding項算出來的 肯定不好啊

 

 【前饋神經網路】

其實就是兩層全連線層

【decoder】

 

 

 

 

 

 看一個並集   上三角是look ahead mask  矩形是padding mask

 

 

 這個的多頭注意力 是左邊產生了 k v   右邊decoder的產生了q

這裡為什麼沒有Look ahead mask呢?

因為現在是decoder跟encoder進行互動

 

 【linear層】隱藏神經元的個數是詞表個數包含開頭結尾

【損失函式】交叉熵損失

要有1 標籤值 2消除padding項帶來的影響。

 

 

 

 注意此處的padding項   與以前的做法相反 此處是padding的置為0

準確的說是兩項相乘。之前是相加是因為後邊經過softmax

 

 

注意:

如果標籤是one-hot就可以categoricalCrossentropy

 

 如上圖所示 右邊的標籤是個one hot的時候

注意這個交叉熵損失 解決了自己以前的一個困惑 就是每個字元都分類  得出一個序列的損失如何計算

查pytroch裡邊該是什麼函式沒查到啊 看起來像這個?

nn.MultiMarginLoss  https://blog.csdn.net/weixin_43687366/article/details/107927693?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=4

 

 (這裡他說 進來的predi是個概率值 那yi是個什麼東西 是1?不能吧)

 

 要把綠色產生的損失消除掉  因為是填充的 準不準的無所謂

 

 

 然後對這個loss求一個平均的損失

 【自定義學習率】