自然語言處理神經網絡模型入門

主要內容

  • 自然語言輸入編碼
  • 前饋網絡
  • 卷積網絡
  • 循環網絡(recurrent networks )
  • 遞歸網絡(recursive networks)
  • 自動計算梯度的計算圖抽象( the computation graph abstraction for automatic gradient computation)

1.神經網絡中的術語

  • feature:具體的語言輸入
  • input vector: the actual input that is fed to the neural-network classifier
  • input vector entry: 輸入的特定值(a specific value of the input)

數學符號

  • 加粗大寫字母(XY, Z ) 表示矩陣
  • 加粗小寫字母代表向量 b
  • W1表示神經網絡中的第一層
  • (W)2 (W1)2 矩陣的冪
  • [v1;v2] 表示向量連接

2.神經網絡架構

feed-forward networks
: 包括具有完全連接層的網絡,例如多層感知器,以及具有卷積(convolutional )和池化層(pooling)的網絡。 All of the networks act as classifiers, but each with different strengths.

  • Fully connected feed-forward neural networks (完全連接層)

    1. 在任何使用線性學習器的地方都可以用作替代品。
    2. 非線性網絡以及容易集成預訓練的字嵌入能力,通常可以提高分類的準確性
    3. 作為分類器的替代品,provide benefits for CCG supertagging, dialog state tracking, pre-ordering for statistical machine translation and language modeling.
  • Networks with convolutional and pooling layers

    1. 對于我們希望找到關于class membership的強大本地線索的分類任務非常有用,但這些線索可以出現在輸入的不同位置
    2. 允許模型學習找到這樣的local indicators,而不用管其位置。
    3. show promising results(有希望的結果) on many tasks, including document classification(文件分類),short-text categorization(短文本分類),sentiment classification(情感分析),relation type classification between entities(實體之間的關系類型分類), event detection(事件探測), paraphrase identification(釋義識別), semantic role labeling(語義角色標注),question answering(問答),predicting box-office revenues of movies based on critic reviews(基于評論的票房預測),modeling text interestingness(建模文本的趣味性),and modeling the relation between character-sequences and part-of-speech tags(模擬字符序列和詞性標簽之間的關系).
    4. 缺點:為了將任意大的 item 編碼為捕獲其最顯著特征的固定大小向量,它犧牲了大部分結構信息。
    5. 幸運的是, 循環和遞歸架構允許我們使用序列(sequences)和樹(tree),同時保留大量結構信息

遞歸網絡(recursive networks)
: 旨在模擬序列

  • can produce very strong results for language modeling(語言建模), sequence tagging(序列標記),machine translation(機器翻譯),dependency parsing(依存關系句法分析),sentiment analysis,noisy text normalization(噪雜文本規范化),dialog state tracking(對話狀態跟蹤),response generation(響應生成),modeling the relation between character sequences and part-of-speech tags(模擬字符序列和詞性標簽之間的關系)

循環網絡
: can handle trees

  • 可以產生最先進或接近最先進的結果 for constituency and dependency parse re-ranking(選區和依賴解析重排序), discourse parsing(語義關系分類),semantic relation classification(語義關系分類),political ideology detection based on parse trees(政治意識形態檢測),sentiment classification,target-dependent sentiment classification(依賴目標的情緒分類),question answering.

3.特征表示

  • a feed-forward neural network 是一個函數 NN(x),其輸入是一個din dimensional vector x,輸出是doutdimensional output vector
  • 該函數作為一個分類器,assigning the input x a degree of membership in one or more of dout classes(為輸入x在一個或多個dout類中分配一個隸屬度)
  • 不再將每個特征表示為唯一維度而是將其表示為密集向量。也就是說,將每個核心特征嵌入到d維空間中,并表示為該空間的向量。然后可以像函數NN的其他參數一樣訓練這種嵌入。
  • 基于前饋神經網絡的NLP分類系統的基本架構如下:
    1. 提取一系列與預測輸出項相關的核心語言特征f1,.....,fk
    2. 對于每個感興趣的特征fi,檢索對應的向量v(fi)
    3. 將這些向量組合成輸入向量x
    4. 將x饋入非線性分類器
  • 這個結構的關鍵在于使用密集型特征向量而不是稀疏特征向量,使用核心特征而不是特征組合
    [圖片上傳失敗...(image-2d7ec1-1539350214260)]
  • 對于這些核心特征的表示主要有稀疏和稠密兩種表現形式即one-hot和Dense Vectors,如上圖所示。其主要區別為:
    1)one-hot:每個維度表示一個特征,其特征值是二維的,即若該特征值存在即為1,不存在則為0。每個特征都有其自身的維度。
    2)Dense Vectors:每個核心特征代表一個向量,每個輸入向量X對應幾個輸入向量條目。特征到向量的映射來自于嵌入表。每個特征都是d維向量,訓練會使得相似的特征具有相似的向量。
  • 應用場景
    1)如果我們在一個類別中具有相對較少的不同特征,并且我們相信在不同特征之間沒有關系,這時采用one-hot表示。
    2)如果我們相信在一個組的不同特征之間存在聯系,那么此時應該采用Dense Vectors,可以讓神經網絡弄清楚特征間的相關性并通過共享參數獲得一些統計強度

3.1可變數量的特征

  • 在很多情況下,特征的數量我們提前是不知道的。因此,我們需要用一個固定長度的向量表示一組無限數量的特征。一種方法就是CBOW(連續詞袋),它與傳統的詞袋表示非常相似但是拋棄了順序信息。
  • CBOW(f1,...,fk) =\frac{1}{k} \sum_{i=1}^{i=k} v(f_{i})
  • 一個CBOW表示的變體就是權重CBOW,不同的向量有不同的權重:
    WCBOW(f1,...,fk) =\frac{1}{\sum_{i=1}^{i=k}a_{i}} \sum_{i=1}^{i=k} a_{i}v(f_{i})
    a_{i}:表示不同特征的相對重要性。例如,a_{i}可以是TF-IDF分數

3.2距離和位置特征

  • 句子中兩個詞的先行距離可以被看成一個informative feature
  • 距離特征編碼:將距離分成幾組,每一組(bin)與一個d維向量相關聯(得到distance-embedding vector),然后將這些向量作為網絡中的常規參數去訓練

3.4特征組合

  • 在神經網絡中,特征提取僅涉及核心特征
  • 在傳統的基于線性模型的神經網絡中,功能設計師不僅要手動指定感興趣的核心特征,還要指定這些特征之間的相互關系。
  • 在線性模型中特征組合很重要,因為他們為輸入引入了更多的維度,使得空間數據點更接近線性可分。?
    而在神經網絡中定義的非線性的分類器用于尋找指定的特征組合,減少了工程量
    -Kernel methods(核方法)允許功能設計師僅指定核心特征,而將特征組合的方面留給學習算法,它允許精確的最優化問題。然而,其運算復雜度與訓練的數據量成線性關系,因此不適用于很大的數據集。神經網絡的分類的復雜度與訓練的數據大小無關,而只與神經網絡的大小線性相關。

3.5維度(Dimensionality )

  • 維度隨著類成員的數量增加而增長。
  • 由于維度對內存需求和處理時間有直接的影響,所以要多嘗試幾次不同的大小,選擇一個在速度和任務準確性上選擇一個最好的。

3.6特征共享(Vector Sharing)

  • 在一些情況下,一些特征共享相同的詞匯表(vocabulary)。
  • 對于兩個向量,是否共享詞匯表是一個經驗問題。如果認為單詞出現在不同位置時表現不同,那么久使用兩個不同的詞匯表。否則就共享一個詞匯表。

