人工神經(jīng)網(wǎng)絡(luò )
人工神經(jīng)網(wǎng)絡(luò )(Artificial Neural Network,ANN)是一組大致模仿人類(lèi)大腦構造設計的計算機算法或數學(xué)模型,屬于機器學(xué)習(Machine Learning,ML)方法中的一類(lèi),適合于處理語(yǔ)音,圖像,文本等數據,賦予計算機處理有關(guān)人類(lèi)認知方面問(wèn)題的能力,如語(yǔ)音識別,圖像識別,自然語(yǔ)言理解等。
人工神經(jīng)網(wǎng)絡(luò )的基本組成單元稱(chēng)為一個(gè)神經(jīng)元,其結構如下圖所示:

一般而言,一個(gè)神經(jīng)元可以接受多個(gè)輸入經(jīng)過(guò)一些線(xiàn)性或非線(xiàn)性變換后轉化成一個(gè)輸出值。神經(jīng)元內部的這個(gè)變換函數稱(chēng)為激活函數(activation function),常用的激活函數包括:sigmoid,tanh,RELU等。
人工神經(jīng)網(wǎng)絡(luò )的神經(jīng)元可以看成一種簡(jiǎn)化版的生物神經(jīng)元。我們知道,生物神經(jīng)元通過(guò)細胞體上的樹(shù)突接收其他神經(jīng)元的信號,而通過(guò)軸突向其他神經(jīng)元傳遞信號;并且通常一個(gè)神經(jīng)元有一個(gè)至多個(gè)樹(shù)突,但軸突只有一條。
顯然,單個(gè)神經(jīng)元能夠進(jìn)行的處理和計算能力有限,因此類(lèi)似生物的大腦,我們可以將許多個(gè)的神經(jīng)元連接起來(lái),組成一個(gè)更大規模的網(wǎng)絡(luò ),這個(gè)網(wǎng)絡(luò )就是人工神經(jīng)網(wǎng)絡(luò ),例如下圖中這樣:

出于計算的考慮,人工神經(jīng)網(wǎng)絡(luò )中的神經(jīng)元不會(huì )像生物大腦中那樣隨意的連接,而是形成相對簡(jiǎn)單的分層結構。一般的基本組成包括:
- 輸入層(input layer):每個(gè)網(wǎng)絡(luò )中只有一個(gè),處于這一層神經(jīng)元用于接收輸入數據;
- 隱藏層(hiddeng layer):每個(gè)網(wǎng)絡(luò )可以由零個(gè)或多個(gè),這部分神經(jīng)元對輸入進(jìn)行變換,分析和計算;
- 輸出層(output layer):每個(gè)網(wǎng)絡(luò )中只有一個(gè),這一層中的神經(jīng)元對來(lái)自隱藏層或輸入層的數據進(jìn)行最后的處理,并輸出最終結果。
深度學(xué)習
深度學(xué)習(Deep Learning,DL),顧名思義,指的使用是隱藏層的數目較大的深層神經(jīng)網(wǎng)絡(luò )(Deep Neural Network,DNN)為模型的機器學(xué)習方法。
傳統神經(jīng)網(wǎng)絡(luò )主要使用由一個(gè)輸入層和一個(gè)輸出層組成的淺層網(wǎng)絡(luò ),至多在兩層之間添加一個(gè)隱藏層。三層以上(包括輸入和輸出層在內)的系統就可以稱(chēng)為“深度”學(xué)習。
在深度學(xué)習網(wǎng)絡(luò )中,每一個(gè)節點(diǎn)層在前一層輸出的基礎上學(xué)習識別一組特定的特征。隨著(zhù)神經(jīng)網(wǎng)絡(luò )深度增加,節點(diǎn)所能識別的特征也就越來(lái)越復雜,因為每一層會(huì )整合并重組前一層的特征。隨著(zhù)特征越來(lái)越復雜,它們的抽象度也越來(lái)越高,可能會(huì )與人類(lèi)大腦中的某些高層語(yǔ)義概念相對應,因而,使用這些特征能夠更有利于和認知有關(guān)任務(wù)的處理。
深度的重要性可以在一些圖像識別任務(wù)中直觀(guān)的看到,如下圖所展示的人臉識別深度模型:

