深度學習中,偏置(bias)在什麼情況下可以要,可以不要?

1.深度學習偏置的作用?

   我們在學深度學習的時候,最早接觸到的神經網絡應該屬於感知器(感知器本身就是一個很簡單的神經網絡,也許有人認爲它不屬於神經網絡,當然認爲它和神經網絡長得像也行)

   要想激活這個感知器,使得y=1,就必須使x1*w1 + x2*w2 +....+xn*wn > T(T爲一個閾值),而T越大,想激活這個感知器的難度越大,人工選擇一個閾值並不是一個好的方法,因爲樣本那麼多,我不可能手動選擇一個閾值,使得模型整體表現最佳,那麼我們可以使得T變成可學習的,這樣一來,T會自動學習到一個數,使得模型的整體表現最佳。當把T移動到左邊,它就成了偏置,x1*w1 + x2*w2 +....+xn*wn  - T> 0   ----->x*w +b > 0,總之,偏置的大小控制着激活這個感知器的難易程度。

 

2.在某些情況下,我們是否可以不要偏置呢?

  如果大家看過我的博客:ShuffleNet V2 神經網絡簡介與代碼實戰,是否會注意到代碼中的一個細節,這個代碼中,bias被設置False,也就是沒有用到偏置。

def conv_bn(inp, oup, stride):
    return nn.Sequential(
        nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
        nn.BatchNorm2d(oup),
        nn.ReLU(inplace=True)
    )

     而在我的博客: ShuffleNet V1 神經網絡簡介與代碼實戰,這個代碼中,bias被設置爲True,用到了偏置

def conv3x3(in_channels, out_channels, stride=1, 
            padding=1, bias=True, groups=1):    
    """3x3 convolution with padding
    """
    return nn.Conv2d(
        in_channels, 
        out_channels, 
        kernel_size=3, 
        stride=stride,
        padding=padding,
        bias=bias,
        groups=groups)

     我這樣做是不小心,還是故意而爲之,大家可以猜一猜,這兩份的代碼區別在於卷積後面有沒有接BN操作(後面我會有博客講歸一化操作,這裏就不展開了)

     BN操作,裏面有一個關鍵操作

     其中x1 = x0 * w0 + b0,而E[x1] = E[x0*w0] + b0, 所以對於分子而言,加沒加偏置,沒有影響;而對於下面分母而言,因爲Var是方差操作,所以也沒有影響(爲什麼沒影響,回頭問問你的數學老師就知道了)。所以,卷積之後,如果要接BN操作,最好是不設置偏置,因爲不起作用,而且佔顯卡內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章