學習筆記TF017:自然語言處理、RNN、LSTM

2022-01-01 清醒瘋子

自然語言處理 (NLP)問題都是序列化的。前饋神經網絡,在單次前饋中對到來數據處理,假定所有輸入獨立,模式丟失。循環神經網絡(recurrent neural network,RNN)對時間顯式建模神經網絡。RNN神經元可接收其他神經元加權輸入。RNN神經元可與更高層建立連接,也可與更低層建立連接。隱含活性值在同一序列相鄰輸入間被記憶。2006年 LSTM。語音識別、語音合成、手寫連體字識別、時間序列預測、圖像標題生成、端到端機器翻譯。

RNN由神經元和連接權值構成任意有向圖。輸入神經元(input neuron)擁有「到來」連接,活性值由輸入數據設置。輸出神經元(output neuron)是數據流圖一組可讀取預測結果神經元。所有其他神經元為隱含神經元(hidden neuron)。每個時間步,通過設置輸入神經元為網絡提供輸入序列下一幀。隱含活性值作為下一個時間步附加輸入。RNN當前隱含活性值為狀態。序列最開始設置值0空狀態。RNN狀態依賴當前輸入和上一狀態。狀態與序列所有前輸入都間接相關,工作記憶(woring memory)。RNN權值矩陣定義執行程序,決定隱含活性值輸入,不同活性值整合新活性值輸出。sigmoid激活函數 RNN 2006年被證明圖錄完備(Turing-complete)。給定正確權值,RNN可完成任意計算程序相同計算。不存在找到完美權值方法,可用梯度下降法得到次好結果。

優化RNN,沿時間輸展開,用優化前饋網絡相同方式優化。複製序列神經元,連接在副本傳遞,移除循環邊接而不改計算語義。相鄰時間步權值相同強度。隨時間反向傳播(Back-Propagation Through Time,BPTT),返回時間相關誤差對權值(包括聯結相鄰副本權值)偏導。聯結權值(tied weight)梯度相加。

循環神經網絡常見映射:序列分類、序列生成、序列標註、序列翻譯。序列標註(sequential labelling),序列作為輸入,訓練網絡為每幀數據產生正確輸出,一個序列到另一個序列等長映射。序列分類(sequential classification),每個序列輸入對應一個類別標籤,可僅選擇上一幀輸出訓練RNN,更新權值時誤差流經所有時間步收集集成有用信息。序列生成(sequential generation),給定一個類別標籤,輸出反饋給網絡作為下一步輸入,生成序列。單個向量視為信息稠密表示。序列翻譯(sequential translation),域中序列編碼,最後隱含活性值解碼為另一個域中序列。輸入輸出概念層次有差異,兩個不同RNN,第一個模型最後活性值初始化第二個模型。單個網絡,序列後傳入特殊符號輸入,通知網絡停止編碼,開始解碼。

帶輸出投影RNN網絡結構,全連接隱含單元,映射輸入輸出。所有隱含單元都為輸出,堆疊前饋層。隱含單元和輸出單元不同激活函數。

TensorFlow支持RNN各種變體,tf.nn.rnn_cell。tensor flow.models.rnn中tf.nn.dynamic_rnn實現RNN動力學。接收循環網絡定義,輸入序列批數據。所有序列等長。返回保存每個時間步輸出和隱含狀態兩個張量。從tensor flow.models.rnn導入rnn_cell和rnn。輸入數據維數為batch_size*sequence_length*frame_size。不希望限制批次大小,第1維尺寸可以設None。rnn_cell.BasicRNNCell 創建基礎RNN。rnn.dynamic_rnn 定義sequence_length步模擬RNN運算。定義RNN,沿時間軸展開,加載數據,選擇TensorFlow優化器訓練網絡,tf.train.RMSPropOptimizer、tf.train.AdamOptimizer。

長時依賴性,網絡記住含有許多後續不相關幀的序列第一幀。長序列,基礎RNN展開網絡深度非常大,層數非常多,每一層反向傳播算法將來自網絡上一層誤差乘以局部偏導。如果大多數局部偏導遠小於1,梯度每層變小,指數衰減,最終消失。如果很多偏導大於1,梯度值急劇增大。誤差項包含相乘項權值矩陣轉置。RNN相鄰時間步聯結一起,權值局部偏導都小於1或大於1,RNN每個權值都向相同方向縮放,梯度消失、爆炸問題突出。數值優化,浮點精度對梯度值產生影響。長短時記憶網絡(long-short term memory,LSTM)RNN架構解決方案。