(圖源:Key Concepts of Deep Neural Networks)
觀(guān)察圖片左邊部分,我們可以看到,隨著(zhù)層數的增加,神經(jīng)網(wǎng)絡(luò )學(xué)習到的特征越來(lái)越抽象。網(wǎng)絡(luò )的第一層的特征只是一些簡(jiǎn)單紋理,方向等線(xiàn)條,第二層通過(guò)第一層得到的線(xiàn)條組成了一些臉部的局部細節,最終在第三層通過(guò)組合上一層的各個(gè)局部,形成一幅幅人臉的圖像。
遞歸神經(jīng)網(wǎng)絡(luò )
前面我們舉的例子中,神經(jīng)元之間的連接只在相鄰的層之間,并且是單方向的,這種類(lèi)型的神經(jīng)網(wǎng)絡(luò )統稱(chēng)為前饋神經(jīng)網(wǎng)絡(luò )(Feed Forward Neural Network)。前饋神經(jīng)網(wǎng)絡(luò )的這種結構特性使得它在處理每個(gè)輸入時(shí),是不考慮之前的輸入的,這僅對輸入數據點(diǎn)之間是獨立的應用有效。而許多實(shí)際的應用場(chǎng)景,每個(gè)輸入點(diǎn)的值會(huì )對其他輸入點(diǎn)的值有所依賴(lài)。這時(shí),我們需要使用另一種結構的神經(jīng)網(wǎng)絡(luò ),即遞歸神經(jīng)網(wǎng)絡(luò )(Recurrent Neural Network,RNN),這種網(wǎng)絡(luò )更適合處理時(shí)間序列的輸入數據,如語(yǔ)音,手寫(xiě)識別,文本等。
遞歸神經(jīng)網(wǎng)絡(luò )與前饋神經(jīng)網(wǎng)絡(luò )的主要區別在于,遞歸神經(jīng)網(wǎng)絡(luò )的神經(jīng)元在前饋神經(jīng)網(wǎng)絡(luò )神經(jīng)元的基礎,增加了一條到自身的連接,也就是說(shuō),神經(jīng)元上一個(gè)時(shí)刻的輸出會(huì )作為下一時(shí)刻的輸入反饋給自身。如圖所示,

通過(guò)這條自反饋連接,RNN把處理過(guò)的歷史數據都存儲在它的狀態(tài)向量中,并且把它與輸入數據一并送給神經(jīng)元處理。由于這部分額外信息的獲取,使得RNN具有更強的記憶和學(xué)習能力。
LSTM
歷史信息使得RNN具備較強的記憶能力,但是同時(shí)也使RNN的學(xué)習過(guò)程變得更加困難。
RNN的學(xué)習通常使用的是沿時(shí)間反向傳播(BackPropagation Through Time,BPTT)算法,這個(gè)算法需要多次連乘權重矩陣,這樣就很容易出現極小或極大的數值,使得訓練不穩定,這個(gè)問(wèn)題被稱(chēng)為梯度消失(vanishing gradients)或梯度爆炸(exploding gradients)問(wèn)題。
為解決上述問(wèn)題,學(xué)者設計出一種稱(chēng)為長(cháng)短期記憶(Long-Short Term Memory,LSTM)的模型。LSTM在RNN神經(jīng)元的基礎上,加入了三個(gè)門(mén)(gate),對模型的記憶內容進(jìn)行精細的控制。一般使用的LSTM包含三個(gè)門(mén):
- 輸入門(mén)(inputgate),控制輸入數據權重;
- 忘記門(mén)(forgetgate),控制歷史信息權重;
- 輸出門(mén)(outputgate),控制輸出結果權重。
LSTM神經(jīng)元的結構,如下圖所示,