3.7網絡輸出(Network’s Output)

  • 在多類分類問題中,網絡的輸出是一個k維向量,每個維度代表一個特定輸出類的強度。也就是說,輸出仍然保持在傳統的線性模型中。
  • 在第四章中,輸出層對應一個d*k維的矩陣。其中,每一列表示d維embeddings,向量表示之間的相似性表示輸出類之間模型學習的相似性。

4.前饋神經網絡

本章包括:

  • representation power
  • common non-linearities
  • loss function

4.1一個典型的神經網絡如下圖所示:

[圖片上傳失敗...(image-559882-1539350214260)]
1)其中,每個圓圈代表一個神經元,射入箭頭是神經元的輸入,射出箭頭是神經元的輸出。每個箭頭都攜帶一個權重,代表其重要性。
2)最底層沒有傳入箭頭,是網絡的輸入層。最頂層沒有外出箭頭,是網絡的輸出層。其他層稱之為“隱藏層”。神經元中的\int代表一個非線性函數,通常是\frac{1}{1+e^{-xa}}
3)在這個圖的表示中,每一個神經元都與下一層的所有神經元相連接,對于類似網絡結構稱之為完全連接層或者仿射層
4)將具有標量輸入和輸出的計算單元看作神經元,計算出每個神經元與其權重的乘積,在進行加和,之后通過一個非線性函數對該加和進行運算,得到輸出。
5)下面,用一些簡潔的數學符號來描述整個運算過程。

  1. 把輸入層看成一個4維的向量x,其上層是一個6維向量(h1)
  2. h = xW,其中W是一個向量矩陣,W_{ij}指的是輸入行中第i個神經元與其連接的第j個神經元的權重
  3. 每次向下層傳遞時,都要經過激活函數g的變換
  4. 因此,第三層得到的輸入為:(g(x****W1))W2

4.2用數學符號表示

  • 最簡單的神經網絡是感知機,是關于輸入的一個線性函數:

NN_{Perception}(x) = xW + b (x∈R^{d_{in}},W∈R^{d_{in}*d_{out}}, b∈R^{d_{out}}
其中,W是權重矩陣,b是偏差項

  • 包含一個隱藏層的多層感知機(MLP1):

NN_{MLP1}(x) = g(xW^{1} + b^{1})W^{2} +b^{2}
(x∈R^{d_{in}},W^{1}R^{d_{in}*d_{1}}, b^{1}R^{d_{1}}, W^{2}R^{d_{1}*d_{2}},b^{2}R^{d_{2}}

  • 包含兩個隱藏層的多層感知機(如上圖所示):

NN_{MLP2}(x) = g^{2}(g^{1}(xW^{1} + b^{1})$$W^{2} +b^{2})W^{3}

使用中間變量可能更清晰:

NN_{MLP2}(x) = y
h^{1} = g^{1}(xW^{1} + b^{1})
h^{2} = g^{2}(h^{1}W^{2} + b^{2})
y = h^{2}W^{3}

1)由每個線性變換產生的向量成為"layer",最外層變換結果成為輸出層(其偏差項往往為0),其他線性變換稱為"hidden layer"(每個"hidden layer"都要經過一個非線性的激活函數)。
2)具有多個隱藏層的網絡稱為是深度網絡,因此也稱深度學習
3)神經網絡的每一層將d_{in}維向量作為其輸入,并將其轉換為d_{out}維向量。層的維度被視為其輸出的維度。對于感知機來說,x的維度是1d_{in},W的維度是d_{in}*d_{out},b的維度是1d_{out}
4)對于d_{out},

  • 如果d_{out}=1,那么網絡的輸出是一個標量,以通過輸出的值來用于回歸(或評分),或者通過查詢輸出的符號用于二進制分類
  • 如果d_{out}=k > 1,可以將每一個維度與一個類相關聯,并找出具有最大值的維度,以此用于k-class分類。如果輸出向量條目為正并且總和為1,則可以將輸出看作為類分配上的分布。(這種輸出歸一化常在輸出層上應用,通過softmax變換來實現)

4.3 表現力

  • MLP1是一種通用的逼近器,他可以用所需的非零誤差逼近一系列函數,包括R^{n}有界子集上的所有連續函數,以及從任何有限維離散空間到另一個有限維離散空間的任何函數映射
  • 然而,MPL1并不能保證訓練算法可以找到生成訓練數據的正確函數,也沒有說明隱藏層應該有多大。
  • 因此,在實踐中,我們使用本地搜索算法在相對少量的數據上訓練,并且使用相對適中的隱藏層(上限幾千)。

4.4 Common Non-linearities(常見的非線性,即激活函數g)

在什么場景下使用哪種非線性函數,目前還沒有一個很好的結論,這大多還是一個經驗問題。常見的非線性函數大概有如下幾種:

  1. Sigmoid(S型)

σ(x) = \frac{1}{1+e^{-x}}, σ(x)\in[0,1]

  1. TANH(雙曲正切)

tanh(x) = \frac{e^{2x}-1}{e^{2x}+1},tanh(x)\in[-1,1]

3.HARD TANH(是tanh的近似值,其計算速度更快)

hardtanh(x) = \begin{cases} -1 \qquad & x \lt -1 \\ 1 \qquad & x \gt 1 \\ x \qquad & otherwise \end{cases}

4.RELU(整流線性單元,易于使用,結果出色)

ReLU(x) = max(0, x) = = \begin{cases} 0 \qquad & x \lt 0 \\ x \qquad & otherwise \end{cases}

5.根據經驗,其工作性能:RELU > tanh > singmoid

注:另外兩種的工作性能在不同情況下有很好的非線性

1)Cube:g(x) = x^{3} ,它在用于預測行動的前饋網絡中更有效
2)tanhCube: g(x) = tanh(x^{3} + x), 在用于基于圖形的依賴解析器的結構預測中的一個組件更有效。
這些激活功能在某些情況下可以改善性能,但其通用性還不確定

4.5輸出轉換(Output Transformations)

  • 當我們對可能的輸出類的概率分布建模感興趣時,我們可以采用softmax轉換,將輸出向量轉換成為一個非負實數的向量且總和為1,并使其成為k個可能結果的離散概率分布。

    x =x1, . . . , xk

    softmax(xi) = \frac{e^{x_{i}}}{\sum_{j=1}^{k}e^{x_{j}} }

  • 為了更高效,softmax通常與概率訓練目標一起使用,例如交叉熵

  • 當softmax應用于沒有隱藏層的output時,結果是著名的多項邏輯回歸模型,也稱最大熵分類器

