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

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)
主站蜘蛛池模板: 绥滨县| 洮南市| 泽州县| 阳高县| 凌云县| 务川| 建宁县| 石狮市| 平定县| 青河县| 武功县| 贵德县| 巴中市| 通河县| 太仓市| 阿瓦提县| 梓潼县| 鄂托克旗| 娄底市| 怀化市| 北流市| 景东| 靖远县| 太谷县| 宁城县| 阳谷县| 米林县| 广州市| 明水县| 日照市| 新河县| 安国市| 锦屏县| 台中县| 红原县| 布尔津县| 耒阳市| 哈尔滨市| 阿荣旗| 南开区| 增城市|