20189230楊 2018-2019-2 論文學習與報告總結

課程:《密碼與安全新技術專題》python

班級:1892
姓名:楊
學號:20189230
上課教師:王志強
上課日期:2019年5月21日
必修/選修:選修git

1.學習論文的總結

論文名稱:Convolutional Neural Networks for Sentence Classification(卷積神經網絡用於句子分類)
論文來源:天然語言處理領域頂級國際會議EMNLP2014
github

文獻原文,全篇翻譯和課堂介紹所用PPT能夠經過連接下載:https://pan.baidu.com/s/19uKDPYW5QtX_ky1ldMbvTg,提取碼:m81o

Part1背景介紹:爲何要用CNN(卷積神經網絡)對句子分類?

(1)特徵提取的高效性
機器學習首先須要選取好特徵,每個特徵即爲一個維度,特徵數目過少,咱們可能沒法精確的分類出來,即咱們所說的欠擬合;若是特徵數目過多,可能會致使咱們在分類過程當中過於注重某個特徵致使分類錯誤,即過擬合。這樣就須要咱們在特徵工程上花費不少時間和精力,才能使模型訓練獲得一個好的效果。然而神經網絡的出現使咱們不須要作大量的特徵工程,譬如提早設計好特徵的內容或者說特徵的數量等等,咱們能夠直接把數據灌進去,讓它本身訓練,自我「修正」,便可獲得一個較好的效果。
(2)數據格式的簡易性
在一個傳統的機器學習分類問題中,咱們「灌」進去的數據是不能直接灌進去的,須要對數據進行一些處理,譬如量綱的歸一化,格式的轉化等等,不過在神經網絡裏咱們不須要額外的對數據作過多的處理。
(3)參數數目的少許性
在面對一個分類問題時,若是用SVM來作,咱們須要調整的參數包括核函數,懲罰因子,鬆弛變量等等,不一樣的參數組合對於模型的效果也不同,想要迅速而又準確的調到最適合模型的參數須要對背後理論知識的深刻了解(固然,若是所有都試一遍也是能夠的,可是花的時間可能會更多)。對於一個基本的三層神經網絡來講(輸入-隱含-輸出),咱們只須要初始化時給每個神經元上隨機的賦予一個權重w和偏置項b,在訓練過程當中,這兩個參數會不斷的修正,調整到最優質,使模型的偏差最小。因此從這個角度來看,咱們對於調參的背後理論知識並不須要過於精通(只不過作多了以後可能會有一些經驗,在初始值時賦予的值更科學,收斂的更快罷了)。
尤爲是在圖像領域,用傳統的神經網絡並不合適。由於圖像是由一個個像素點構成,每一個像素點有三個通道,分別表明RGB顏色,那麼,若是一個圖像的尺寸是(28,28,1),即表明這個圖像的是一個長寬均爲28,channel爲1的圖像(channel也叫depth,此處1表明灰色圖像)。若是使用全鏈接的網絡結構,即,網絡中的神經與與相鄰層上的每一個神經元均鏈接,那就意味着咱們的網絡有28 * 28 =784個神經元,hidden層採用了15個神經元,那麼簡單計算一下,咱們須要的參數個數(w和b)就有:7841510+15+10=117625個,這個參數太多了,隨便進行一次反向傳播計算量都是巨大的,從計算資源和調參的角度都不建議用傳統的神經網絡。算法

Part2模型介紹

下圖是原論文中給出的用於句子分類的CNN模型:

用一張釋義更明確的圖來說解該模型的結構:

數組

輸入矩陣

CNN輸入矩陣的大小取決於兩個因素:
A.句子長度(包含的單詞的個數)
B.每一個字符的長度

假設輸入X包含m個單詞,而每一個單詞的字嵌入(Word Embedding)長度爲d,那麼此時的輸入就是m d的二維向量。對於I like this movie very much!來講,當字嵌入長度設爲5時,輸入即爲75的二維向量。
卷積過程

文中使用了2種過濾器(卷積核),每種過濾器有三種高度(區域大小),即有6種卷積結構。每一個卷積核的大小爲filter_size embedding_size。

A.filter_size表明卷積核縱向上包含單詞個數,即認爲相鄰幾個詞之間有詞序關係,代碼裏使用的是[3,4,5]。
B.embedding_size就是詞向量的維數。每一個卷積覈計算完成以後咱們就獲得了1個列向量,表明着該卷積核從句子中提取出來的特徵。有多少卷積核就能提取出多少種特徵。
池化過程