4.6 嵌入層(Embedding Layers)

  • 在NLP應用中,輸入向量x由幾個嵌入向量組成。我們可以明確x的來源,并將其包含在網絡的定義中。我們引入c(·),一個從核心特征到輸入向量的函數。
    1)c通常提取與每個特征相關聯的嵌入向量,并進行連接。

    x = c(f1, f2, f3) =[v(f_{1}); v(f_{2}); v(f_{3})]

    NN_{MLP1}(x) =NN_{MLP1}(c(f_{1},f_{2},f_{3}))
    =NN_{MLP1}([v(f_{1}); v(f_{2}); v(f_{3})])
    =(g([v(f_{1}); v(f_{2}); v(f_{3})]$$W^{1} + b^{1}))W^{2} + b^{2}

    2)另一個常見的選擇是c對嵌入向量求和(假設嵌入向量具有相同的維度)

    x = c(f1, f2, f3) =[v(f_{1})+v(f_{2})+v(f_{3})]

    NN_{MLP1}(x) =NN_{MLP1}(c(f_{1},f_{2},f_{3}))
    =NN_{MLP1}([v(f_{1})+v(f_{2})+v(f_{3})])
    =(g([v(f_{1})+v(f_{2})+v(f_{3})]$$W^{1} + b^{1}))W^{2} + b^{2}

  • 假設有一個V個單詞的詞表,每個詞嵌入d維向量 。則可以將向量集合視為| V |×d的嵌入矩陣E,其中每行對應嵌入特征。令:
    f_{i}: 1 x |V|向量,除了一個索引值為1外全為0(該索引對應第i個特征的值)
    f_{i}E將選擇相應的E的行,因此,v(f_{i})可以用E和f_{i}來定義,即:v(f_{i}) = f_{i}E
    例如:
    f_{2} = (0,1,0),E=\begin{pmatrix} a_{1} & a_{2} & a_{3} & a_{4} \\ b_{1} & b_{2} & b_{3} & b_{4} \\ c_{1} & c_{2} & c_{3} & c_{4} \\ \end{pmatrix}

    因此,v(f_{2}) = (b_{1} ,b_{2} ,b_{3} ,b_{4})

  • 類似的,
    CBOW(f_{1},...,f_{k}) = \sum_{i=1}^{k}(f_{i}E) = (\sum_{i=1}^{k}f_{i})E

  • 然后,網絡的輸入被認為是一個one-hot向量的集合。雖然這在數學上很好地定義,但是有效的實現通常涉及基于散列的數據結構,將特征映射到它們對應的嵌入向量,而不是通過one-hot表示

  • 在本文中,我們將c與網絡架構分開:網絡的輸入始終是密集的實值輸入向量,并且在輸入傳遞到網絡之前應用c

4.6.2 關于符號的注記(A Note on Notation)

當一個網絡的輸入是幾個向量的的連接時,
1)顯式連接:([x;y;z]W+b)

  1. 仿射變換:(xU + yV + zW +b),如果矩陣U,V,W彼此不同,那么這兩種向量表示等價

4.6.3 關于稀疏與密集特征的注記(A Note on Sparse vs. Dense Features)

  • 考慮傳統的沒有嵌入層的網絡,其中
    1. V是所有可用的特征組合,
    2. f_{1},....,f_{k}個特征, f_{i}\inV
    3. 網絡輸入:x = \sum_{i=1}^{k}f_{i}, x\in$$N^{|V|}_{+}
    4. 因此第一層(忽略非線性激活函數):
      xW + b = (\sum_{i=1}^{k}f_{i})W
      W\in R^{|V|*d},b\in R^8dx8unw
  • 這非常類似于在特征上產生CBOW表示的嵌入層,其中矩陣
    1. W充當嵌入矩陣
    2. 主要區別在于偏置矢量b的引入,以及嵌入層通常不經歷非線性激活而是直接傳遞到第一層
    3. 另一個區別是上述情況迫使每個特征接收一個單獨的向量(W中的行),而嵌入層提供更大的靈活性,例如允許特征“next word is dog”和“previous word is dog”共享相同的向量。

4.7 損失函數 (Loss Function)

訓練神經網絡時,就像訓練線性分類器時一樣,需要定義一個損失函數L(\bar{y},y),說明當真實輸出為y時預測\bar{y}的丟失(\bar{y}是網絡的輸出,y則是真實的輸出)。訓練的目標是最小化這種損失。

給定真實預期輸出y時,損失函數L(\bar{y},y)將為網絡的輸出\bar{y}指定數值分數(標量)。損失函數可以是將兩個向量映射到標量的任意函數,出于優化的實際目的,我們將其局限于可以輕松計算梯度(或子梯度)的函數。下面給出一些常用的Loss Function:

  1. Hinge(二進制)
    • 對于一個二元分類問題,網絡的輸出是一個單個的標量\bar{y},預期輸出y\in{+1,-1}。
    • Hinge loss,也稱為邊緣損失或SVM loss
    • L_{hinge(binary)}(\bar{y},y) = max(0,1-y*\bar{y})
    • 只有當y*\bar{y} > 0(也就是說,兩者同號)時,分類才正確
    • 如果y*\bar{y} > 0并且|\bar{y}| \ge 1,那么loss為0。也就是說,二元hinge函數要實行正確的分類,其邊界至少為1。
  2. Hinge (multiclass)
    • \bar{y} = \bar{y}_{1},....,\bar{y}_{n},網絡的輸出向量。
      y:one-hot vector,正確的output class
    • 分類規則:選擇具有最高分數的class:
      prediction = arg max\bar{y}_{i}
    • t= arg max_{i}y_{i} : 正確的的class
      k = arg max_{i\ne t} : 最高得分的類
      并且使得k \ne t
      那么,L_{hinge(multiclass)}(\bar{y},y) = max(0,1 - (\bar{y}_{t} - \bar{y}_{k}))
    • 每當我們需要一個 hard decision rule時并且不需要去模擬類成員概率,該方法就很有效
  • Log Loss
    1. 是一個 hinge loss的一個變體,with an infinite margin
    2. L_{log}(\bar y,y) = log(1 + exp(-(\bar{y}_{t} - \bar{y}_{k} )))
  • Categorical Cross-Entropy Loss(分類交叉熵)
    1. 當分數的概率解釋理想時,該方法有效
    2. y = y_{1}, . . . , y_{n},在標簽1,...,n上代表真正的多項分布
      \bar{y} = \bar{y}_{1},....,\bar{y}_{n},是被sonftmax激活函數轉化過的網絡輸出,表示class membership的條件分布,\bar{y}_{i} = P(y = i | x)
    3. 分類交叉熵Loss測量真實標簽分布y和預測標簽\bar{y}的不相似性,并定義為交叉熵:L_{Lcross-entropy}(\bar{y},y) = - \sum_{i} y_{i}log(\bar{y}_{i})
    4. 對于hard classification problems(硬分類問題),其中每個訓練示例僅有一個正確的類分配。此時y是一個one-hot vector,表示正確的class,其交叉熵簡化為:L_{Lcross-entropy(hard classification)}(\bar{y},y) = - log(\bar{y}_{t})
      其中,t為correct class assignment。
    5. 目的:將正確的分類的概率質量設置為1。因為分數\bar{y}使用softmax函數轉換并表示條件分布,所以增加the mass assigned to the correct class意味著減少 the mass assigned to all the other classes。
    6. 益處:不僅能預測 the one-best class label,而且也能預測a distribution over the possible labels。
    7. 但是要使用分類交叉熵Loss時,必須保證網絡輸出已經使用softmax進行了轉換
  • Ranking Losses
    1. 有時,我們并沒有對標簽進行監督,而是根據對正確和不正確的條目x,x^{'}進行監督,并且我們要將正確條目的得分高于錯誤的。當我們只有positive examples時才會出現這樣的訓練情況,從而我們需要通過破壞一個positive examples來得到一個negative examples。在這種情況下有效的損失函數是margin-based ranking loss,定義如下:
      L_{ranking(margin)}(x,x^{'}) = max(0,1 - (NN(x) - NN(x^{'})))
      NN_{x}:網絡給input vector x的打分
      目的:正確的inputs score高于不正確的

    2. 一個通常的變體是使用ranking loss的log version:
      L_{ranking(log)}(x,x^{'}) = log(1 + exp(-(NN(x) - NN(x^{'}))))

    3. 在語言任務中使用ranking hinge loss的例子是,訓練導出預訓練的字嵌入的輔助任務的訓練。我們給出一個正確的單詞序列和損壞的單詞序列,我們的目標是正確序列的得分高于損壞的。

5.Word Embeddings(詞嵌入)

神經網絡方法的一個重要要組成部分是使用嵌入 - 將每個特征表示為低維空間中的向量。但是這些vector來自于何處?這就是本節要討論的內容。

