在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

positional encoding詳解

深度學習自然語言處理 ? 來源:深度學習自然語言處理 ? 作者:CS的陋室 ? 2021-02-10 17:12 ? 次閱讀

近期我會一連幾篇談談bert中的關鍵細節,這個position encoding是我看到的bert(實質上是transformer中提出的)中最為驚喜的但是卻被很多人忽略(可以理解為媒體鼓吹最少的)一個細節,這里給大家談談。

什么是position encoding

顧名思義,就是基于位置的一套詞嵌入方法,說得簡單點,就是對于一個句子,都有對應的一個向量。

position encoding的收益

我感覺要做一個事情,首先還是要看他的出發點和收益,說白了就是優點是啥,做這個的目標是啥,這樣我們才知道怎么做。

回頭看看CNN結構、RNN甚至是transformer的self-attention,其實都沒有特別關注位置信息,而實際上,我們卻是需要去關注的,畢竟作為一門語言,他大都有比較嚴謹的語法結構,特定詞匯還真的會出現在特定位置,這是非常有意思的,來看看例子(來源于知乎):

I like this movie because it doesn't have an overhead history.I don't like this movie because it has an overhead history.

從情感上,上面是正面,下面是負面,這個非常顯而易見,因為這個否定句,從實體提取的角度都有movie和history,無論是哪個任務,都可以看到一個語法結構中存在的位置信息。

對CNN,只能考慮到固定前后的局部信息,RNN能考慮稍微長期的信息,LSTM是有重點的記錄,Transformer只能考慮到全局的信息,尤其在bert中,只用了transformer encoder,模型上就完全喪失對位置信息的描述了,因此引入基于位置的特征就可能在特定任務中產生收益。

換個角度再看一個例子:

I believe I can be the best.

對于self attention,如果沒有positional encoding,兩個i的輸出將會一樣,但是我們知道,這兩個i是存在區別的,不是在指代上,而是含義上,第一個i是觀點的發出者,“不要你覺得,我要我覺得”,第二個i是觀點的對象,“認為我會是最棒的,不是別人”,所以從語義上兩者就有所區別了,權重向量完全一樣可就有問題了吧。這也是缺少位置信息的缺憾。

position embedding怎么做

首先,最簡單的模式就是對詞向量矩陣直接加一層全連接層,就是全連接層。就真的是這么簡單!

d3fb8444-603d-11eb-8b86-12bb97331649.jpg

對于每個位置的詞向量,都穩定的乘以一個穩定的向量,就如上面所示,第1個位置一定對應positonal embedding的第一個向量,那這組向量抽出來,不是positional embedding是啥。

但當然的,這里就有很大的問題,那就是這只是絕對位置,看上面第一個例子(我再搬運一遍):

I like this movie because it doesn't have an overhead history.I don't like this movie because it has an overhead history.

這里的like 和 don't like可就不是一個位置了吧,所以絕對位置肯定是有問題的,那么就要引入相對位置的概念了。來看看transformer論文里面是怎么說的(我把解釋也給大家搬過來了):

d463970a-603d-11eb-8b86-12bb97331649.jpg

這里用的是兩種三角函數,可以說是非常巧妙了,我們來慢慢分析。上代碼!

import matplotlib.pyplot as plt

import math

def positional_enc(i,pos):

return math.sin(pos /10000**(i/100))

x = []

for idx in range(10):

tmp_x = list(range(1,100))

tmp_y = [positional_enc(i, idx) for i in tmp_x]

plt.plot(tmp_x,tmp_y,label=str(idx))

plt.legend(loc = 'upper right')

plt.show()

代碼跑出來是這樣的:

d50345ca-603d-11eb-8b86-12bb97331649.jpg

橫坐標是維數上的每個值,縱坐標是對應的sin值,圖例對應句子中的每個位置。

首先看維數位置-sin值之間的關系,很明顯,我們沒有發現周期性,最終往0處收斂,我們也可以知道了,在這種emcoding下,其實維數沒必要太高了。

而對于位置-sini值之間的關系,可以整個曲線是會朝著右邊移動的,從權重角度看,實質上就是每一個維度都會有一個比較看重的句子位置,其他位置說白了就是不看了,而前面的甚至可能為負,主要原因是要拋棄以前的信息,這樣多個維度就能把多個位置都當做了重點來看。