LSTM專門解決梯度消失、爆炸問題。學習長時依賴關係的RNN事實標準。將RNN普通神經元替換為內部擁有少量記憶LSTM單元(LSTM Cell)。聯結一起,內部狀態記憶時間步誤差。LSTM內部狀態有固定權值為1自連接,線性激活函數,局部偏導始終為1。反向傳播,常量誤差傳輸子(constant error carousel)在時間步攜帶誤差不發生梯度消失或爆炸。內部狀態隨時間步傳遞誤差,LSTM環繞門(surrounding gates)負責學習,非線性激活函數(sigmoid)。原始LSTM單元,一種門學習對到來活性值縮放,另一種門學習輸出活性值縮放,學習包含或忽略新輸入,學習給其他單元傳遞特徵。單元輸入送入不同權值門。可以把循環神經網絡用為規模更大網絡架構組成部分。

LSTMCell類可替換BasicRNNCell類,一個完整的LSTM層。輸入非線性->輸入門->狀態->輸出非線性->輸出門。

LSTM流行變種,添加對內部循環連接比例縮放遺忘門(forget gate),網絡學會遺忘,內部循環連接局部偏導變成遺忘門活性值,可取非1值。當上下文重要,遺忘門保持關閉狀態。輸入非線性->輸入門->狀態->遺忘門->輸出非線性->輸出門。

添加窺視孔連接(peephole connection),門能看到單元狀態。當精確時間選擇和間隔時有益。TensorFlow LSTM層傳入use-peepholes=Trues標記激活窺視孔連接。

門限循環單元(Gated Recurrent Unit,GRU),架構簡單,更少計算量,沒有輸出門,輸入和遺忘門整合單獨更新門(update gate)。更新門決定內部狀態與候選活性值融合比例。重置門(reset gate)和新輸入確定部分隱含狀態計算得到候選活性值。TensorFlow GRU層對應GRUCell類。只需要單元數目參數。輸入->候選活性值->更新門->重置門->狀態。

全連接隱含單元RNN,訓練期間把不需要權值置0。最常見做法,兩層或多層全連接RNN相互堆疊,信息只能在兩層之間向上流動,多層RNN權值數目少,學習到更多抽象特徵。

參考資料:

《面向機器智能的TensorFlow實踐》

歡迎加我微信交流:qingxingfengzi

我的微信公眾號:qingxingfengzigz

我老婆張幸清的微信公眾號:qingqingfeifangz