5.1 Random Initialization(隨機初始化)

  • 當有足夠的監督訓練數據時,可以將特征嵌入視為與其他模型參數相同:將嵌入向量初始化為隨機值,并讓網絡訓練程序將它們調整為“good”vectors。
  • 執行初始化的方式
    1. word2vec implementation
      將單詞向量初始化為[-\frac{1}{2d},\frac{1}{2d}]范圍內的均勻采樣隨機數,其中d是維數
    2. xavier initialization
      使用[-\frac{\sqrt{6}}{\sqrtfx3movu}, \frac{\sqrt{6}}{\sqrtlvlc14y}] 的均勻采樣值進行初始化
  • 在實踐中
    1. 使用隨機初始化方法初始化常見特征的嵌入向量,例如詞性標簽或單個字母
    2. 使用某種形式的監督或無監督預訓練來初始化潛在的稀有特征,例如單個單詞的功能。預訓練的vector在網絡訓練過程中被視為fixed vectors或者randomly-initialized vectors

5.2 Supervised Task-Specific Pre-training(有監督的特定任務的預訓練)

  • 如果我們對任務A感興趣,但只有有限數量的標記數據(例如:語法分析)
    若此時有一個輔助任務B,有比較多的標記數據(比如:詞性標記)
  • 我們想要預先訓練我們的word vectors,以便它們作為任務B的預測變量時表現的更好,然后再使用這些訓練過的詞向量來訓練任務A。這樣,我們就可以利用任務B所具有的大量標記數據。
  • 在訓練任務A時,我們可以將預訓練的vector視為fixed,或者將其進一步調整他們用于任務A.另一種選擇是將兩個目標聯合訓練。

5.3 Unsupervised Pre-training(無監督的預訓練)

  • 常見的情況是,我們沒有擁有足夠大量的注釋數據的輔助任務。在這種情況下,我們采用“無監督的“方法,可以在大量未注釋的文本上進行訓練。

  • 訓練單詞向量的技術本質上是監督學習的技術,但我們不是監督我們關心的任務,而是從原始文本創建幾乎無限數量的監督訓練實例,從而希望我們創建的任務與我們關心的最終任務相匹配(或足夠接近)。

  • key idea: "similar" words的嵌入向量具有相似的向量

  • 由于詞的相似性很難定義,因此當前所使用的方法來自于分布假設,即如果兩個詞的上下文相同,那么這兩個詞的表示也是相似的

  • 不同的方法都創建了有監督的訓練實例,其目標是從其上下文預測單詞,或從單詞預測上下文。

  • 在大量未注釋的數據上訓練詞嵌入的一個重要好處是,它為未出現在監督訓練集中的詞提供了向量表示。理想情況下,這些單詞的表示將與訓練集中出現的相關單詞的表示相似,從而允許模型更好的概括unseen events。

  • 常用的無監督學習算法:

    1. word2vec
    2. GloVe
    3. Collobert and Weston embeddings algorithm

    這些模型的靈感來自于神經網絡,并基于隨機梯度訓練(stochastic gradient training)

  • 可以說,輔助問題的選擇(基于什么樣的上下文預測的內容)對結果向量的影響遠遠超過用于訓練它們的學習方法的選擇。因此,我們專注于可用的輔助問題的不同選擇,并且僅略過訓練方法的細節。

  • 值得注意的是,由無監督訓練算法導出的詞嵌入在NLP中除了用于初始化神經網絡模型的詞嵌入層之外,還有廣泛的應用。

5.4 訓練目標

1給定一個詞w和其上下文c
2)不同的算法會制定不同的輔助任務(auxiliary tasks)
3在所有的case下,每個單詞被表示為d維向量,其被初始化為隨機值
4)訓練模型\rightarrow使其很好地執行輔助任務\rightarrow從而產生用于把詞和上下文聯系起來的good word embeddings\rightarrow反過來使得相似單詞的嵌入向量也彼此相似

  • Language-modeling inspired approaches(語言建模的啟發式方法),目標是根據其上下文預測單詞。這是在概率設置中提出的,試圖去模擬條件概率P(w|c)
  • 其他方法將問題簡化到二進制分類的問題:
  1. 除了觀察到的 ”word-context pairs“的集合D之外,還生成了一個"random words and context pairings"的集合\bar{D}
  2. 二元分類的問題是:給定的(w,c)對是否來自集合D?
  3. 這些方法有三個不同之處\begin{cases} 如何構造集合\bar{D} \\ 分類器的結構 \\ 優化的目標 \end{cases}

5.5 上下文的選擇

  • context:單詞的上下文。是指出現在其周圍的其他單詞(可以是在其周圍的短窗口中,也可以是在同一個句子,段落或文檔中)。在某些情況下,文本是由語法分析器自動解析的,并且上下文是從自動分析樹引發的語法鄰域派生的。
  • 有時,單詞和上下文也可以是單詞的一部分,例如前綴或后綴
  • 神經詞嵌入源于語言建模的世界,其中訓練網絡以基于先前詞的序列預測下一個詞。
  1. 在這里,文本用于創建輔助任務,其中目的是基于k個先前詞的上下文來預測詞。
  2. 雖然對語言建模輔助預測問題的訓練確實產生了有用的嵌入,但是這種方法受到語言建模任務的約束,其中只允許查看前面的單詞。
  3. 如果我們不關心語言建模而只關心最終的嵌入,我們可以通過忽略這個約束并使上下文成為焦點詞的對稱窗口來做得更好。

5.5.1 窗口方法(Window Approach)

  • 滑動窗口方法
  1. 輔助任務的創建:查看2k + 1個字的序列,其中中間的詞被稱為是焦點詞,焦點詞的兩邊各有k個詞,成為context(上下文)
  2. 隨后:
    1)創建一個任務,其目標是基于所有上下文的詞(用CBOW或矢量連接)來預測焦點詞。
    2)或者創建2k個不同的任務(distinct tasks),每個任務將焦點詞與不同的上下文詞配對。
  3. 2k任務方法被稱為Skip-gram模型,基于Skip-gram的方法被證明對于訓練是強健和有效的,并且經常產生最先進的結果。
  • 窗口大小的影響:滑動窗口的大小對結果向量的相似性有很大的影響。
    1)較大的窗口傾向于產生更多的局部相似性(即“dog”, “bark” 和 “leash” 將被組合在一起,以及 “walked”, “run” 和 “walking”)
    2)較小的窗口傾向于產生更多的功能和句法相似性(即“Poodle”(貴賓犬), “Pitbull”(比特犬), “Rottweiler”(羅威犬), or “walking”,“running”和“approaching”)
  • 帶位置的窗口(Positional Windows)
    1)當使用CBOW或skip-gram上下文表示時,窗口內的所有不同上下文單詞被平等對待,即焦點詞的距離、是出現在焦點詞前還是后沒有區別。
    2)通過使用positional contexts可以考慮這樣的信息:為每個上下文單詞指示它與焦點單詞的相對位置(即,上下文單詞不是“the”而是“the:+2”,表示單詞出現在焦點詞右側的兩個位置)。
    3)優點:①與小窗口的結合能產生更多語法相似性,并且具有將共享詞性的詞組合在一起的強烈傾向,以及在語義功能上相似
    ②當用于初始化網絡以進行詞性標注和語法依賴性解析時,Positional vectors比window-based vectors表現的更加有效。
  • Variants(變體):窗口方法可能有許多變體。
    1)可以在學習之前對單詞進行詞典化,應用文本歸一化,過濾太短或太長的句子,或者去除大小寫。
    2)可以對語料庫的一部分進行子樣本處理,跳過一些常見的或太罕見的焦點詞的窗口的創建任務。
    3)窗口大小可以是動態的,在每次嘗試中使用不同的窗口大小。可以用不同的方式來衡量窗口的不同位置,更多地關注于試圖正確的預測附近的word-context pairs而不是更遠的。
    4)這些選擇中的每一個都將影響結果向量。

5.5.2 Sentences, Paragraphs or Documents

  • 使用skip-gram(或CBOW)方法,可以將單詞的上下文視為與同一句子,段落或文檔中出現的所有其他單詞。
  • 這相當于使用非常大的窗口,并且會捕獲與主題相似的word vector(來自同一主題的單詞,即人們期望出現在同一文檔中的單詞,很可能會接收到類似的向量)

5.5.3 句法窗口(Syntactic Window)

  • 一些工作用句法替換句子中的線性上下文。
  • 文本被依賴解析器自動解析,單詞的上下文被視為在解析樹中的近似,兩者被句法關系相連。
  • 這些方法產生highly functional similarities,將單詞分組而不是在句子中填充相同的角色(例如,不同的顏色、學校的名稱、行為動詞)。

5.5.4 多種語言(Multilingual)

  • 另一種選擇是使用多語言、基于翻譯的上下文。
  • 例如,給定大量句子對齊的并行文本,可以運行雙語對齊模型,例如IBM模型1或模型2(即使用GIZA ++軟件),然后使用生成的對齊方式來推導單詞上下文。這里,一個單詞實例的上下文是與其對齊的外語單詞。這樣的對比往往會導致得到相似向量的同義詞。
  • 有時候我們不依賴詞對齊,而是使用句子對齊。
  • 一種吸引人的方法是將單語窗口方法與多語言方法相結合,創建兩種輔助任務。
  • 這很可能產生類似于基于窗口的方法的向量,但減少了基于窗口方法的一些不希望的影響,其中的反義詞(例如熱和冷,高和低)傾向于接收類似的向量。

5.5.5 基于字符和子字表示(Character-Based and Sub-word Representations)

  • 一個有趣的工作是嘗試從組成它的字符中導出一個單詞的向量表示。
    1. 對于語法上的任務特別有效,因為單詞中的字符模式與它們的句法功能密切相關。
    2. 這些方法也有利于產生非常小的模型尺寸(對于字母表中的每個字符,只需要存儲一個矢量以及少量的小矩陣),并且能夠為可能遇到的每個單詞提供嵌入向量。
  • 從字符的表示中獲得單詞的表示是由未知單詞問題驅動的:當遇到一個沒有嵌入向量的單詞時你會怎么做?
    • 在字符級別上工作很大程度上緩解了這個問題,因為可能字符的詞匯比可能單詞的詞匯要小得多。
    • 但是,處理字符級別非常具有挑戰性,因為語言中的形式(字符)和功能(語法,語義)之間的關系非常松散。
    • 因此一些研究人員提出了一個中間立場,將word表示為其自身向量與構成它的子詞單元的向量的組合。
    • 然后,子詞嵌入有助于在相似形式的不同單詞之間共享信息,并且當詞未被觀察時時允許返回到子詞級別
    • 同時,只要有足夠的詞觀察樣本,模型不會被迫僅僅依賴于形式

6. 神經網絡訓練

  • 神經網絡訓練:利用梯度的方法,使訓練集上的損失函數最小
  • 錯略的說,所有的訓練方法無非為三種:
    1. 重復計算數據集上的誤差估計
    2. 計算相對于誤差的梯度
    3. 沿梯度相反的方向移動參數
  • 各個模型的不同之處在于如何計算誤差估計,以及如何定義“在梯度的相反方向上移動”。

6.1 隨機梯度訓練(Stochastic Gradient Training)

  • 訓練神經網絡的常用方法是使用隨機梯度下降(SGD)算法或其變體。SGD是一種通用優化算法。
  • 算法工作流程如下:
    Input: f(x; θ) ,參數θ,輸入向量x
    Input: 訓練輸入集x_{1}, . . . , x_{n} 和輸出集y_{1}, . . . , y_{n}
    Input: 損失函數L.
    while 停止標準未滿足 do
    ?訓練樣例抽樣:xi, yi
    ?計算損失 L(f(xi;θ), yi)
    ?計算L(f(x_{i};θ), yi)關于θ的梯度\rightarrow\hat{g}
    ?θ ← θ ? η_{t}\hat{g}
    return θ
    1)該算法的目標是設置參數θ,以便最小化訓練集上的總損失\sum_{i=1}^{n}L(f(x_{i} ;θ), y_{i})
    2)它通過重復抽樣訓練示例并根據參數θ計算樣例中的誤差梯度來工作--- 假設輸入和預期輸出是固定的,并且將損失視為參數θ的函數
    3)然后在梯度的相反方向上更新參數θ,通過learning rate η_{t}進行縮放。learning rate可以在整個訓練過程中固定,也可以作為時間步長t的函數進行衰減。
    4)缺點:不精確,只針對一個訓練樣例,會產生noise,從而導致導致不準確的梯度。
  • minibatch SGD algorithm(小批次SGD訓練)
    Input: 函數 f(x; θ) ,參數θ.
    Input: 訓練輸入集x_{1}, . . . , x_{n} 和輸出集y_{1}, . . . , y_{n}
    Input: 損失函數L
    while 停止標準未滿足
    ?抽取一個含有m個樣例的minibatch {(x_{1}, y_{1}), . . . ,(x_{m}, y_{m})}
    ?\hat{g}\leftarrow0
    ?for i = 1 to m
    ???計算損失L(f(x_{i};θ), y_{i})
    ???\hat{g}\hat{g}+ \frac{1}{m}L(f(x_{i};θ), y_{i})關于θ的梯度
    ?θ ← θ ? η_{t}\hat{g}
    return θ
    1)在第6-9行中,算法基于minibatch來估計語料庫損失的梯度。在循環之后,g包含梯度估計,并且參數θ朝向g更新。
    2)小批次的sizem可以從1到n。較高的值能夠對語料庫范圍梯度產生更好的估計,而較小的值允許更多的更新,并且反過來可以更快地收斂。
    3)除了提高梯度估計的準確性之外,小批量算法能夠提高訓練效率。對于適度的m大小,一些計算架構(即GPU)允許在第6-9行中有效地實現并行計算。如果函數是凸的,那么通過適當降低學習率,SGD可以保證收斂到全局最優。但是,它也可以用于優化非凸函數,如神經網絡。雖然不再能保證找到全局最優,但該算法在實踐中表現也很好。
  • 在訓練神經網絡時,函數f是神經網絡,參數θ是線性變換矩陣,偏置項,嵌入矩陣等。梯度計算是SGD算法以及所有其他神經網絡訓練算法中的關鍵步驟。
  • 那么,如何根據參數計算網絡誤差的梯度呢?可以使用backpropagation algorithm(反向傳播算法)。

6.1.1 Beyond SGD

  • 雖然SGD算法可以并且通常確實產生了良好的結果,但也可以使用更先進的算法。SGD擴展可以通過SGD+Momentum或者Nesterov Momentum進行算法優化,也可以通過自適應學習率進行優化,常見的有AdaGrad、AdaDelta、RMSPorp、Adam適用于不同的網絡結構。

