attention is all you need 的預測過程
好,閒話少說。關於self-attention的訓練階段 http://jalammar.github.io/ill... ,這篇文章寫的已經很清楚,而且確實驗證有效。那麼今天扯一下該模型的預測是怎麼做的。
一.預測流程及輸入內容
1.我們的encode的input是輸入測試集編碼(也就是和訓練階段輸入一樣),但decode的input是0向量(維度和訓練時的輸入相同)。
2.在預測時,encode的output會傳遞到decode這邊的6個layer作為其k,v,隨機0向量在第一步的時候作為q傳入。(只在第一步作為input傳入,然後開心訓練)
二.但為什麼傳入的q為0矩陣,模型卻能進行很好的預測呢。
以我是中國人對應i am a chinese舉例。
1.當encode訓練好後,相對來說我是中國人對應的矩陣也就確定了,然後經過encode編碼得到最終輸入想decode的output,也就是k,v,而在論文中decode這邊一共有6層網路層(每層3個sub-layer),這裡的kv會輸入到這6層的每一層,好,關鍵來了。模型怎麼能夠預測出我對應i,這是最重要的一步也是最難理解的一步。在decode層,我們要弄清訓練的什麼,當我們訓練好後的這些引數,其作用又是什麼,實際上就是當我們傳過來kv時,因為kv已知,是全域性變數,我們能夠看到,所以在decode中,i的向量可以理解為當指定kv後,又知道訓練好的引數矩陣,經過一系列編號,我們第一個的輸出很大概率就是對應的i的向量,當輸出為i向量時,即預測對了,然後預測am,會把第一次i向量作為額外的input加到q上,繼續進行預測。直到遇到結束向量。
三.問題思考
1.論文裡的multi-head為什麼要這麼做,事實上論文提出說因為發現多頭效果更好,筆者認為因為每個頭的引數是隨機初始化,所以其學到的關於一句話關注的點就會不同,這樣會加深對原句的學習能力,同時,8頭並行減少了訓練時間。
2.為什麼position embedding是cos和sin,論文解釋可以學到更長的序列關係,這點我還沒弄懂。
3.mask是做什麼用,使decode只考慮前面的,不考慮後面的,這點隨意百度一下就可以了。
該文不保證完全正確,只做參考。