使用LSTM能夠使RNN模型的訓練過(guò)程更穩定,學(xué)習更有效。
TensorFlow
為了加速深度學(xué)習領(lǐng)域的發(fā)展,2015年11月9日,Google發(fā)布深度學(xué)習框架TensorFlow并宣布開(kāi)源。在不到一年時(shí)間內,在GitHub上,TensorFlow就成為了最流行的深度學(xué)習項目。TensorFlow在圖形分類(lèi)、音頻處理、推薦系統和自然語(yǔ)言處理等場(chǎng)景下都有豐富的應用。
TensorFlow是一個(gè)深度學(xué)習框架,支持Linux平臺,Windows平臺,Mac平臺,甚至手機移動(dòng)設備等各種平臺。其次,TensorFlow提供了非常豐富的深度學(xué)習相關(guān)的API,可以說(shuō)目前所有深度學(xué)習框架里,提供的API最全的,包括基本的向量矩陣計算、各種優(yōu)化算法、各種卷積神經(jīng)網(wǎng)絡(luò )和循環(huán)神經(jīng)網(wǎng)絡(luò )基本單元的實(shí)現、以及可視化的輔助工具等等。
TensorFlow的特點(diǎn)包括:
- 高度的靈活性
TensorFlow并不僅僅是一個(gè)深度學(xué)習庫,只要可以把你的計算過(guò)程表示稱(chēng)一個(gè)數據流圖的過(guò)程,我們就可以使用TensorFlow來(lái)進(jìn)行計算。TensorFlow允許我們用計算圖的方式還建立計算網(wǎng)絡(luò ),同時(shí)又可以很方便的對網(wǎng)絡(luò )進(jìn)行操作。用戶(hù)可以基于TensorFlow的基礎上用Python編寫(xiě)自己的上層結構和庫,如果TensorFlow沒(méi)有提供我們需要的API的,我們也可以自己編寫(xiě)底層的C++代碼,通過(guò)自定義操作將新編寫(xiě)的功能添加到TensorFlow中。
- 真正的可移植性
TensorFlow可以在CPU和GPU上運行,可以在臺式機,服務(wù)器,甚至移動(dòng)設備上運行。
- 多語(yǔ)言支持
TensorFlow采用非常易用的python來(lái)構建和執行我們的計算圖,同時(shí)也支持C++的語(yǔ)言。我們可以直接寫(xiě)python和C++的程序來(lái)執行TensorFlow,也可以采用交互式的ipython來(lái)方便的嘗試我們的想法。
- 豐富的算法庫
TensorFlow提供了所有開(kāi)源的深度學(xué)習框架里,最全的算法庫,并且在不斷的添加新的算法庫。這些算法庫基本上已經(jīng)滿(mǎn)足了大部分的需求,對于普通的應用,基本上不用自己再去自定義實(shí)現基本的算法庫了。
- 完善的文檔
TensorFlow的官方網(wǎng)站,提供了非常詳細的文檔介紹,內容包括各種API的使用介紹和各種基礎應用的使用例子,也包括一部分深度學(xué)習的基礎理論。
語(yǔ)言模型
語(yǔ)言模型是一種概率模型,它是基于一個(gè)語(yǔ)料庫創(chuàng )建,得到每個(gè)句子出現的概率。語(yǔ)言模型在語(yǔ)音識別中起到重要的作用,如果沒(méi)有語(yǔ)言模型,語(yǔ)音識別的結果只能是一些發(fā)音正確的詞語(yǔ)或單字,卻不一定能組成有意義的句子。關(guān)于語(yǔ)音識別原理的詳細介紹,請參見(jiàn)我們的上一篇文章。
傳統的N-gram語(yǔ)言模型數學(xué)上表示為:

