色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

從one-hot、word embedding、rnn、seq2seq、transformer一步步逼近bert

WpOh_rgznai100 ? 來源:lq ? 2019-07-18 14:10 ? 次閱讀

NLP

NLP:自然語言處理(NLP)是信息時代最重要的技術之一。理解復雜的語言也是人工智能的重要組成部分。而自google在2018年10月底公布BERT在11項nlp任務中的卓越表后,BERT(Bidirectional Encoder Representation from Transformers)就成為NLP一枝獨秀,本文將為大家層層剖析bert。

NLP常見的任務主要有: 中文自動分詞、句法分析、自動摘要、問答系統、文本分類、指代消解、情感分析等。

我們會從one-hot、word embedding、rnn、seq2seq、transformer一步步逼近bert,這些是我們理解bert的基礎。

Word Embedding

首先我們需要對文本進行編碼,使之成為計算機可以讀懂的語言,在編碼時,我們期望句子之間保持詞語間的相似行,詞的向量表示是進行機器學習深度學習的基礎。

word embedding的一個基本思路就是,我們把一個詞映射到語義空間的一個點,把一個詞映射到低維的稠密空間,這樣的映射使得語義上比較相似的詞,他在語義空間的距離也比較近,如果兩個詞的關系不是很接近,那么在語義空間中向量也會比較遠。

如上圖英語和西班牙語映射到語義空間,語義相同的數字他們在語義空間分布的位置是相同的

在句子的空間結構上我們期望獲取更底層的之間的關系比如:

VKing- VQueen= VMan-VWomen

VParis- VFrance= VBerlin-VGerman

king和queen之間的關系相比與man與woman的關系大體應該相同的,那么他們通過矩陣運算,維持住這種關系;Paris 和France之間的關系相比與Berlin與German的關系大體應該相同的,那么他們通過矩陣運算,維持住這種關系。

簡單回顧一下word embedding,對于nlp來說,我們輸入的是一個個離散的符號,對于神經網絡來說,它處理的都是向量或者矩陣。所以第一步,我們需要把一個詞編碼成向量。最簡單的就是one-hot的表示方法。如下圖所示:

one-hot encoding編碼

通常我們有很多的詞,那只在出現的位置顯示會,那么勢必會存在一些問題

高維的表示

稀疏性

正交性(任意兩個詞的距離都是1,除了自己和自己,這樣就帶來一個問題,貓和狗距離是1,貓和石頭距離也是1,但我們理解上貓和狗距離應該更近一些)

兩個詞語義上無法正確表示,我們更希望低維的相似的比較接近,語義相近的詞距離比較近,語義不想近的詞,距離也比較遠。解決的辦法就是word enbedding,是一種維位稠密的表示。

Neural Network Language Model(神經網絡語言模型)

我們都知道word2vec,glove。其實更早之前的神經網絡語言模型里出現。已經有比較早的一個詞向量了。語言模型是nlp的一個基本任務,是給定一個句子w,包括k個詞,我們需要計算這個句子的概率。使用分解成條件概率乘積的形式。變成條件概率的計算。

傳統的方法,統計的n-gram的,詞頻統計的形式,出現的多,概率就高,出現少概率就低,。

不能常時依賴上下文,如:他出生在法國,他可以講一口流利的(__),我們希望法語的概率比英語、漢語的概率要高。n-gram記住只能前面有限幾個詞,若參數比較多,它根本學不到這復雜關系,這是傳統語言模型比較大的一個問題。這個可以通過后面的rnn、lstm解決,我們這里先不討論。

第二個問題就是泛化能力的問題,泛化能力,或者說不能共享上下文的信息,我要去(__)玩, 北京、上海應該是一樣的,因為都是中國的一個城市,概率應該相等或相近的,但是因為預料中北京很多,所以出現上海的概率很低。那神經網絡語言模型就可以解決這樣的問題。

神經網絡語言模型架構如上圖:

將每個詞向量拼接成句子矩陣。每一列都是一個詞, 如北京、上海、 天津比較近,大致相同一塊區域,所以當預測時,可以給出大概相同的概率,不僅僅與預料中統計結果有關系。矩陣相乘就可以提取出這個詞,但是為了提取一個詞,我們要進行一次矩陣運算,這個比較低效,所以比較成熟的框架都提供了查表的方法,他的效率更高。

因為上下文環境很相似,會共享類似的context,在問我要去 (__)概率會比較大。這也是神經網絡語言模型的一個好處。我們通過神經網絡語言模型得到一個詞向量。當然我們也可以用其他的任務來做,一樣得到詞向量,比如句法分析,但是那些任務大部分是有監督的學習,需要大量的標注信息。語言模型是非監督的,資料獲取不需要很大的成本。

word2vec和神經網絡語言模型不同,直接來學習這個詞向量,使用的基本假設是分布式假設,如果兩個詞的上下文時相似的,那么他們語義也是相似的。

word2vec分為cbow(根據context預測中心詞)和skip-gram(根據中心詞預測context)兩種。

我們可以通過word2vec或者 glove這種模型在大量的未標注的語料上學習,我們可以學習到比較好的向量表示,可以學習到詞語之間的一些關系。比如男性和女性的關系距離,時態的關系,學到這種關系之后我們就可以把它作為特征用于后續的任務,從而提高模型的泛化能力。

但是同時存在一些問題比如:

He deposited his money in this bank .

His soldiers were arrayed along the river bank .word embeding 有個問題就是我們的詞通常有很多語義的,比如bank是銀行還是河岸,具體的意思要取決與上下文,如果我們強行用一個向量來表示語義的話,只能把這兩種語義都編碼在這個向量里,但實際一個句子中,一個詞只有一個語義,那么這種編碼是有問題的。

RNN/LSTM/GRU

那么這種上下文的語義可以通過RNN/LSTM/GRU來解決,RNN與普通深度學習不同的是,RNN是一種序列的模型,會有一定的記憶單元,能夠記住之前的歷史信息,從而可以建模這種上下文相關的一些語義。RNN中的記憶單元可以記住當前詞之前的信息。

RR可以解決,理論上我們希望學到很長的關系,但是由于梯度消失的問題,所以長時依賴不能很好的訓練。

其實lstm可以解決RNN長時依賴梯度消失的問題。

seq2seq

對于翻譯,我們不可能要求英語第一個詞一定對應法語的第一個詞,不能要求長度一樣,對于這樣一個rnn不能解決這一問題。我們使用兩個rnn拼接成seq2seq來解決。

我們可以用兩段RNN組成seq2seq模型

從而可以來做翻譯,摘要、問答和對話系統。

比如經典的翻譯例子法語到英語的翻譯,由encoder編碼到語義空間和decoder根據語義空間解碼翻譯成一個個的英語句子。

encoder把要翻譯的句子,映射到了整個語義空間,decoder根據語義空間再逐一翻譯出來,但是句子長度有時會截斷。有一個問題,我們需要一個固定長度的context向量來編碼所有語義,這個是很困難的,要記住每一個細節是不可能的。用一個向量記住整個語義是很困難的。

這時候我們引入了attention機制。

可以理解為context只記住了一個大概的提取信息,一種方法是做內積,內積大就關注大,這里可以理解為一種提取的方式,當提取到相關內容,再與具體的ecoder位置計算,得到更精細的內容。

pay attention 做內積。越大越相近 約重要,后續的attention、transformer都是對seq2seq的一個改進,通過這種可以解決word embbeing沒有上下文的一個問題。

加上attention機制,我們就取得了很大的成績,但是仍然存在一個問題,順序依賴,如下圖:t依賴t-1,t-1依賴t-2,串行的,很難并行的計算,持續的依賴的關系,通常很慢,無法并行:

The animal didn’t cross the street because it was too tired.

The animal didn’t cross the street because it was too narrow.

存在單向信息流的問題,只看前文,我們很難猜測it指代的具體內容,編碼的時候我們要看整個句子的上下文,只看前面或者只看后面是不行的。

RNN的兩個問題:

1、順序依賴,t依賴t-1時刻。

2、單向信息流(如例子中指代信息,不能確定)

3、需要一些比較多的監督數據,對于數據獲取成本很高的任務,就比較困難,在實際中很難學到復雜的上下文關系

Contextual Word Embedding

要解決RNN的問題,就引入了contextual word embedding。

contextual word embedding:無監督的上下文的表示,這種無監督的學習是考慮上下文的,比如ELMo、OpenAI GPT、BERT都是上下文相關的詞的表示方法。

attention是需要兩個句子的,我們很多時候只有一個句子,這就需要self-attention。提取信息的時候、編碼時self-atenntion是自驅動的,self-attention關注的詞的前后整個上下文。

self-attention最早是transformer的一部分。transformer是怎么解決這一問題的?

transformer:

本質也是一個encoder與decoder的過程,最起初時6個encoder與6個decoder堆疊起來,如果是LSTM的話,通常很難訓練的很深,不能很好的并行

每一層結構都是相同的,我們拿出一層進行解析,每一層有self-attention和feed-forward,decoder還有普通的attention輸入來自encoder,和seq-2seq一樣,我在翻譯某一個詞的時候會考慮到encoder的輸出,來做一個普通的attention

如下圖例子給定兩個詞 thinking和machies,首先通過word embedding把它變成向量,通過self-attention,把它變成一個向量,這里的sefl-attention時考慮上下文的。然后再接全連接層,計算z1的時候我要依賴x1、x2、x3整個序列的,才能算z1,z2也一樣,我算r1的時候時不需要z2的,只要有z1我就可以算r1.只要有z2就能算r2,這個是比較大的一個區別,這樣就可以并行計算。

我們來看看self-attention具體是怎么計算的

假設只有兩個詞,映射成長度只有四的向量,接下來使用三個變換矩陣wqwkwv,分別把每個向量變換成三個向量 q1k1v1q2k2v2這里是與設映的向量相乘得到的

得到向量之后就可以進行編碼了,考慮上下文,如上文提到的bank同時有多個語義,編碼這個詞的時候要考慮到其他的詞,具體的計算是q1k1做內積 q2k2做內積得到score,內積越大,表示約相似,softmax進行變成概率。花0.88的概率注意Thinking,0.12注意macheins這個詞

就可以計算z1了,z1=0.88v1+0.12z2z2的計算也是類似的。

q表示為了編碼自己去查詢其他的詞,k表示被查詢,v表示這個詞的真正語義,經過變換就變成真正的包含上下文的信息,普通attention可以理解為self-attention的一個特例。

普通attention的對比:

實際中是多個head, 即多個attention(多組qkv),通過訓練學習出來的。不同attention關注不同的信息,指代消解 上下位關系,多個head,原始論文中有8個,每個attention得到一個三維的矩陣

將8個3維的拼成24維,信息太多 經過24 *4進行壓縮成4維。

位置編碼:

北京 到 上海 的機票

上海 到 北京 的機票

self-attention是不考慮位置關系的,兩個句子中北京,初始映射是一樣的,由于上下文一樣,qkv也是一樣的,最終得到的向量也是一樣的。這樣一個句子中調換位置,其實attention的向量是一樣的。實際是不一樣的,一個是出發城市,一個是到達城市。

引入位置編碼,絕對位置編碼,每個位置一個 Embedding,每個位置一個embedding,同樣句子,多了個詞 就又不一樣了,編碼就又不一樣了

北京到上海的機票 vs 你好,我要北京到上海的機票

tranformer原始論文使用相對位置編碼,后面的bert open gpt使用的是簡單絕對位置編碼:

大家可以嘗試bert換一下相對位置會不會更好:

transformer中encoder的完整結構,加上了殘差連接和layerNorm

decoder加上了普通的attention,最后一刻的輸出,會輸入。

transformer的decoder不能利用未知的信息,即單向信息流問題。

transformer 解決的問題:

可以并行計算,訓練的很深,到后來的open gpt可以到12層 bert的16、24層;單向信息流的問題:至少在encoder的時候考慮前面和后面的信息,所以可以取得很好的效果;transformer解決了普通word embedding 沒有上下文的問題,但是解決這個問題,需要大量的標注信息樣本。

如何解決transformer的問題,就引入了elmo,elmo:無監督的考慮上下文的學習。

一個個的預測的語言模型:

雙向的lstm,每個向量2n,是一種特征提取的方法,考慮的上下文的,編碼完,就定住了,

elmo:將上下文當作特征,但是無監督的語料和我們真實的語料還是有區別的,不一定的符合我們特定的任務,是一種雙向的特征提取。

openai gpt就做了一個改進,也是通過transformer學習出來一個語言模型,不是固定的,通過任務 finetuning,用transfomer代替elmo的lstm。openai gpt其實就是缺少了encoder的transformer。當然也沒了encoder與decoder之間的attention。

openAI gpt雖然可以進行fine-tuning,但是有些特殊任務與pretraining輸入有出入,單個句子與兩個句子不一致的情況,很難解決,還有就是decoder只能看到前面的信息。

bert

bert從這幾方面做了改進:

Masked LM

NSP Multi-task Learning

Encoder again

bert為什么更好呢?

單向信息流的問題 ,只能看前面,不能看后面,其實預料里有后面的信息,只是訓練語言模型任務特殊要求只能看后面的信息,這是最大的一個問題;

其次是pretrain 和finetuning 幾個句子不匹配。

bert的輸入是兩個句子,分割符sep,cls表示開始,對輸入的兩個句子,使用位置編碼, segment embeding 根據這個可以知道 該詞屬于哪個句子,學習會更加簡單。可以很清楚知道第一句子需要編碼什么信息,第二個句子可以編碼什么信息。

單向信息流的問題,換一個任務來處理這個問題

單向信息流問題:mask ml 有點類似與完形填空,根據上下文信息猜其中信息,計算出最大概率,隨機丟掉15%的詞來bert來進行預測,考慮前后雙向的信息,怎么搞兩個句子?

-50%概率抽連續句子 正樣本1

50%概率抽隨機句子 負樣本 0

這樣學習到兩個句子的關系,可以預測句子關系,在一些問答場景下很重要。

finetuning

單個句子的任務,我們拿第一個cls向量,上面接一些全連接層,做一個分類,標注的數據 fine-tuningbert參數也包括全連接的一個參數,為什么選擇第一個?

bert任務還是預測這個詞,預測的時候會參考其他的詞,如eat本身還是吃的語義,直接根據eat去分類,顯然是不可以的,cls沒有太多其他詞的語義,所以它的語義完全來自其他的語義 來自整個句子,編碼了整個句子的語義,用它做可以,當然也可以得出所有結果進行拼接后,再來進行預測。

注意:

使用中文模型,不要使用多語言模型

max_seq_length 可以小一點,提高效率

內存不夠,需要調整 train_batch_size

有足夠多的領域數據,可以嘗試 Pretraining

bert的實際應用比較簡單,不過多贅述內容,推薦簡單的demo樣例:

https://www.jianshu.com/p/3d0bb34c488a

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

    關注

    1791

    文章

    47183

    瀏覽量

    238265
  • 機器學習
    +關注

    關注

    66

    文章

    8406

    瀏覽量

    132567
  • 自然語言處理

    關注

    1

    文章

    618

    瀏覽量

    13552

