Highway Networks Pytorch


導讀

本文討論了深層神經網絡訓練困難的原因以及如何使用Highway Networks去解決深層神經網絡訓練的困難,並且在pytorch上實現了Highway Networks。

一 、Highway Networks 與 Deep Networks 的關系

深層神經網絡相比於淺層神經網絡具有更好的效果,在很多方面都已經取得了很好的效果,特別是在圖像處理方面已經取得了很大的突破,然而,伴隨着深度的增加,深層神經網絡存在的問題也就越大,像大家所熟知的梯度消失問題,這也就造成了訓練深層神經網絡困難的難題。2015年由Rupesh Kumar Srivastava等人受到LSTM門機制的啟發提出的網絡結構(Highway Networks)很好的解決了訓練深層神經網絡的難題,Highway Networks 允許信息高速無阻礙的通過深層神經網絡的各層,這樣有效的減緩了梯度的問題,使深層神經網絡不在僅僅具有淺層神經網絡的效果。

二、Deep Networks 梯度消失/爆炸(vanishing and exploding gradient)問題

我們先來看一下簡單的深層神經網絡(僅僅幾個隱層)

先把各個層的公式寫出來

我們對W1求導:

W = W - lr * g(t)

以上公式僅僅是四個隱層的情況,當隱層的數量達到數十層甚至是數百層的情況下,一層一層的反向傳播回去,當權值 < 1的時候,反向傳播到某一層之后權值近乎不變,相當於輸入x的映射,例如,g(t) =〖0.9〗^100已經是很小很小了,這就造成了只有前面幾層能夠正常的反向傳播,后面的那些隱層僅僅相當於輸入x的權重的映射,權重不進行更新。反過來,當權值 > 1的時候,會造成梯度爆炸,同樣是僅僅前面的幾層能更改正常學習,后面的隱層會變得很大。

三、Highway Networks Formula

  • Notation

    (.) 操作代表的是矩陣按位相乘

    sigmoid函數:

  • Highway Networks formula

    對於我們普通的神經網絡,用非線性激活函數H將輸入的x轉換成y,公式1忽略了bias。但是,H不僅僅局限於激活函數,也采用其他的形式,像convolutional和recurrent。

    對於Highway Networks神經網絡,增加了兩個非線性轉換層,一個是 T(transform gate) 和一個是 C(carry gate),通俗來講,T表示輸入信息經過convolutional或者是recurrent的信息被轉換的部分,C表示的是原始輸入信息x保留的部分 ,其中 T=sigmoid(wx + b)

    為了計算方便,這里定義了 C = 1 - T

    需要注意的是x,y, H, T的維度必須一致,要想保證其維度一致,可以采用sub-sampling或者zero-padding策略,也可以使用普通的線性層改變維度,使其一致。

    幾個公式相比,公式3要比公式1靈活的多,可以考慮一下特殊的情況,T= 0的時候,y = x,原始輸入信息全部保留,不做任何的改變,T = 1的時候,Y = H,原始信息全部轉換,不在保留原始信息,僅僅相當於一個普通的神經網絡。

    aa

四、Highway BiLSTM Networks

  • Highway BiLSTM Networks Structure Diagram
    下圖是 Highway BiLSTM Networks 結構圖:
    input:代表輸入的詞向量
    B:在本任務代表bidirection lstm,代表公式(2)中的 H
    T:代表公式(2)中的 T,是Highway Networks中的transform gate
    C:代表公式(2)中的 C,是Highway Networks中的carry gate
    Layer = n,代表Highway Networks中的第n層
    Highway:框出來的代表一層Highway Networks
    在這個結構圖中,Highway Networks第 n - 1 層的輸出作為第n層的輸入

  • Highway BiLSTM Networks Demo
    pytorch搭建神經網絡一般需要繼承nn.Module這個類,然后實現里面的forward()函數,搭建Highway BiLSTM Networks寫了兩個類,並使用nn.ModuleList將兩個類聯系起來:

      class HBiLSTM(nn.Module):
      def __init__(self, args):
      	super(HBiLSTM, self).__init__()
      	......
      def forward(self, x):
      	# 實現Highway BiLSTM Networks的公式
      	......
      
      class HBiLSTM_model(nn.Module): 
      def __init__(self, args):
      	super(HBiLSTM_model, self).__init__()
      	......
      	# args.layer_num_highway 代表Highway BiLSTM Networks有幾層
      	self.highway = nn.ModuleList([HBiLSTM(args) for _ in range(args.layer_num_highway)])
      	......
      def forward(self, x):
       	......
      	# 調用HBiLSTM類的forward()函數
      	for current_layer in self.highway:
      		x, self.hidden = current_layer(x, self.hidden)
      

    HBiLSTM類的forward()函數里面我們實現Highway BiLSTM Networks的的公式
    首先我們先來計算H,上文已經說過,H可以是卷積或者是LSTM,在這里,normal_fc就是我們需要的H

       x, hidden = self.bilstm(x, hidden)
      	 # torch.transpose是轉置操作
      	 normal_fc = torch.transpose(x, 0, 1)
      

    上文提及,x,y,H,T的維度必須保持一致,並且提供了兩種策略,這里我們使用一個普通的Linear去轉換維度

      source_x = source_x.contiguous()
      information_source = source_x.view(source_x.size(0) * source_x.size(1), source_x.size(2))
      information_source = self.gate_layer(information_source)
      information_source = information_source.view(source_x.size(0), source_x.size(1), information_source.size(1))
      

    也可以采用zero-padding的策略保證維度一致

      # you also can choose the strategy that zero-padding
      zeros = torch.zeros(source_x.size(0), source_x.size(1), carry_layer.size(2) - source_x.size(2))
      source_x = Variable(torch.cat((zeros, source_x.data), 2))
      

    維度一致之后我們就可以根據我們的公式來寫代碼了:

      # transformation gate layer in the formula is T
      transformation_layer = F.sigmoid(information_source)
      # carry gate layer in the formula is C
      carry_layer = 1 - transformation_layer
      # formula Y = H * T + x * C
      allow_transformation = torch.mul(normal_fc, transformation_layer)
      allow_carry = torch.mul(information_source, carry_layer)
          information_flow = torch.add(allow_transformation, allow_carry)
      

    最后的information_flow就是我們的輸出,但是,還需要經過轉換維度保證維度一致。
    更多的請參考Github: Highway Networks implement in pytorch

五、Highway BiLSTM Networks 實驗結果

本次實驗任務是使用Highway BiLSTM Networks 完成情感分類任務(一句話的態度分成積極或者是消極),數據來源於Twitter情感分類數據集,以下是數據集中的各個標簽的句子個數:

下圖是本次實驗任務在2-class數據集中的測試結果。圖中1-300在Highway BiLSTM Networks中表示Layer = 1,BiLSTM 隱層的維度是300維。

實驗結果:從圖中可以看出,簡單的多層雙向LSTM並沒有帶來情感分析性能的提升,尤其是是到了10層之后,效果有不如隨機的猜測。當用上Highway Networks之后,雖然性能也在逐步的下降,但是下降的幅度有了明顯的改善。

References


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM