非线性单元

在这篇文章当中,我们就来简单探讨一下神经网络当中的非线性单元

通常用的非线性单元有两类Sigmoid非线性单元,RuLU非线性单元

1.为什么要使用非线性单元?

这个问题其实涉及到一个非常基本的问题:神经网络为什么可以用来做分类?

Sigmoid函数是这样一个函数

S(t)=11+et

函数图像是这样的

这个函数可以把

[,+]

范围当中的值映射到[0,1]

有兴趣的同学可以看一下这段代码,自己尝试着画一下sigmoid的函数

import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.misc import imread, imresize

def sigmoid(x):
    return [ (1.0 / ( 1.0 + math.exp( i * -1 ) )) for i in x  ]

def main():
    x = np.arange(0,1, 0.01)
    w = 10
    b = -5
    z = w * x + b
    print z
    y = sigmoid( z )
    plt.plot(x,y)
    plt.show()

if __name__ == '__main__':
    main()

如果我们考量输入的变量t,再把它进一步分解成神经网络的输入的话,公式就变成了这样

S(t)=11+ewt+b

这个式子是非常有意思的,如果我们改变w和b的值,就可以改变函数的形状

在这个式子中,如果改变w的值,就会改变sigmoid函数的形状,w越大,变化越都快函数形状越陡峭;改变b的值可以改变函数的位置。 而且如果我们关注

t0=bx

这个值的话,就会发现这个值就是S(t)=0.5的位置,我们可以通过控制这个值来控制函数的位置

当w和b的值很大的时候,函数就会变成一个离散的阶越函数,就像这样

而我们可以通过构造两个阶越函数来实现一个阶越,就像这样

The code is here

import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.misc import imread, imresize

def sigmoid(x):
    num = x.shape[0]
    for i in range(num):
        x[ i ] = (1.0 / ( 1.0 + math.exp( x[i] * -1 ) ))
    return x

def main():
    x = np.arange(0,1, 0.01)
    w1 = 300
    b1 = -100
    z1 = sigmoid(w1 * x + b1)

    h1 = 1
    a1 = z1 * h1

    w2 = 600
    b2 = -400
    z2 = sigmoid(w2 * x + b2)

    h2 = -1
    a2 = z2 * h2

    y = a1 + a2
    plt.plot(x,y)
    plt.show()

if __name__ == '__main__':
    main()

这段代码可以实现一个bump,而我们可以通过这个bump来逼近分类的边界函数。当然一个bump是极其不精确的,我们需要增加神经元的数量,以及层数(因为增加了层数就增加了非线性单元)来实现逼近。理论上来讲,只要神经元足够多,就可以足够逼近,达到我们的要求

|f(x)g(x)|<ϵ

ReLU相比Sigmoid有什么优点?

ReLU的全称是Rectified Linear Units(修正线性单元),它的函数表达式非常的简单

R(x)=max(0,x)

就是说小于0的部分全部置为0,其他的维持原来不变

这样做有几个好处

第一,计算方便

尤其是我们要在back propagation的阶段要计算偏导的时候,如果是要计算Sigmoid的偏导,那就是

S(t)=11+et

S(t)=(1S(t))S(t)

但是计算ReLU的偏导就是

R(x)=x,R(x)>0

R(x)=0,otherwise

第二,不会出现dead neuron

在训练神经网络的时候,有时候会出现dead neuron的情况,就是说某个neuron出现了特定的值,导致不管怎么训练它的值都不会发生太大的变化。这是因为如果使用了sigmoid的激活函数的话,我们可以看到在x足够大的时候,函数的值接近1,趋向于饱和,这个时候x的值可能发生了变化,但是表现在激活函数的输出上可能根本不明显,所以才会出现不管怎么训练都没有效果的情况

猜你喜欢

转载自blog.csdn.net/superCally/article/details/54291865