原文標題:從One-hot, Word embedding到Transformer,一步步教你理解Bert

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    外國牛人教你一步步快速打造首臺機器人(超詳細)

    外國牛人教你一步步快速打造首臺機器人(超詳細)
    發表于 08-15 19:30

    一步步寫嵌入式操作系統—ARM編程的方法與實踐ch02

    一步步寫嵌入式操作系統—ARM編程的方法與實踐ch02
    發表于 08-20 20:54

    CC2530一步步演示程序燒寫

    CC2530一步步演示程序燒寫第一步——先安裝IAR開發環境第二歩——安裝CC2530燒寫工具第三歩——CC2530串口配置軟件使用具體完整步驟看下面文檔
    發表于 03-03 14:33

    一步步建立_STM32_UCOS_模板

    一步步建立_STM32_UCOS_模板
    發表于 09-29 11:46

    菜鳥一步步入門SAM4S-XPLAINED--IAR開發環境

    菜鳥一步步入門SAM4S-XPLAINED--IAR開發環境
    發表于 01-25 10:55

    機器翻譯不可不知的Seq2Seq模型

    。更多細節,請大家參看知乎何之源的文章,文末會給出文章鏈接。4、CNN的seq2seq現在大多數場景下使用的Seq2Seq模型是基于RNN構成的,雖然取得了不錯的效果,但也有些學者發
    發表于 07-20 04:00

    一步步進行調試GPRS模塊

    背景:在不知道硬件是否正確情況下,一步步進行調試,最終完成調試。以下是自己調試步驟。1、gprs模塊TX ,RX 單獨焊接兩個線出來,通過上位機發送AT指令,是否能正常工作。
    發表于 01-25 07:33

    stm32是如何一步步實現設置地址匹配接收喚醒中斷功能的

    為什么要設置地址匹配接收喚醒中斷呢?stm32是如何一步步實現設置地址匹配接收喚醒中斷功能的?
    發表于 02-28 08:07

    一步步寫嵌入式操作系統

    一步步寫嵌入式操作系統_ARM編程的方法與實踐
    發表于 07-14 11:32 ?0次下載

    Java開發環境的搭建以及使用eclipse開始一步步創建Java項目

    本文詳細介紹了Java開發環境的搭建以及使用eclipse開始一步步創建Java項目。1.首先安裝JDK,接下來需要配置環境變量,配置path變量等,詳情請看下文
    的頭像 發表于 02-01 14:20 ?3436次閱讀
    Java開發環境的搭建以及使用eclipse<b class='flag-5'>從</b>開始<b class='flag-5'>一步步</b>創建Java項目

    文看懂NLP里的模型框架 Encoder-Decoder和Seq2Seq

    Encoder-Decoder 是 NLP 領域里的種模型框架。它被廣泛用于機器翻譯、語音識別等任務。本文將詳細介紹 Encoder-Decoder、Seq2Seq 以及...
    的頭像 發表于 12-10 22:19 ?1138次閱讀

    一步步重新演繹汽車駕駛體驗

    一步步重新演繹汽車駕駛體驗
    發表于 11-04 09:52 ?0次下載
    <b class='flag-5'>一步步</b>重新演繹汽車駕駛體驗

    基于一步步蒸餾(Distilling step-by-step)機制

    為優化LLM為“小模型/少數據/好效果”,提供了種新思路:”一步步蒸餾”(Distilling step-by-step)
    的頭像 發表于 05-16 10:24 ?1228次閱讀
    基于<b class='flag-5'>一步步</b>蒸餾(Distilling step-by-step)機制

    PyTorch教程10.7之用于機器翻譯的編碼器-解碼器Seq2Seq

    電子發燒友網站提供《PyTorch教程10.7之用于機器翻譯的編碼器-解碼器Seq2Seq.pdf》資料免費下載
    發表于 06-05 18:14 ?0次下載
    PyTorch教程10.7之用于機器翻譯的編碼器-解碼器<b class='flag-5'>Seq2Seq</b>

    PyTorch教程-10.7. 用于機器翻譯的編碼器-解碼器 Seq2Seq

    10.7. 用于機器翻譯的編碼器-解碼器 Seq2Seq? Colab [火炬]在 Colab 中打開筆記本 Colab [mxnet] Open the notebook in Colab
    的頭像 發表于 06-05 15:44 ?781次閱讀
    PyTorch教程-10.7. 用于機器翻譯的編碼器-解碼器 <b class='flag-5'>Seq2Seq</b>
    主站蜘蛛池模板: 一本色道久久综合亚洲精品加| 久久久高清国产999尤物| 纯肉合集(高H)| qvod在线观看| Y8848高清私人影院软件优势| 97在线观看免费| 伦理片秋霞免费影院| 97人人碰免费视频公开| 中文字幕完整高清版| 18禁无遮挡羞羞污污污污免费| 最近更新2019中文字幕国语| 91青青草原| 成人性生交大片免费看中文 | 老师别揉我胸啊嗯小说| 蜜芽在线影片| 日韩一区二区三区精品| 小SAO货叫大声点妓女| 在线观看国产亚洲| aaaaaa级特色特黄的毛片| 东北老妇人70OLDMAN| 国产强奷伦奷片| 蜜芽tv在线www| 色欲精品国产AV久久久| 亚瑟天堂久久一区二区影院| 日韩亚洲不卡在线视频| 日本精品久久久久中文字幕| 无修肉动漫在线观看影片| 亚洲中文字幕日产乱码2020| 亚洲一区综合图区| xxxx69日本| 国产这里有精品| 欧美熟妇VIVOE精品| 小舞被爆操| 99久久无码一区人妻A片竹菊 | 日本xxxxxx片免费播放18| 亚洲spank男男实践网站| 99久久久久国产精品免费| 国产午夜亚洲精品区| 青柠在线观看视频在线高清| 欧美 另类 美腿 亚洲 无码 | 成人亚洲视频|