6.2 計算圖抽象(The Computation Graph Abstraction)

  • 雖然可以手動計算網絡各種參數的梯度并在代碼中實現它們,但這個過程既麻煩又容易出錯。在大多數情況下,最好使用自動工具進行梯度計算。計算圖抽象允許我們輕松構建任意網絡,評估它們對給定輸入的預測(正向傳遞),并計算其參數相對于任意標量損失的梯度(向后傳遞)。
  • 圖計算是任意數學計算的表示,它是有向無環圖(DAG),其中節點對應于數學運算或變量,邊對應于節點間中間值的流動。圖結構根據不同組件之間的依賴關系定義計算的順序。圖是DAG而不是樹,因為一個操作的結果可以是幾個連續的輸入。
  • 例如:上圖的結果是 (a ? b + 1) ? (a ? b + 2)[圖片上傳失敗...(image-7e8911-1539350214260)]
  • 由于神經網絡本質上是一種數學表達式,因此它可以表示為圖計算。例如,圖3a給出了具有一個隱藏層和softmax輸出變換的MLP的計算圖。在我們的表示法中,橢圓形節點表示數學運算或函數,陰影矩形節點表示參數。網絡輸入被視為常量,并且沒有周圍節點。輸入和參數節點沒有傳入弧,輸出節點沒有傳出弧。每個節點的輸出是矩陣,其維度在節點上方指示。
  • 但此圖表不完整:由于未指定輸入,我們無法計算輸出。圖3b顯示了MLP的完整圖表,該圖表將三個單詞作為輸入,并預測第三個單詞的詞性標簽的分布。此圖可用于預測,但不用于訓練,因為輸出是向量(不是標量),圖表未考慮正確答案或損失項。最后,3c中的圖表顯示了特定訓練示例的計算圖,其中輸入是單詞“the”,“black”,“dog”(嵌入),預期輸出是“NOUN”(其索引是5)。pick節點實現索引操作,接收向量和索引(在本例中為5)并返回向量中的相應條目。
    [圖片上傳失敗...(image-2d2d27-1539350214260)]
  • 一旦構建了圖形,就可以直接運行正向計算(計算結果)或反向計算(計算梯度),如下所示。構建圖表可能看起來令人生畏,但使用專用軟件庫和API實際上非常容易。

6.2.1 正向計算(Forward Computation)

  • 正向傳遞計算圖中節點的輸出。由于每個節點的輸出僅取決于它自身和它的輸入邊,所以通過以拓撲順序遍歷節點,并根據其之前已經計算得到的輸出計算每個節點的輸出,以此來計算所有節點的輸出是很簡單的。
  • 在N個節點的圖中,索引 i 與各個節點的拓樸順序相關聯,f_{i}是節點 i 的計算功能(如:乘法、加法)。π(i)是節點 i 的父節點,π^{-1}(i)= { j | i ∈ π(j)}是節點 i 的子節點。v(i)表示節點i的輸出,即f_{i}對其參數π^{-1}(i)的輸出值的application。
  • 對于變量和輸入節點,f_{i}是常數函數,π^{-1}(i)是空的。該算法計算所有的v(i),其中 i∈ [1, N]。
  • Computation Graph Forward Pass:
    for i = 1 to N
    ??Let a_{1}, . . . , a_{m} = π^{-1}(i)
    ??v(i) ← f_{i}(v(a_{1}), . . . , v(a_{m}))

6.2.2 反向計算(Backward Computation)

  • 向后傳遞從指定具有標量輸出(1×1)的節點N作為 loss-node開始,并向前計算直到該節點。Backward Computation計算相對于該節點的值的梯度。
  • d(i) = \frac{?N}{?i},反向傳播算法用于計算所有節點 i 的值d(i)。
  • Computation Graph Backward Pass (Backpropagation):
    d(N) ← 1
    for i = N-1 to 1
    ??d(i) ← \sum_{j∈π(i)}d(j)·\frac{?f_{i}}{?i}

其中,\frac{?f_{i}}{?i}: 是f_{j}π^{-1}(j)對 i 求偏導, i ∈ π^{-1}(j)。該值依賴于f_{j}和它的參數v(a_{1}),...,v(a_{m})(其中a_{1}, . . . , a_{m} = π^{-1}(j)),這些值是在向前傳遞中計算的。

  • 因此,為了定義新類型的節點,需要定義兩種方法:一個用于根據節點輸入計算正向值v(i),另一個用于計算\frac{?f_{i}}{?x},對于每一個x∈ π^{-1}(i)

6.2.3 Software

  • 幾個軟件包實現了計算圖模型,包括Theano,Chainer,penne和CNN / pyCNN。所有這些軟件包都支持所有基本組件(節點類型),用于定義各種神經網絡體系結構,涵蓋本教程中描述的結構等。通過使用運算符重載,圖形創建幾乎是透明的。框架定義了一種表示圖形節點的類型(通常稱為表達式),用于構造輸入和參數的節點的方法,以及一組函數和數學運算,它們將表達式作為輸入并產生更復雜的表達式。例如,使用pyCNN框架從圖3c創建圖計算的python代碼是:
import pycnn as pc
# model initialization.
model = pc.Model()
pW1 = model.add_parameters((20,150))
pb1 = model.add_parameters(20)
pW2 = model.add_parameters((17,20))
pb2 = model.add_parameters(17)
words = model.add_lookup_parameters((100, 50))
# Building the computation graph:
pc.renew_cg() # create a new graph.
# Wrap the model parameters as graph-nodes.
W1 = pc.parameter(pW1)
b1 = pc.parameter(pb1)
W2 = pc.parameter(pW2)
b2 = pc.parameter(pb2)
def get_index(x): return 1 # place holder
# Generate the embeddings layer.
vthe = pc.lookup(words, get_index("the"))
vblack = pc.lookup(words, get_index("black"))
vdog = pc.lookup(words, get_index("dog"))
# Connect the leaf nodes into a complete graph.
x = pc.concatenate([vthe, vblack, vdog])
output = pc.softmax(W2*(pc.tanh(W1*x)+b1)+b2)
loss = -pc.log(pc.pick(output, 5))
loss_value = loss.forward()
loss.backward() # the gradient is computed
                # and stored in the corresponding
                # parameters.

  • 大多數代碼涉及各種初始化:第一個塊定義了在不同計算圖之間共享的模型參數(回想一下,每個圖對應于特定的訓練示例)。第二個塊將模型參數轉換為圖形節點(表達式)類型。第三個塊檢索表達式以嵌入輸入單詞。最后,第四個塊是創建圖形的位置。請注意圖形創建是多么透明——在創建圖形和數學描述圖形之間幾乎存在一對一的對應關系。最后一個塊顯示前進和后退。其他軟件框架遵循類似的模式。

6.2.4 Implementation Recipe

  • 用圖抽象計算的神經網絡訓練的偽代碼(minibatch的大小為1):
    定義網絡參數
    for iteration = 1 to N
    ??for 訓練樣例x_{i},y_{i}(在數據集中)
    ???loss_node \leftarrow build_computation_graph(x_{i},y_{i},arameters)
    ???loss_node.forward()
    ???gradients \leftarrow loss_node().backward()
    ???parameters \leftarrow update_parameters(parameters, gradients)
    return parameters
  • 這里,build_computation_graph是一個用戶定義的函數,它為給定的輸入,輸出和網絡結構建立計算圖,返回單個loss node。update_parameters是特定于優化程序的更新規則。The recipe指定為每個訓練示例創建一個新圖。這適用于訓練示例之間的網絡結構變化的情況,例如循環和遞歸神經網絡。對于具有固定結構的網絡,例如MLP,創建一個基本計算圖并且僅改變示例之間的輸入和預期輸出可能更有效。

6.2.5 網絡組成(Network Composition)

  • 只要網絡的輸出是向量(1×k矩陣),通過將一個網絡的輸出作為另一個網絡的輸入來組成網絡,從而創建任意的網絡是很簡單的。圖抽象計算使得這種能力顯而易見:計算圖中的節點本身可以是具有指定輸出節點的計算圖。然后,人們可以設計任意深度和復雜的網絡,并且由于自動前向和梯度計算,能夠輕松地評估和訓練它們。這使我們很容易定義和訓練結構化輸出和多目標訓練的網絡,以及復雜的循環和遞歸網絡。

