官术网_书友最值得收藏!

2.3.2 Transformer輸入表示

在Transformer模型中,每個單詞的輸入向量是由它的詞嵌入向量和它的位置嵌入向量相加而成的,如圖2-12所示。

圖2-12 Transformer輸入表示

詞嵌入向量可以通過word2vec等模型預訓練獲取,同時也可以通過在Transformer中添加嵌入層獲取。

在Transformer,不僅要對單詞進行編碼,還要對它們在句子中的位置進行編碼。這是因為Transformer沒有使用循環神經網絡這樣的循環結構,而是使用了全局的注意力機制(attention mechanism),導致無法直接捕捉單詞之間的順序關系;但是由于順序關系對于自然語言處理任務是至關重要的,因此需要通過位置嵌入向量來保留單詞在序列中的相對或絕對位置信息。

位置嵌入向量的維度要和詞嵌入向量保持一致。有兩種方法可以得到位置嵌入向量,一種是將其作為可學習的參數進行訓練,另一種是根據預定義的公式直接計算。Transformer模型采用了第二種方法,其計算公式為

 ?。?-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)
主站蜘蛛池模板: 铁力市| 嵊泗县| 杭锦后旗| 泰州市| 龙川县| 垣曲县| 南京市| 崇左市| 澄迈县| 上杭县| 新蔡县| 汝州市| 浦县| 峨眉山市| 西畴县| 达州市| 涟源市| 云梦县| 公主岭市| 磴口县| 潢川县| 永嘉县| 昆山市| 二连浩特市| 常州市| 陇川县| 南平市| 澜沧| 绥德县| 新密市| 陵水| 云霄县| 雅安市| 丰宁| 增城市| 长岛县| 萨迦县| 通州市| 修武县| 河池市| 城口县|