上述公式的意義是:一個(gè)句子出現的概率等于給定前面的詞情況下,緊接著(zhù)后面的詞出現的概率。它是通過(guò)條件概率公式展開(kāi)得到。其中條件概率P(w2|w1),P(w3|w1w2),?,P(wt|w1w2?wt?1)就是創(chuàng )建語(yǔ)言模型所需要的參數,每個(gè)條件概率的意義解釋為:根據前面的詞預測下一個(gè)詞的概率。有了這些條件概率參數,給定一個(gè)句子,就可以通過(guò)以上公式得到一個(gè)句子出現的概率。句子的概率越大,說(shuō)明它越接近自然語(yǔ)言的表達。
神經(jīng)網(wǎng)絡(luò )的語(yǔ)言模型則是使用神經(jīng)網(wǎng)絡(luò )來(lái)建模句子的概率。將句子中的詞按順序逐個(gè)輸入給一個(gè)神經(jīng)網(wǎng)絡(luò ),在每次得到的輸出中找到下一個(gè)詞的概率,最后將句子中所有詞的概率連乘,就得到了這個(gè)句子的概率。
語(yǔ)言模型中下一個(gè)詞的概率顯然和之前歷史的詞有非常大的依賴(lài)關(guān)系,因此,LSTM比較適合于應用在語(yǔ)言模型建模中。
基于TensorFlow的LSTM語(yǔ)言模型
根據以上原理,我們就可以利用TensorFlow來(lái)實(shí)現LSTM語(yǔ)言模型了。根據以上原理,我們就可以利用TensorFlow來(lái)實(shí)現LSTM語(yǔ)言模型了。
- 模型訓練
首先,掃描語(yǔ)料庫建立字典,并為每個(gè)詞編號。
第二步,需要建立TensorFlow的計算流圖,在其中定義要使用的LSTM模型。這里的使用模型是一個(gè)N+2層的LSTM,其中第一層是輸入層,又叫做詞向量矩陣,然后是N層的LSTM隱藏層,最后連接的是輸出層。輸出層的神經(jīng)元個(gè)數與詞典中詞數相同,每個(gè)神經(jīng)元輸出的值就是它所對應的詞的概率大小。
第三步,使用BPTT算法訓練模型。這時(shí)我們需要優(yōu)化目標函數,采用梯度下降逐步更新參數。
梯度下降算法最重要的參數就是學(xué)習率,需要人工設置一個(gè)合適的值,學(xué)習率太大容易造成訓練過(guò)程不穩定,太小則會(huì )使得學(xué)習過(guò)程太慢。一般而言,我們會(huì )在一次訓練的過(guò)程中,逐步減小學(xué)習率,最終使得訓練收斂。
將上面所述轉化為代碼后,使用TensorFlow運行,我們就可以得到最終的模型。
- 模型評價(jià)
對于任何一種機器學(xué)習模型,我們都需要使用某種方法評價(jià)它的好壞。在語(yǔ)言模型領(lǐng)域,使用最多的是一種稱(chēng)為困惑度(Perplexity,PPL)的指標。其基本思想是給測試集的句子賦予較高概率值的語(yǔ)言模型較好,公式如下:

可以看出,困惑度和概率成反比,概率越高,困惑度越低,語(yǔ)言模型越好。
使用TensorFlow進(jìn)行模型評估時(shí),代碼和訓練時(shí)基本一樣,只需要把最后運行的梯度下降的去掉。得到每一個(gè)詞的概率后,就可以通過(guò)上面的公式計算PPL了。在PennTreeBank(PTB)數據集(訓練集包含929k個(gè)詞)上,不同模型的PPL如下:
模型 |
PPL |
N-gram |
141 |
RNN |
123 |
LSTM |
82 |
顯然,基于神經(jīng)網(wǎng)絡(luò )的模型效果優(yōu)于傳統的Ngram模型,而LSTM模型比RNN更優(yōu)。