李宏毅Transformer
Transformer
Transformer 其實(shí)就是Sequence-to-Sequence(Seq2Seq)架構(gòu)的model,就是輸入一堆向量,輸出一堆向量,輸出的向量數(shù)量由機(jī)器自己決定。
Seq2Seq架構(gòu)
整體架構(gòu)
Encode部分
Encode部分就是輸入一堆向量,然后輸出一堆向量,這個(gè)encoder部分可以是RNN或者CNN組成的,但是在Transformer里,Encoder得是Transformer的Encoder就是下圖右邊這部分。
首先我們看下Encoder的基本架構(gòu),就是紅色框中,輸入一堆向量然后經(jīng)過(guò)一個(gè)block輸出一堆向量,然后接著輸入到下一個(gè)block中…最后輸出h1, h2, h3, h4, 在Transformer網(wǎng)絡(luò)中每一個(gè)block里面是下圖中右面這部分組成,對(duì)輸入的向量進(jìn)行self-attention操作,每個(gè)向量都考慮與其它向量的關(guān)聯(lián)性之后然后輸出,然后接入到FC中輸出結(jié)果。
實(shí)際上Transformer的Block里面的網(wǎng)絡(luò)比這個(gè)更復(fù)雜,舉例:第一個(gè)向量b經(jīng)過(guò)Self-attention考慮與其它所有向量關(guān)聯(lián)性得到輸出結(jié)果下圖a,然后把a(bǔ)與輸入向量b進(jìn)行相加(這就是residual操作)接著把a(bǔ)+b相加的結(jié)果做Layer Norm運(yùn)算。(這個(gè)就是對(duì)向量中每個(gè)元素求mean[平均值], standard deviation[標(biāo)準(zhǔn)差] ),下圖綠色的方框接著紅色方框部分,接著放入FC網(wǎng)絡(luò)中得到輸出結(jié)果,這里也要做一次residual操作,得到輸出的結(jié)果再次做Layer Norm操作,得到最終輸出結(jié)果。block中一個(gè)向量做的所有操作。
以上就是下圖紅色區(qū)域的操作,總結(jié)一下,就是輸入向量如果需要位置信息的話,加上位置Positional向量,然后經(jīng)過(guò)Self-attention(Multi-Head Attention),做add&Norm操作,其中add就是(Residual操作,將輸入向量加到self-attention結(jié)果輸出上),然后將add結(jié)果做Layer Norm操作,接著放入到Feed Forward網(wǎng)絡(luò)中輸出結(jié)果繼續(xù)做add&Norm操作。
Decode部分
常見結(jié)構(gòu)(Autoregressive)
以語(yǔ)音識(shí)別舉例,首先我們把Encoder輸出的向量,讀入到Decoder中,這時(shí)給Decoder一個(gè)專門的記號(hào)(special token)Begin,告訴Decoder開始了,然后Decoder輸出向量(這里的向量大小取決于你想輸出的內(nèi)容,如果你想輸出文字,那么它的長(zhǎng)度就是所有文字的數(shù)量,如果是英文單詞,那么它的長(zhǎng)度就是所有英文單詞的數(shù)量…),再對(duì)向量整體做softmax(求每個(gè)中文的概率,所有中文概率加起來(lái)為1),求其中最大值就是它的第一個(gè)輸出結(jié)果。
然后把第一個(gè)輸出作為Decoder的輸入,第一個(gè)輸出”機(jī)“是一個(gè)one-hot向量(在”機(jī)“位置為1,其它位置為0),這樣Decoder有兩個(gè)輸入向量,根據(jù)這兩個(gè)輸入的向量通過(guò)Decoder輸出”器“,然后再把”器“作為第三個(gè)Decoder輸入的向量,Decoder通過(guò)這三個(gè)輸入向量輸出…,以此往后,所以Decoder每次輸入都是上一次輸出的結(jié)果累加起來(lái)的。
Decoder內(nèi)部結(jié)構(gòu)
Decoder的內(nèi)部結(jié)構(gòu)如下圖中右面這部分
可以發(fā)現(xiàn)它除了紅色區(qū)域其它與Encoder都一樣操作,只是它使用的是Masked Multi-Head Attention
Masked Multi-Head Attention 就是b1,b2,b3,b4,每一個(gè)向量輸出的時(shí)候只考慮左邊輸入的向量關(guān)聯(lián)性得到的輸出。為什么出現(xiàn)這種情況呢?因?yàn)槊看蝑ecoder輸入,都是上一次輸出的結(jié)果累加起來(lái)的,所有還沒有后面的向量!
那么要如何停下來(lái)呢
我們需要給輸出向量中加一個(gè)end標(biāo)識(shí),它與其它的中文文字類似,這樣當(dāng)輸入”機(jī)”“器”“學(xué)”“習(xí)“時(shí)候,經(jīng)過(guò)Decoder輸出向量,然后softmax處理后取最大值得到”end“
以上是AT decoder,還有NAT decoder。。。
Encoder-Decoder
現(xiàn)在講解Encoder-Decoder之間怎么傳遞的。
首先我們可以看到紅色框中,有藍(lán)色的圈和一個(gè)綠色的圈,其中藍(lán)色的圈為從encoder過(guò)來(lái)的輸入,綠色的為從decoder過(guò)來(lái)的輸入。
具體操作就是我們可以并行來(lái)看,最下面的大紅色框,首先左邊對(duì)所有的輸入做Encoder操作,輸出a1,a2,a3,右邊對(duì)begin輸入做self-attention操作得到輸出向量b,然后看b與a1,a2,a3關(guān)聯(lián)性也就是self-attention一系列操作。
其它的Decoder輸入也是類似操作
總結(jié)
以上是生活随笔為你收集整理的李宏毅Transformer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PASSWORD_VERIFY_FUNC
- 下一篇: 【日常吐槽 · 第八期】adb偶遇foo