相關焦點

  • RNN遞歸神經網絡原理介紹+數字識別應用
    CNN卷積神經網絡主要應用在圖像識別領域;而RNN遞歸神經網絡的改進版LSTM網絡主要應用於自然語言處理中;為什麼我介紹RNN是叫——遞歸神經網絡?這之前是一個困擾我很久的問題。一、RNN原理介紹RNN神經網絡為什麼廣泛應用於自然語言處理?因為它是依靠時間序列具有記憶功能的——這一刻的輸出,除了考慮這一刻的輸入外,還有一部分是來自上一刻的輸出記憶。同時這一刻的輸出也會有一部分做為「記憶」傳給下一刻。
  • Python人工智慧 | 十二.循環神經網絡RNN和LSTM原理詳解及TensorFlow分類案例
    2.RNN應用RNN常用於自然語言處理、機器翻譯、語音識別、圖像識別等領域,下面簡單分享RNN相關應用所對應的結構。### # Cell結構 隱藏層數 forget初始偏置為1.0(初始時不希望forget) lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True) # RNN會保留每一步計算的結果state # lstm cell
  • 【NLP保姆級教程】手把手帶你RNN文本分類(附代碼)
    把現實問題當做一個個獨立的單任務處理,往往會忽略了問題之間所富含的豐富的關聯信息。上面的問題引出了本文的重點——「多任務學習(Multi-task learning)」,把多個相關(related)的任務(task)放在一起學習。多個任務之間共享一些因素,它們可以在學習過程中,共享它們所學到的信息,這是單任務學習沒有具備的。
  • 【NLP傻瓜式教程】手把手帶你RNN文本分類(附代碼)
    把現實問題當做一個個獨立的單任務處理,往往會忽略了問題之間所富含的豐富的關聯信息。上面的問題引出了本文的重點——「多任務學習(Multi-task learning)」,把多個相關(related)的任務(task)放在一起學習。多個任務之間共享一些因素,它們可以在學習過程中,共享它們所學到的信息,這是單任務學習沒有具備的。
  • 深度學習TensorFlow的55個經典案例
    本教程包含還包含筆記和帶有註解的代碼。通過一個具體的機器學習任務學習 TFLearn 基礎。開發和訓練一個深度神經網絡分類器。自然語言處理模型及數據集https://github.com/tflearn/tflearn/blob/master/examples/nlp/lstm.pyhttps://github.com/tflearn/tflearn/blob/master/examples
  • Tensorflow教程-雙向的LSTM文本分類
    # 定義佔位符x_input = tf.placeholder(tf.int32, [None, sequence_length], name="input")y_output = tf.placeholder(tf.float32, [None, num_classes], name="y_output")定義輸入佔位符和標籤佔位符,sequence_length
  • Char RNN原理介紹以及文本生成實踐
    眾所周知,RNN非常擅長處理序列問題。序列數據前後有很強的關聯性,而RNN通過每個單元權重與偏置的共享以及循環計算(前面處理過的信息會被利用處理後續信息)來體現。Char-RNN模型是從字符的維度上,讓機器生成文本,即通過已經觀測到的字符出發,預測下一個字符出現的概率,也就是序列數據的推測。現在網上介紹的用深度學習寫歌、寫詩、寫小說的大多都是基於這個方法。
  • 學習筆記TF021:預測編碼、字符級語言建模、ArXiv摘要
    語言建模(language modelling),預測一個句子中下一個單詞的似然。生成文本,依據網絡下一個單詞分布抽樣,訓練結束,種子單詞(seed word)送入RNN,觀察預測的下一個單詞,最可能單詞輸入RNN,重複,生成新內容。預測編碼壓縮訓練網絡任意序列所有重要信息。網絡捕捉語法、語言規則,精確預測是語言下一個字符。
  • 作詞家下崗系列:教你用 RNN 算法做一個寫詞軟體
    作者 | 李秋鍵編輯 | Carol出品 | CSDN(ID:CSDNnews)自然語言處理作為人工智慧的一個重要分支,在我們的生活中得到了廣泛應用。其中RNN算法作為自然語言處理的經典算法之一,是文本生成的重要手段。而今天我們就將利用RNN算法建立一個寫歌詞的軟體。其中的界面如下:
  • 深度學習在自然語言處理中的應用之情感分析
    引言隨著深度學習理論研究的逐漸深入,自然語言處理(Natural Language Processing, NLP)領域作為人工智慧研究的重要方向之一也出現了很多深度學習模型。相對於傳統的機器學習方法,深度學習的優點主要在於訓練效果好,以及不需要複雜的特徵提取過程。同時,在深度學習框架如TensorFlow和PyTorch的幫助下,搭建和部署深度學習模型的難度也相對較小。
  • 【手把手教你】使用RNN深度學習預測股票價格
    數據處理好了之後,就需要對網絡進行搭建了。接受的訓練數據是一個[batchSize, 4]的shape,就是用前4個數據預測後一個。hidden_size是一個lstm或者rnn單元的神經元的個數,也就是結構圖中的一個方框A,可以想像其中有這麼多個神經元。
  • 在 TensorFlow 上使用 LSTM 進行情感分析
    在討論具體的概念之前,讓我們先來談談為什麼深度學習適合應用在自然語言處理中。深度學習在自然語言處理中的應用自然語言處理是教會機器如何去處理或者讀懂人類語言的系統,目前比較熱門的方向,包括如下幾類:在未進入深度學習時代,NLP也是一個蓬勃發展的領域。然而,在所有的上述任務中,我們都需要根據語言學的知識去做大量的,複雜的特徵工程。
  • 專題 自然語言處理學習筆記(二):encoder-decoder框架和attention mechanism兩種研究
    上述三個難點對於人類來說都不是一件容易的事情,何況是發展沒太多年的自然語言處理技術。人工智慧領域中AI能夠領先人類的例子很多,包括前不久很火的Alpha狗,圖片識別,主要是利用計算機遠強於人類的計算能力,但也有很多的領域,AI離人類的水平還有很遠,比如paper的survey,summarization,機器翻譯等等。
  • Tensorflow實戰系列:手把手教你使用LSTM進行文本分類(附完整代碼)
    並且教程代碼包含了配置信息,將數據處理為LSTM的輸入格式,以及定義和訓練相關代碼,因此希望在日常項目中使用Tensorflow的朋友可以參考這篇教程。import static_rnnfrom tensorflow.python.ops.rnn_cell_impl import BasicLSTMCell這裡用偽造的文本數據進行情感分類,有正面情感數據和負面情感數據。
  • 學習筆記TF019:序列分類、IMDB影評分類
    tf.gather()沿第1維建立索引。輸出活性值形狀sequences*time_steps*word_vectors前兩維扁平化(flatten),添加序列長度。添加length-1,選擇最後有效時間步。梯度裁剪,梯度值限制在合理範圍內。可用任何中分類有意義代價函數,模型輸出可用所有類別概率分布。增加梯度裁剪(gradient clipping)改善學習結果,限制最大權值更新。
  • TensorFlow中RNN實現的正確打開方式
    tfimport numpy as nplstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=128)inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_sizeh0 = lstm_cell.zero_state(32
  • (源碼)tflearn/tensorflow實現金融文本情感分析:LSTM/雙向LSTM/CNN
    在深度學習崛起後,短文本分類在電商、電影評論中的應用也開始流行。本文將LSTM/雙向LSTM/CNN分別應用於金融股吧裡的用戶討論的文本,分析文本裡的包含的情緒,一定程度上可以發現當前股票對應的用戶情緒變化,支持投資決策。這裡我們把情緒分成三類,正向、負向及無明顯偏向,當然還可以分得更細,這只是數據標註的區別。