日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ANN:神经网络堆叠/进化故事( 从感知机到DRBN )

發(fā)布時間:2023/12/31 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ANN:神经网络堆叠/进化故事( 从感知机到DRBN ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言: ???????

??????? 幾乎每一次神經(jīng)網(wǎng)絡(luò)的再流行,都會出現(xiàn):推進人工智能的夢想之說。不過感覺,神經(jīng)網(wǎng)絡(luò)的成功是對人的已有經(jīng)驗的覆蓋。自然狀態(tài)是一個DFA,而總結(jié)規(guī)律的過程則是根據(jù)經(jīng)驗的正確性把幾何狀態(tài)轉(zhuǎn)化為抽象代數(shù)運算,這就是規(guī)則。ANN以我們難以理解的網(wǎng)絡(luò)參數(shù)來表示規(guī)則,是個不明所以的黑箱。

????????DNN的流行因其多層模型,以其強大的表征能力可擬合形狀詭異的樣本流形分布,可以使用多層少量參數(shù)的組合來代替淺層網(wǎng)絡(luò)的海量參數(shù)。

??????? 本文有大量修改,如有疑問,請拜訪原文, 原文鏈接:http://www.cnblogs.com/xiaowanyer/p/3701944.html?????????

????? ? 關(guān)于DNN的對比介紹:最接近人腦的智能學(xué)習(xí)器-深度學(xué)習(xí)及并行化實現(xiàn)???????????????????????????????????

??????? 另外參考:DL深度學(xué)習(xí)原理與實現(xiàn)??? DL原理步進:http://blog.csdn.net/zouxy09/article/details/8781396


目錄:

1.感知器:線性分類器

2.多層網(wǎng):前饋神經(jīng)網(wǎng)絡(luò)

3.解決方案:逐層初始化—自編碼器

4.隨機可視化:全連接玻爾茲曼機

5.自學(xué)習(xí):深度信念網(wǎng)絡(luò)


一. 感知器??????

?????? 智慧分解為元素是識別和決策,代表人對環(huán)境的輸入和輸出。而識別和決策可以坍塌為一種邏輯表示:分類,即感知器對輸入的分類和觸發(fā)器對思維結(jié)果的分類。其中最簡單的是兩類問題,即布爾邏輯運算問題。

感知機結(jié)構(gòu)

  感知機是監(jiān)督式訓(xùn)練算法,是神經(jīng)網(wǎng)絡(luò)構(gòu)建的基礎(chǔ)。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程最終是發(fā)生在神經(jīng)元之間的突觸部位,突觸的聯(lián)結(jié)強度隨著突觸前后神經(jīng)元的活動而變化,變化的量與兩個神經(jīng)元的活性之和成正比。 1957年,Frank Rosenblatt用數(shù)學(xué)的方法描述這個過程,即為感知器模型。????

?????? 此處參考資料:神經(jīng)網(wǎng)絡(luò)從被人忽悠好忽悠人??????????????????

??????

?????? 數(shù)學(xué)模型:

???????????????????

應(yīng)用場景例子分解

????? 假如平面中存在?n?個點,并被分別標(biāo)記為“0”和“1”。此時加入一個新的點,如果我們想知道這個點的標(biāo)記是什么(和之前提到的小狗圖片的辨別同理),我們要怎么做呢?

  一種很簡單的方法是查找離這個點最近的點是什么,然后返回和這個點一樣的標(biāo)記。而一種稍微“智能”的辦法則是去找出平面上的一條線來將不同標(biāo)記的數(shù)據(jù)點分開,并用這條線作為“分類器”來區(qū)分新數(shù)據(jù)點的標(biāo)記。

??????

  在本例中,每一個輸入數(shù)據(jù)都可以表示為一個向量?x?= (x_1, x_2) ,而我們的函數(shù)則是要實現(xiàn)“如果線以下,輸出0;線以上,輸出1”。這歸結(jié)為一個簡單的線性分類問題。

  數(shù)學(xué)描述:用數(shù)學(xué)方法表示,定義一個表示權(quán)重的向量?w?和一個垂直偏移量?b。然后,我們將輸入、權(quán)重和偏移結(jié)合可以得到如下傳遞函數(shù):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

??????????????? 或者離散描述這種形式:

?????????????????????????

  這個傳遞函數(shù)的結(jié)果將被輸入到一個激活函數(shù)中以產(chǎn)生標(biāo)記。在上面的例子中,我們的激活函數(shù)是一個門限截止函數(shù)(即大于某個閾值后輸出1):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  整個步驟連接起來就是一個感知器模型,由此實現(xiàn)線性分類。


模型識別過程代碼實現(xiàn):

bool slp_calculate_output( const double * inputs, const double * weights, int nInputs,int & output ) { if( NULL ==inputs || NULL == weights ) return false; //1.權(quán)值相加,累計double sum =0.0; for (int i = 0 ; i < nInputs ; ++i){ sum += (weights[i] * inputs[i] ); } //2.激活函數(shù):這里我們對乘積和的處理:如果大于0,則輸出值為1;其他情況,輸出值為-1 if(sum >0.0) output = 1; else output = -1; return true; } 簡單模型代碼:感知器模型實現(xiàn)了一個簡單的感知器算法,此外可以生成一個感知器結(jié)構(gòu),用以規(guī)整化輸入輸出,對應(yīng)結(jié)構(gòu)圖中的描述。


學(xué)習(xí)/訓(xùn)練過程

  感知機的訓(xùn)練包括多訓(xùn)練樣本的輸入及計算每個樣本的輸出。在每一次計算以后,權(quán)重?w?都要調(diào)整以最小化輸出誤差,這個誤差由輸入樣本的標(biāo)記值與實際計算得出值的差得出。還有其它的誤差計算方法,如均方差等,但基本的原則是一樣的。

????? 感知器學(xué)習(xí)算法步驟如下:

  • 對權(quán)系數(shù)置初值。
  • 輸入一樣(X1…Xn)本以及它的期望輸出d。
    期望輸出值d在樣本的類屬不同時取值不同。如果是A類,則取d=1,如果是B類,則取-1。期望輸出d也即是教師信號。
  • 計算實際輸出值。

  • 根據(jù)實際輸出求誤差e。
    ?? E = d-Y(t)
  • 用誤差e去修改權(quán)系數(shù)。
    ??
  • 轉(zhuǎn)到第2點,一直執(zhí)行到一切樣本均穩(wěn)定為止。
  • 學(xué)習(xí)有效性

    ??????? 模型的可收斂性能:通過上述的學(xué)習(xí)算法,模型一定收斂到一個穩(wěn)定模型嗎?

    ? ? ? ? 此處參考:Rosenblatt感知器詳解????? 詳細看原文章,下面轉(zhuǎn)載兩個圖,感知器算法模型訓(xùn)練收斂性證明的上界和下界。

    ???????

    ??????????????????????????????????????? 上界證明過程????????????????????????????????????????????????????????????????????????????? ? ? ? ? ?? 下界證明過程


    感知器算法缺陷

      這種簡單的感知機有一個明顯缺陷:只能對線性可分樣本集合分類

    ?????? 這個缺陷重要嗎?比如?XOR,這么簡單的函數(shù),都不能被線性分類器分類(如下圖所示,分隔兩類點失敗):

    ??????

    ?????? 為了解決這個問題,我們要使用一種多層感知機,也就是——多層前饋神經(jīng)網(wǎng)絡(luò):事實上,我們將要組合一群這樣的感知機來創(chuàng)建出一個更強大的學(xué)習(xí)機器。多層分段線性函數(shù)的組合可以模擬任意復(fù)雜的非線性函數(shù),也即使理論上多層感知機網(wǎng)絡(luò)可以?對任意分類面復(fù)雜的?樣本集合進行正確分類。


    二. 多層前饋神經(jīng)網(wǎng)絡(luò)

      神經(jīng)網(wǎng)絡(luò)實際上就是將大量之前講到的感知機進行組合,用不同的方法進行連接并作用在不同的激活函數(shù)上。

    ? ? ??

      我們簡單介紹下前向神經(jīng)網(wǎng)絡(luò),其具有以下屬性:

    • 一個輸入層,一個輸出層,一個或多個隱含層。上圖所示的神經(jīng)網(wǎng)絡(luò)中有一個三神經(jīng)元的輸入層、一個四神經(jīng)元的隱含層、一個二神經(jīng)元的輸出層。
    • 每一個神經(jīng)元都是一個上文提到的感知機。
    • 輸入層的神經(jīng)元作為隱含層的輸入,同時隱含層的神經(jīng)元也是輸出層神經(jīng)元的輸入。
    • 每條建立在神經(jīng)元之間的連接都有一個權(quán)重?w?(與感知機中提到的權(quán)重類似)。
    • 在?t?層的每個神經(jīng)元通常與前一層(?t - 1層)中的每個神經(jīng)元都有連接(但你可以通過將這條連接的權(quán)重設(shè)為0來斷開這條連接)。
    • 為了處理輸入數(shù)據(jù),將輸入向量賦到輸入層中。在上例中,這個網(wǎng)絡(luò)可以計算一個3維輸入向量(由于只有3個輸入層神經(jīng)元)。假如輸入向量是?[7, 1, 2],你將第一個輸入神經(jīng)元輸入7,中間的輸入1,第三個輸入2。這些值將被傳播到隱含層,通過加權(quán)傳遞函數(shù)傳給每一個隱含層神經(jīng)元(這就是前向傳播),隱含層神經(jīng)元再計算輸出(激活函數(shù))。
    • 輸出層和隱含層一樣進行計算,輸出層的計算結(jié)果就是整個神經(jīng)網(wǎng)絡(luò)的輸出。

    非線性

      如果每一個感知機都只能使用一個線性激活函數(shù)會怎么樣?整個網(wǎng)絡(luò)的最終輸出也仍然是將輸入數(shù)據(jù)通過一些線性函數(shù)計算過一遍,只是用一些在網(wǎng)絡(luò)中收集的不同權(quán)值調(diào)整了一下。換名話說,再多線性函數(shù)的組合還是線性函數(shù)。如果我們限定只能使用線性激活函數(shù)的話,前饋神經(jīng)網(wǎng)絡(luò)其實比一個感知機強大不到哪里去,無論網(wǎng)絡(luò)有多少層。

      正是這個原因,大多數(shù)神經(jīng)網(wǎng)絡(luò)都是使用的非線性激活函數(shù),如對數(shù)函數(shù)、雙曲正切函數(shù)、階躍函數(shù)、整流函數(shù)等。不用這些非線性函數(shù)的神經(jīng)網(wǎng)絡(luò)只能學(xué)習(xí)輸入數(shù)據(jù)的線性組合。

    訓(xùn)練過程

    大多數(shù)常見的應(yīng)用在多層感知機的監(jiān)督式訓(xùn)練的算法都是反向傳播算法。基本的流程如下:

      1、將訓(xùn)練樣本通過神經(jīng)網(wǎng)絡(luò)進行前向傳播計算。

      2、計算輸出誤差,常用均方差:

    ? ? ? ? ?

       其中?t?是目標(biāo)值,?y?是實際的神經(jīng)網(wǎng)絡(luò)計算輸出。其它的誤差計算方法也可以,但MSE(均方差)通常是一種較好的選擇。

    ? ? ? ? ? ? ? ? ?

      3、網(wǎng)絡(luò)誤差通過 隨機梯度下降/梯度下降法 的方法來最小化。

      梯度下降很常用,但在神經(jīng)網(wǎng)絡(luò)中,輸入?yún)?shù)是一個訓(xùn)練誤差的曲線。每個權(quán)重的最佳值應(yīng)該是誤差曲線中的全局最小值(上圖中的?global minimum)。在訓(xùn)練過程中,權(quán)重以非常小的步幅改變(在每個樣本或每小組樣本訓(xùn)練完成后)以找到全局最小值,但這可不容易,訓(xùn)練通常會結(jié)束在局部最小值上(上圖中的local minima)。如例子中的,如果當(dāng)前權(quán)重值為0.6,那么要向0.4方向移動。

      這個圖表示的是最簡單的情況,誤差只依賴于單個參數(shù)。但是,網(wǎng)絡(luò)誤差依賴于每一個網(wǎng)絡(luò)權(quán)重,誤差函數(shù)非常、非常復(fù)雜。

      好消息是反向傳播算法提供了一種通過利用輸出誤差來修正兩個神經(jīng)元之間權(quán)重的方法。關(guān)系本身十分復(fù)雜,但對于一個給定結(jié)點的權(quán)重修正按如下方法(簡單):

          

      其中?E?是輸出誤差,?w_i?是輸入?i?的權(quán)重。

      實質(zhì)上這么做的目的是利用權(quán)重?i 來修正梯度的方向。關(guān)鍵的地方在于誤差的導(dǎo)數(shù)的使用,這可不一定好計算:你怎么樣能給一個大型網(wǎng)絡(luò)中隨機一個結(jié)點中的隨機一個權(quán)重求導(dǎo)數(shù)呢?

      答案是:通過反向傳播。誤差的首次計算很簡單(只要對預(yù)期值和實際值做差即可),然后通過一種巧妙的方法反向傳回網(wǎng)絡(luò),讓我們有效的在訓(xùn)練過程中修正權(quán)重并(期望)達到一個最小值。

    隱含層

      隱含層十分有趣。根據(jù)普適逼近原理,一個具有有限數(shù)目神經(jīng)元的隱含層可以被訓(xùn)練成可逼近任意隨機函數(shù)。換句話說,一層隱含層就強大到可以學(xué)習(xí)任何函數(shù)了。這說明我們在多隱含層(如深度網(wǎng)絡(luò))的實踐中可以得到更好的結(jié)果。

      隱含層存儲了訓(xùn)練數(shù)據(jù)的內(nèi)在抽象表示,和人類大腦(簡化的類比)保存有對真實世界的抽象一樣。接下來,我們將用各種方法來搞一下這個隱含層。

    一個網(wǎng)絡(luò)的例子

      可以看一下這個通過?testMLPSigmoidBP?方法用Java實現(xiàn)的簡單(4-2-3)前饋神經(jīng)網(wǎng)絡(luò),它將?IRIS?數(shù)據(jù)集進行了分類。這個數(shù)據(jù)集中包含了三類鳶尾屬植物,特征包括花萼長度,花瓣長度等等。每一類提供50個樣本給這個神經(jīng)網(wǎng)絡(luò)訓(xùn)練。特征被賦給輸入神經(jīng)元,每一個輸出神經(jīng)元代表一類數(shù)據(jù)集(“1/0/0” 表示這個植物是Setosa,“0/1/0”表示?Versicolour,而“0/0/1”表示 Virginica)。分類的錯誤率是2/150(即每分類150個,錯2個)。

    大規(guī)模網(wǎng)絡(luò)中的難題

      神經(jīng)網(wǎng)絡(luò)中可以有多個隱含層:這樣,在更高的隱含層里可以對其之前的隱含層構(gòu)建新的抽象。而且像之前也提到的,這樣可以更好的學(xué)習(xí)大規(guī)模網(wǎng)絡(luò)。增加隱含層的層數(shù)通常會導(dǎo)致兩個問題:

        1、梯度消失:隨著我們添加越來越多的隱含層,反向傳播傳遞給較低層的信息會越來越少。實際上,由于信息向前反饋,不同層次間的梯度開始消失,對網(wǎng)絡(luò)中權(quán)重的影響也會變小。

        2、過度擬合:也許這是機器學(xué)習(xí)的核心難題。簡要來說,過度擬合指的是對訓(xùn)練數(shù)據(jù)有著過于好的識別效果,這時導(dǎo)至模型非常復(fù)雜。這樣的結(jié)果會導(dǎo)致對訓(xùn)練數(shù)據(jù)有非常好的識別較果,而對真實樣本的識別效果非常差。



    下面我們來看看一些深度學(xué)習(xí)的算法是如何面對這些難題的。

    三. 自編碼器--逐層哈希

      大多數(shù)的機器學(xué)習(xí)入門課程都會讓你放棄前饋神經(jīng)網(wǎng)絡(luò)。但是實際上這里面大有可為——請接著看。

      自編碼器就是一個典型的前饋神經(jīng)網(wǎng)絡(luò),它的目標(biāo)就是學(xué)習(xí)一種對數(shù)據(jù)集的壓縮且分布式的表示方法(編碼思想)。

      

      從概念上講,神經(jīng)網(wǎng)絡(luò)的目的是要訓(xùn)練去“重新建立”輸入數(shù)據(jù),好像輸入和目標(biāo)輸出數(shù)據(jù)是一樣的。換句話說:你正在讓神經(jīng)網(wǎng)絡(luò)的輸出與輸入是同一樣?xùn)|西,只是經(jīng)過了壓縮(或者說是所謂的降維.....)。這還是不好理解,先來看一個例子。

    壓縮輸入數(shù)據(jù):灰度圖像

      這里有一個由28x28像素的灰度圖像組成的訓(xùn)練集,且每一個像素的值都作為一個輸入層神經(jīng)元的輸入(這時輸入層就會有784個神經(jīng)元)。輸出層神經(jīng)元要有相同的數(shù)目(784),且每一個輸出神經(jīng)元的輸出值和輸入圖像的對應(yīng)像素灰度值相同。

      在這樣的算法架構(gòu)背后,神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到的實際上并不是一個訓(xùn)練數(shù)據(jù)到標(biāo)記的“映射”,而是去學(xué)習(xí)數(shù)據(jù)本身的內(nèi)在結(jié)構(gòu)和特征(也正是因為這,隱含層也被稱作特征探測器(feature detector))。通常隱含層中的神經(jīng)元數(shù)目要比輸入/輸入層的少,這是為了使神經(jīng)網(wǎng)絡(luò)只去學(xué)習(xí)最重要的特征并實現(xiàn)特征的降維。

      我們想在中間層用很少的結(jié)點去在概念層上學(xué)習(xí)數(shù)據(jù)、產(chǎn)生一個緊致的表示方法。

    流行感冒例子

      為了更好的描述自編碼器,再看一個應(yīng)用。

      這次我們使用一個簡單的數(shù)據(jù)集,其中包括一些感冒的癥狀。如果感興趣,這個例子的源碼發(fā)布在這里。

      數(shù)據(jù)結(jié)構(gòu)如下:

      • 輸入數(shù)據(jù)一共六個二進制位
      • 前三位是病的證狀。例如,1 0 0 0 0 0?代表病人發(fā)燒;0 1 0 0 0 0?代表咳嗽;1 1 0 0 0 0?代表即咳嗽又發(fā)燒等等。
      • 后三位表示抵抗能力,如果一個病人有這個,代表他/她不太可能患此病。例如,0 0 0 1 0 0?代表病人接種過流感疫苗。一個可能的組合是:0 1 0 1 0 0?,這代表著一個接種過流感疫苗的咳嗽病人,等等。

      當(dāng)一個病人同時擁用前三位中的兩位時,我們認為他生病了;如果至少擁用后三位中的兩位,那么他是健康的,如:

      • 111000, 101000, 110000, 011000, 011100?= 生病
      • 000111, 001110, 000101, 000011, 000110?= 健康

      我們來訓(xùn)練一個自編碼器(使用反向傳播),六個輸入、六個輸出神經(jīng)元,而只有兩個隱含神經(jīng)元。

      在經(jīng)過幾百次迭代以后,我們發(fā)現(xiàn),每當(dāng)一個“生病”的樣本輸入時,兩個隱含層神經(jīng)元中的一個(對于生病的樣本總是這個)總是顯示出更高的激活值。而如果輸入一個“健康”樣本時,另一個隱含層則會顯示更高的激活值。



    再看學(xué)習(xí)

      本質(zhì)上來說,這兩個隱含神經(jīng)元從數(shù)據(jù)集中學(xué)習(xí)到了流感癥狀的一種緊致表示方法。為了檢驗它是不是真的實現(xiàn)了學(xué)習(xí),我們再看下過度擬合的問題。通過訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到的是一個緊致的簡單的,而不是一個高度復(fù)雜且對數(shù)據(jù)集過度擬合的表示方法。

      某種程度上來講,與其說在找一種簡單的表示方法,我們更是在嘗試從“感覺”上去學(xué)習(xí)數(shù)據(jù)。

    四. 受限波爾茲曼機

      下一步來看下受限波爾茲曼機(Restricted Boltzmann machines?RBM),一種可以在輸入數(shù)據(jù)集上學(xué)習(xí)概率分布的生成隨機神經(jīng)網(wǎng)絡(luò)。

      

      RBM由隱含層、可見層、偏置層組成。和前饋神經(jīng)網(wǎng)絡(luò)不同,可見層和隱含層之間的連接是無方向性(值可以從可見層->隱含層或隱含層->可見層任意傳輸)且全連接的(每一個當(dāng)前層的神經(jīng)元與下一層的每個神經(jīng)元都有連接——如果允許任意層的任意神經(jīng)元連接到任意層去,我們就得到了一個波爾茲曼機(非受限的))。

      標(biāo)準(zhǔn)的RBM中,隱含和可見層的神經(jīng)元都是二態(tài)的(即神經(jīng)元的激活值只能是服從伯努力分布的0或1),不過也存在其它非線性的變種。

      雖然學(xué)者們已經(jīng)研究RBM很長時間了,最近出現(xiàn)的對比差異無監(jiān)督訓(xùn)練算法使這個領(lǐng)域復(fù)興。


    對比差異

      單步對比差異算法原理:

      1、正向過程:

      • 輸入樣本?v?輸入至輸入層中。
      • v?通過一種與前饋網(wǎng)絡(luò)相似的方法傳播到隱含層中,隱含層的激活值為?h。

      2、反向過程:

      • 將?h?傳回可見層得到?v’?(可見層和隱含層的連接是無方向的,可以這樣傳)。
      • 再將?v’?傳到隱含層中,得到?h’。

      3、權(quán)重更新:

          

        ??????? 其中?a?是學(xué)習(xí)速率,?v,?v’,?h,?h’?和?w?都是向量。

      算法的思想就是在正向過程中影響了網(wǎng)絡(luò)的內(nèi)部對于真實數(shù)據(jù)的表示。同時,反向過程中嘗試通過這個被影響過的表示方法重建數(shù)據(jù)。主要目的是可以使生成的數(shù)據(jù)與原數(shù)據(jù)盡可能相似,這個差異影響了權(quán)重更新。

      換句話說,這樣的網(wǎng)絡(luò)具有了感知對輸入數(shù)據(jù)表示的程度的能力,而且嘗試通過這個感知能力重建數(shù)據(jù)。如果重建出來的數(shù)據(jù)與原數(shù)據(jù)差異很大,那么進行調(diào)整并再次重建。


    再看流行感冒的例子

      為了說明對比差異,我們使用與上例相同的流感癥狀的數(shù)據(jù)集。測試網(wǎng)絡(luò)是一個包含6個可見層神經(jīng)元、2個隱含層神經(jīng)元的RBM。我們用對比差異的方法對網(wǎng)絡(luò)進行訓(xùn)練,將癥狀?v?賦到可見層中。在測試中,這些癥狀值被重新傳到可見層;然后再被傳到隱含層。隱含層的神經(jīng)元表示健康/生病的狀態(tài),與自編碼器相似。

      在進行過幾百次迭代后,我們得到了與自編碼器相同的結(jié)果:輸入一個生病樣本,其中一個隱含層神經(jīng)元具有更高激活值;輸入健康的樣本,則另一個神經(jīng)元更興奮。

      例子的代碼在這里。

    深度網(wǎng)絡(luò)

      到現(xiàn)在為止,我們已經(jīng)學(xué)習(xí)了隱含層中強大的特征探測器——自編碼器和RBM,但現(xiàn)在還沒有辦法有效的去利用這些功能。實際上,上面所用到的這些數(shù)據(jù)集都是特定的。而我們要找到一些方法來間接的使用這些探測出的特征。

      好消息是,已經(jīng)發(fā)現(xiàn)這些結(jié)構(gòu)可以通過棧式疊加來實現(xiàn)深度網(wǎng)絡(luò)。這些網(wǎng)絡(luò)可以通過貪心法的思想訓(xùn)練,每次訓(xùn)練一層,以克服之前提到在反向傳播中梯度消失及過度擬合的問題。

      這樣的算法架構(gòu)十分強大,可以產(chǎn)生很好的結(jié)果。如Google著名的“貓”識別,在實驗中通過使用特定的深度自編碼器,在無標(biāo)記的圖片庫中學(xué)習(xí)到人和貓臉的識別。

      下面我們將更深入。

    棧式自編碼器

      和名字一樣,這種網(wǎng)絡(luò)由多個棧式結(jié)合的自編碼器組成。

      


      自編碼器的隱含層?t?會作為?t + 1?層的輸入層。第一個輸入層就是整個網(wǎng)絡(luò)的輸入層。利用貪心法訓(xùn)練每一層的步驟如下:

        1、通過反向傳播的方法利用所有數(shù)據(jù)對第一層的自編碼器進行訓(xùn)練(t=1,上圖中的紅色連接部分)。

        2、訓(xùn)練第二層的自編碼器?t=2?(綠色連接部分)。由于?t=2?的輸入層是?t=1?的隱含層,我們已經(jīng)不再關(guān)心?t=1?的輸入層,可以從整個網(wǎng)絡(luò)中移除。整個訓(xùn)練開始于將輸入樣本數(shù)據(jù)賦到?t=1?的輸入層,通過前向傳播至 t = 2 的輸出層。下面t = 2的權(quán)重(輸入->隱含和隱含->輸出)使用反向傳播的方法進行更新。t = 2的層和 t=1 的層一樣,都要通過所有樣本的訓(xùn)練。

        3、對所有層重復(fù)步驟1-2(即移除前面自編碼器的輸出層,用另一個自編碼器替代,再用反向傳播進行訓(xùn)練)。

        4、步驟1-3被稱為預(yù)訓(xùn)練,這將網(wǎng)絡(luò)里的權(quán)重值初始化至一個合適的位置。但是通過這個訓(xùn)練并沒有得到一個輸入數(shù)據(jù)到輸出標(biāo)記的映射。例如,一個網(wǎng)絡(luò)的目標(biāo)是被訓(xùn)練用來識別手寫數(shù)字,經(jīng)過這樣的訓(xùn)練后還不能將最后的特征探測器的輸出(即隱含層中最后的自編碼器)對應(yīng)到圖片的標(biāo)記上去。這樣,一個通常的辦法是在網(wǎng)絡(luò)的最后一層(即藍色連接部分)后面再加一個或多個全連接層。整個網(wǎng)絡(luò)可以被看作是一個多層的感知機,并使用反向傳播的方法進行訓(xùn)練(這步也被稱為微調(diào))。

      棧式自編碼器,提供了一種有效的預(yù)訓(xùn)練方法來初始化網(wǎng)絡(luò)的權(quán)重,這樣你得到了一個可以用來訓(xùn)練的復(fù)雜、多層的感知機。


    DBN與RBM

    ???? 全部用RBM形成的深層模型為深度玻爾茲曼機(Deep?Boltzmann?Machine,DBM)。如果將靠近輸入層的部分替換為貝葉斯信念網(wǎng)絡(luò),即有向圖模型而在遠離輸入層的部分仍然使用RBM,則稱為深度信念網(wǎng)絡(luò)?Deep?Belief?Networks,DBN)。

    插入:

    RBM-受限波爾茲曼機

    ? ?? 假設(shè)有一個二部圖,每一層的節(jié)點之間沒有鏈接,一層是可視層,即輸入數(shù)據(jù)層(v),一層是隱藏層(h),如果假設(shè)所有的節(jié)點都是隨機二值變量節(jié)點(只能取0或者1值),同時假設(shè)全概率分布p(v,h)滿足Boltzmann 分布,我們稱這個模型是Restricted BoltzmannMachine (RBM)。

    ???????

    ? ?? 下面我們來看看為什么它是Deep Learning方法。首先,這個模型因為是二部圖,所以在已知v的情況下,所有的隱藏節(jié)點之間是條件獨立的(因為節(jié)點之間不存在連接),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隱藏層h的情況下,所有的可視節(jié)點都是條件獨立的。同時又由于所有的v和h滿足Boltzmann 分布,因此,當(dāng)輸入v的時候,通過p(h|v) 可以得到隱藏層h,而得到隱藏層h之后,通過p(v|h)又能得到可視層,通過調(diào)整參數(shù),我們就是要使得從隱藏層得到的可視層v1與原來的可視層v如果一樣,那么得到的隱藏層就是可視層另外一種表達,因此隱藏層可以作為可視層輸入數(shù)據(jù)的特征,所以它就是一種Deep Learning方法。

    ??????

    ? ?? 如何訓(xùn)練呢?也就是可視層節(jié)點和隱節(jié)點間的權(quán)值怎么確定呢?我們需要做一些數(shù)學(xué)分析。也就是模型了。

    ???????


    能量最小化

    ? ? ? ? 聯(lián)合組態(tài)(jointconfiguration)的能量可以表示為:

    ???????

    ? ? ? ? 而某個組態(tài)的聯(lián)合概率分布可以通過Boltzmann 分布(和這個組態(tài)的能量)來確定:

    ??????

    ? ? ? 因為隱藏節(jié)點之間是條件獨立的(因為節(jié)點之間不存在連接),即:

    ???????

    ? ? ? 然后我們可以比較容易(對上式進行因子分解Factorizes)得到在給定可視層v的基礎(chǔ)上,隱層第j個節(jié)點為1或者為0的概率:

    ?????

    ? ? ? ?同理,在給定隱層h的基礎(chǔ)上,可視層第i個節(jié)點為1或者為0的概率也可以容易得到:

    ??????

    ? ? ? ?給定一個滿足獨立同分布的樣本集:D={v(1), v(2),…, v(N)},我們需要學(xué)習(xí)參數(shù)θ={W,a,b}。

    ? ? ? ?我們最大化以下對數(shù)似然函數(shù)(最大似然估計:對于某個概率模型,我們需要選擇一個參數(shù),讓我們當(dāng)前的觀測樣本的概率最大):

    ?????

    ? ? ? ? 也就是對最大對數(shù)似然函數(shù)求導(dǎo),就可以得到L最大時對應(yīng)的參數(shù)W了。

    ??????

    ? ? ? ?如果,我們把隱藏層的層數(shù)增加,我們可以得到Deep Boltzmann Machine(DBM);如果我們在靠近可視層的部分使用貝葉斯信念網(wǎng)絡(luò)(即有向圖模型,當(dāng)然這里依然限制層中節(jié)點之間沒有鏈接),而在最遠離可視層的部分使用Restricted Boltzmann Machine,我們可以得到DeepBelief Net(DBN)。


    ????????????????????????


    訓(xùn)練過程和代碼:

    ?????? 對于二者都使用同一個算法來訓(xùn)練,看起來毫無區(qū)別,但是DBM有一個優(yōu)勢,由于RBM是無向的,這就決定了無論給定可視節(jié)點還是隱藏節(jié)點,各個節(jié)點都是獨立的,可由圖模型的馬爾科夫性看出。

    ?????? 作為無向圖的DBM天生具有一些優(yōu)秀的基因,比如當(dāng)人看到一個外觀性質(zhì),知道它是什么物體,同樣你告訴他物體名字,他可以知道物體的外觀應(yīng)該是什么樣子。這種互相推理的關(guān)系正好可以用無向圖來表示。這種優(yōu)勢也順理成章的延伸出了autoencoder(大家所謂的自編碼神經(jīng)網(wǎng)絡(luò))和棧式神經(jīng)網(wǎng)絡(luò),最終輸出的少量節(jié)點是可以推理(重建)出原來樣本,也起到了降維的作用,無形中也找到了特征(編碼),autoencoder的效果如圖二所示。但是DBN中有些層是有向的,就不具有這種優(yōu)勢。



    ? ? ?? 二者逐層預(yù)訓(xùn)練后,結(jié)合樣本標(biāo)簽,使用BP算法進行權(quán)重微調(diào),說白了就是在預(yù)訓(xùn)練后的權(quán)重基礎(chǔ)上使用BP算法進行訓(xùn),這樣得出的權(quán)重更好些。。。

    下面貼出部分DBN代碼,大家可以看出總體思路是按照構(gòu)建DBN網(wǎng)絡(luò)(剛構(gòu)建后的每層的權(quán)重是隨機生成的,從代碼也能看出),貪心層層預(yù)訓(xùn)練,權(quán)重微調(diào),預(yù)測(識別)這個步驟來的。

    ????? 另外代碼中softmax其實是多變量的邏輯回歸函數(shù)注意我發(fā)的下面的代碼中權(quán)重微調(diào)使用的是邏輯回歸,不是BP

    ????? 多維邏輯回歸使用的優(yōu)化方法依然是最小二乘,二不是BP.

    #include <iostream> #include <math.h> #include "HiddenLayer.h" #include "RBM.h" #include "LogisticRegression.h" #include "DBN.h" #include "FirstRBM.h"using namespace std; double uniform(double min, double max) { return rand() / (RAND_MAX 1.0) * (max - min) min; } int binomial(int n, double p) { if(p < 0 || p > 1) return 0; int c = 0; double r; for(int i=0; i<n; i ) { r = rand() / (RAND_MAX 1.0); if (r < p) c ; } return c; } double sigmoid(double x) { return 1.0 / (1.0 exp(-x)); } // DBN DBN::DBN(int size, int n_i, int *hls, int n_o, int n_l) { int input_size; N = size; n_ins = n_i; hidden_layer_sizes = hls; n_outs = n_o; n_layers = n_l; sigmoid_layers = new HiddenLayer*[n_layers]; rbm_layers = new RBM*[n_layers]; // construct multi-layer for(int i=0; i<n_layers; i ) { if(i == 0) { input_size = n_ins; } else { input_size = hidden_layer_sizes[i-1]; } // construct sigmoid_layer sigmoid_layers[i] = new HiddenLayer(N, input_size, hidden_layer_sizes[i], NULL, NULL); // construct rbm_layer rbm_layers[i] = new RBM(N, input_size, hidden_layer_sizes[i],\ sigmoid_layers[i]->W, sigmoid_layers[i]->b, NULL); } // layer for output using LogisticRegression log_layer = new LogisticRegression(N, hidden_layer_sizes[n_layers-1], n_outs); } DBN::~DBN() { delete log_layer; for(int i=0; i<n_layers; i ) { delete sigmoid_layers[i]; delete rbm_layers[i]; } delete[] sigmoid_layers; delete[] rbm_layers; } void DBN::pretrain(int *input, double lr, int k, int epochs) { int *layer_input; int prev_layer_input_size; int *prev_layer_input; int *train_X = new int[n_ins]; for(int i=0; i<n_layers; i ) { // layer-wise for(int epoch=0; epoch<epochs; epoch ) { // training epochs for(int n=0; n<N; n ) { // input x1...xN // initial input for(int m=0; m<n_ins; m ) train_X[m] = input[n * n_ins m]; // layer input for(int l=0; l<=i; l ) { if(l == 0) { layer_input = new int[n_ins]; for(int j=0; j<n_ins; j ) layer_input[j] = train_X[j]; } else { if(l == 1) prev_layer_input_size = n_ins; else prev_layer_input_size = hidden_layer_sizes[l-2]; prev_layer_input = new int[prev_layer_input_size]; for(int j=0; j<prev_layer_input_size; j ) prev_layer_input[j] = layer_input[j]; delete[] layer_input; layer_input = new int[hidden_layer_sizes[l-1]]; sigmoid_layers[l-1]->sample_h_given_v(prev_layer_input, layer_input); delete[] prev_layer_input; } } rbm_layers[i]->contrastive_divergence(layer_input, lr, k); } } } delete[] train_X; delete[] layer_input; } void DBN::finetune(int *input, int *label, double lr, int epochs) { int *layer_input; // int prev_layer_input_size; int *prev_layer_input; int *train_X = new int[n_ins]; int *train_Y = new int[n_outs]; for(int epoch=0; epoch<epochs; epoch ) { for(int n=0; n<N; n ) { // input x1...xN // initial input for(int m=0; m<n_ins; m ) train_X[m] = input[n * n_ins m]; for(int m=0; m<n_outs; m ) train_Y[m] = label[n * n_outs m]; // layer input for(int i=0; i<n_layers; i ) { if(i == 0) { prev_layer_input = new int[n_ins]; for(int j=0; j<n_ins; j ) prev_layer_input[j] = train_X[j]; } else { prev_layer_input = new int[hidden_layer_sizes[i-1]]; for(int j=0; j<hidden_layer_sizes[i-1]; j ) prev_layer_input[j] = layer_input[j]; delete[] layer_input; } layer_input = new int[hidden_layer_sizes[i]]; sigmoid_layers[i]->sample_h_given_v(prev_layer_input, layer_input); delete[] prev_layer_input; } log_layer->train(layer_input, train_Y, lr); } // lr *= 0.95; } delete[] layer_input; delete[] train_X; delete[] train_Y; } void DBN::predict(int *x, double *y) { double *layer_input; // int prev_layer_input_size; double *prev_layer_input; double linear_output; prev_layer_input = new double[n_ins]; for(int j=0; j<n_ins; j ) prev_layer_input[j] = x[j]; // layer activation for(int i=0; i<n_layers; i ) { layer_input = new double[sigmoid_layers[i]->n_out]; for(int k=0; k<sigmoid_layers[i]->n_out; k ) { // linear_output = 0.0; //原代碼中刪除此句 for(int j=0; j<sigmoid_layers[i]->n_in; j ) { linear_output = 0.0; //原代碼中添加此句 linear_output = sigmoid_layers[i]->W[k][j] * prev_layer_input[j]; } linear_output = sigmoid_layers[i]->b[k]; layer_input[k] = sigmoid(linear_output); } delete[] prev_layer_input; if(i < n_layers-1) { prev_layer_input = new double[sigmoid_layers[i]->n_out]; for(int j=0; j<sigmoid_layers[i]->n_out; j ) prev_layer_input[j] = layer_input[j]; delete[] layer_input; } } for(int i=0; i<log_layer->n_out; i ) { y[i] = 0; for(int j=0; j<log_layer->n_in; j ) { y[i] = log_layer->W[i][j] * layer_input[j]; } y[i] = log_layer->b[i]; } log_layer->softmax(y); delete[] layer_input; } // HiddenLayer HiddenLayer::HiddenLayer(int size, int in, int out, double **w, double *bp) { N = size; n_in = in; n_out = out; if(w == NULL) { W = new double*[n_out]; for(int i=0; i<n_out; i ) W[i] = new double[n_in]; double a = 1.0 / n_in; for(int i=0; i<n_out; i ) { for(int j=0; j<n_in; j ) { W[i][j] = uniform(-a, a); } } } else { W = w; } if(bp == NULL) { b = new double[n_out]; } else { b = bp; } } HiddenLayer::~HiddenLayer() { for(int i=0; i<n_out; i ) delete W[i]; delete[] W; delete[] b; } double HiddenLayer::output(int *input, double *w, double b) { double linear_output = 0.0; for(int j=0; j<n_in; j ) { linear_output = w[j] * input[j]; } linear_output = b; return sigmoid(linear_output); } void HiddenLayer::sample_h_given_v(int *input, int *sample) { for(int i=0; i<n_out; i ) { sample[i] = binomial(1, output(input, W[i], b[i])); } } // RBM RBM::RBM(){} RBM::RBM(int size, int n_v, int n_h, double **w, double *hb, double *vb) { N = size; n_visible = n_v; n_hidden = n_h; if(w == NULL) { W = new double*[n_hidden]; for(int i=0; i<n_hidden; i ) W[i] = new double[n_visible]; double a = 1.0 / n_visible; for(int i=0; i<n_hidden; i ) { for(int j=0; j<n_visible; j ) { W[i][j] = uniform(-a, a); } } } else { W = w; } if(hb == NULL) { hbias = new double[n_hidden]; for(int i=0; i<n_hidden; i ) hbias[i] = 0; } else { hbias = hb; } if(vb == NULL) { vbias = new double[n_visible]; for(int i=0; i<n_visible; i ) vbias[i] = 0; } else { vbias = vb; } } RBM::~RBM() { // for(int i=0; i<n_hidden; i ) delete[] W[i]; // delete[] W; // delete[] hbias; delete[] vbias; } void RBM::contrastive_divergence(int *input, double lr, int k) { double *ph_mean = new double[n_hidden]; int *ph_sample = new int[n_hidden]; double *nv_means = new double[n_visible]; int *nv_samples = new int[n_visible]; double *nh_means = new double[n_hidden]; int *nh_samples = new int[n_hidden]; /* CD-k */ sample_h_given_v(input, ph_mean, ph_sample); for(int step=0; step<k; step ) { if(step == 0) { gibbs_hvh(ph_sample, nv_means, nv_samples, nh_means, nh_samples); } else { gibbs_hvh(nh_samples, nv_means, nv_samples, nh_means, nh_samples); } } for(int i=0; i<n_hidden; i ) { for(int j=0; j<n_visible; j ) { W[i][j] = lr * (ph_sample[i] * input[j] - nh_means[i] * nv_samples[j]) / N; } hbias[i] = lr * (ph_sample[i] - nh_means[i]) / N; } for(int i=0; i<n_visible; i ) { vbias[i] = lr * (input[i] - nv_samples[i]) / N; } delete[] ph_mean; delete[] ph_sample; delete[] nv_means; delete[] nv_samples; delete[] nh_means; delete[] nh_samples; } void RBM::sample_h_given_v(int *v0_sample, double *mean, int *sample) { for(int i=0; i<n_hidden; i ) { mean[i] = propup(v0_sample, W[i], hbias[i]); sample[i] = binomial(1, mean[i]); } } void RBM::sample_v_given_h(int *h0_sample, double *mean, int *sample) { for(int i=0; i<n_visible; i ) { mean[i] = propdown(h0_sample, i, vbias[i]); sample[i] = binomial(1, mean[i]); } } double RBM::propup(int *v, double *w, double b) { double pre_sigmoid_activation = 0.0; for(int j=0; j<n_visible; j ) { pre_sigmoid_activation = w[j] * v[j]; } pre_sigmoid_activation = b; return sigmoid(pre_sigmoid_activation); } double RBM::propdown(int *h, int i, double b) { double pre_sigmoid_activation = 0.0; for(int j=0; j<n_hidden; j ) { pre_sigmoid_activation = W[j][i] * h[j]; } pre_sigmoid_activation = b; return sigmoid(pre_sigmoid_activation); } void RBM::gibbs_hvh(int *h0_sample, double *nv_means, int *nv_samples,double *nh_means, int *nh_samples) { sample_v_given_h(h0_sample, nv_means, nv_samples); sample_h_given_v(nv_samples, nh_means, nh_samples); } void RBM::reconstruct(int *v, double *reconstructed_v) { double *h = new double[n_hidden]; double pre_sigmoid_activation; for(int i=0; i<n_hidden; i ) { h[i] = propup(v, W[i], hbias[i]); } for(int i=0; i<n_visible; i ) { pre_sigmoid_activation = 0.0; for(int j=0; j<n_hidden; j ) { pre_sigmoid_activation = W[j][i] * h[j]; } pre_sigmoid_activation = vbias[i]; reconstructed_v[i] = sigmoid(pre_sigmoid_activation); } delete[] h; } // LogisticRegression LogisticRegression::LogisticRegression(int size, int in, int out) { N = size; n_in = in; n_out = out; W = new double*[n_out]; for(int i=0; i<n_out; i ) W[i] = new double[n_in]; b = new double[n_out]; for(int i=0; i<n_out; i ) { for(int j=0; j<n_in; j ) { W[i][j] = 0; } b[i] = 0; } } LogisticRegression::~LogisticRegression() { for(int i=0; i<n_out; i ) delete[] W[i]; delete[] W; delete[] b; } void LogisticRegression::train(int *x, int *y, double lr) { double *p_y_given_x = new double[n_out]; double *dy = new double[n_out]; for(int i=0; i<n_out; i ) { p_y_given_x[i] = 0; for(int j=0; j<n_in; j ) { p_y_given_x[i] = W[i][j] * x[j]; } p_y_given_x[i] = b[i]; } softmax(p_y_given_x); for(int i=0; i<n_out; i ) { dy[i] = y[i] - p_y_given_x[i]; for(int j=0; j<n_in; j ) { W[i][j] = lr * dy[i] * x[j] / N; } b[i] = lr * dy[i] / N; } delete[] p_y_given_x; delete[] dy; } void LogisticRegression::softmax(double *x) { double max = 0.0; double sum = 0.0; for(int i=0; i<n_out; i ) if(max < x[i]) max = x[i]; for(int i=0; i<n_out; i ) { x[i] = exp(x[i] - max); sum = x[i]; } for(int i=0; i<n_out; i ) x[i] /= sum; } void LogisticRegression::predict(int *x, double *y) { for(int i=0; i<n_out; i ) { y[i] = 0; for(int j=0; j<n_in; j ) { y[i] = W[i][j] * x[j]; } y[i] = b[i]; } softmax(y); } void test_dbn() { srand(0); double pretrain_lr = 0.1; int pretraining_epochs = 1000; int k = 1; double finetune_lr = 0.1; int finetune_epochs = 500; int train_N = 6; int test_N = 3; int n_ins = 6; int n_outs = 2; int hidden_layer_sizes[] = {3, 3}; int n_layers = sizeof(hidden_layer_sizes) / sizeof(hidden_layer_sizes[0]); // training data int train_X[6][6] = { {1, 1, 1, 0, 0, 0}, {1, 0, 1, 0, 0, 0}, {1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 0}, {0, 0, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0} }; int train_Y[6][2] = { {1, 0}, {1, 0}, {1, 0}, {0, 1}, {0, 1}, {0, 1} }; // construct DBN DBN dbn(train_N, n_ins, hidden_layer_sizes, n_outs, n_layers); // pretrain dbn.pretrain(*train_X, pretrain_lr, k, pretraining_epochs); // finetune dbn.finetune(*train_X, *train_Y, finetune_lr, finetune_epochs); // test data int test_X[3][6] = { {1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0}, {1, 1, 1, 1, 1, 0} }; double test_Y[3][2]; // test for(int i=0; i<test_N; i ) { dbn.predict(test_X[i], test_Y[i]); for(int j=0; j<n_outs; j ) { cout << test_Y[i][j] << " "; } cout << endl; } } int main() { test_dbn(); return 0; }

    程序輸出:

    <pre></pre> <p>程序運行結(jié)果,是個二維的回歸值:</p> <p>0.493724 0.5062760.493724 0.5062760.493724 0.506276</p>

    深度念網(wǎng)絡(luò)

      和自編碼器一樣,我也可以將波爾茲曼機進行棧式疊加來構(gòu)建深度信度網(wǎng)絡(luò)(DBN)。

          

      

      在本例中,隱含層?RBM?t?可以看作是?RBM?t+1?的可見層。第一個RBM的輸入層即是整個網(wǎng)絡(luò)的輸入層,層間貪心式的預(yù)訓(xùn)練的工作模式如下:

        1. 通過對比差異法對所有訓(xùn)練樣本訓(xùn)練第一個RBM?t=1?

        2. 訓(xùn)練第二個RBM?t=1。由于?t=2?的可見層是?t=1?的隱含層,訓(xùn)練開始于將數(shù)據(jù)賦至?t=1?的可見層,通過前向傳播的方法傳至?t=1?的隱含層。然后作為?t=2?的對比差異訓(xùn)練的初始數(shù)據(jù)。

        3. 對所有層重復(fù)前面的過程。

        4. 和棧式自編碼器一樣,通過預(yù)訓(xùn)練后,網(wǎng)絡(luò)可以通過連接到一個或多個層間全連接的?RBM 隱含層進行擴展。這構(gòu)成了一個可以通過反向傳僠進行微調(diào)的多層感知機。

      本過程和棧式自編碼器很相似,只是用RBM將自編碼器進行替換,并用對比差異算法將反向傳播進行替換。

      (注: 例中的源碼可以從?此處獲得.)


    五. Deep Belief Networks-深度信念網(wǎng)絡(luò)

    ? ? ? DBNs是一個概率生成模型,與傳統(tǒng)的判別模型的神經(jīng)網(wǎng)絡(luò)相對,生成模型是建立一個觀察數(shù)據(jù)和標(biāo)簽之間的聯(lián)合分布,對P(Observation|Label)和 P(Label|Observation)都做了評估,而判別模型僅僅而已評估了后者,也就是P(Label|Observation)。對于在深度神經(jīng)網(wǎng)絡(luò)應(yīng)用傳統(tǒng)的BP算法的時候,DBNs遇到了以下問題:

    (1)需要為訓(xùn)練提供一個有標(biāo)簽的樣本集;

    (2)學(xué)習(xí)過程較慢;

    (3)不適當(dāng)?shù)膮?shù)選擇會導(dǎo)致學(xué)習(xí)收斂于局部最優(yōu)解。

    ??????

    ? ? ? ?DBNs由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經(jīng)網(wǎng)絡(luò)類型如圖三所示。這些網(wǎng)絡(luò)被“限制”為一個可視層和一個隱層,層間存在連接,但層內(nèi)的單元間不存在連接。隱層單元被訓(xùn)練去捕捉在可視層表現(xiàn)出來的高階數(shù)據(jù)的相關(guān)性。


    訓(xùn)練過程

    ? ? ? ?首先,先不考慮最頂構(gòu)成一個聯(lián)想記憶(associative memory)的兩層,一個DBN的連接是通過自頂向下的生成權(quán)值來指導(dǎo)確定的,RBMs就像一個建筑塊一樣,相比傳統(tǒng)和深度分層的sigmoid信念網(wǎng)絡(luò),它能易于連接權(quán)值的學(xué)習(xí)。

    ? ? ? ?最開始的時候,通過一個非監(jiān)督貪婪逐層方法去預(yù)訓(xùn)練獲得生成模型的權(quán)值,非監(jiān)督貪婪逐層方法被Hinton證明是有效的,并被其稱為對比分歧(contrastive divergence)。

    ? ? ? ?在這個訓(xùn)練階段,在可視層會產(chǎn)生一個向量v,通過它將值傳遞到隱層。反過來,可視層的輸入會被隨機的選擇,以嘗試去重構(gòu)原始的輸入信號。最后,這些新的可視的神經(jīng)元激活單元將前向傳遞重構(gòu)隱層激活單元,獲得 h(在訓(xùn)練過程中,首先將 可視向量值 映射給隱單元;然后 可視單元 由隱層單元重建; 這些新可視單元 再次映射給隱單元,這樣就 獲取新的隱單元。執(zhí)行這種反復(fù)步驟叫做吉布斯采樣)。這些后退和前進的步驟就是我們熟悉的Gibbs采樣,而隱層激活單元和可視層輸入之間的相關(guān)性差別就作為權(quán)值更新的主要依據(jù)。

    ? ? ? ?訓(xùn)練時間會顯著的減少,因為只需要單個步驟就可以接近最大似然學(xué)習(xí)。增加進網(wǎng)絡(luò)的每一層都會改進訓(xùn)練數(shù)據(jù)的對數(shù)概率,我們可以理解為越來越接近能量的真實表達。這個有意義的拓展,和無標(biāo)簽數(shù)據(jù)的使用,是任何一個深度學(xué)習(xí)應(yīng)用的決定性的因素。

    ?????

    ? ?? 在最高兩層,權(quán)值被連接到一起,這樣更低層的輸出將會提供一個參考的線索或者關(guān)聯(lián)給頂層,這樣頂層就會將其聯(lián)系到它的記憶內(nèi)容。而我們最關(guān)心的,最后想得到的就是判別性能,例如分類任務(wù)里面。

    ? ? ? ?在預(yù)訓(xùn)練后,DBN可以通過利用帶標(biāo)簽數(shù)據(jù)用BP算法去對判別性能做調(diào)整。在這里,一個標(biāo)簽集將被附加到頂層(推廣聯(lián)想記憶),通過一個自下向上的,學(xué)習(xí)到的識別權(quán)值獲得一個網(wǎng)絡(luò)的分類面。這個性能會比單純的BP算法訓(xùn)練的網(wǎng)絡(luò)好。這可以很直觀的解釋,DBNs的BP算法只需要對權(quán)值參數(shù)空間進行一個局部的搜索,這相比前向神經(jīng)網(wǎng)絡(luò)來說,訓(xùn)練是要快的,而且收斂的時間也少。

    ? ? ? ?DBNs的靈活性使得它的拓展比較容易。一個拓展就是卷積DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs并沒有考慮到圖像的2維結(jié)構(gòu)信息,因為輸入是簡單的從一個圖像矩陣一維向量化的。而 CDBNs 就是考慮到了這個問題,它利用鄰域像素的空域關(guān)系,通過一個稱為卷積RBMs的模型區(qū)達到生成模型的變換不變性,而且可以容易得變換到高維圖像。DBNs并沒有明確地處理對觀察變量的時間聯(lián)系的學(xué)習(xí)上,雖然目前已經(jīng)有這方面的研究,例如堆疊時間RBMs,以此為推廣,有序列學(xué)習(xí)的dubbed temporal convolutionmachines,這種序列學(xué)習(xí)的應(yīng)用,給語音信號處理問題帶來了一個讓人激動的未來研究方向。

    ? ? ? ?目前,和DBNs有關(guān)的研究包括堆疊自動編碼器,它是通過用堆疊自動編碼器來替換傳統(tǒng)DBNs里面的RBMs。這就使得可以通過同樣的規(guī)則來訓(xùn)練產(chǎn)生深度多層神經(jīng)網(wǎng)絡(luò)架構(gòu),但它缺少層的參數(shù)化的嚴格要求。與DBNs不同,自動編碼器使用判別模型,這樣這個結(jié)構(gòu)就很難采樣輸入采樣空間,這就使得網(wǎng)絡(luò)更難捕捉它的內(nèi)部表達。但是,降噪自動編碼器卻能很好的避免這個問題,并且比傳統(tǒng)的DBNs更優(yōu)。它通過在訓(xùn)練過程添加隨機的污染并堆疊產(chǎn)生場泛化性能。訓(xùn)練單一的降噪自動編碼器的過程和RBMs訓(xùn)練生成模型的過程一樣。


    卷積神經(jīng)網(wǎng)絡(luò)(圖像識別)

       這個是本文最后一個軟件架構(gòu)——卷積網(wǎng)絡(luò),一類特殊的對圖像識別非常有效的前饋網(wǎng)絡(luò)。

     ??

      在我們深入看實際的卷積網(wǎng)絡(luò)之臆,我們先定義一個圖像濾波器,或者稱為一個賦有相關(guān)權(quán)重的方陣。一個濾波器可以應(yīng)用到整個圖片上,通常可以應(yīng)用多個濾波器。比如,你可以應(yīng)用四個6x6的濾波器在一張圖片上。然后,輸出中坐標(biāo)(1,1)的像素值就是輸入圖像左上角一個6x6區(qū)域的加權(quán)和,其它像素也是如此。

      有了上面的基礎(chǔ),我們來介紹定義出卷積網(wǎng)絡(luò)的屬性:

    • 卷積層??對輸入數(shù)據(jù)應(yīng)用若干濾波器。比如圖像的第一卷積層使用4個6x6濾波器。對圖像應(yīng)用一個濾波器之后的得到的結(jié)果被稱為特征圖譜(feature map, FM),特征圖譜的數(shù)目和濾波器的數(shù)目相等。如果前驅(qū)層也是一個卷積層,那么濾波器應(yīng)用在FM上,相當(dāng)于輸入一個FM,輸出另外一個FM。從直覺上來講,如果將一個權(quán)重分布到整個圖像上后,那么這個特征就和位置無關(guān)了,同時多個濾波器可以分別探測出不同的特征。
    • 下采樣層?縮減輸入數(shù)據(jù)的規(guī)模。例如輸入一個32x32的圖像,并且通過一個2x2的下采樣,那么可以得到一個16x16的輸出圖像,這意味著原圖像上的四個像素合并成為輸出圖像中的一個像素。實現(xiàn)下采樣的方法有很多種,最常見的是最大值合并、平均值合并以及隨機合并。
    • 最后一個下采樣層(或卷積層)通常連接到一個或多個全連層,全連層的輸出就是最終的輸出。
    • 訓(xùn)練過程通過改進的反向傳播實現(xiàn),將下采樣層作為考慮的因素并基于所有值來更新卷積濾波器的權(quán)重。

      可以在這看幾個應(yīng)用在?MNIST?數(shù)據(jù)集上的卷積網(wǎng)絡(luò)的例子,在這還有一個用JavaScript實現(xiàn)的一個可視的類似網(wǎng)絡(luò)。

    ............................................

    實現(xiàn)

      目前為止,我們已經(jīng)學(xué)會了常見神經(jīng)網(wǎng)絡(luò)中最主要的元素了,但是我只寫了很少的在實現(xiàn)過程中所遇到的挑戰(zhàn)。

      概括來講,我的目標(biāo)是實現(xiàn)一個深度學(xué)習(xí)的庫,即一個基于神經(jīng)網(wǎng)絡(luò)且滿足如下條件的框架:    

      • 一個可以表示多種模型的通用架構(gòu)(比如所有上文提到的神經(jīng)網(wǎng)絡(luò)中的元素)
      • 可以使用多種訓(xùn)練算法(反向傳播,對比差異等等)。
      • 體面的性能

      為了滿足這些要求,我在軟件的設(shè)計中使用了分層的思想。

    結(jié)構(gòu)

      我們從如下的基礎(chǔ)部分開始:

      • NeuralNetworkImpl?是所有神經(jīng)網(wǎng)絡(luò)模型實現(xiàn)的基類。
      • 每個網(wǎng)絡(luò)都包含有一個?layer?的集合。
      • 每一層中有一個?connections?的鏈表,?connection 指的是兩個層之間的連接,將整個網(wǎng)絡(luò)構(gòu)成一個有向無環(huán)圖。

      這個結(jié)構(gòu)對于經(jīng)典的反饋網(wǎng)絡(luò)、RBM?及更復(fù)雜的如?ImageNet?都已經(jīng)足夠靈活。

      這個結(jié)構(gòu)也允許一個 layer 成為多個網(wǎng)絡(luò)的元素。比如,在?Deep Belief Network(深度信度網(wǎng)絡(luò))中的layer也可以用在其?RBM 中。

      另外,通過這個架構(gòu)可以將DBN的預(yù)訓(xùn)練階段顯示為一個棧式RBM的列表,微調(diào)階段顯示為一個前饋網(wǎng)絡(luò),這些都非常直觀而且程序?qū)崿F(xiàn)的很好。

    數(shù)據(jù)流

    下個部分介紹網(wǎng)絡(luò)中的數(shù)據(jù)流,一個兩步過程:

  • 定義出層間的序列。例如,為了得到一個多層感知機的結(jié)果,輸入數(shù)據(jù)被賦到輸入層(因此,這也是首先被計算的層),然后再將數(shù)據(jù)通過不同的方法流向輸出層。為了在反向傳播中更新權(quán)重,輸出的誤差通過廣度優(yōu)先的方法從輸出層傳回每一層。這部分通過?LayerOrderStrategy?進行實現(xiàn),應(yīng)用到了網(wǎng)絡(luò)圖結(jié)構(gòu)的優(yōu)勢,使用了不同的圖遍歷方法。其中一些樣例包含了?廣度優(yōu)先策略?和?定位到一個指定的層。層的序列實際上由層間的連接進行決定,所以策略部分都是返回一個連接的有序列表。
  • 計算激活值。每一層都有一個關(guān)聯(lián)的?ConnectionCalculator,包含有連接的列表(從上一步得來)和輸入值(從其它層得到)并計算得到結(jié)果的激活值。例如,在一個簡單的S形前饋網(wǎng)絡(luò)中,隱含層的??ConnectionCalculator?接受輸入層和偏置層的值(分別為輸入值和一個值全為1的數(shù)組)和神經(jīng)元之間的權(quán)重值(如果是全連接層,權(quán)重值實際上以一個矩陣的形式存儲在一個?FullyConnected?結(jié)構(gòu)中,計算加權(quán)和,然后將結(jié)果傳給S函數(shù)。ConnectionCalculator?中實現(xiàn)了一些轉(zhuǎn)移函數(shù)(如加權(quán)求和、卷積)和激活函數(shù)(如對應(yīng)多層感知機的對數(shù)函數(shù)和雙曲正切函數(shù),對應(yīng)RBM的二態(tài)函數(shù))。其中的大部分都可以通過?Aparapi?在GPU上進行計算,可以利用迷你批次訓(xùn)練。
  • 通過?Aparapi 進行 GPU 計算

      像我之前提到的,神經(jīng)網(wǎng)絡(luò)在近些年復(fù)興的一個重要原因是其訓(xùn)練的方法可以高度并行化,允許我們通過GPGPU高效的加速訓(xùn)練。本文中,我選擇?Aparapi?庫來進行GPU的支持。

      Aparapi 在連接計算上強加了一些重要的限制:

    • 只允許使用原始數(shù)據(jù)類型的一維數(shù)組(變量)。
    • 在GPU上運行的程序只能調(diào)用 Aparapi?Kernel?類本身的成員函數(shù)。

      這樣,大部分的數(shù)據(jù)(權(quán)重、輸入和輸出數(shù)據(jù))都要保存在?Matrix?實例里面,其內(nèi)部是一個一維浮點數(shù)組。所有Aparapi 連接計算都是使用?AparapiWeightedSum?(應(yīng)用在全連接層和加權(quán)求和函數(shù)上)、?AparapiSubsampling2D?(應(yīng)用在下采樣層)或?AparapiConv2D?(應(yīng)用在卷積層)。這些限制可以通過?Heterogeneous System Architecture 里介紹的內(nèi)容解決一些。而且Aparapi 允許相同的代碼運行在CPU和GPU上。

    訓(xùn)練

      training?的模塊實現(xiàn)了多種訓(xùn)練算法。這個模塊依賴于上文提到的兩個模塊。比如,BackPropagationTrainer?(所有的訓(xùn)練算法都以?Trainer?為基類)在前饋階段使用前饋層計算,在誤差傳播和權(quán)重更新時使用特殊的廣度優(yōu)先層計算。

      我最新的工作是在Java8環(huán)境下開發(fā),其它一些更新的功能可以在這個branch?下獲得,這部分的工作很快會merge到主干上。

    結(jié)論

      本文的目標(biāo)是提供一個深度學(xué)習(xí)算法領(lǐng)域的一個簡明介紹,由最基本的組成元素開始(感知機)并逐漸深入到多種當(dāng)前流行且有效的架構(gòu)上,比如受限波爾茲曼機。

      神經(jīng)網(wǎng)絡(luò)的思想已經(jīng)出現(xiàn)了很長時間,但是今天,你如果身處機器學(xué)習(xí)領(lǐng)域而不知道深度學(xué)習(xí)或其它相關(guān)知識是不應(yīng)該的。不應(yīng)該過度宣傳,但不可否認隨著GPGPU提供的計算能力、包括Geoffrey Hinton, Yoshua Bengio, Yann LeCun and Andrew Ng在內(nèi)的研究學(xué)者們提出的高效算法,這個領(lǐng)域已經(jīng)表現(xiàn)出了很大的希望。現(xiàn)在正是最佳的時間深入這些方面的學(xué)習(xí)。

    附錄:相關(guān)資源

      如果你想更深入的學(xué)習(xí),下面的這些資源在我的工作當(dāng)中都起過重要的作用:

    • DeepLearning.net: 深度學(xué)習(xí)所有方面知識的一個門戶。里面有完善的手冊、軟件庫?和一個非常好的?閱讀列表。
    • 活躍的?Google+社區(qū).
    • 兩個很好的課程:?Machine Learning?and?Neural Networks for Machine Learning, 都在Coursera上。
    • The?Stanford neural networks tutorial,斯坦福神經(jīng)網(wǎng)絡(luò)指南。

    后記:

    ?????? 很期待作者的庫,在這里轉(zhuǎn)載一下,省的作者有一天刪除了........

    總結(jié)

    以上是生活随笔為你收集整理的ANN:神经网络堆叠/进化故事( 从感知机到DRBN )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩一区正在播放 | 日韩欧美一区二区三区在线 | 黄色片软件网站 | 国内精品久久久久影院日本资源 | 91在线影院 | 久久精品久久99精品久久 | 一区二区三区国产欧美 | 亚洲精品视频在线免费播放 | 天天色天天搞 | 亚洲va综合va国产va中文 | 免费a现在观看 | 久久久久福利视频 | 九九热在线播放 | 青青河边草免费视频 | 久久国产精品一区二区三区 | 欧美99热| 亚洲有 在线 | 日韩区视频 | 日韩av在线网站 | 亚洲 欧美变态 另类 综合 | 国产精品久久久网站 | 日韩羞羞| 中文字幕日韩一区二区三区不卡 | 黄网站app在线观看免费视频 | 天天曰天天干 | 久久国产精品二国产精品中国洋人 | 91精品久久久久久综合五月天 | www最近高清中文国语在线观看 | 亚洲一区欧美精品 | 中文字幕在线影视资源 | 色福利网站| 日韩欧美在线第一页 | 国产高清免费视频 | 色噜噜在线观看视频 | 狂野欧美激情性xxxx欧美 | 日本久久不卡视频 | 97香蕉久久超级碰碰高清版 | 一级淫片a | 欧美最猛性xxxxx亚洲精品 | 日本成人免费在线观看 | 中文一区在线 | 亚洲精品动漫成人3d无尽在线 | 黄在线免费观看 | 亚洲国产三级在线观看 | 免费看成人a| 国产91精品高清一区二区三区 | 国产精品乱码久久 | 国产福利精品视频 | 91大神在线看 | 亚洲成人黄色在线观看 | 欧美国产高清 | 日韩91av| 人人舔人人爱 | 黄色a大片 | bbb搡bbb爽爽爽| 日韩欧美视频 | 国产精品久久久电影 | 国产a级片免费观看 | 成人影片在线免费观看 | 国产精品va在线观看入 | 九九久久影视 | 国产午夜精品福利视频 | 国产福利精品在线观看 | 热久久这里只有精品 | 午夜av一区 | 免费视频资源 | 久久久久久久网 | 亚洲最新av| 色综合中文字幕 | 伊人婷婷激情 | 天天插天天狠天天透 | 91天天操 | 日本aaaa级毛片在线看 | 国产91精品一区二区麻豆亚洲 | 国产精品一区在线观看 | 国产精品久久久久久久久久三级 | 婷婷丁香狠狠爱 | 成人综合免费 | 综合网天天色 | 久久久电影 | 99 视频 高清 | 麻豆成人精品视频 | 久久亚洲区 | 在线观看完整版免费 | 在线中文字幕网站 | 成人aⅴ视频 | 日韩欧美国产成人 | 日韩av在线高清 | 黄a在线看 | aa一级片 | 国产一区二区三精品久久久无广告 | 日本三级久久 | 久久激情视频 久久 | 91视频国产免费 | 久草在线99 | 精品国产精品一区二区夜夜嗨 | 九九国产精品视频 | 久久成视频 | 久久精品中文 | 91久久一区二区 | 国产精品6999成人免费视频 | 在线高清一区 | 国产伦精品一区二区三区无广告 | 欧美亚洲免费在线一区 | 日韩精品一区二区三区电影 | 黄色网在线播放 | 国产午夜精品一区二区三区欧美 | 国产原厂视频在线观看 | 久久色中文字幕 | 亚洲精品在线观看视频 | 日本中文字幕免费观看 | 国产精品久久久久久久久久久久午夜片 | 免费在线国产精品 | 国产成a人亚洲精v品在线观看 | 精品专区| 在线免费观看不卡av | 婷婷激情影院 | 久久成人综合视频 | 顶级bbw搡bbbb搡bbbb | 日本在线观看一区二区 | 最近中文字幕视频完整版 | 日韩美女一级片 | 国产精品av免费 | 久久久久久久久久久国产精品 | 久久超级碰视频 | 国产麻豆果冻传媒在线观看 | 久草视频免费 | 91精选在线 | av亚洲产国偷v产偷v自拍小说 | 中文字幕婷婷 | 久久亚洲免费视频 | 91精品在线视频观看 | 午夜av免费 | 亚洲精品久久久久久久蜜桃 | 欧美中文字幕第一页 | 天天射天天射 | 91成人蝌蚪| 日韩免费成人 | 四虎成人精品永久免费av九九 | 成 人 黄 色视频免费播放 | 看片网站黄色 | 日韩精品黄 | 丁香激情综合 | 日日躁你夜夜躁你av蜜 | 99欧美| 国产精品中文字幕在线观看 | 天天操天天射天天插 | 天天艹日日干 | 天天在线视频色 | 看片一区二区三区 | 日韩免费一区二区在线观看 | 99视频在线观看一区三区 | 日韩电影中文字幕在线观看 | 日韩三级视频 | 视频精品一区二区三区 | 国产精品乱看 | 日日夜夜精品视频天天综合网 | 亚洲午夜激情网 | 国产精品乱码久久 | 亚洲一区在线看 | 精品美女久久久久 | 中文字幕在线观 | 欧美一区二区免费在线观看 | 国产乱对白刺激视频不卡 | 久热色超碰 | 亚洲一区二区三区在线看 | 国产亚洲精品久久久久久 | 国产123区在线观看 国产精品麻豆91 | 欧美精品资源 | 天天插日日操 | 欧美精品三级 | 探花视频免费在线观看 | 美国三级黄色大片 | 国产a网站 | 亚洲一区二区高潮无套美女 | 久久精品日本啪啪涩涩 | 国精产品一二三线999 | 麻豆首页 | 欧美日韩性视频 | 国产精品video爽爽爽爽 | 亚洲精品在线免费播放 | 伊人黄色网 | 亚洲欧美综合 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产免费av一区二区三区 | 久久午夜影视 | 久久久久久影视 | 国产一级在线免费观看 | 九月婷婷色 | 不卡av电影在线 | 国产在线999 | 国产精品一区二区吃奶在线观看 | 久草免费看 | 亚洲最新视频在线 | 国产精品久久久久国产精品日日 | 黄色三级视频片 | 国产精品一区二区久久精品爱微奶 | 国产日韩精品在线观看 | 波多野结衣精品视频 | 在线观看视频色 | 在线观看免费高清视频大全追剧 | 久久精品国产99国产 | 99精品免费久久久久久久久日本 | 欧美孕妇与黑人孕交 | 日本视频高清 | 久久久91精品国产一区二区精品 | 亚洲精品成人免费 | 国产精品视频观看 | 超碰在线中文字幕 | 日本精品视频在线 | 午夜精品久久久久久久久久久久 | 一本大道久久精品懂色aⅴ 五月婷社区 | 成人午夜av电影 | 中文字幕日韩一区二区三区不卡 | 免费精品视频在线观看 | 国产精品区二区三区日本 | 国产成人一区二区三区在线观看 | 97福利在线观看 | 国产人成免费视频 | 国产成人三级三级三级97 | av福利网址导航 | 99精品国产成人一区二区 | 亚洲视频综合在线 | 国产69精品久久久久9999apgf | 毛片永久免费 | 你操综合 | 国产精品久久久久亚洲影视 | 亚洲日本国产 | 久久人人艹| 婷婷中文字幕 | 婷婷午夜天 | 九九视频这里只有精品 | 伊人色**天天综合婷婷 | 国产成人精品综合久久久 | 免费亚洲黄色 | 私人av| 摸bbb搡bbb搡bbbb | 国产精品一区二区三区久久久 | 国内精品福利视频 | 日韩肉感妇bbwbbwbbw | 999国产在线 | 国产91成人在在线播放 | 亚洲欧美日韩国产 | 色无五月 | 亚洲码国产日韩欧美高潮在线播放 | 精品人人人 | 日韩资源在线播放 | 在线亚州 | 黄毛片在线观看 | 久久免费视频4 | 欧美日韩在线播放 | 午夜丁香网 | 精品久久一区 | 国产精品久久久久aaaa | 亚洲va韩国va欧美va精四季 | 青青河边草免费视频 | 国产免费久久 | 日本久久片 | 欧美analxxxx| 国产精品久久麻豆 | 911国产精品 | 亚洲天堂网在线播放 | 久艹视频在线免费观看 | 久精品视频在线 | 中文不卡视频 | 精品国产自| 欧美韩国日本在线观看 | 综合久久久久久久 | 国产艹b视频 | 欧美精品免费视频 | 三级免费黄| 射九九 | 国产精品乱码久久久 | 久久99偷拍视频 | 色视频国产直接看 | 永久av免费在线观看 | 国产成人精品女人久久久 | 少妇bbb| 国产成人精品亚洲日本在线观看 | 中文字幕亚洲不卡 | 五月天中文字幕 | 五月开心婷婷 | 亚洲成人av片 | 韩国精品福利一区二区三区 | 日韩精品最新在线观看 | 97超碰色偷偷 | 在线观看亚洲国产精品 | japanese黑人亚洲人4k | 日韩午夜高清 | 午夜av免费在线观看 | 国产黄色片一级三级 | 国产无套视频 | av视屏在线播放 | 国产精品一区二区av日韩在线 | 夜夜躁狠狠躁日日躁视频黑人 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 中文十次啦 | 亚洲精品福利在线观看 | 日韩在线视频免费播放 | 九九视频在线观看视频6 | 久久综合亚洲鲁鲁五月久久 | www.日本色 | 亚洲精品国产精品国自产在线 | 操操爽| 免费黄色看片 | 在线免费观看视频一区二区三区 | 久久久久久久久久国产精品 | 国产亲近乱来精品 | 国产精品69av| 草莓视频在线观看免费观看 | 久久久久亚洲精品成人网小说 | 久久激情久久 | 亚洲精品456在线播放乱码 | 日韩在线观看三区 | 黄色在线观看免费 | 在线日韩一区 | www.亚洲黄 | 免费午夜av | 九九热久久久 | 在线香蕉视频 | 婷婷六月天丁香 | 国产精品久久久久久久久久东京 | 亚洲伊人成综合网 | 久久久精品网站 | 日韩av播放在线 | 天天综合五月天 | 婷婷免费在线视频 | 一区二区三区四区不卡 | 正在播放亚洲精品 | 欧美爽爽爽 | 韩国在线一区 | 日韩色中色 | 久久人操 | 丁香九月婷婷 | 成人h动漫精品一区二 | 黄色aa久久| 午夜久久网站 | 天天操夜夜操夜夜操 | www久草 | 天天操夜操视频 | 国产视频欧美视频 | 婷婷综合激情 | 成人免费av电影 | 五月天久久婷 | 九色琪琪久久综合网天天 | 免费一级片在线观看 | 国产97av | 在线天堂日本 | 国产美女视频免费 | 蜜臀精品久久久久久蜜臀 | 超碰在线色 | 成人羞羞视频在线观看免费 | 91高清在线看 | 亚洲精品视频在线观看免费视频 | 日韩69视频| 狠狠伊人| 天天草夜夜 | 99精品国产99久久久久久福利 | 日韩欧美中文 | 国内精品久久久精品电影院 | 在线观看视频你懂得 | 国产一级高清视频 | 国外调教视频网站 | 伊人天堂av | 黄色在线观看免费网站 | 久久视频国产精品免费视频在线 | 丁香高清视频在线看看 | 欧美日韩一区二区三区不卡 | 免费特级黄毛片 | 久久精品在线免费观看 | 国产精品婷婷午夜在线观看 | 日韩精品一区在线播放 | 一级片视频在线 | 久久另类小说 | 天天激情在线 | 国产999精品久久久久久绿帽 | 久章草在线 | aaa日本高清在线播放免费观看 | 久久超碰99 | 中文字幕在线观看一区 | 欧美日韩视频在线播放 | 色综合久久久久久久久五月 | 五月婷婷香蕉 | 国产伦精品一区二区三区照片91 | 三级av免费看 | 中文视频一区二区 | 久久不卡国产精品一区二区 | 成人污视频在线观看 | 最近在线中文字幕 | 日本电影久久 | 激情图片qvod| 亚洲91精品在线观看 | 91探花国产综合在线精品 | 精品99久久久久久 | 91免费国产在线观看 | 日本一区二区三区免费观看 | 久久综合狠狠综合久久综合88 | www黄色大片 | 天天视频色版 | 国产精品视频 | 国产三级香港三韩国三级 | 一区二区三区四区不卡 | 午夜精品一区二区三区在线观看 | 色综合久久88色综合天天人守婷 | 亚洲视频,欧洲视频 | 亚洲精品国产精品国自 | 日韩高清在线观看 | 日韩一区视频在线 | 在线免费91 | 综合网成人| 成人精品久久久 | 91亚洲网站 | 91在线精品播放 | 一级久久精品 | 久久一区国产 | 午夜 久久 tv| 国产一二三在线视频 | 日韩视频一区二区 | 色欧美视频 | 国产视频在线播放 | 中文字幕人成乱码在线观看 | 国产免费久久 | 中国精品少妇 | 欧美日韩激情视频8区 | 另类老妇性bbwbbw高清 | 美女久久久久久久久久久 | 亚洲欧洲美洲av | 国产不卡av在线 | av观看免费在线 | 欧美日在线 | 色在线网 | 99精品黄色 | 亚洲日本va午夜在线电影 | 九九综合久久 | 色福利网 | 欧美午夜精品久久久久久浪潮 | 久久国产精品免费一区二区三区 | 毛片a级片 | 天天操夜| 久久久久亚洲最大xxxx | 久久精品精品电影网 | 激情五月网站 | 久久色在线观看 | 欧美一级高清片 | 香蕉视频在线免费看 | 天天干天天干天天射 | 狠狠色婷婷丁香六月 | 欧美专区国产专区 | 精品欧美乱码久久久久久 | 亚洲1区 在线 | 久久久久综合精品福利啪啪 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 天天色图 | 日日爽视频 | 亚洲激情网站免费观看 | 欧美国产91 | 天天操导航 | 成人a在线观看高清电影 | 男女日麻批 | 天堂av色婷婷一区二区三区 | 久久久久久影视 | 日韩一区二区久久 | 中文字幕高清免费日韩视频在线 | 免费在线观看黄网站 | 久久精品5 | 国产精品久久久一区二区三区网站 | 国产青春久久久国产毛片 | 日本黄色大片免费看 | 91av在线免费观看 | 激情视频一区二区 | 婷婷久久一区二区三区 | 午夜美女福利直播 | 91传媒91久久久 | 日韩中文字幕免费在线播放 | 四虎影院在线观看av | 成人欧美在线 | 日韩av看片 | 日韩 在线 | 一区二区三区在线免费观看 | 日韩伦理一区二区三区av在线 | 一区二区三区电影大全 | 久久九九久久精品 | 伊人精品在线 | 九七在线视频 | 日韩色在线观看 | 久久9999久久 | 中文字幕三区 | 日韩久久午夜一级啪啪 | 国产不卡一二三区 | 2020天天干夜夜爽 | 久久国产亚洲视频 | 玖玖爱国产在线 | 久久爱导航 | 黄色亚洲精品 | 亚洲综合色丁香婷婷六月图片 | 国内精品久久久久影院男同志 | 日韩午夜在线观看 | 91精品国产91久久久久久三级 | 久久久久久久久久久久久9999 | 国产精品少妇 | 激情五月开心 | 粉嫩av一区二区三区四区 | 久久久精品一区二区三区 | 黄色在线视频网址 | 国产高清久久久久 | 日韩在线视频不卡 | 国产黄色a| 精品美女在线视频 | 亚洲综合国产精品 | 97色婷婷人人爽人人 | 中文字幕在线观看网址 | 中文字幕国产 | 日韩一级黄色av | 久久精品免费播放 | 国产999视频 | 欧美日韩在线网站 | 国产高清中文字幕 | 亚洲精品视频免费观看 | 麻豆视频www | 国产成人精品国内自产拍免费看 | 九九热精品国产 | 伊人小视频 | 成人久久免费视频 | 91成人精品观看 | 色偷偷88欧美精品久久久 | 91av欧美 | 欧美日韩aa| 五月天久久久久 | 国产小视频在线观看免费 | 精品一区在线 | 97色国产 | 天天骚夜夜操 | 一级黄色片毛片 | 色综合天| av资源在线看 | 日韩中文字幕在线不卡 | 久久综合欧美 | 日免费视频 | 狠狠色丁香婷婷综合最新地址 | 亚洲视频 视频在线 | 日韩 精品 一区 国产 麻豆 | 欧美伦理一区二区 | 国产一卡二卡在线 | 亚洲国产午夜精品 | 久久在草| 国产做aⅴ在线视频播放 | 黄色小说在线观看视频 | 天天干.com | 久草在线国产 | 99久久精品国产欧美主题曲 | 久久人人爽爽人人爽人人片av | 热re99久久精品国产66热 | 一本—道久久a久久精品蜜桃 | 精品亚洲一区二区三区 | 免费人成网 | 色综合天天狠天天透天天伊人 | 超碰免费成人 | 久久人人精 | 国产韩国日本高清视频 | 99热这里有| 国产理论在线 | av中文字幕日韩 | av黄色免费看 | 99热这里有 | 亚洲精品在线观看免费 | 一区二区av| 日韩电影在线观看一区二区三区 | 免费一级日韩欧美性大片 | 日韩精品第1页 | 免费看色视频 | 国产又粗又硬又爽视频 | 亚洲免费精品视频 | 西西www4444大胆在线 | 最近中文字幕mv | 天天干天天操天天操 | 免费在线一区二区 | 国产精彩视频一区 | 在线免费观看国产精品 | 色网站黄 | 色婷婷综合五月 | a黄色影院 | 国产免费久久av | 日韩av不卡在线播放 | 视频成人| 天天av天天 | 丁香午夜 | 在线蜜桃视频 | 在线观看免费 | 国产电影黄色av | 成人av一区二区三区 | 黄色在线免费观看网站 | 叶爱av在线 | 欧美色图亚洲图片 | 国产麻豆果冻传媒在线观看 | 麻豆果冻剧传媒在线播放 | 五月婷香| 中文字幕中文 | 色婷丁香 | 麻豆传媒在线视频 | 久草在线在线精品观看 | 高清视频一区二区三区 | 麻花豆传媒一二三产区 | 人人添人人澡 | 日韩无在线 | 久久精品中文 | 日本精品xxxx| 天堂av中文字幕 | 欧美日韩a视频 | 97夜夜澡人人双人人人喊 | 国产黄影院色大全免费 | 天天爱天天操天天射 | 97在线观看免费观看 | 丁香激情网 | 久久精品国产免费看久久精品 | 国产99久 | 麻豆91视频 | 在线免费av播放 | 国产在线播放不卡 | 亚洲精品高清在线 | 在线视频欧美日韩 | 色婷久久 | 天天做日日爱夜夜爽 | 超碰在线免费97 | 日韩在线电影观看 | www天天操 | 在线观看aaa | 高清一区二区三区av | 美女网站久久 | 国产精品一区在线 | 欧美日bb | 天天天天射 | 国产大尺度视频 | 欧美日韩亚洲在线观看 | 婷婷亚洲五月 | 中文字幕免费 | av网址在线播放 | 亚色视频在线观看 | 91视频88av| 色爱成人网 | 亚洲天天摸日日摸天天欢 | 亚洲欧美日韩在线看 | 国产精品毛片一区 | 蜜臀av性久久久久av蜜臀三区 | 97在线观看视频免费 | 91在线看免费 | 五月综合 | 亚洲激情国产精品 | 日韩最新中文字幕 | 毛片视频电影 | 最近中文字幕在线播放 | 又粗又长又大又爽又黄少妇毛片 | 四虎国产精品免费 | 日韩有码第一页 | 国产欧美综合在线观看 | 精品久久久免费 | 国产亚洲综合精品 | 国产一级做a爱片久久毛片a | 91精品在线视频观看 | 精品久久久久久久久久久久久久久久久久 | 精品一区欧美 | 亚洲精品国产免费 | 日韩美一区二区三区 | 久久视频网址 | 99爱这里只有精品 | 美女免费视频观看网站 | 91亚洲精品国偷拍 | av免费在线播放 | 久草在线国产 | 欧美黑人巨大xxxxx | av免费在线看网站 | 亚洲无在线| 天天色图 | 99久视频| 国产日韩欧美视频 | 麻豆视频免费播放 | 成人丁香花 | 婷婷久久国产 | 91亚洲精品在线 | 国产 日韩 欧美 中文 在线播放 | 国产精品成人av电影 | 国产亚洲精品久久久久久电影 | 亚洲精品色婷婷 | 在线视频日韩欧美 | 欧美一区二区免费在线观看 | 国产破处在线视频 | 日韩精品视频免费看 | 久久精彩 | 亚洲h在线播放在线观看h | 国产精品视频久久 | 亚洲黄色影院 | av成人在线电影 | 免费精品视频在线观看 | 久久区二区 | 日韩有码网站 | 日韩在观看线 | 人人涩| 精品国产一区二区三区久久久蜜月 | 精品国产一区二区三区男人吃奶 | 久久最新| 国产成人高清 | 中文字幕在线免费看线人 | 成人免费在线播放 | 96精品在线 | 久久久精品网 | 91完整版在线观看 | 久草在线费播放视频 | 日韩二区三区在线 | 黄色av一级| 激情偷乱人伦小说视频在线观看 | 日韩高清观看 | 国产精品18久久久久久首页狼 | 91免费版在线 | 久久精选视频 | 国偷自产中文字幕亚洲手机在线 | 国产精品成人自拍 | 亚洲精品国久久99热 | 九精品| 国产96av | 狠狠色狠狠色综合日日92 | 成人av资源网 | 91中文字幕一区 | 亚洲美女精品视频 | 日韩在线视频观看免费 | 国产精品综合在线观看 | 精品免费久久 | 天天操天天爱天天干 | 日日夜夜精品视频天天综合网 | 国产成人亚洲在线观看 | 午夜视频一区二区三区 | 精品国产免费一区二区三区五区 | 一级特黄av | 国产韩国精品一区二区三区 | 亚洲精品高清在线 | 青青射| 探花视频在线观看+在线播放 | 激情综合中文娱乐网 | 国产高清区 | 欧美一区二区在线免费观看 | 亚洲激情中文 | 久久综合久久久久88 | 国产xxxxx在线观看 | 日韩精品首页 | 国产精品一区二区电影 | 天天插天天射 | 欧美精品一区二区在线观看 | 99中文字幕视频 | 国产黄免费在线观看 | 欧美巨乳网 | 91免费看片黄| 波多野结衣在线视频免费观看 | 久草在线最新视频 | 热久久免费视频精品 | 四虎成人精品在永久免费 | 欧美大香线蕉线伊人久久 | 国产三级精品在线 | 久草免费色站 | 久久国产精品影片 | 国产三级精品三级在线观看 | 欧美成人精品欧美一级乱黄 | av片子在线观看 | 一色屋精品视频在线观看 | 久久久久高清 | 日韩小视频网站 | 午夜精品一区二区三区在线观看 | 人人干网 | 国产 日韩 在线 亚洲 字幕 中文 | 免费看av在线 | 日韩字幕在线 | 91亚洲精品久久久蜜桃 | 一区二区三区免费看 | 成人免费在线播放 | 国产免费xvideos视频入口 | 成人免费精品 | 91九色九色| 三级免费黄色 | a亚洲视频| 成人av网页| 日日干日日 | 亚洲电影第一页av | 一区二区三区日韩视频在线观看 | 18做爰免费视频网站 | a级片久久 | 在线视频日韩精品 | 久久激情小视频 | 国产一区二区在线影院 | 久久天天躁夜夜躁狠狠85麻豆 | 欧美日韩亚洲第一页 | 九九精品毛片 | 香蕉影视在线观看 | 99精品欧美一区二区 | 亚洲久草在线视频 | 高清av在线免费观看 | 欧美日本不卡高清 | 久久国产高清 | 丁香在线 | 在线午夜 | 国产99久久久国产精品 | 午夜丰满寂寞少妇精品 | 中文av在线免费观看 | .国产精品成人自产拍在线观看6 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产 一区二区三区 在线 | 欧美日韩伦理一区 | 精品国产亚洲日本 | 成人性生交大片免费观看网站 | 黄色av网站在线观看免费 | 久草在线在线视频 | 丁香免费视频 | 久久精品成人欧美大片古装 | 国产做aⅴ在线视频播放 | 亚洲欧洲精品一区二区 | 探花视频免费在线观看 | 色偷偷88888欧美精品久久久 | 一区二区三区四区免费视频 | 亚洲精品h| 毛片视频网址 | 国产亚洲精品综合一区91 | 国产福利资源 | 911在线 | 日本精品一区二区三区在线观看 | 亚洲一区二区高潮无套美女 | av品善网 | 香蕉久草 | 国产精品嫩草69影院 | 亚洲视频免费在线观看 | www.av中文字幕.com | 婷婷伊人五月天 | 91亚洲精品久久久蜜桃网站 | 欧美伦理电影一区二区 | 欧美孕妇与黑人孕交 | 亚洲精品影院在线观看 | 超碰97.com| 草免费视频 | 一区二区欧美日韩 | 精品国偷自产在线 | 国产精品久久久久婷婷 | 精品一区二区6 | 麻豆国产精品永久免费视频 | 免费三级网 | 丁香婷婷综合色啪 | 久久国产精品免费 | 国产视频一级 | 在线日韩av | 丁五月婷婷 | 亚洲精品国产综合99久久夜夜嗨 | 亚洲天堂社区 | 国内揄拍国内精品 | 中文字幕免费观看视频 | 国产私拍在线 | 中文字幕永久免费 | 久久视精品| 久章草在线观看 | 亚洲女同videos | 97超碰在线久草超碰在线观看 | 91麻豆精品国产91久久久无需广告 | 欧美黄网站 | 日本精品一区二区在线观看 | 午夜久操 | 91人人爽久久涩噜噜噜 | 国产精品理论片在线观看 | 一区二区三区在线观看 | 日韩精品久久中文字幕 | 国产 在线 日韩 | 天天干天天天天 | 伊人婷婷| 色欧美综合 | 国产精品久久久久久69 | 激情综合交 | 四虎在线视频免费观看 | 亚洲视频 中文字幕 | 欧美精品国产精品 | 国产福利网站 | 日韩av网址在线 | 91精品视频在线免费观看 | 久久国产一区 | 国产黄色在线观看 | 国产成人在线免费观看 | 狠狠色综合欧美激情 | 五月天婷婷综合 | bayu135国产精品视频 | 天天操天天摸天天射 | 九九有精品 | 久久激情五月丁香伊人 | 亚洲综合欧美日韩狠狠色 | 69视频网站 | 国产精品一区专区欧美日韩 | 免费国产亚洲视频 | 在线岛国av| 婷婷综合电影 | 激情视频在线观看网址 | 欧美亚洲久久 | 成人黄色小说在线观看 | 国产一区二区免费在线观看 | 97精品在线观看 | 精品久久久久久国产 | 亚洲免费在线 | 8x8x在线观看视频 | 夜夜婷婷| 国产精品福利久久久 | 97国产情侣爱久久免费观看 | 国产高清精品在线 | 久久精品www人人爽人人 | 6080yy精品一区二区三区 | 91在线porny国产在线看 | 日韩欧美在线观看一区 | 久久天堂影院 | 久久久黄视频 | 久久久久成 | 日韩视频免费在线观看 | 久久99精品国产 | 国产精品18毛片一区二区 | 国内久久看| 久草在线资源网 | 最新色站 | 亚洲在线不卡 | 久久精品视频5 | 在线欧美a| 99色免费视频 | 天天色天 | 夜夜操夜夜干 | 韩日av在线| 国产成人在线综合 | 成年人免费观看国产 | 狠狠色婷婷丁香六月 | 国产成人99久久亚洲综合精品 | www.夜夜操.com| 视频在线观看亚洲 | 成人免费看视频 | 天天射天天干天天爽 | 狠色在线 | 成人丝袜 | 亚洲理论电影网 | 美女在线观看av | 亚洲精品av中文字幕在线在线 | 91九色成人蝌蚪首页 | 亚洲免费精品一区二区 | 91丨九色丨蝌蚪丰满 | 久久视频这里只有精品 | 久久成视频| 久久综合狠狠综合久久激情 | 人人射人人射 | 国产在线观看免 | 九九久久免费视频 | 精品久久久久久电影 | 色婷婷激情电影 | 日韩欧美亚州 | 国产福利网站 | av免费试看| 国产免费叼嘿网站免费 | 色视频网址 | 亚欧日韩成人h片 | 久久av在线播放 | 成人影片在线免费观看 | 国产日韩精品欧美 | 日本成人中文字幕在线观看 | 在线观看播放av | 黄色不卡av | 高清中文字幕av | 99久久久成人国产精品 | 国产中文字幕在线免费观看 | 国产精品永久免费观看 | 亚洲欧美日韩在线一区二区 | 久久久久 | 狠狠干中文字幕 | 日本久久久久久 | 18+视频网站链接 | 欧美日韩伦理一区 | 成人app在线播放 | 人人玩人人添人人澡97 | 99视频在线免费播放 | 久久婷五月 | 国产成人精品久久久久蜜臀 | 在线观看一区 | 国产在线p | 国产精品高清在线观看 | 日本特黄一级片 | 奇米7777狠狠狠琪琪视频 | 婷婷激情综合网 | 国产中文字幕免费 | 欧美极品一区二区三区 | 日日干 天天干 | 欧美黑人xxxx猛性大交 | 国产不卡在线观看 | 青青五月天 | 国产精品久久久久久久久久三级 | www色综合| 国产亚洲在线观看 | 五月婷婷激情网 | 免费十分钟 | 国产精品麻豆免费版 | 日韩在线三级 | 超碰成人免费电影 | 欧美午夜久久 | 玖玖视频免费在线 | 在线观看视频在线 | 中文字幕综合在线 | 日韩在线视频免费播放 | 丁五月婷婷 |