模型流程:
1. 文字序列首先被分成token,把token的序號輸入模型, 輸入張量的維數為(B,T), B是批次大小(也就是同時處理幾段文字),T是文字的長度
2. 分別對token和位置進行編碼,每個token序號都映射為維數為C的向量,每個位置(不超過某個最大值T_max)也映射為維數為C的向量,這樣我們得到了兩個維數為(B,T,C)的張量,再把兩個張量相加,得到一個維數為(B,T,C)的張量用於後續處理
3. 把張量輸入到順次連接的Transformer塊中。一個Transformer塊有nH個Transformer頭,每個頭輸出的維數為(B,T,C/nH),它們並起來維數仍然為(B,T,C), 計算後再經過LayerNorm正則化,再經過兩層線性層和再一次正則化,得到的結果仍是維數為(B,T,C)的張量,這樣的張量再次輸入到下一個Transformer塊。
3.1. 其中,注意力頭內部的機制是Transformer最精妙的地方。同一組張量輸入到三個尺寸相同的線性層中,分別得到Q,K,V三個張量,它們分別表示query,key,value,然後使用公式
softmax(M+QK^T/sqrt{N})V
得到輸出結果。其中,M是casual mask,表示屏蔽了未來的token,只根據過去信息進行預測。
4. 使用一個線性層得到logits,它表示未歸一化的token概率, 形狀為(B, N_tokens), 其中N_tokens是不同token的總量
5. 在推理時,用softmax把logits轉化為概率,並依照概率採樣下一個token. 然後,把新token加到context的末尾再次運行1~5步驟,如此循環就可以生成文本。在訓練時,使用交叉熵函數,計算logits和真實的下一個token之間的交叉熵損失並進行梯度反傳,更新模型參數。