6.3優化問題

  • 一旦考慮了梯度計算,就使用SGD或其他基于梯度的優化算法對網絡進行訓練。被優化的函數不是凸的,長期以來,神經網絡的訓練被認為是一種“黑色藝術”,只能由少數人完成。實際上,許多參數會影響優化過程,因此必須注意調整這些參數。雖然本教程不打算作為成功訓練神經網絡的全面指南,但我們在這里列出了一些突出的問題。

6.3.1 初始化

  • 損失函數的非凸性意味著優化過程可能陷入局部最小值或鞍點,并且從不同的初始點開始(例如,參數的不同隨機值)可能導致不同的結果。因此,建議從不同的隨機初始化開始多次重新訓練,并根據開發集選擇最佳訓練集。對于不同的網絡公式和數據集,結果的方差量不同,無法提前預測。
  • 將權重矩陣W∈R^{d_{in}×d_{out}}初始化為:
    W ~ U[-\frac{\sqrt{6}}{\sqrt{d_{in}+d_{out}}},+\frac{\sqrt{6}}{\sqrt{d_{in}+d_{out}}}]
    其中U [a,b]是[a,b]范圍內的均勻采樣隨機值。
  • He et al 建議:當使用ReLU非線性時,權重應通過從標準偏差為\sqrt{\frac{2}{d_{in}}}的零均值高斯分布中采樣來初始化。涉及深度網絡時,這種初始化更好。

6.3.2 消失和爆炸的梯度(Vanishing and Exploding Gradients)

  • 在深度網絡中,誤差梯度通常在計算圖傳播時消失(變得非常接近0)或爆炸(變得非常高)。在更深層次的網絡中問題變得更加嚴重,特別是在遞歸和循環網絡中。
  • 解決方案包括使網絡更淺,逐步訓練(首先根據一些輔助輸出信號訓練第一層,然后根據實際任務信號修復它們并訓練整個網絡的上層),執行批量標準化(對于每個小批量,將每個網絡層的輸入標準化為零均值和單位方差)或使用旨在幫助梯度流的專用架構(例如,用于循環網絡的LSTM和GRU架構)。
  • 處理爆炸梯度有一個簡單但非常有效的解決方案:如果梯度超過給定閾值(threshold),則剪切梯度。設\hat{g}是網絡中所有參數的梯度,而||\hat{g}||是它們的L_{2}范數。
    設置:\hat{g}\frac{threshold}{||\hat{g}||}$$\hat{g},如果||\hat{g}|| > threshold

6.3.3 飽和和死亡神經元(Saturation and Dead Neurons)

  • 飽和:具有tanh和sigmoid激活的圖層可能會變得飽和,將會導致該圖層的輸出值都接近1(即激活函數的上限)。飽和神經元梯度很小,應該避免。
    改善:飽和神經元是由于進入該層的值太大引起的,可以改變初始化、縮放輸入值的范圍或改變學習速率來控制。另一種選擇是在激活后對飽和層中的值進行標準化,即使用g(h) = \frac{tanh(h)}{||tanh(h)||}來代替g(h) =tanh(h) 。
  • 死亡:具有ReLU激活的層可能會死亡,將會導致大多數或所有值都是負的,因此對于所有輸入都將其限制為零,從而導致該層的梯度為零。
    改善:死神經元是由于進入該層的所有信號都是負的引起的(例如,這可能在大梯度更新之后發生)。可以通過降低學習率來控制。

6.3.4 Shuffling

  • 訓練實例呈現給網絡的順序是很重要的。上面的SGD公式規定在每個回合中隨機選擇一個例子。在實踐中,大多數實現都按順序進行訓練示例。建議在每次通過數據之前對訓練實例進行混洗。

6.3.5 Learning Rate

  • 選擇學習率很重要。學習速率太大會阻止網絡融合到有效的解決方案上。太小的學習率需要很長時間才能收斂。
  • 根據經驗,人們應該嘗試范圍[0,1]范圍內的一系列初始學習率,例如0.001,0.01,0.1,1。
  • 一直監控網絡隨時間的損失,一旦網絡固定在某個固定的區間,則降低學習率。
  • 學習速率調度(Learning rate scheduling)根據觀察到的微小數量來降低速率。常見的調度是將初始學習率除以迭代次數。
  • L'eon Bottou 建議使用η_{t} =η_{0}(1+η_{0}λt)^{-1} 形式的學習率。其中η_{0}是初始學習率,η_{t}是在第t個訓練樣例上使用的學習率,λ是額外的超參數。他進一步建議,在運行整個數據集之前,根據一小部分數據確定η_{0}的良好值。

6.3.6 Minibatches(小批次)

  • 參數更新發生在每一個訓練示例(size為1的小批量)或每個K訓練示例中。一些問題受益于larger minibatch sizes的訓練。
  • 在抽象圖計算方面,可以為每個k個訓練實例創建計算圖,然后將k個損失節點連接在一個平均節點下,該平均節點的輸出將是 minibatch的損失。
  • Large minibatched 訓練在諸如GPU之類的專用計算體系結構上的計算效率以及用矩陣運算代替向量矩陣運算方面也是有益的。

6.4 Regularization(正則化)

  • 神經網絡模型具有許多參數,并且容易發生過度擬合。正則化可以在一定程度上緩解過度擬合。
  • 常見的正則化方法是L_{2}正則化,在損失函數的代價函數后加一個正則化項:\frac{λ}{2}||θ||^{2}. 其中,θ是模型參數的集合,||·||^{2}L_{2}范數的平方,λ是控制正則化量的超參數。
  • 通過向要最小化的目標函數添加加法λ2kθk2項,對具有大值的參數設置平方懲罰,其中θ是模型參數的集合,k·k2是平方L2norm(值的平方和),λ是控制正則化量的超參數
  • dropout:正則化的替代,旨在防止網絡學習依賴特定權重。
    方法:在每個訓練示例中隨機drop掉(設置為0)網絡(或特定層)中一半的神經元

7. 級聯和多任務學習(Cascading and Multi-task Learning)

  • 將在線訓練方法與使用計算圖抽象的自動梯度計算相結合,可以輕松實現模型級聯,參數共享和多任務學習。

7.1模型級聯(Model Cascading)

  • 模型級聯是一種強大的技術,通過組合較小的組件網絡來構建大型網絡。
  • 例如,前饋網絡可以用于基于其相鄰單詞and/or組成單詞的字符來預測單詞的詞性。在pipeline approach 中,我們將使用該網絡來預測詞性,然后將預測作為輸入特征提供給進行語法分塊或解析的神經網絡。此外,我們可以把這個網絡的隱藏層看作一種編碼,它用于捕獲預測詞性的相關信息。在級聯方法中,我們采用該網絡的隱藏層并將它們(而不是詞性預測本身)作為語法網絡的輸入進行連接。我們現在有一個更大的網絡,它將單詞和字符作為輸入序列,并輸出一個句法結構。計算圖抽象允許我們容易地將語法任務丟失的錯誤梯度傳播回字符。
  • 為了解決深度網絡的消失梯度問題,以及更好地利用可用的訓練資源,可以通過在相關任務上分別訓練單個組件網絡的參數來引導它們,然后將它們插入更大的網絡以進一步調整。
  • 當使用卷積,遞歸和遞歸神經網絡時,模型級聯是非常常見的,例如,使用循環網絡將句子編碼成固定大小的向量,然后將其用作另一網絡的輸入。遞歸網絡的監控信號主要來自上層網絡,該上層網絡在輸入時消耗遞歸網絡的輸出。

