Word Embedding 之深度學習
RNN:
RNN引入了隱狀態(tài)h(hidden state)的概念,h1接收到前一個隱狀態(tài)h0和當前輸入x1,結合權重和bias,輸出y1
RNN存在很多問題, 如序列足夠長RNN會遺漏掉比較早時刻的信息边败。當然還有反向傳播時候面臨梯度消失的問題放可,所以原生態(tài)RNN沒法用,LSTM在RNN基礎上做了優(yōu)化价匠。
LSTM:
LSTM除了RNN的h隱狀態(tài)又引入一條貫穿頂部的”傳送帶” Cell 狀態(tài) C, LSTM的關鍵之處就在于這個Cell的狀態(tài)正塌。
三個門:嘀略,遺忘門(下圖1)洼哎,輸入門(下圖2讶请,3)弥雹,輸出門(下圖4)抵窒。門與門之間通過一個sigmoid[0,1]和一個點乘操作組成, 結果0不能通過,1可以通過颗品。
回到LSTM為什么能解決RNN的不足苍碟,首先LSTM顧名思義“長短期記憶網絡”啥供,隨著C的加入稠集,LSTM有對長期記憶的處理奶段,同時“門”的加入進行了選擇性的保留和添加,所以也可以對短期以及進行處理巍杈。同時“門”的設計中忧饭,每個激活函數(shù)都是sigmoid[0,1], 使其輸出要嘛接近0扛伍,要嘛接近1.門為0時筷畦,說明上一時刻對當前時刻沒有影響,也就沒必要傳遞回來更新參數(shù)了。所以這樣很大程度上減輕了梯度消失發(fā)生的概率鳖宾。
LSTM在keras中的實際應用:
數(shù)據(jù)表-2D 形狀 = (樣本數(shù)吼砂,特征數(shù))
序列類-3D 形狀 = (樣本數(shù),步長鼎文,特征數(shù))
圖像類-4D 形狀 = (樣本數(shù)渔肩,寬,高拇惋,通道數(shù))
視屏類-5D 形狀 = (樣本數(shù)周偎,幀數(shù),寬撑帖,高蓉坎,通道數(shù))
這里重點說說序列類,輸入shape(samples, timesteps, input_dim)胡嘿,這里的timesteps可以理解為input_length蛉艾。比如100條句子,每條句子有13個單詞衷敌,每個單詞200維勿侯,shape(100, 13, 200)。當然這個是比較簡單的解釋缴罗,實際中因每條句子長度不一樣助琐,需將句子設置為最長長度,句子長度不足的padding補0瞒爬。keras中model.add(LSTM(128,....))看下圖代碼中表示是隱層ht是128維弓柱。
輸出時,當return_sequence = True時侧但,返回3D張量 shape(samples, timesteps, output_dim)
否則矢空,返回shape(samples, output_dim) 2D張量
keras現(xiàn)在被tensorflow封裝的好,當然用tf也可以實現(xiàn)禀横,下面是多層LSTM用TF實現(xiàn)
GRU:
GRU在LSTM基礎上做了變種屁药,組合了遺忘門和輸入門到一個單獨的“更新門”,同時也結合了cell狀態(tài)C和隱狀態(tài)h柏锄,變得比LSTM更簡單酿箭。
查了一些論文,說這兩種方法基本上一樣趾娃。如果數(shù)據(jù)少用GRU更快缭嫡,如果數(shù)據(jù)多,LSTM也許會有更好的結果.
ELMO
雙層雙向LSTM抬闷,由一個向前和向后語言模型構成妇蛀,目標函數(shù)取這兩個方向的最大似然耕突。相對于最基本的LSTM,ELMO相當于deep model. 從之前討論深度學習的本質來看评架,ELMO比LSTM提取到了更多詞義眷茁,句法,上下文關系纵诞,long term dependency等等特征信息上祈。所以ELMO目的在解決一詞多義的問題,即在不同的上下文環(huán)境下浙芙,哪怕是同一個詞登刺,也會表達出不同的含義。
Elmo由RNN演變而來嗡呼,所以具備了時序模型類一個最大問題:無法并行計算(計算的本質)塘砸,咱們的GPU再強大,core再多晤锥,提速也不理想掉蔬。但是不用時序模型,又沒法“記憶”矾瘾。有沒有一種方法即可以讓計算機并行計算女轿,模型又具備“記憶”功能。Attention就這樣橫空出世壕翩。
Transformer
首先看幾幅圖蛉迹,來自論文“Why Self-Attention?....”和張俊林的博文
這樣一對比,是不是看出來Transformer在各項指標上都碾壓了RNN和CNN放妈。為什么會這樣北救?
上圖就是transformer的內部構造,除了大家都知道的self-attention在發(fā)揮作用外芜抒,還有transform里的各個“部件”也發(fā)揮著作用珍策。一起先看看self-attention
Query貫穿整個流程,與Key發(fā)生交互后輸出value宅倒,這就是attention抽象流程圖攘宙,具體是怎么樣了?
”Thinking”輸入是one-hot編碼拐迁,假設通過embedding形成1 * 4矩陣蹭劈,再與q權重wq(4 * 3)矩陣相乘得出個1 * 3矩陣的q值,同樣的分別得到k與v值线召。q與k的值得到score铺韧,為了更好normalization轉換后進行softmax得到概率,再與v值相乘輸出缓淹。從這可以看出q值分別與每個詞的k值相乘得到score哈打,然后判斷每個詞與自己的相關性工窍。這里與每個詞都相乘了再判斷,所以attention解決了RNN句子太長會損失最初信息的問題前酿,attention“記住”了所有詞的信息。另外因為attention每個詞都是一樣的相乘鹏溯,所以解決了RNN無法并行計算的問題罢维。只是因為attention的加入,transformer才表現(xiàn)的這么好嗎丙挽?做個小實驗肺孵,用transformer的內部構造,把self-attention替換成雙向RNN和CNN颜阐,看看最后結果
可以看出替換了雙向RNN和CNN后平窘,性能得到不同幅度的提升。Transformer有什么神構造這么厲害凳怨?看下圖
把x輸入向量與attention后z向量做相加和歸一化(add&Normalize)瑰艘,在減少信息損失的同時,讓分布更均勻肤舞,這樣便于訓練梯度紫新。做完后,向量z1做一次前饋神經網絡提取更細致的特征李剖,然后與提取前的輸入結合再做一次add&normalize芒率。Transformer的架構就是一個優(yōu)化框架。Multi-head attention使用不同的attention關注點的特征篙顺,一開始是隨機初始化偶芍,通過訓練輸入到前饋神經網絡后獲取不同w值,這么多組都輸入到前饋神經網絡是不合理的德玫,所以為了解決這個問題匪蟀,需要再初始化一個矩陣w,和多個attention結果做乘法最終變換成前饋神經網絡可以接收的大小宰僧。
最后就是encoder - decoder萄窜。 Self-attention 是自身去做attention,輸入和輸出是一樣長撒桨,encoder-decoder attention對編碼輸入和解碼輸出做attention,可以不是一樣長查刻。Decoder后再經過Linear線性計算,然后做一次softmax.
Bert
雙向transformer,相當于把ELMO中的LSTM替換成transformer.
Transformer XL
RNN主要的問題是梯度消失和梯度爆炸的問題凤类,而且其捕捉上下文的長度沒有Transformer那么強大穗泵,而Transformer雖然能力比較強,但是在預測時會受到訓練時所設定的最大長度限制谜疤。 兩者都局限在捕捉長期依賴性上佃延。
Transformer規(guī)定輸入大小為512现诀,這意味著我們需要對原始的輸入文本進行裁剪或填充.剪裁填充后,整個文章被割裂履肃,這樣文本如果跨片段就無法學習仔沿。Transformer XL做了兩件事:XL把上一次處理的片段存儲起來,在當前片段的處理中會把這部分信息添加進來尺棋,這便是“延長”的含義封锉。這樣做便完成了上下文之間的遷移。第二件事是使用相對編碼位置膘螟,Transformer原本的位置embedding是一種絕對的位置編碼成福。XL做第一件事時,絕對位置編碼會發(fā)生變化荆残。
XLNet
BERT 雖然用了深層雙向信息奴艾,但沒有對被遮掩(Mask)的 token 之間的關系進行直接學習,因此 XLNet 通過提出 Permutation Language Model (PLM)對其進行了學習内斯。
更多的數(shù)據(jù)蕴潦,還有用 Transformer-XL 中的技巧帶來的更大范圍上下文,對模型有正向加強俘闯。這就是為什么XLNet數(shù)據(jù)上能跑過Bert.
最近的新聞品擎,F(xiàn)acebook AI團隊 RoBERTa 采用Bert-Large,并通過更多的數(shù)據(jù)和更長時間的訓練來提升預訓練的過程备徐,最終結果超過XLNet萄传。其實到這里,我對NLP還是有點失望的蜜猾,自從Bert誕生再到Transformer XL再到XLNet, Google大佬們引領這AI進入了需要更多數(shù)據(jù)和更強計算力才能跑贏各項指標的時代秀菱。不客氣的講一句,我這有大量數(shù)據(jù)又有超強計算力蹭睡,用什么模型不都一樣能跑出不錯的分數(shù)衍菱,這樣讓“算法”不知不覺中從核心變成了輔助,讓數(shù)據(jù)量和計算機的算力成為了主角肩豁。更致命的一點是脊串,數(shù)據(jù)如果都需要TPU來跑了,工業(yè)界又有多少能承擔的起清钥?又怎么落地了琼锋?