精华内容
下载资源
问答
  • 激活函数的作用

    2020-11-16 23:36:51
    激活函数的作用,摘自知乎。 f(*)称为激活函数或激励函数(Activation Function),激活函数的主要作用是完成数据的非线性变换,解决线性模型的表达、分类能力不足的问题; 激活函数的主要作用是改变之前数据的线性...

    使用pytorch弄一个单层网络,但是激活函数选择线性函数,不然永远达不到要求,
    激活函数的作用,摘自知乎。

    f(*)称为激活函数或激励函数(Activation Function),激活函数的主要作用是完成数据的非线性变换,解决线性模型的表达、分类能力不足的问题;
    激活函数的主要作用是改变之前数据的线性关系,如果网络中全部是线性变换,则多层网络可以通过矩阵变换,直接转换成一层神经网络。所以激活函数的存在,使得神经网络的“多层”有了实际的意义,使网络更加强大,增加网络的能力,使它可以学习复杂的事物,复杂的数据,以及表示输入输出之间非线性的复杂的任意函数映射。
    激活函数的另一个重要的作用是 执行数据的归一化,将输入数据映射到某个范围内,再往下传递,这样做的好处是可以限制数据的扩张,防止数据过大导致的溢出风险。
    这里还要提一下:为什么要使用非线性的激活函数?
    因为如果使用线性的激活函数,那么输入x跟输出y之间的关系为线性的,便可以不需要网络结构,直接使用线性组合便可以。只有在输出层极小可能使用线性激活函数,在隐含层都使用非线性激活函数。
    

    下面是pytorch-单层网络,用于线性回归,大财小用。

    import  torch as tor
    from torch import  nn
    import  numpy as np
    from torch.nn import functional as F
    from torch import  optim as op  #优化器
    ######
    #函数版
    ##
    def f_function(x):
        data=0.5*x+0.5+np.random.uniform(0.0001,0.0002,(1,1)) #注意是这样调用
        #data1=0.5*x+1.8+np.random.uniform(0.02,0.03,(1,1))  #理想值
        return  data
    ###生成带噪音的数据的公式
    def use_function():
        x=np.mat(np.linspace(0,5,num=1000))
        y=np.mat(f_function(x))
        x1=np.mat(np.full((1,1000),1))  #生成1*1000作为权值
        return  x,x1,y   #y作为单层感知器的权重
    
    ##生成噪音np.mat()
    ##单层神经网络
    class NET(nn.Module):
        def __init__(self):
            super(NET, self).__init__()  #NET继承nn类
            self.Fc1=nn.Linear(2,1,bias=False)  #生成一个线性层
    
        def forward_function(self , x):  #输入
            xainxingceng_output=(self.Fc1(x))  #暂时不用
    
            return xainxingceng_output  #完成前向传播
    
    
    net=NET() #实例化上述的类
    optimizer=op.SGD(net.parameters(),lr=0.01) #优化net中的参数,学习速率为0.01
    
    x,b,y=use_function()  #第一是输入,第二个是权值,第三个是期望值
    x=tor.FloatTensor(x)
    b=tor.FloatTensor(b)   #
    input=tor.cat((x,b),0) #行连接
    y=tor.FloatTensor(y)   #根据要求转换为张量
    for iteration in range(20):
        train_loss=0
        out=tor.zeros((1,1000))
        for i in range(1000):
    
            out[0,i]=net.forward_function(input[:,i])  #输入x 输出激活层的结果 0维矩阵乘法无法实现
            #loss=F.mse_loss(out,y[0,i]) #计算损失函数
            #train_loss += loss #tensor(0.0594, grad_fn=<MseLossBackward>)
        ##进行判断
        loss=F.mse_loss(out,y)
        E=loss  #求导是乘法
        if E <0.01:
            break
        else:
            optimizer.zero_grad()  #就以最速下降为例。由于代入的x每次都不一样,所以不存在梯度累加,但是其他的算法,比如动量是需要考虑其他的,那就不知到怎么用了
            E.backward()
            optimizer.step()      #开始优化,并且会自动更新
    
    
    
    print(E)
    print(net.Fc1.weight)
    
    
    展开全文
  • 为什么要使用激活函数,激活函数的作用

    千次阅读 多人点赞 2019-04-17 15:57:34
    激活函数的作用:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。 3.常见的激活函数 3.1.Sigmoid函数 3.2.tanh函数 3.3.Relu函数 总结: 1.如果没有激活函数会怎么样? 1. 对于y=ax+b 这样的...

    目录

    1.如果没有激活函数会怎么样?

    2.所以需要对线性输出做非线变换

    激活函数的作用:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。

    3.常见的激活函数 

    3.1.Sigmoid函数

    3.2.tanh函数

    3.3.Relu函数

     总结:


    1.如果没有激活函数会怎么样?

    1. 对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合我们的预期,很多情况下我们希望的输出是一个概率

    2. 线性的表达能力太有限了,即使经过多层网络的叠加,y=ax+b无论叠加多少层最后仍然是线性的,增加网络的深度根本没有意义。线性回归连下面这个最简单的“异或”x1 XOR x2,都无法拟合:

    2.所以需要对线性输出做非线变换

    激活函数的作用:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。

    这个变换要满足什么条件?

    1. 非线性,这样增加网络的深度才有意义

    2. 可导的,不然怎么做梯度下降

    3. 易于计算的

    4. 输出空间最好是有限的,这条好像也不是必须的,Relu就没有遵循这条

    基于这些限制,专家们发掘出了好多个激活函数,这就是一个先有实践再总结理论的过程。一个函数在实际应用中发现效果很好时,再反过来去推导它为什么会有道理

    3.常见的激活函数 

    3.1.Sigmoid函数

    特点:

    它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.

    缺点:

    缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大

    缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0, x>0, f=w^{T}x+b ,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。

    缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

    3.2.tanh函数

    tanh(x)åå¶å¯¼æ°çå ä½å¾å

    特点:

    1.tahn解决了Sigmoid函数的不是zero-centered输出问题,

    2.然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在

    3.3.Relu函数

    è¿éåå¾çæè¿°
     

    ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient

    有以下几大优点

    1) 解决了gradient vanishing问题 (在正区间)

    2)计算速度非常快,只需要判断输入是否大于0

    3)收敛速度远快于sigmoid和tanh

    ReLU问题:

    1)ReLU的输出不是zero-centered

    2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

     总结:

    激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问

    展开全文
  • 【神经网络】激活函数的作用及常用激活函数ReLu、Sigmoid

    一、激活函数的作用

    激活函数(activation function)的作用是去线性化,神经网络节点的计算就是加权求和,再加上偏置项:
    ai=ixiwi+ba_i=\sum_ix_iw_i+b
    这是一个线性模型,将这个计算结果传到下一个节点还是同样的线性模型。只通过线性变换,所有的隐含层的节点就无存在的意义。原因如下:假设每一层的权值矩阵用W(i)W^{(i)}表示。那么存在一个WW'使:
    W=W(1)W(2)W(n)W'=W^{(1)}W^{(2)}…W^{(n)}
    那么,n层隐含层就可以全部变成一个隐含层,隐含层的数量就没有任何意义。所以使用激活函数将其去线性化。种种情况下,W=W(1)W(2)W(n)W'=W^{(1)}W^{(2)}…W^{(n)}不再成立,每层隐含层都有其存在的意义。

    下面有更详细的解释,改内容来自《TensorFlow实战Google深度学习框架》(第2版)。在这里插入图片描述

    二、常用激活函数

    人工神经网络中常用到激活函数(activation function):ReLuSigmoid

    2.1 ReLu

    线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元。其函数表达式如下:
    f(x)=max(0,x)f(x)=max(0,x)
    其函数图像图下:
    在这里插入图片描述
    其含义就是,如果输入的x>0x>0,那么f(x)=xf(x)=x;如果x<0,那么f(x)=0f(x)=0

    2.2 Sigmoid

    Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。其函数表达式如下:
    f(x)=11+exf(x)=\dfrac{1}{1+e^{-x}}
    其函数图像图下:
    在这里插入图片描述
    可以看到在趋于正无穷或负无穷时,函数趋近平滑状态,sigmoid函数因为输出范围(0,1),所以二分类的概率常常用这个函数。

    sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些缺点,下面将根据其导数对其缺点进行分析,导数图像如下:
    在这里插入图片描述
    缺点:

    • 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
      如果我们初始化神经网络的权值为[0,1][0,1]之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为(1,+)(1,+\infty)区间内的值,则会出现梯度爆炸情况。
    • Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0,f=wTx+bx>0,f=w^Tx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。
      当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
    • 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

    参考:https://blog.csdn.net/tyhj_sf/article/details/79932893

    展开全文
  • 激活函数的作用 ##一.激活函数出现的原因 思考这么一个问题: 现在有一个二分类问题,我们要将下面的三角形和圆点进行正确的分类,如图1所示。我们试着用神经网络解决这个问题。跟大家说明一下,这是一个线性不可分...

    激活函数的作用

    ##一.激活函数出现的原因
    思考这么一个问题:
    现在有一个二分类问题,我们要将下面的三角形和圆点进行正确的分类,如图1所示。我们试着用神经网络解决这个问题。跟大家说明一下,这是一个线性不可分的问题,就是你在这个平面里,找不到一条直线可以把图中的三角形和圆点完全分开。如果你能找到,算你厉害!
    在这里插入图片描述

    二、激活函数作用

    我们再设计一个神经网络,在所有的隐层和输出层加一个激活函数,这里激活函数我们就用Sigmoid函数,如图6所示。这样y输出的就是一个非线性函数了,y的输出更复杂,有了这样的非线性激活函数以后,神经网络的表达能力更加强大了。能不能解决我们一开始提出的线性不可分问题呢?我们接着来验证吧!

    图6:带有非线性激活函数的感知机

    我们把图6中的带有激活函数的单层感知机扩展到带有激活函数的多个神经元的情况。那么神经网络的表达能力更强,具体如图7所示。

    #include studio
    include studio
    
    
    展开全文
  • 形象的解释神经网络激活函数的作用是什么?
  • 神经网络激活函数的作用是什么

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,824
精华内容 729
关键字:

激活函数的作用