這篇文章使用MaxPooling的方法對Filter提取的特徵進行降維操做,造成最終的特徵。每一個卷積的結果將變爲一個特徵值,最終生成一個特徵向量。
如下圖爲例,池化層採用MaxPooling,大小爲2
2,步長爲1,取每一個窗口的最大值更新,那麼圖片的尺寸會由3 3變成22。
注意:這一步統一了維度!
補充:池化方法通常有兩種:MaxPooling:取滑動窗口裏最大的值;AveragePooling:取滑動窗口內全部值的平均值。

全鏈接層(含Dropout和Softmax)

A.要處理的問題
二分類問題:正面評價;負面評價。
B.全鏈接層
把權重矩陣與輸入向量相乘再加上偏置,實際上就是三層神經網絡的隱層到輸出層的映射。

C.添加Dropout
因爲實驗中所用的數據集相對較小,很容易就會發生過擬合現象,因此要引入Dropout來減小過擬合現象。

神經元激活的機率,能夠在參數 dropout_keep_prob 中設置。這篇文章裏選擇的是0.5。
D.Softmax分類層
咱們能夠應用Softmax函數來將原始分數轉換爲歸一化機率,從而獲得機率最大的輸出,最終達到預測的目的。

補充:Dropout的做用原理
按照必定的機率來「禁用」一些神經元的發放。這種方法能夠防止神經元共同適應一個特徵,而迫使它們單獨學習有用的特徵。

Part3數據集

(1)文章中使用的數據集包括:
•MR:電影評論,每次評論一句話。分類包括檢測積極/消極的評論。
•SST-1:Stanford Perfection Treebank是MR的擴展,但提供了train/dev/test分割和細粒度標籤(很是積極、積極、中立、消極、很是消極)。
•SST-2:與SST-1相同,但刪除中立評論。•Subj:主觀性數據集,將句子分類爲主觀性或客觀性兩種。
•TREC:數據集將問題分爲6種類型(是否涉及人員、位置、數字信息)。
•CR:客戶對各類產品(相機、MP3等)的正面/負面評論。
•MPQA:用於意見極性檢測。