周期性去了哪里呢,其實在這里,再來上代碼:

import matplotlib.pyplot as plt

import math

def positional_emb(i,pos):

return math.sin(pos /10000**(i/100))

tmp_x = list(range(20))

tmp_y = [positional_emb(10, i) for i in tmp_x]

plt.plot(tmp_x,tmp_y)

plt.show()

得到了有周期性的圖。

d5743ad2-603d-11eb-8b86-12bb97331649.png

周期性只體現在位置和整個函數結果的關系,而具體的波長,其實是由positional encoding向量決定的。

不得不說,這個函數的設計可謂是對現實場景有了十分充分的理解,抽象非常精準。

預測效果

首先來看看兩種positional encoding的具體效果,來自transformer的對比。

d5f5d4ca-603d-11eb-8b86-12bb97331649.jpg

主要看E、base和big。其實可以看到posiitional emb本身的效果其實還行,與base相當,說明還是有不小收益的。

來看看源碼

原理是看完了,來看看源碼吧。

def positional_encoding(inputs,

maxlen,

masking=True,

scope="positional_encoding"):

'''Sinusoidal Positional_Encoding. See 3.5

inputs: 3d tensor. (N, T, E)

maxlen: scalar. Must be >= T

masking: Boolean. If True, padding positions are set to zeros.

scope: Optional scope for `variable_scope`.

returns

3d tensor that has the same shape as inputs.

'''

E = inputs.get_shape().as_list()[-1] # static

N, T = tf.shape(inputs)[0], tf.shape(inputs)[1] # dynamic

with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):

# position indices

position_ind = tf.tile(tf.expand_dims(tf.range(T), 0), [N, 1]) # (N, T)

# First part of the PE function: sin and cos argument

position_enc = np.array([

[pos / np.power(10000, (i-i%2)/E) for i in range(E)]

for pos in range(maxlen)])

# Second part, apply the cosine to even columns and sin to odds.

position_enc[:, 0::2] = np.sin(position_enc[:, 0::2]) # dim 2i

position_enc[:, 1::2] = np.cos(position_enc[:, 1::2]) # dim 2i+1

position_enc = tf.convert_to_tensor(position_enc, tf.float32) # (maxlen, E)

# lookup

outputs = tf.nn.embedding_lookup(position_enc, position_ind)

# masks

if masking:

outputs = tf.where(tf.equal(inputs, 0), inputs, outputs)

return tf.to_float(outputs)

本身公式上沒有想象的復雜,但是這里面其實展現了很多python相關的技巧。

這里的計算并非全都使用的tf,對positionenc,前面用numpy進行計算,然后用embeddinglookup的方式引入。

position_enc[:,0::2]和position_enc[:,1::2]來自numpy語法,避免了寫循環和條件語句就能夠完成奇數偶數計算。

另外是有很多可能在各種教材或者教程中沒有的函數工具,大家可以多看看學學。

tf.AUTO_REUSE:批量化共享變量作用域的方法。

tf.tile():張量擴展,對當前張量內的數據進行一定規則的復制,保證輸出張量維度不變。

責任編輯:xj

原文標題:bert之我見 - positional encoding

文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 深度學習
    +關注

    關注

    73

    文章

    5507

    瀏覽量

    121299
  • 自然語言
    +關注

    關注

    1

    文章

    288

    瀏覽量

    13365
  • nlp
    nlp
    +關注

    關注

    1

    文章

    489

    瀏覽量

    22059

