近幾年,華爾街不斷裁員,高盛在2000年頂峰時(shí)期,雇傭了600名交易員,為其機(jī)構(gòu)客戶(hù)進(jìn)行股票買(mǎi)賣(mài),但時(shí)至今日,卻僅剩下2名交易員“看守”柜臺(tái)。 不僅高盛、瑞銀、摩根士丹利等金融公司,目前都已經(jīng)采用機(jī)器學(xué)習(xí)算法替代普通交易員來(lái)進(jìn)行交易。 那,什么樣的算法如此厲害? 它能夠預(yù)測(cè)股價(jià)走勢(shì) 不僅如此,它還能搭建聊天機(jī)器人,可以翻譯外文,可以寫(xiě)新聞稿、寫(xiě)小說(shuō)..... 這個(gè)算法就是循環(huán)神經(jīng)網(wǎng)絡(luò),簡(jiǎn)稱(chēng)RNN。 這里總分為3個(gè)部分: RNN算法之預(yù)備知識(shí):前饋神經(jīng)網(wǎng)絡(luò)(FFNN) 初始RNN算法 RNN算法之變體:長(zhǎng)短期記憶(LSTM) RNN算法之預(yù)備知識(shí):前饋神經(jīng)網(wǎng)絡(luò)(FFNN)
這只是我們隨機(jī)編寫(xiě)的一些數(shù)字,它很簡(jiǎn)單,不適用任何模型算法,你也能輕而易舉的找到x-y之間的規(guī)律:y=9*x 但是如果我們一定要用神經(jīng)網(wǎng)絡(luò)來(lái)計(jì)算的話(huà),那么,這個(gè)神經(jīng)網(wǎng)絡(luò)可以簡(jiǎn)單的搭建為: 先別暈,我們舉個(gè)例子,你就明白上面的邏輯了。 以第一條數(shù)據(jù)為例:
這個(gè)模型的核心:就是努力找到x與y之間的聯(lián)系。 比如, 圖中的1和9,就是模型找到的其中一種連接方法。 更一般的,如果你擁有數(shù)據(jù)(X,Y),神經(jīng)網(wǎng)絡(luò)算法就會(huì)去尋找最佳的參數(shù)W: 求解W,就是這條神經(jīng)網(wǎng)絡(luò)會(huì)替我們努力完成的工作。 上面的圖,寫(xiě)成公式為: 注:兩個(gè)公式中的w,數(shù)值可能不相同。 這就是一條最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò) 當(dāng)然,更多的時(shí)候,你在教材上看到的是這樣的: 如果我們將參數(shù)b暫時(shí)遮擋?。?/div> “公式二”與“公式一”之間,僅僅多出一個(gè)f()函數(shù)。 這個(gè)f()函數(shù),在學(xué)術(shù)上被稱(chēng)為“激活函數(shù)”,通常是一個(gè)非線(xiàn)性的函數(shù)。 例如, 像上面這些,均可以作為激活函數(shù)來(lái)使用。 你會(huì)問(wèn):“為什么我們要使用激活函數(shù)?” 這里因?yàn)?,(w*x)和(w*h)僅僅是線(xiàn)性運(yùn)算: 而我們?cè)诂F(xiàn)實(shí)中遇到的問(wèn)題,更多都是非線(xiàn)性的。 這就好比, 家到學(xué)校,理論上是兩點(diǎn)一線(xiàn)的距離;但在現(xiàn)實(shí)中,你要曲曲彎彎走很多路,才能抵達(dá)終點(diǎn): 因而,在w*X的外面,包裹上一層激活函數(shù) f(w*X) 可以將線(xiàn)性問(wèn)題轉(zhuǎn)化為非線(xiàn)性問(wèn)題,這樣更接近真實(shí)的世界,也能使我們的模型預(yù)測(cè)準(zhǔn)確度得到大幅度提升。 好了,前面我們一直討論的是一條數(shù)據(jù)的情形,即 ![]() 現(xiàn)在,如果我們把t+1條數(shù)據(jù),全部考慮進(jìn)來(lái): ![]() 那么此時(shí),神經(jīng)網(wǎng)絡(luò)的形態(tài)變?yōu)椋?/div> ![]() 由圖可以看出,它是t+1條數(shù)據(jù)的“堆疊”。 你會(huì)發(fā)現(xiàn)像這樣的神經(jīng)網(wǎng)絡(luò),它只是橫向箭頭,并沒(méi)有縱向箭頭。 即第t條數(shù)據(jù),并不受之前數(shù)據(jù)的影響。 你可以視為它為一條一直向前,永不回望的神經(jīng)網(wǎng)絡(luò),也因此而得名“前饋神經(jīng)網(wǎng)絡(luò)”。 我們單拎出第t條數(shù)據(jù): ![]() 此時(shí),ht僅僅受Xt的影響。 在實(shí)際工作中,它適用于“上一條數(shù)據(jù)與下一條數(shù)據(jù),彼此之間沒(méi)有任何關(guān)聯(lián)”的情形。 舉幾個(gè)例子: 圖像分類(lèi) ![]() 第一張圖與第2張圖之間,并無(wú)關(guān)聯(lián)。 薪水等的預(yù)測(cè) ![]() 第一條職位所提供的薪水,并不決定第2條職位薪水的高低。 電影推薦 ![]() 第一部電影的好壞,并不影響第2部電影是否受觀眾的歡迎。 上面這些例子,都可以借助前饋神經(jīng)網(wǎng)絡(luò)來(lái)解決。但有些例子則不然。 初始RNN算法 先來(lái)看一組數(shù)據(jù): ![]() 這組數(shù)據(jù)來(lái)自某只大A股2017年9月份的表現(xiàn) ![]() 在前饋神經(jīng)網(wǎng)絡(luò)中,數(shù)據(jù)與數(shù)據(jù)之間,并不存在依存關(guān)系,即“下一條數(shù)據(jù),并不依賴(lài)于之前 數(shù)據(jù)的信息”。 但是,像上圖中,這樣的一組股票價(jià)格,你還能說(shuō)“上一條數(shù)據(jù)與下一條沒(méi)有關(guān)系”嗎? 我們預(yù)測(cè)9月21日的價(jià)格時(shí),不僅要參考9 月20日的,還要參考9月18日的、9月17日的、... 此時(shí),每一條數(shù)據(jù),都受到之前數(shù)據(jù)的影響。 除了股價(jià)預(yù)測(cè)外,像搭建聊天機(jī)器人: ![]() 寫(xiě)新聞稿: ![]() 預(yù)測(cè)故事發(fā)展情節(jié): ![]() 類(lèi)似這樣的數(shù)據(jù),都是帶有時(shí)間順序呢的,即 都需要通過(guò)前面已經(jīng)出現(xiàn)過(guò)的文字(或情節(jié)),來(lái)預(yù)測(cè)下一個(gè)文字(或片段)。 遇到這種情況,我們就需要借助循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)來(lái)處理。 RNN的運(yùn)行原理,我們舉一個(gè)很簡(jiǎn)單的例子來(lái)說(shuō)明。 假設(shè)有這樣一句話(huà): “我愛(ài)你們” 每次輸入一個(gè)文字,我們都希望能預(yù)測(cè)出下一個(gè)即將出現(xiàn)的文字是什么? ![]() 這樣的數(shù)據(jù),寫(xiě)成表格的形式,即: ![]() RNN的運(yùn)算過(guò)程很簡(jiǎn)單,只要你耐心看完下面這張動(dòng)圖: ![]() 你會(huì)發(fā)現(xiàn),RNN的運(yùn)算,是這樣一個(gè)流程: ![]() 如果我們將上圖簡(jiǎn)化,它就是這個(gè)樣子: ![]() 看出它與前饋神經(jīng)網(wǎng)絡(luò)的區(qū)別了嗎? ![]() 循環(huán)神經(jīng)網(wǎng)絡(luò),除了有橫向箭頭外,還有縱向箭頭 即,對(duì)于循環(huán)神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),它的每一條數(shù)據(jù)演算,都會(huì)依賴(lài)于之前的數(shù)據(jù)。 我們會(huì)反復(fù)用到隱藏層所攜帶的信息: ![]() 此時(shí),隱藏層ht不僅受Xt影響,還受上一時(shí)刻ht-1的影響: ![]() 注意,ht是受[Xt,ht-1]的影響; 而不是受[Xt,Xt-1]的影響。 因?yàn)?,ht與Xt-1,可以被視為簡(jiǎn)單的硬連接。 舉個(gè)不恰當(dāng)?shù)翘貏e好記得例子: ![]() 如果你的第二盤(pán)菜,準(zhǔn)備做魚(yú)香肉絲。 那么,使用第一盤(pán)已經(jīng)切好的土豆絲, 要比直接使用原材料----土豆塊,更省時(shí)、省力,對(duì)吧? 開(kāi)個(gè)玩笑,不管怎樣,要記?。?/div> RNN的隱藏層ht是受[Xt,ht-1]的影響,而非[Xt,Xt-1的影響。 希望今后,你再看到其他教材上的公式,會(huì)覺(jué)得更好理解了。 ![]() 注:公式中的w,數(shù)值可能不同 長(zhǎng)短期記憶,簡(jiǎn)稱(chēng)LSTM 上面講到,循環(huán)神經(jīng)網(wǎng)絡(luò)的形態(tài),類(lèi)似于下圖的樣子: ![]() 如果我們想預(yù)測(cè)一句話(huà) 我愛(ài)你們,可以簡(jiǎn)單的描述為: ![]() 從上圖中我們能夠看到,在中間的灰色鏈條上,被塞入了各式各樣的“記憶”。事實(shí)上,在這根灰色鏈條上,存儲(chǔ)了大量的信息。 ![]() 這根“灰色”鏈條,我們可以視它為一根記憶鏈條。 如果將這根記憶鏈條,比喻成一條公路;將每一次的記憶,比作一輛車(chē)。 那么,在這條公路上,已經(jīng)塞滿(mǎn)了汽車(chē): ![]() 如果這根記憶鏈條很長(zhǎng)、很長(zhǎng)...... 那么可以想象,在這條長(zhǎng)長(zhǎng)的公路上,會(huì)擠壓無(wú)數(shù)條等待通行的車(chē)輛。 你或許能看清離你最近的,但卻無(wú)法回望到整個(gè)隊(duì)伍的盡頭。 ![]() RNN算法也是一樣的。 在這根記憶鏈條上,存儲(chǔ)了太多、太多“有用的”和“無(wú)用的”信息。 或許,它仍保留有最近一段時(shí)間的記憶, 但是,太過(guò)久遠(yuǎn)的記憶,已經(jīng)記不清了。 所以,當(dāng)你的數(shù)據(jù)比較有限時(shí),使用RNN是一個(gè)不錯(cuò)的選擇。 但如果你的數(shù)據(jù)時(shí)間周期很長(zhǎng),例如: 你有100天的股票收盤(pán)數(shù)據(jù),你希望基于這100天的數(shù)據(jù),預(yù)測(cè)出第101天的收盤(pán)價(jià)格。 此時(shí),如果你仍選用RNN算法,那么很可能,它并不能帶來(lái)令你滿(mǎn)意的結(jié)果。因?yàn)?,它?shí)在記不住那么久遠(yuǎn)的信息了。而此時(shí)能解決問(wèn)題的,是LSTM. LSTM是RNN的一種變體。 既然是變體,說(shuō)明它的基本原理與RNN大體相同。唯一的區(qū)別在于,它比RNN多出了一條公路: ![]() 在這條多出的“公路”上,LSTM存儲(chǔ)了更加簡(jiǎn)潔的信息。 就像你在圖中看到的,左邊的道路,忙忙碌碌; 右邊的道路,清清凈凈。 對(duì)應(yīng)LSTM算法,忙忙碌碌的道路,即“第一根灰色鏈條”,依然是“隱藏層”,它用于做各種各樣的記憶運(yùn)算。 比如: 哪些記憶有用,我要留下; 哪些記憶沒(méi)用,我要丟棄; 哪些輸入帶有新的信息,我要更新; 等等這些,都是在第一根灰色鏈條上來(lái)處理的,所以你看到它,一直在忙忙碌碌的工作。 ![]() 而第2根灰色鏈條,學(xué)術(shù)上稱(chēng)為“細(xì)胞狀態(tài)”,它用于存儲(chǔ)“有用的”記憶。 那些“無(wú)用的”記憶,是不會(huì)出現(xiàn)在這條鏈條上的,所以你看到它,是干干凈凈,十分簡(jiǎn)潔的。 ![]() 正因?yàn)橛辛诉@樣一條“干凈、簡(jiǎn)潔”的信息通道,LSTM能夠記住更加久遠(yuǎn)的信息,即“在處理 ”長(zhǎng)期記憶的問(wèn)題上,LSTM相較于RNN更勝一籌”。 下面,我們來(lái)看一看,LSTM是如何“開(kāi)通這樣一條快速通道”的? 還是這張圖,我們將其中一個(gè)隱藏層單元,放大來(lái)看: ![]() 將隱藏層單元放大后的效果為: ![]() 和RNN一樣,這個(gè)單元依然受Xt和ht-1的影響。 ![]() 與RNN不同的是,在這個(gè)單元上,多出3個(gè)“閥門(mén)”: ![]() 剛剛我們已經(jīng)講了,整個(gè)單元受[Xt,ht-1]的影響。因而,這3個(gè)閥門(mén)同樣也受[Xt,ht-1]的影響。 因而,在很多教材上,你會(huì)看到這樣的公式: ![]() 其實(shí),它們均在說(shuō)明,這3個(gè)閥門(mén)被[Xt,ht-1]影響著: ![]() 回過(guò)頭來(lái),我們?nèi)匀豢催@張圖: ![]() 這3個(gè)閥門(mén),分別代表: 忘記門(mén):忘記過(guò)去沒(méi)用的記憶 輸入門(mén):輸入新的記憶 輸出門(mén):輸出當(dāng)前時(shí)刻用得上的信息 耐心看完這張動(dòng)圖,LSTM的運(yùn)行原理,你或許就清楚了。 ![]() 我們將動(dòng)圖鎖定在最后一時(shí)刻 ![]() 從上圖我們能夠看到 右側(cè)的灰色鏈條上,僅包含了有價(jià)值的信息,因而更加簡(jiǎn)潔。 也正因?yàn)槎嗉恿诉@根鏈條,使得LSTM比起RNN來(lái),能夠記住更加久遠(yuǎn)的信息。 提示: 為了方便理解,本文“輸入門(mén)”的位置上,只畫(huà)出了一條線(xiàn): ![]() 更多的時(shí)候,你會(huì)看到2條,一條決定添加哪些信息,一條決定添加多少。 ![]() 這2條線(xiàn)的運(yùn)算目的,就是未來(lái)向舊記憶中,添加有用的新記憶。 |
|