其中,c是目標類的數目;l是語句平均長度;N是數據集大小;|V|是詞典大小;|Vpre|是預先訓練過的單詞向量集中出現的單詞數;Test是測試集的大小(CV:沒有訓練/測試集的劃分,於是採用十折交叉驗證的方法。
(2)復現時使用的是MR(Movie Review data from Rotten Tomatoes),來自爛番茄的電影評論數據。數據集包含10662個示例評論句,半正半負。詞彙表大小約爲20k。因爲此數據集很是小,使用強大的模型可能會形成過擬合。此外,數據集沒有進行train/test分割,所以咱們將數據集分紅十份,輪流將其中9份做爲訓練數據,1份做爲測試數據。10次結果的平均值做爲對算法精度的估計(十折交叉驗證)。
A.數據清洗:將重複、多餘的數據篩選清除,將缺失的數據補充完整,將錯誤的數據糾正或者刪除,最後整理成爲咱們能夠進一步加工、使用的數據。
B.數據集裏最大的句子長度爲59,所以爲了更方便地進行批處理,須要用0將其餘句子填充到這個長度。填充操做並不會對結果形成大的影響,由於最後的MaxPooling會選取最大特徵值。
C.構建詞彙索引表,將每一個單詞映射到 0 ~ 18765 之間(18765是詞彙量大小),那麼每一個句子都變成了一個向量。
D.批處理。瀏覽器

Part4實驗結論

(1)Model Variations
A.CNN-rand:全部的word vector都是隨機初始化的,同時當作訓練過程當中優化的參數;
B.CNN-static:全部的word vector直接使用無監督學習即Google的word2vector工具獲得的結果,而且是固定不變的;
C.CNN-non-static:全部的word vector直接使用無監督學習即Google的word2vector工具獲得的結果,可是會在訓練過程當中被微調;
D.CNN-multichannel:CNN-static和CNN-non-static的混合版本,即兩種類型的輸入。
本文實現的CNN模型及其變體在不一樣的數據集上和前人方法的比較:

(2)結論
A.CNN-static優於CNN-rand,由於採用訓練好的word2vector向量利用了更大規模的文本信息,提升acc;
B.CNN-non-static優於CNN-static,由於BP算法微調參數使得word2vector更加貼近於某一個具體的任務,提升acc;
C.CNN-multichannel在小規模數據集上的表現優於CNN-single。它體現的是一種折中思想,即既不但願微調參數後的word2vector距離原始值太遠,但同時保留其必定的變化空間。
(3)其餘結論(十分有趣哦❤)

A.CNN-static中,bad對應的最相近詞爲good,緣由是這兩個詞在句法上的使用是極其相似的(能夠簡單替換,不會出現語句毛病);而在CNN-non-static的版本中,bad對應的最相近詞爲terrible,這是由於在微調參數的過程當中,word2vector的值發生改變從而更加貼切數據集(是一個情感分類的數據集),因此在情感表達的角度這兩個詞會更加接近;
B.句子中的!最接近一些表達形式較爲激進的詞彙,如lush(酷)等;而,則接近於一些鏈接詞,這和咱們的主觀感覺也是相符的。不過在某種程度上這種"過分推斷"容易形成過擬合,於是做者將這兩種詞向量做爲了輸入層不一樣的channel來進行訓練,取得了還不錯的效果。安全

Part5論文復現

運行環境

Windows10;
Anaconda 2019.03;
Python 3.7.3;
Tensorflow1.13.1(CPU版);
TensorBoard 1.13.1。
服務器

訓練/測試集的劃分:activate tensorflow——導入數據集rt-polaritydata——python train.py——python eval.py

十折交叉驗證(10-fold cross-validation)是一種經常使用的測試方法:將數據集分紅十份,輪流將其中9份做爲訓練數據,1份做爲測試數據,進行試驗。每次試驗都會得出相應的正確率(或差錯率)。10次的結果的正確率(或差錯率)的平均值做爲對算法精度的估計。

step=30000(步進值爲1)



從圖中能夠看出,loss值不斷降低,acc值最終達到0.753982。
Tensorboard可視化

tensorboard.exe--logdir="C:\Users\yangxiaopang\Desktop\cnn-text-classification-tf-master\runs\1558944107\summaries\train"——用Chrome瀏覽器打開http://LAPTOP-4731L8IJ:6006便可

A.卷積神經網絡結構圖(含節點及關聯關係)
Main Graph和Auxiliary Nodes——

conv maxpooling4局部節點——

B.Model Variations(4種)的acc和loss值
命令語句分別爲:
使用隨機初始化的詞向量進行訓練:python train.py --input_layer_type 'CNN-rand';
使用與訓練好的GloVe 詞向量訓練,在訓練過程當中詞向量不可訓練,是固定的:python train.py --input_layer_type 'CNN-static';
使用與訓練好的GloVe 詞向量訓練,在訓練中微調詞向量:python train.py --input_layer_type 'CNN-non-static';
使用兩個詞向量組成雙通道做爲輸入,一個固定,另外一個能夠微調:python train.py --input_layer_type 'CNN-multichannel'。
acc值:


loss值:

由上面的圖表可知,四種Model Variations的acc值較原論文中偏小,可是相互間的大小關係和原論文中一致。
C.其餘可視化結果
標量Scalars/數據分佈Distribution /直方圖Histograms

D.改進方向

如上圖,測試集(紅)的精度明顯低於訓練集(藍)(CNN-static),代表過擬合了。要想改進實驗,咱們須要更多的數據、更強的正則化或更少的模型參數。

2.學習中遇到的問題及解決

  • 問題1:究竟什麼是Word Embedding?
  • 問題1解決方案:
    Word Embedding本質是將文本數據轉換爲數值型數據,能夠當作一種映射。
    舉例——「apple on a apple tree」
    (1)Word Embedding的輸入是原始文本中的一組不重疊的詞彙,即一個dictionary:["apple", "on", "a", "tree"]。
    (2)Word Embedding的輸出就是每一個word的向量表示。使用最簡單的one hot編碼方式,那麼每一個word都對應了一種數值表示。
    例如,apple對應的vector就是[1, 0, 0, 0],a對應的vector就是[0, 0, 1, 0]。
    由上例,Word Embedding實質上是特徵提取器,在指定維度中編碼語義特徵。
    語義相近的詞, 它們的歐氏距離或餘弦距離也比較近。
    這時候的句子就天然而然地成爲了天然語言處理中的「圖像」。
    Word Embedding主要分爲如下兩類:
    基於頻率的Word Embedding(Frequency based embedding);
    基於預測的Word Embedding(Prediction based embedding)。
  • 問題2:究竟什麼是Word2Vector?
  • 問題2解決方案:
    Word2Vector本質就是進行詞向量化,使得機器可以處理文字類型的數據(文本)。
    (1)發展歷史:在Word2Vector出現以前,對於天然語言的處理的詞的向量化使用的是One-Hot Encoder。它的特色是:詞向量維度大小爲整個詞彙表的大小,對於每一個具體的詞彙表中的詞,將對應的位置置爲1。好比咱們有下面的5個詞組成的詞彙表,詞"Queen"的序號爲2, 那麼它的詞向量就是(0,1,0,0,0)(0,1,0,0,0)。一樣的道理,詞"Woman"的詞向量就是(0,0,0,1,0)(0,0,0,1,0)。
    (2)One-Hot Encoder的缺點:過於稀疏;不能體現詞與詞之間的關係;對於詞量大時會出現維度災難。

    (3)解決辦法:使用Vector Representations能夠有效解決這個問題。Word2Vector能夠將One-Hot Encoder轉化爲低維度的連續值,也就是稠密向量,而且其中意思相近的詞將被映射到向量空間中相近的位置。 咱們能夠發現,華盛頓和紐約彙集在一塊兒,北京上海彙集在一塊兒,且北京到上海的距離與華盛頓到紐約的距離相近。也就是說模型學習到了城市的地理位置,也學習到了城市位置之間的關係。

    有了用Dristributed representation表示的較短的詞向量,咱們就能夠較容易的分析詞之間的關係了,好比咱們將詞的維度降維到2維,有一個有趣的研究代表,用下圖的詞向量表示咱們的詞時,咱們能夠發現:King−Man+Woman=Queen。

    (4)模型拆解
    Word2Vector模型其實就是簡單化的神經網絡。

    輸入是One-Hot Vector,Hidden Layer沒有激活函數,也就是線性的單元。Output Layer維度跟Input Layer的維度同樣,用的是Softmax迴歸。咱們要獲取的dense vector其實就是Hidden Layer的輸出單元。有的地方定爲Input Layer和Hidden Layer之間的權重,其實說的是一回事。
  • 問題3:池化層還能夠進一步改進以提升模型提取特徵的能力麼?
  • 問題3解決方案:用其餘池化方法
    (1)K-MaxPooling——
    原先的Max Pooling從Convolution層一系列特徵值中只取最強的那個值,那麼咱們思路能夠擴展一下,K-Max Pooling能夠取全部特徵值中得分在Top-K的值,並保留這些特徵值原始的前後順序,就是說經過多保留一些特徵信息供後續階段使用。
    很明顯,K-Max Pooling能夠表達同一類特徵出現屢次的情形,便可以表達某類特徵的強度;另外,由於這些Top-K特徵值的相對順序得以保留,因此應該說其保留了部分位置信息,可是這種位置信息只是特徵間的相對順序,而非絕對位置信息。

    (2)Chunk-Max Pooling——
    把某個Filter對應的Convolution層的全部特徵向量進行分段,切割成若干段後,在每一個分段裏面各自取得一個最大特徵值,好比將某個Filter的特徵向量切成3個Chunk,那麼就在每一個Chunk裏面取一個最大值,因而得到3個特徵值。

    K-Max Pooling是一種全局取Top-K特徵的操做方式,而Chunk-Max Pooling則是先分段,在分段內包含特徵數據裏面取最大值,因此實際上是一種局部Top-K的特徵抽取方式。網絡

    3.學習感想和體會

    經過此次論文學習與報告總結的工做,我收穫良多。
    (1)在選擇論文進行復現的階段,我選擇了我一直特別感興趣的深度學習領域的論文來進行復現,可是說到底,這種「興趣」一直停留在「興趣」層面。研一一年,個人研究方向一直集中在指靜脈識別領域,所閱讀的論文和復現的工做一直是使用傳統的方法來進行特徵的提取,進而加密。可是指靜脈領域當前的研究熱點主要集中在經過機器學習方法來對樣本數較少的數據集進行識別。
    出於爲未來的工做打基礎的考慮,我選擇了一篇用卷積神經網絡對句子進行分類的天然語言處理領域的經典文章來進行復現。在查找選擇的過程當中,我瞭解到有許多提供開源代碼和相應論文的網站,上面的種類也有不少,好比:Papers with Code。首先在天然語言處理(NLP)領域,我瞭解到分類主要包括:Machining Translation,Language Modeling,Question Answering,Sentiment Analysis以及Natural Language Inference等等。其次。在選擇論文的過程當中,我瞭解到7種基本的深度學習工具的基礎知識及使用。其中經常使用的有如下幾種:
    A.TensorFlow
    TensorFlow是Google基於DistBelief進行研發的第二代人工智能學習系統,其命名來源於自己的運行原理。Tensor(張量)意味着N維數組,Flow(流)意味着基於數據流圖的計算,TensorFlow爲張量從圖像的一端流動到另外一端的計算過程。TensorFlow是將複雜的數據結構,傳輸至人工智能神經網中進行分析和處理過程的系統。TensorFlow表達了高層次的機器學習計算,可被用於語音識別或圖像識別等多項機器深度學習領域。TensorFlows對2011年開發的深度學習基礎架構DistBelief進行了各方面的改進,可在小到一部智能手機,大到數千臺數據中心服務器的各類設備上運行。TensorFlow徹底開源。
    B.Caffe
    Caffe是一個清晰而高效的深度學習框架,做者是畢業於UC Berkeley的賈揚清。Caffe的全稱應該是Convolutional Architecture for Fast Feature Embedding,它是開源的,核心語言是C++,支持命令行、Python和MATLAB接口。既能夠在CPU上運行也能夠在GPU上運行。License是BSD 2-Clause。Caffe能夠應用在視覺、語音識別、機器人、神經科學和天文學領域。
    C.Torch
    Torch已經存在了十多年的時間,是一個普遍支持機器學習算法的科學計算框架,具備簡單和快速的腳本語言LuaJIT和底層C/CUDA實現, Facebook開源了Torch深度學習庫包。
    Torch的特色包括:具備強大的n維數組;具備豐富的索引、切片和transposing的例程;經過LuaJIT的C接口;線性代數例程;基於能量的神經網絡模型;數值優化例程;支持快速高效的GPU;可移植嵌入到iOS、Android和FGPA平臺。
    ❤最終我選擇用Tensorflow來實現一個簡單的用於文本分類的卷積神經網絡❤
    (2)在整個閱讀論文、理解論文、復現論文的過程當中,我意識到本身在「讀論文」這方面還存在很大的不足。拿到一篇論文,先翻譯成中文讀一遍,在讀一遍英文確認細節,看似好像沒有問題,也算是「完成了任務 」,可是對於一篇好論文來講是遠遠不夠的。論文中的精髓部分仍是沒有學習和領會到,只是草草了事罷了。我認爲要想讀好一篇論文,讀懂表面意思只是第一步,第二步也是最重要的一步就是嘗試去復現論文裏所做的工做。在復現的過程當中,一遍遍地去讀論文,五遍十遍都不爲過,每一遍都能有新的體會,新的思考,讀完每一遍都能發現上一遍本身陷入了哪些誤區,哪些知識點自覺得懂了,可是其實沒有。我以爲這個過程是使人欣喜的,使人不斷地思考本身在學習的過程當中存在哪些不足。做者爲何要選取這種方法,做者是如何創建模型的,針對某一類問題選擇這個模型的依據在哪裏。爲了復現論文裏的工做,首先個人數據集從哪裏來,在這樣一個小數據集的狀況下,我怎麼去劃分訓練集和測試集。我如何選取一個單變量,從而造成對比。在訓練時,參數如何選取,這個參數是始終肯定的,仍是不斷根據模型更新的。這些都是須要考慮的問題。我一開始以爲這些都是細節,可是時間久了才發現,「由小見大」,「因小失大」說的都是細節處見真知的道理。
    (3)在此次論文復現的過程當中,個人另外一個重要感想就是凡事不能到了眼前再打算。一開始以爲一週時間搞定一篇論文綽綽有餘,但是當事情真的逼到眼前了,才發現這個時候可能還有其餘事的存在會影響本身的進度。不知不覺中,研一已通過去了。在這一年裏,有收穫也有對不足的反思。但願從如今開始,抓緊時間,多讀論文,投身科研吧!

3.參考資料

Papers with Code
深度學習工具介紹
Convolutional Neural Networks for Sentence Classifification
Convolutional Neural Network for Text Classification in Tensorflow
Word Embedding的發展和原理簡介
Word2Vector
TensorBoard可視化工具
softmax函數詳解
天然語言處理中CNN模型幾種常見的Max Pooling操做
Implementing a CNN for Text Classification in TensorFlow

相關文章
相關標籤/搜索