重學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求一個平均的損失
【自定義學習率】