7.2 多任務學習

  • 用于:當我們有一些相關但是不一定相互影響的預測任務時,我們相信對一種預測有用的信息也可以對其他任務有用。
  • 例如,分塊,命名實體識別(NER)和語言建模是協同任務的示例。用于預測塊邊界,命名實體邊界和句子中的下一個詞的信息都依賴于一些共享的底層語法 - 語義表示。我們可以創建一個具有多個輸出的網絡,而不是為每個任務單獨訓練的網絡。一種常見的方法是建立一個多層前饋網絡,然后將其最終隱藏層(或所有隱藏層的串聯)傳遞到不同的輸出層。這樣,網絡的大多數參數在不同任務之間共享。從一個任務中學到的有用信息可以幫助消除其他任務的歧義。
  • 同樣,計算圖抽象使得構建這樣的網絡并計算它們的梯度變得非常容易,通過為每個可用的監控信號計算單獨的損失,然后將損失匯總成用于計算梯度的單個損失。如果我們有幾個語料庫,每個語料庫都有不同類型的監督信號(例如我們有一個NER語料庫和另一個用于分塊的語料庫),訓練過程將混洗所有可用的訓練示例,并在每輪執行梯度計算和針對不同的損失進行更新。

8.結構化輸出預測(Structured Output Prediction)

  • NLP中的許多問題涉及結構化輸出:期望輸出不是類標簽或類標簽上的分布,而是結構化對象(例如序列,樹或圖形)的情況。典型示例是序列標記(例如,詞性標記)、序列分割(分塊,NER)和句法分析。在本節中,我們將討論前饋神經網絡模型如何用于結構化任務。

8.1貪婪的結構預測(Greedy Structured Prediction)

  • 結構化預測的貪婪方法是將結構預測問題分解為一系列局部預測問題,并訓練分類器去執行每個局部決策。在測試時,訓練的分類器以貪婪的方式使用。例如:從左到右的模型標記( left-to-right tagging models)和基于貪婪轉換的解析(greedy transition-based parsing)。這些方法可以簡單地將局部分類器從線性分類器(例如SVM或邏輯回歸模型)替換為神經網絡。
  • 這種貪婪的方法會受到誤差傳播的影響,早期決策中的錯誤會延續并影響以后的決策。可以達到整體更高精度的非線性神經網絡分類器在一定程度上有助于抵消該問題。此外,還可以通過嘗試在更難的預測之前進行更容易的預測,或通過將訓練過程暴露于可能由于錯誤導致的輸入來使訓練條件更類似于測試條件,來減輕錯誤傳播問題的訓練技術。

8.2 基于搜索的結構化預測(Search Based Structured Prediction)

  • 預測自然語言結構的常用方法是基于搜索。基于搜索的結構化預測被公式化為可能結構范圍的搜索問題:
    [圖片上傳失敗...(image-26a9f6-1539350214260)]
    其中x是輸入結構,y是x上的輸出(例如:x是句子,y是句子上的 tag-assignment 或解析樹),Y(x)是所有x的可用結構集合。我們想要找到一個輸出y,它將使x,y對的得分最大化。
  • 評分函數定義為一個線性模型:
    ?????????????score(x, y) = w · Φ(x, y)
    其中Φ是特征提取函數,w是權重向量
    為了便于搜索最優y,將結構y分解為若干部分,并根據各部分定義特征函數,其中 φ(p)是局部特征提取函數:
    [圖片上傳失敗...(image-30b212-1539350214260)]
    對每個部分分別進行評分,結構評分是組成該結構的部分評分的總和:
    [圖片上傳失敗...(image-f3a21b-1539350214260)]
    其中p∈y是p∈part(x,y)的簡寫。將y分解為多個部分是這樣的,即存在一種推理算法,該算法允許在給定各個部分的得分的情況下有效的搜索最佳得分結構。
  • 現在,我們可以用神經網絡簡單地替換組件上的線性評分函數:[圖片上傳失敗...(image-d04786-1539350214260)]
    其中c(p)將部分p映射到d_{in}維向量。
  • 在一個隱藏層的前饋網絡的情況下,[圖片上傳失敗...(image-8d1344-1539350214260)]
    其中,c(p)∈R^{d_{in}}W^{1}∈R^{d_{in}×d_{1}}b_{1}∈R^{d_{1}}W∈R^{d_{1}}
  • 結構化預測的一個共同目標是使 gold structurey 的分數高于任何其他結構y^{'},從而導致下列(generalized perceptron)損失:
    [圖片上傳失敗...(image-faba91-1539350214260)]
  • 執行順尋如下:
    1)為每個可能的部分創建計算圖CG_{p},并計算其得分
    2)對scored parts 進行 run inference, 找到最佳得分結構y^{'}
    3)將對應于 gold(predicted)結構y(y^{'})中的部分計算圖的輸出節點連接到求和節點CG_{y}(CG_{y^{'}})
    4)使用 "minus" node,CG_{l},連接CG_{y}和CG^{'}_{y},并計算其梯度。
  • 當在訓練結構化預測神經網絡(structured prediction neural networks)時,廣義感知器損失不是一個好的損失函數,因為它沒有 margin,因此 margin-based hinge loss 是首選:
    [圖片上傳失敗...(image-e3325b-1539350214260)]
  • 請注意,在這兩種情況下,我們都會失去線性模型的優良特性。特別地,該模型不再是凸的了。這是在預期范圍內的,因為即使最簡單的非線性神經網絡也已經是非凸的。盡管如此,我們仍然可以使用標準的神經網絡優化技術來訓練結構化模型。
  • 訓練和推理較慢,因為我們必須評估神經網絡(并采用梯度)| parts(x,y) | 次。

8.2.1 Probabilistic Objective (CRF) :概率目標

  • 在概率框架(條件隨機字段,CRF)中,我們將每一部分分數視為 clique potential 并定義每個結構的分數y為:
    [圖片上傳失敗...(image-c48a0c-1539350214260)]

    評分函數定義條件分布P(y | x),并且我們希望設置網絡的參數,使得語料庫條件對數似然\sum_{(x_{i},y_{i})∈training}logP(y_{i}|x_{i})最大。

  • 然后,給定訓練示例(x,y)的損失為: - log score_{CRF}(x,y)

8.2.2 重新排序(Reranking)

  • 用途:當搜索所有可能的結構是不現實的、低效的或是難以集成到模??型中,經常使用 Reranking方法。
  • 過程:在 Reranking 框架中,基礎模型用于生成 k-best scoring structures 的列表。然后訓練更復雜的模型以在 k-best 列表中對候選者進行評分,使得關于the gold one的最佳結構的得分最高。
  • 由于現在搜索的是在k個項目上而不是在指數空間上執行的,因此復雜模型可以對得分結構的任意方面進行條件化(從中提取特征)。Reranking 方法是使用神經網絡模型進行結構化預測的自然候選方法,因為它們允許建模者專注于特征提取和網絡結構,同時無需將神經網絡評分集成到解碼器中。

8.2.3 MEMM和混合方法(MEMM and Hybrid Approaches)

  • MEEM: 用MLP替換邏輯回歸(“最大熵”)組件
  • 神經網絡模型和線性模型之間的混合方法: 在兩階段模型中基于轉換的依賴關系解析
    1)第一階段:訓練靜態前饋神經網絡(MLP2),使得在隔離的情況下對結構化問題的每個單獨決策表現良好。
    2)第二階段:神經網絡模型保持固定,然后將每個輸入的不同層(輸出以及隱藏層向量)連接起來,并用作線性結構感知器模型的輸入特征。經過訓練,可以對最佳結果進行波束搜索(beam-search)。
  • 雖然目前尚不清楚這種訓練方法是否比訓練單個結構化預測神經網絡更有效,但使用兩個更簡單的、孤立的模型允許研究人員進行更廣泛的超參數搜索(例如調整圖層大小、激活函數、學習率等等),相對于使用更復雜的網絡,這無疑是個更可行的方案。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。