自然語言處理 (NLP)問題都是序列化的诡右。前饋神經(jīng)網(wǎng)絡(luò)安岂,在單次前饋中對(duì)到來數(shù)據(jù)處理,假定所有輸入獨(dú)立帆吻,模式丟失域那。循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network,RNN)對(duì)時(shí)間顯式建模神經(jīng)網(wǎng)絡(luò)。RNN神經(jīng)元可接收其他神經(jīng)元加權(quán)輸入猜煮。RNN神經(jīng)元可與更高層建立連接次员,也可與更低層建立連接。隱含活性值在同一序列相鄰輸入間被記憶王带。2006年 LSTM淑蔚。語音識(shí)別、語音合成愕撰、手寫連體字識(shí)別刹衫、時(shí)間序列預(yù)測(cè)、圖像標(biāo)題生成搞挣、端到端機(jī)器翻譯带迟。
RNN由神經(jīng)元和連接權(quán)值構(gòu)成任意有向圖。輸入神經(jīng)元(input neuron)擁有“到來”連接柿究,活性值由輸入數(shù)據(jù)設(shè)置邮旷。輸出神經(jīng)元(output neuron)是數(shù)據(jù)流圖一組可讀取預(yù)測(cè)結(jié)果神經(jīng)元。所有其他神經(jīng)元為隱含神經(jīng)元(hidden neuron)蝇摸。每個(gè)時(shí)間步,通過設(shè)置輸入神經(jīng)元為網(wǎng)絡(luò)提供輸入序列下一幀办陷。隱含活性值作為下一個(gè)時(shí)間步附加輸入貌夕。RNN當(dāng)前隱含活性值為狀態(tài)。序列最開始設(shè)置值0空狀態(tài)民镜。RNN狀態(tài)依賴當(dāng)前輸入和上一狀態(tài)啡专。狀態(tài)與序列所有前輸入都間接相關(guān),工作記憶(woring memory)制圈。RNN權(quán)值矩陣定義執(zhí)行程序们童,決定隱含活性值輸入畔况,不同活性值整合新活性值輸出。sigmoid激活函數(shù) RNN 2006年被證明圖錄完備(Turing-complete)慧库。給定正確權(quán)值跷跪,RNN可完成任意計(jì)算程序相同計(jì)算。不存在找到完美權(quán)值方法齐板,可用梯度下降法得到次好結(jié)果吵瞻。
優(yōu)化RNN,沿時(shí)間輸展開甘磨,用優(yōu)化前饋網(wǎng)絡(luò)相同方式優(yōu)化橡羞。復(fù)制序列神經(jīng)元,連接在副本傳遞济舆,移除循環(huán)邊接而不改計(jì)算語義卿泽。相鄰時(shí)間步權(quán)值相同強(qiáng)度。隨時(shí)間反向傳播(Back-Propagation Through Time,BPTT)滋觉,返回時(shí)間相關(guān)誤差對(duì)權(quán)值(包括聯(lián)結(jié)相鄰副本權(quán)值)偏導(dǎo)又厉。聯(lián)結(jié)權(quán)值(tied weight)梯度相加。
循環(huán)神經(jīng)網(wǎng)絡(luò)常見映射:序列分類椎瘟、序列生成覆致、序列標(biāo)注、序列翻譯肺蔚。序列標(biāo)注(sequential labelling)煌妈,序列作為輸入,訓(xùn)練網(wǎng)絡(luò)為每幀數(shù)據(jù)產(chǎn)生正確輸出宣羊,一個(gè)序列到另一個(gè)序列等長(zhǎng)映射璧诵。序列分類(sequential classification),每個(gè)序列輸入對(duì)應(yīng)一個(gè)類別標(biāo)簽仇冯,可僅選擇上一幀輸出訓(xùn)練RNN之宿,更新權(quán)值時(shí)誤差流經(jīng)所有時(shí)間步收集集成有用信息。序列生成(sequential generation)苛坚,給定一個(gè)類別標(biāo)簽比被,輸出反饋給網(wǎng)絡(luò)作為下一步輸入,生成序列泼舱。單個(gè)向量視為信息稠密表示等缀。序列翻譯(sequential translation),域中序列編碼娇昙,最后隱含活性值解碼為另一個(gè)域中序列尺迂。輸入輸出概念層次有差異,兩個(gè)不同RNN,第一個(gè)模型最后活性值初始化第二個(gè)模型噪裕。單個(gè)網(wǎng)絡(luò)蹲盘,序列后傳入特殊符號(hào)輸入,通知網(wǎng)絡(luò)停止編碼膳音,開始解碼召衔。
帶輸出投影RNN網(wǎng)絡(luò)結(jié)構(gòu),全連接隱含單元严蓖,映射輸入輸出薄嫡。所有隱含單元都為輸出,堆疊前饋層颗胡。隱含單元和輸出單元不同激活函數(shù)毫深。
TensorFlow支持RNN各種變體,tf.nn.rnn_cell毒姨。tensor flow.models.rnn中tf.nn.dynamic_rnn實(shí)現(xiàn)RNN動(dòng)力學(xué)哑蔫。接收循環(huán)網(wǎng)絡(luò)定義,輸入序列批數(shù)據(jù)弧呐。所有序列等長(zhǎng)闸迷。返回保存每個(gè)時(shí)間步輸出和隱含狀態(tài)兩個(gè)張量。從tensor flow.models.rnn導(dǎo)入rnn_cell和rnn俘枫。輸入數(shù)據(jù)維數(shù)為batch_sizesequence_lengthframe_size腥沽。不希望限制批次大小,第1維尺寸可以設(shè)None鸠蚪。rnn_cell.BasicRNNCell 創(chuàng)建基礎(chǔ)RNN今阳。rnn.dynamic_rnn 定義sequence_length步模擬RNN運(yùn)算。定義RNN茅信,沿時(shí)間軸展開盾舌,加載數(shù)據(jù),選擇TensorFlow優(yōu)化器訓(xùn)練網(wǎng)絡(luò)蘸鲸,tf.train.RMSPropOptimizer妖谴、tf.train.AdamOptimizer。
長(zhǎng)時(shí)依賴性酌摇,網(wǎng)絡(luò)記住含有許多后續(xù)不相關(guān)幀的序列第一幀膝舅。長(zhǎng)序列,基礎(chǔ)RNN展開網(wǎng)絡(luò)深度非常大妙痹,層數(shù)非常多铸史,每一層反向傳播算法將來自網(wǎng)絡(luò)上一層誤差乘以局部偏導(dǎo)。如果大多數(shù)局部偏導(dǎo)遠(yuǎn)小于1,梯度每層變小怯伊,指數(shù)衰減,最終消失。如果很多偏導(dǎo)大于1,梯度值急劇增大耿芹。誤差項(xiàng)包含相乘項(xiàng)權(quán)值矩陣轉(zhuǎn)置崭篡。RNN相鄰時(shí)間步聯(lián)結(jié)一起,權(quán)值局部偏導(dǎo)都小于1或大于1,RNN每個(gè)權(quán)值都向相同方向縮放吧秕,梯度消失琉闪、爆炸問題突出。數(shù)值優(yōu)化砸彬,浮點(diǎn)精度對(duì)梯度值產(chǎn)生影響颠毙。長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)(long-short term memory,LSTM)RNN架構(gòu)解決方案。
LSTM專門解決梯度消失砂碉、爆炸問題蛀蜜。學(xué)習(xí)長(zhǎng)時(shí)依賴關(guān)系的RNN事實(shí)標(biāo)準(zhǔn)逸雹。將RNN普通神經(jīng)元替換為內(nèi)部擁有少量記憶LSTM單元(LSTM Cell)脏毯。聯(lián)結(jié)一起,內(nèi)部狀態(tài)記憶時(shí)間步誤差站宗。LSTM內(nèi)部狀態(tài)有固定權(quán)值為1自連接滋迈,線性激活函數(shù)霎奢,局部偏導(dǎo)始終為1。反向傳播饼灿,常量誤差傳輸子(constant error carousel)在時(shí)間步攜帶誤差不發(fā)生梯度消失或爆炸幕侠。內(nèi)部狀態(tài)隨時(shí)間步傳遞誤差,LSTM環(huán)繞門(surrounding gates)負(fù)責(zé)學(xué)習(xí)碍彭,非線性激活函數(shù)(sigmoid)晤硕。原始LSTM單元,一種門學(xué)習(xí)對(duì)到來活性值縮放硕旗,另一種門學(xué)習(xí)輸出活性值縮放窗骑,學(xué)習(xí)包含或忽略新輸入,學(xué)習(xí)給其他單元傳遞特征漆枚。單元輸入送入不同權(quán)值門创译。可以把循環(huán)神經(jīng)網(wǎng)絡(luò)用為規(guī)模更大網(wǎng)絡(luò)架構(gòu)組成部分墙基。
LSTMCell類可替換BasicRNNCell類软族,一個(gè)完整的LSTM層。輸入非線性->輸入門->狀態(tài)->輸出非線性->輸出門残制。
LSTM流行變種立砸,添加對(duì)內(nèi)部循環(huán)連接比例縮放遺忘門(forget gate),網(wǎng)絡(luò)學(xué)會(huì)遺忘初茶,內(nèi)部循環(huán)連接局部偏導(dǎo)變成遺忘門活性值颗祝,可取非1值。當(dāng)上下文重要,遺忘門保持關(guān)閉狀態(tài)螺戳。輸入非線性->輸入門->狀態(tài)->遺忘門->輸出非線性->輸出門搁宾。
添加窺視孔連接(peephole connection),門能看到單元狀態(tài)倔幼。當(dāng)精確時(shí)間選擇和間隔時(shí)有益盖腿。TensorFlow LSTM層傳入use-peepholes=Trues標(biāo)記激活窺視孔連接。
門限循環(huán)單元(Gated Recurrent Unit,GRU)损同,架構(gòu)簡(jiǎn)單翩腐,更少計(jì)算量,沒有輸出門膏燃,輸入和遺忘門整合單獨(dú)更新門(update gate)茂卦。更新門決定內(nèi)部狀態(tài)與候選活性值融合比例。重置門(reset gate)和新輸入確定部分隱含狀態(tài)計(jì)算得到候選活性值蹄梢。TensorFlow GRU層對(duì)應(yīng)GRUCell類疙筹。只需要單元數(shù)目參數(shù)。輸入->候選活性值->更新門->重置門->狀態(tài)禁炒。
全連接隱含單元RNN而咆,訓(xùn)練期間把不需要權(quán)值置0。最常見做法幕袱,兩層或多層全連接RNN相互堆疊暴备,信息只能在兩層之間向上流動(dòng),多層RNN權(quán)值數(shù)目少们豌,學(xué)習(xí)到更多抽象特征涯捻。
參考資料:
《面向機(jī)器智能的TensorFlow實(shí)踐》
歡迎加我微信交流:qingxingfengzi
我的微信公眾號(hào):qingxingfengzigz
我老婆張幸清的微信公眾號(hào):qingqingfeifangz