原文標題:bert之我見 - positional encoding

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    十幾種格力空調故障代碼詳解

    十幾種格力空調故障代碼詳解,查表一目了然
    發表于 11-27 15:15 ?0次下載

    詳解MySQL多實例部署

    詳解MySQL多實例部署
    的頭像 發表于 11-11 11:10 ?287次閱讀

    詳解kubectl常用命令

    詳解kubectl常用命令
    的頭像 發表于 11-05 15:39 ?286次閱讀
    <b class='flag-5'>詳解</b>kubectl常用命令

    智慧公交是什么?一文帶你詳解智慧公交的解決方案!

    智慧公交是什么?一文帶你詳解智慧公交的解決方案!
    的頭像 發表于 11-05 12:26 ?322次閱讀
    智慧公交是什么?一文帶你<b class='flag-5'>詳解</b>智慧公交的解決方案!

    PRU開發詳解

    電子發燒友網站提供《PRU開發詳解.pdf》資料免費下載
    發表于 09-05 11:27 ?0次下載
    PRU開發<b class='flag-5'>詳解</b>

    ESP32-C3-DecKitM-1板子運行esp-rainmaker的switch例程,cli provision失敗的原因?

    ]:_X25519PublicKey.public_bytes() missing 2 required positional arguments: \'encoding\' and \'format\' 請問這里意思是證書有錯嗎?ESP32-C3不是self clai
    發表于 06-26 08:11

    在CMD中調用spiffsgen可以正常工作生成bin,在pycharm調用不了spiffsgen怎么解決?

    \', \'data\', \'data.bin\']) TypeError: main() takes 0 positional arguments but 1 was given
    發表于 06-20 06:53

    RA MCU CANFD在FSP中的配置詳解

    RA MCU CANFD在FSP中的配置詳解
    的頭像 發表于 06-19 08:06 ?561次閱讀
    RA MCU CANFD在FSP中的配置<b class='flag-5'>詳解</b>

    VC++串口通信詳解

    電子發燒友網站提供《VC++串口通信詳解.doc》資料免費下載
    發表于 03-24 09:36 ?0次下載

    EMI電磁干擾:原理、影響及解決方法詳解

    EMI電磁干擾:原理、影響及解決方法詳解?|深圳比創達電子
    的頭像 發表于 03-21 10:02 ?899次閱讀
    EMI電磁干擾:原理、影響及解決方法<b class='flag-5'>詳解</b>?

    集成芯片原理圖詳解

    集成芯片的原理圖詳解涉及多個方面,包括芯片的結構、功能模塊、信號傳輸以及內部電路連接等。
    的頭像 發表于 03-19 16:36 ?1984次閱讀

    靜電ESD整改:原因、影響與解決方案詳解

    靜電ESD整改:原因、影響與解決方案詳解?|深圳比創達電子
    的頭像 發表于 03-13 10:26 ?946次閱讀
    靜電ESD整改:原因、影響與解決方案<b class='flag-5'>詳解</b>?

    詳解pcb粗糙度測量,分享測量技巧

    詳解pcb粗糙度測量,分享測量技巧
    的頭像 發表于 03-12 11:28 ?1318次閱讀

    DCDC原理詳解

    電子發燒友網站提供《DCDC原理詳解.pptx》資料免費下載
    發表于 03-05 17:18 ?97次下載

    python中open函數的用法詳解

    python中open函數的用法詳解 Python中的open()函數用于打開文件。它接受文件名和模式作為參數,并返回一個文件對象。文件對象可用于讀取、寫入和管理文件。 open()函數的基本語法
    的頭像 發表于 01-30 15:31 ?2170次閱讀
    主站蜘蛛池模板: 能看的黄色网址| tube69欧美最新片| 欧美成网| 四虎永久在线精品免费影视| 操香蕉| 色片免费网站| 尤物久久99热国产综合| 国产一级特黄a大片免费| 国产在线色| 97综合视频| 天天干影院| 天天搞夜夜操| 久久精品影院永久网址| 天天干夜干| 国产伦精品一区二区三区免费| 欧美精品久久天天躁| 天天干天天上| 久久精品亚洲| xxx69欧美| 中文在线三级中文字幕| 2021国产成人精品国产| 32pao强力打造免费高速高清| 97se亚洲综合| 99精品福利| 三级aa久久| 日本一区高清视频| 亚洲国产成人在人网站天堂| 一区二区三区四区在线视频| 道区二区三区四区| 五月婷婷综合色| 四虎最新免费网址| 女毛片| 777色狠狠一区二区三区香蕉| 可以在线看黄的网站| 国产午夜影院| 午夜精品久久久久久久第一页| 一级女性黄 色生活片| 午夜黄色福利| 久久美女免费视频| 国产福利资源在线| 热久久影院|