- 揭秘大模型:從原理到實戰
- 文亮 江維
- 536字
- 2025-04-17 18:46:18
2.3.2 Transformer輸入表示
在Transformer模型中,每個單詞的輸入向量是由它的詞嵌入向量和它的位置嵌入向量相加而成的,如圖2-12所示。

圖2-12 Transformer輸入表示
詞嵌入向量可以通過word2vec等模型預訓練獲取,同時也可以通過在Transformer中添加嵌入層獲取。
在Transformer,不僅要對單詞進行編碼,還要對它們在句子中的位置進行編碼。這是因為Transformer沒有使用循環神經網絡這樣的循環結構,而是使用了全局的注意力機制(attention mechanism),導致無法直接捕捉單詞之間的順序關系;但是由于順序關系對于自然語言處理任務是至關重要的,因此需要通過位置嵌入向量來保留單詞在序列中的相對或絕對位置信息。
位置嵌入向量的維度要和詞嵌入向量保持一致。有兩種方法可以得到位置嵌入向量,一種是將其作為可學習的參數進行訓練,另一種是根據預定義的公式直接計算。Transformer模型采用了第二種方法,其計算公式為
(2-9)
其中,pos表示單詞在句子中的位置,dmodel表示位置嵌入向量的維度。
代碼清單2-2 生成詞的位置嵌入向量
def get_angles(pos, i, d_model): # i等價于式(2-9)中的2i和2i+1 angle_rates = 1 / np.power(10000, (2*(i // 2))/ np.float32(d_model)) return pos * angle_rates def positional_encoding(position, d_model): angle_rads = get_angles(np.arange(position)[:, np.newaxis], np.arange(d_model)[np.newaxis,:], d_model) # 第2i項使用sin sines = np.sin(angle_rads[:, 0::2]) # 第2i+1項使用cos cones = np.cos(angle_rads[:, 1::2]) pos_encoding = np.concatenate([sines, cones], axis=-1) pos_encoding = pos_encoding[np.newaxis, ...] return tf.cast(pos_encoding, dtype=tf.float32)
上述代碼中,函數positional_encoding()對應式(2-9)。下面的例子顯示,輸入當前位置為50,詞嵌入維度為512,輸出為位置嵌入向量形狀。
代碼清單2-3 查看詞的位置嵌入向量形狀示例
pos_encoding = positional_encoding(50, 512)
print(pos_encoding.shape)
輸出:(1, 50, 512)