本文所用代碼請(qǐng)見 我的Github,版權(quán)歸屬于 Udacity 和 Andrew Trask夭拌。
在神經(jīng)網(wǎng)絡(luò)構(gòu)建的過程中小作,為了快速實(shí)現(xiàn)模型迭代,可能在初期的時(shí)候?qū)τ趩栴}作了基本的分析之后就開始打造網(wǎng)絡(luò)的雛形了即纲,一個(gè)工作正常但精度或效率不高的模型要遠(yuǎn)好于理論上精度奇高但從未完整運(yùn)行成功過一次的模型。
在 Udacity 的這個(gè)影評(píng)情感分析練習(xí)中博肋,在初期了解了電影評(píng)論的積極與消極傾向可以由評(píng)論中出現(xiàn)的詞匯來進(jìn)行預(yù)測(cè)后就可以動(dòng)手打造網(wǎng)絡(luò)了低斋。最初的版本是將訓(xùn)練集中所有可能出現(xiàn)的詞匯構(gòu)成一個(gè)很長的 review_vocab 數(shù)組蜂厅,這種處理方式相當(dāng)于將各個(gè)詞匯作為 類別數(shù)據(jù) 進(jìn)行處理,在此基礎(chǔ)上對(duì)于任意一個(gè)訓(xùn)練樣本中的影評(píng)輸入拔稳,統(tǒng)計(jì)其中出現(xiàn)的單詞及其數(shù)量葛峻,以此更新其在 review_vocab 上相應(yīng)位置的值,將這個(gè)向量作為網(wǎng)絡(luò)的輸入進(jìn)行一個(gè)樣本的訓(xùn)練巴比。
后續(xù)在訓(xùn)練中發(fā)現(xiàn)網(wǎng)絡(luò)的訓(xùn)練效率很低术奖,此時(shí),可以不急于使用那些高級(jí)的數(shù)據(jù)處理技術(shù)轻绞,可以先回過頭來對(duì)于初期的實(shí)現(xiàn)方式進(jìn)行評(píng)價(jià)采记,例如評(píng)論中實(shí)際上很多中性的冠詞出現(xiàn)的頻率甚至遠(yuǎn)高于帶有感情色彩的形容詞,此時(shí)在統(tǒng)計(jì)輸入中如果只考慮單詞是否出現(xiàn)政勃,而不統(tǒng)計(jì)單詞出現(xiàn)的數(shù)量唧龄,對(duì)于網(wǎng)絡(luò)的預(yù)測(cè)能力可能就是有提升的。此時(shí)只需要將輸入向量中所有出現(xiàn)的單詞的位置設(shè)置成 1 奸远,在實(shí)際運(yùn)算中可以發(fā)現(xiàn)這個(gè)小小的改動(dòng)對(duì)于提高預(yù)測(cè)準(zhǔn)確性有很大的影響既棺。
進(jìn)一步地,可以發(fā)現(xiàn)網(wǎng)絡(luò)在每一個(gè)樣本的計(jì)算過程中要計(jì)算大量的輸入中的 0 與權(quán)重的乘法懒叛,而如果有辦法將這些輸入中的非零位置索引出來丸冕,將隱藏層的輸出直接定義為輸入與隱藏層權(quán)重參數(shù)的乘法而不是兩個(gè)向量相乘就可以減少大量的計(jì)算。更進(jìn)一步地薛窥,由于輸入中所有非零位置的元素都為 1胖烛,那么可以直接將隱藏層的輸出定義為對(duì)應(yīng)輸入向量非零位置的權(quán)重參數(shù)的加法。這里需要注意的是在構(gòu)建每一個(gè)評(píng)論的索引列表時(shí)诅迷,索引位置還是基于相應(yīng)單詞在之前的 review_vobab 數(shù)組中的位置佩番,這樣可以不改變輸入層到隱藏層矩陣的形狀 (input_nodes, hidden_nodes) ,其中 input_nodes = len(review_vocab) 使得模型的代碼修改量最小罢杉。
最后趟畏,還可以根據(jù)部分帶有感情色彩的語氣詞在積極評(píng)價(jià)中出現(xiàn)的頻率高于消極評(píng)價(jià)這一點(diǎn),進(jìn)一步改進(jìn)輸入?yún)?shù)設(shè)置滩租,將頻率過高及過低的助詞直接在訓(xùn)練之前過濾掉拱镐,減少模型中所需要的特征輸入的量,講師 Andrew Trask 提到這一方式在自然語言處理中比較常用持际。總結(jié)起來就是對(duì)于問題的分析和前期的數(shù)據(jù)處理非常重要哗咆,將很大程度上決定算法的效率蜘欲,在高效的算法的基礎(chǔ)上建立的模型,才能體現(xiàn)出算力的重要性晌柬,否則只會(huì)浪費(fèi)硬件姥份。