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

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

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

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

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

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

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

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