sigmod和sigmoid「sigmod和sigmoid的区别」
sigmoid怎么读
Sigmoid读法如下:
Sigmoid函数是一个在生物学中常见的S型的函数,也称为S形生长曲线。sigmoid函数是一个良好的阈值函数,连续,光滑,严格单调

Sigmoid函数,即f(x)=1/(1+e-x).神经元的非线性作用函数.人工神经网络的学习算法-BP算法
神经网络的学习是基于一组样本进行的,它包括输入和输出(这里用期望输出表示),输入和输出有多少个分量就有多少个输入和输出神经元与之对应.最初神经网络的权值(Weight)和阈值是任意给定的,学习就是逐渐调整权值和阈值使得网络的实际输出和期望输出一致.
函数是数学名词,代数式中,凡相关的两数X与Y,对于每个X值,都只有一个Y的对应值。这种对应关系就表示Y是X的函数。函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从**、映射的观点出发。
函数的近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。
激活函数
参考 :
非线性激活函数能够使神经网络逼近任意复杂的函数。如果没有激活函数引入的非线性,多层神经网络就相当于单层的神经网络
sigmoid
1、梯度消失:sigmoid函数在0和1附近是平坦的。也就是说,sigmoid的梯度在0和1附近为0。在通过sigmoid函数网络反向传播时,当神经元的输出近似于0和1时它的梯度接近于0。这些神经元被称为饱和神经元。因此,这些神经元的权值无法更新。不仅如此,与这些神经元相连接的神经元的权值也更新得非常缓慢。这个问题也被称为梯度消失。所以,想象如果有一个大型网络包含有许多处于饱和动态的sigmoid激活函数的神经元,那么网络将会无法进行反向传播。
2、不是零均值:sigmoid的输出不是零均值的。
3、计算量太大:指数函数与其它非线性激活函数相比计算量太大了。下一个要讨论的是解决了sigmoid中零均值问题的非线性激活函数。
Sigmoid 和 Softmax 区别:
sigmoid将一个real value映射到(0,1)的区间,用来做二分类。而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。
tanh
Tanh唯一的缺点是:tanh函数也存在着梯度消失的问题,因此在饱和时会导致梯度消失。为了解决梯度消失问题,让我们讨论另一个被称为线性整流函数(ReLU)的非线性激活函数,它比我们之前讨论的两个激活函数都更好,并且也是在今天应用最为广泛的激活函数。
ReLU
用形式化的语言来说,所谓****非线性 ,就是一阶导数不为常数 。 ReLu 的定义是max(0, x),因此, ReLU 的导数为:
显然, ReLU 的导数不是常数,所以 ReLU 是 非线性 的。Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
1、ReLu虽然在大于0的区间是线性的,在小于等于0的部分也是线性的, 但是它整体不是线性的,因为不是一条直线,所以Relu函数是非线性函数 。也就是说,线性和 非线性 都是就 函数 的整体而言的。用术语来说, 线性、 非线性 是就 函数 的整个定义域而言的。 这就意味着无论我们堆多少层网络,如果这些层都使用线性激活 函数 ,那这些层最终等效于一层!那这样的模型的表达能力就很 有 限了。多个线性操作的组合也是一个线性操作,没有非线性激活,就相当于只有一个超平面去划分空间。
ReLu是非线性的,效果类似于划分和折叠空间,组合多个(线性操作 + ReLu)就可以任意的划分空间 。
2、对于浅层的机器学习,比如经典的三层神经网络,用它作为激活函数的话,那表现出来的性质肯定是线性的。但是在深度学习里,少则几十,多则上千的隐藏层,虽然,单独的隐藏层是线性的,但是很多的隐藏层表现出来的就是非线性的。举个简单的例子,一条曲线无限分段,每段就趋向直线,反过来,很多这样的直线就可以拟合曲线。类似,大规模的神经网络,包含很多这样的线性基本组件,自然也可以拟合复杂的非线性情况。Relu通过构造很多的线形空间(类似于折叠的方式),逼近非线性方程。
但是Relu神经元有几个缺点:
平时使用的时候RELU的缺点并不是特别明显,只有在学习率设置不恰当(较大)的时候,会加快神经网络中神经元的“死亡”。
为了解决relu激活函数在x0时的梯度消失问题, 提出了Leaky Relu
leaky ReLU
pReLU
PRelu的函数为:
其中α为超参数。PRelu的思想是引进任意超参数α ,而 这个α可以通过反向传播学习(注意 PRelu 与leaky relu的区别,前者是学习得到,后者是我们认为设定) 。这赋予了神经元在负区域内选择最好斜率的能力,因此,他们可以变成单纯的ReLU激活函数或者Leaky ReLU激活函数。如果α=0,那么 PReLU 退化为ReLU;如果α是一个很小的固定值(如α =0.01),则 PReLU 退化为 Leaky ReLU(LReLU)。
(1) PReLU只增加了极少量的参数,也就意味着网络的计算量以及过拟合的危险性都只增加了一点点。特别的, 当不同channels使用相同的ai时,参数就更少了。
(2) BP更新ai时,采用的是带动量的更新方式:
总之, 一般使用ReLU效果更好 ,但是你可以通过实验使用Leaky ReLU或者Parametric ReLU来观察它们是否能对你的问题给出最好的结果。
ELU
SELU
经过该激活函数后使得样本分布自动归一化到0均值和单位方差(自归一化,保证训练过程中梯度不会爆炸或消失,效果比Batch Normalization 要好)
其实就是ELU乘了个lambda,关键在于这个lambda是大于1的。以前relu,prelu,elu这些激活函数,都是在负半轴坡度平缓,这样在activation的方差过大的时候可以让它减小,防止了梯度爆炸,但是正半轴坡度简单的设成了1。而selu的正半轴大于1,在方差过小的的时候可以让它增大,同时防止了梯度消失。这样激活函数就有一个不动点,网络深了以后每一层的输出都是均值为0方差为1。
swish
激活函数总结
因为神经网络是线性组合,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中.好用的激活函数具有可求且方便求导,单调平滑.下面简单介绍一下常用的激活函数:
1. sigmoid函数 :常用于LR中,也可以用于神经网络最后一层(一分类问题,是该类,和其他).函数公式和图表如下图:
如图2所示,它能够把输入的连续实值变换为(0,1)之间的输出,特别的,如果是非常大的负数,那么输出就是0,如果是非常大的正数,输出就是1. sigmoid曾经是主流的激活函数,但是由于一些缺陷,导致现在不主流了...它的缺点有:
1) 由于sigmoid导数的性质(如图3),在神经网络进行反向传播时,会发生梯度消失(权重初始值在[0,1]内)和梯度爆炸(权重初始值在[1,+∞]).
2) 其解析式中含有幂运算,计算机求解时相对来讲比较耗时,对于规模比较大的深度网络,这会较大地增加训练时间.
3) sigmoid的输出不是0均值的,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入, 产生的一个结果就是:如果数据进入神经元的时候是正的,那么计算出的梯度也会始终都是正的.
2. tanh函数 :tanh函数是拉伸后的sigmoid,它弥补了sigmoid的缺点3,tanh函数公式和曲线如下:
它的值域变成了(-1,1),均值从sigmoid的0.5,变成了0.从而解决sigmoid的缺点3输出均值不为0的问题.从图4可以看出,在0附近曲线的倾斜更为陡峭,所以它的导数的曲线是比图3更高更细一些.
它的优点是解决了sigmoid的输出均值不为0的问题,还有就是比sigmoid的收敛更快一些.
它的缺点是还没有解决sigmoid最大的问题1,梯度消失和梯度爆炸的问题.
3. ReLU函数 :ReLU函数训练速度比tanh快6倍,是目前使用最广泛的激活函数.当输入值小于零时,输出值为零.当输入值大于等于零时,输出值等于输入值.公式和曲线如下:
它的优点是训练速度快(因为线性),同时当输入为正数时,不会造成梯度爆炸.
它的缺点是ReLU所在的神经元在训练的过程中可能会随机失活,如果learning rate很大,那么很有可能网络中的40%的神经元都”dead”了.而且它的输出也不是均值为0.
4. LeakyReLU PReLU函数 :这两个激活函数类似,都是ReLU的改良版,目的是为了避免出现神经单元失活的问题.公式如下:
其中LeakyReLU将α的值设为0.001,而PReLU是将α当做参数一起参与到模型训练中去学习.这样函数的输出下界不为0,从而也不会有神经元失活的现象.
5. ELU函数 (指数线性单元):它解决了ReLU的两个问题,一个是失活,一个是均值不为0的问题.
6. softmax函数 :常用于神经网络的最后一层(多分类),是sigmoid函数在多分类问题上的推广.公式如下:
它的值域是[0,1],输出是概率值,所以加和为1.用指数的形式是为了使大的值更大,同时也为了求导.
1.尽量不要使用sigmoid和tanh函数(梯度消失和爆炸),尽量使用ReLU及其变体.
2.使用ReLU时,注意设置小的learning rate.
3.尽量使用0均值的激活函数.
sigmoid有什么作用
什么是sigmoid?其作用是什么?很简单。这是一个科学家发明的数学工具。我们在做决策的时候通常非此即彼。在计算机中通常用零或一来替代两种可能性。为了勾画决策的不确定性。可以使用0到1之间的一个实数来表示我们决策的结果。这样当我们的决策结果是0.6的时候。代表我们更倾向于选择1更不倾向于选择0。
然而现实中我们所观察到的特征,通常不是0到1之间的实数。我们要做决策,就必须将这个实数压缩到0到1之间。
假设我们有若干客户的消费记录。想判断哪些客户是高收入人群,哪些客户是低收入人群。
一个比较简单的方法就是计算每个客户的平均消费金额。当平均消费金额大于一个特定的阈值a时,则为高收入人群,小于则为低收入人群。
这显然是一个非此即彼判断。没有表现出决策的不确定性。
为了引入决策的不确定性,我们必须给每一种平均消费金额给予一个打分。这个打分在0到1之间。也可以理解为是决策的概率。
我们完全可以把平均消费金额作为sigmoid函数的输入,从而将任意金额映射到0到1之间。
这个sigmoid函数有两个参数来控制着决策不确定性的映射。第一个参数的取值决定了sigmoid函数将怎样的平均消费金额映射为0.5,即完全不确定。该参数的取值类似于上文提到的阈值a。
另外一个参数和sigmoid函数的性质有关。sigmoid函数有如下性质当平均消费金额远大于a时函数的输出结果无限逼近于一。当平均消费金额远小于a时函数的输出结果无限逼近于零。
则另外一个参数实际上控制着这个逼近速度。当这个逼近速度无限大的时候,就等同于上面简单的方案。而这当这个逼近速度比较慢的时候,其会以较细的粒度描述决策的不确定性。即针对各种平均消费金额其都不会草率的将其无限逼近于零或者一。而是给定一个0到1之间的合适的实数值。
这就是sigmoid函数全部的作用了。
神经网络:损失函数详解
交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足。
1. 二次代价函数的不足
ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理, 我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在 反向传播训练 的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。 然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。
以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):
实验1:第一次输出值为0.82
实验2:第一次输出值为0.98
在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。
从两次实验的代价曲线中可以看出: 实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢 。
其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:
其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为:
目前训练ANN最有效的 算法 是 反向传播算法 。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient
descent),沿着梯度方向调整参数大小。w和b的梯度推导如下:
其中,z表示神经元的输入,
表示激活函数。从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:
如图所示, 实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。 与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。
可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?图样图森破,那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多优点,非常适合用来做激活函数,具体请自行google之。
2. 交叉熵代价函数
换个思路,我们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:
其中,x表示样本,n表示样本的总数。那么,重新计算参数w的梯度:
其中(具体证明见附录):
因此,w的梯度公式中原来的
被消掉了;另外,该梯度公式中的
表示输出值与实际值之间的误差。所以,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。同理可得,b的梯度为:
实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。
3. 交叉熵代价函数是如何产生的?
以偏置b的梯度计算为例,推导出交叉熵代价函数:
在第1小节中,由二次代价函数推导出来的b的梯度公式为:
为了消掉该公式中的
,我们想找到一个代价函数使得:
即:
对两侧求积分,可得:
而这就是前面介绍的交叉熵代价函数。
附录:
sigmoid函数为:
可证:
更系统的回答:
在之前的内容中,我们用的损失函数都是平方差函数,即
C=12(a−y)2
其中y是我们期望的输出,a为神经元的实际输出(a=σ(Wx+b)。也就是说,当神经元的实际输出与我们的期望输出差距越大,代价就越高。想法非常的好,然而在实际应用中,我们知道参数的修正是与∂C∂W和∂C∂b成正比的,而根据
∂C∂W=(a−y)σ′(a)xT∂C∂b=(a−y)σ′(a)
我们发现其中都有σ′(a)这一项。因为sigmoid函数的性质,导致σ′(z)在z取大部分值时会造成饱和现象,从而使得参数的更新速度非常慢,甚至会造成离期望值越远,更新越慢的现象。那么怎么克服这个问题呢?我们想到了交叉熵函数。我们知道,熵的计算公式是
H(y)=−∑iyilog(yi)
而在实际操作中,我们并不知道y的分布,只能对y的分布做一个估计,也就是算得的a值, 这样我们就能够得到用a来表示y的交叉熵
H(y,a)=−∑iyilog(ai)
如果有多个样本,则整个样本的平均交叉熵为
H(y,a)=−1n∑n∑iyi,nlog(ai,n)
其中n表示样本编号,i表示类别编。 如果用于logistic分类,则上式可以简化成
H(y,a)=−1n∑nylog(a)+(1−y)log(1−a)
与平方损失函数相比,交叉熵函数有个非常好的特质,
H′=1n∑(an−yn)=1n∑(σ(zn)−yn)
可以看到其中没有了σ′这一项,这样一来也就不会受到饱和性的影响了。当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。这是一个很好的性质。
3.总结
当我们用sigmoid函数作为神经元的激活函数时,最好使用交叉熵代价函数来替代方差代价函数,以避免训练过程太慢。
不过,你也许会问,为什么是交叉熵函数?导数中不带σ′(z)项的函数有无数种,怎么就想到用交叉熵函数?这自然是有来头的,更深入的讨论就不写了,少年请自行了解。
另外,交叉熵函数的形式是−[ylna+(1−y)ln(1−a)]而不是
−[alny+(1−a)ln(1−y)],为什么?因为当期望输出的y=0时,lny没有意义;当期望y=1时,ln(1-y)没有意义。而因为a是sigmoid函数的实际输出,永远不会等于0或1,只会无限接近于0或者1,因此不存在这个问题。
4.还要说说:log-likelihood cost
对数似然函数也常用来作为softmax回归的代价函数,在上面的讨论中,我们最后一层(也就是输出)是通过sigmoid函数,因此采用了交叉熵代价函数。而 深度学习 中更普遍的做法是将softmax作为最后一层,此时常用的是代价函数是log-likelihood cost。
In fact, it’s useful to think of a softmax output layer with
log-likelihood cost as being quite similar to a sigmoid output layer
with cross-entropy cost。
其实这两者是一致的,logistic回归用的就是sigmoid函数,softmax回归是logistic回归的多类别推广。log-likelihood代价函数在二类别时就可以化简为交叉熵代价函数的形式。
补充一个困扰我很久的问题:
;mid=502840969idx=1sn=05b8d27dccf6efc3f85f47a74669e1c9#rd
总结:
softmax 损失函数,适合单标签多分类问题
欧式损失函数(就是均方误差),适合实数值回归问题
sigmod 交叉熵,适合多标签分类问题,这里上面说是主要用在二分类,暂时理解为多标签二分类问题。
contrastive loss,适合深度测度学习,就是siamese网络的相似度学习。
