99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

positional encoding詳解

深度學(xué)習(xí)自然語言處理 ? 來源:深度學(xué)習(xí)自然語言處理 ? 作者:CS的陋室 ? 2021-02-10 17:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

近期我會一連幾篇談?wù)刡ert中的關(guān)鍵細(xì)節(jié),這個(gè)position encoding是我看到的bert(實(shí)質(zhì)上是transformer中提出的)中最為驚喜的但是卻被很多人忽略(可以理解為媒體鼓吹最少的)一個(gè)細(xì)節(jié),這里給大家談?wù)劇?/span>

什么是position encoding

顧名思義,就是基于位置的一套詞嵌入方法,說得簡單點(diǎn),就是對于一個(gè)句子,都有對應(yīng)的一個(gè)向量。

position encoding的收益

我感覺要做一個(gè)事情,首先還是要看他的出發(fā)點(diǎn)和收益,說白了就是優(yōu)點(diǎn)是啥,做這個(gè)的目標(biāo)是啥,這樣我們才知道怎么做。

回頭看看CNN結(jié)構(gòu)、RNN甚至是transformer的self-attention,其實(shí)都沒有特別關(guān)注位置信息,而實(shí)際上,我們卻是需要去關(guān)注的,畢竟作為一門語言,他大都有比較嚴(yán)謹(jǐn)?shù)恼Z法結(jié)構(gòu),特定詞匯還真的會出現(xiàn)在特定位置,這是非常有意思的,來看看例子(來源于知乎):

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

從情感上,上面是正面,下面是負(fù)面,這個(gè)非常顯而易見,因?yàn)檫@個(gè)否定句,從實(shí)體提取的角度都有movie和history,無論是哪個(gè)任務(wù),都可以看到一個(gè)語法結(jié)構(gòu)中存在的位置信息。

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

換個(gè)角度再看一個(gè)例子:

I believe I can be the best.

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

position embedding怎么做

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

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

對于每個(gè)位置的詞向量,都穩(wěn)定的乘以一個(gè)穩(wěn)定的向量,就如上面所示,第1個(gè)位置一定對應(yīng)positonal embedding的第一個(gè)向量,那這組向量抽出來,不是positional embedding是啥。

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

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可就不是一個(gè)位置了吧,所以絕對位置肯定是有問題的,那么就要引入相對位置的概念了。來看看transformer論文里面是怎么說的(我把解釋也給大家搬過來了):

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

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

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

橫坐標(biāo)是維數(shù)上的每個(gè)值,縱坐標(biāo)是對應(yīng)的sin值,圖例對應(yīng)句子中的每個(gè)位置。

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

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

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

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

周期性只體現(xiàn)在位置和整個(gè)函數(shù)結(jié)果的關(guān)系,而具體的波長,其實(shí)是由positional encoding向量決定的。

不得不說,這個(gè)函數(shù)的設(shè)計(jì)可謂是對現(xiàn)實(shí)場景有了十分充分的理解,抽象非常精準(zhǔn)。

預(yù)測效果

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

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

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

來看看源碼

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

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)

本身公式上沒有想象的復(fù)雜,但是這里面其實(shí)展現(xiàn)了很多python相關(guān)的技巧。

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

position_enc[:,0::2]和position_enc[:,1::2]來自numpy語法,避免了寫循環(huán)和條件語句就能夠完成奇數(shù)偶數(shù)計(jì)算。

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

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

tf.tile():張量擴(kuò)展,對當(dāng)前張量內(nèi)的數(shù)據(jù)進(jìn)行一定規(guī)則的復(fù)制,保證輸出張量維度不變。

責(zé)任編輯:xj

原文標(biāo)題:bert之我見 - positional encoding

文章出處:【微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5560

    瀏覽量

    122769
  • 自然語言
    +關(guān)注

    關(guān)注

    1

    文章

    292

    瀏覽量

    13654
  • nlp
    nlp
    +關(guān)注

    關(guān)注

    1

    文章

    490

    瀏覽量

    22612

原文標(biāo)題:bert之我見 - positional encoding

文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    達(dá)夢數(shù)據(jù)庫常用管理SQL命令詳解

    達(dá)夢數(shù)據(jù)庫常用管理SQL命令詳解
    的頭像 發(fā)表于 06-17 15:12 ?477次閱讀
    達(dá)夢數(shù)據(jù)庫常用管理SQL命令<b class='flag-5'>詳解</b>

    安徽京準(zhǔn):北斗衛(wèi)星同步時(shí)鐘的安裝與調(diào)試詳解

    安徽京準(zhǔn):北斗衛(wèi)星同步時(shí)鐘的安裝與調(diào)試詳解
    的頭像 發(fā)表于 06-05 10:08 ?414次閱讀
    安徽京準(zhǔn):北斗衛(wèi)星同步時(shí)鐘的安裝與調(diào)試<b class='flag-5'>詳解</b>

    SSH常用命令詳解

    SSH常用命令詳解
    的頭像 發(fā)表于 06-04 11:30 ?584次閱讀

    芯片新關(guān)稅涉及的品牌/標(biāo)簽/產(chǎn)地—詳解

    芯片新關(guān)稅涉及的品牌/標(biāo)簽/產(chǎn)地—詳解
    的頭像 發(fā)表于 04-16 17:44 ?545次閱讀
    芯片新關(guān)稅涉及的品牌/標(biāo)簽/產(chǎn)地—<b class='flag-5'>詳解</b>

    AMAZINGIC晶焱科技:詳解RF端口如何選擇TVS啟動電壓

    AMAZINGIC晶焱科技:詳解RF端口如何選擇TVS啟動電壓
    的頭像 發(fā)表于 02-20 10:09 ?456次閱讀
    AMAZINGIC晶焱科技:<b class='flag-5'>詳解</b>RF端口如何選擇TVS啟動電壓

    電力電子中的坐標(biāo)變換詳解

    電力電子中的坐標(biāo)變換詳解 clark變換&park變換
    發(fā)表于 02-17 15:28 ?1次下載

    Kubernetes Pod常用管理命令詳解

    Kubernetes Pod常用管理命令詳解
    的頭像 發(fā)表于 02-17 14:06 ?492次閱讀
    Kubernetes Pod常用管理命令<b class='flag-5'>詳解</b>

    精密空調(diào)操作使用方法詳解

    精密空調(diào)操作使用方法詳解
    的頭像 發(fā)表于 02-10 14:44 ?979次閱讀
    精密空調(diào)操作使用方法<b class='flag-5'>詳解</b>

    詳解RF端口如何選擇TVS啟動電壓

    AMAZINGIC晶焱科技技術(shù)應(yīng)用:詳解RF端口如何選擇TVS啟動電壓
    的頭像 發(fā)表于 02-05 16:19 ?803次閱讀
    <b class='flag-5'>詳解</b>RF端口如何選擇TVS啟動電壓

    十幾種格力空調(diào)故障代碼詳解

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

    詳解MySQL多實(shí)例部署

    詳解MySQL多實(shí)例部署
    的頭像 發(fā)表于 11-11 11:10 ?629次閱讀

    詳解kubectl常用命令

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

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

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

    EEPROM讀寫程序詳解

    EEPROM(Electrically Erasable Programmable Read-Only Memory)讀寫程序的詳解涉及多個(gè)方面,包括EEPROM的基本工作原理、讀寫流程、編程接口、代碼示例以及注意事項(xiàng)等。以下是對EEPROM讀寫程序的詳細(xì)解析。
    的頭像 發(fā)表于 09-05 12:32 ?4920次閱讀

    PRU開發(fā)詳解

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