相关文章推荐
睿智的跑步鞋  ·  Android GATT ...·  9 月前    · 
近视的菠萝  ·  postgresql - Postgres ...·  1 年前    · 
开心的登山鞋  ·  使用js ...·  1 年前    · 
机灵的鸡蛋面  ·  React 初探 [八] ...·  1 年前    · 

GeLU高斯误差线性单元

在bert模型里,里边的激活函数不是Relu等常见的函数,是一个新的激活函数GELU。

在神经网络的建模过程中,模型很重要的性质就是非线性,同时为了模型泛化能力,需要加入随机正则,例如dropout(随机置一些输出为0,其实也是一种变相的随机非线性激活), 而随机正则与非线性激活是分开的两个事情, 而其实模型的输入是由非线性激活与随机正则两者共同决定的。

GELU正是在激活中引入了随机正则的思想,是一种对神经元输入的概率描述,直观上更符合自然的认识,同时实验效果要比Relu与ELU都要好。

GELUs其实是 dropout、zoneout、Relus的综合,GELUs对于输入乘以一个0,1组成的mask,而该mask的生成则是依概率随机的依赖于输入。假设输入为X, mask为m,则m服从一个伯努利分布(Φ(x), Φ ( x ) = P ( X < = x ) , X服从标准正太分布 ),这么选择是因为神经元的输入趋向于正太分布,这么设定使得当输入x减小的时候,输入会有一个更高的概率被dropout掉,这样的激活变换就会随机依赖于输入了。

公式可表达成:

                                             GELU(x)=xP(X<=x)=xΦ(x)

这里Φ(x)是正太分布的概率函数,可以简单采用正太分布N(0,1), 也可以使用参数化的正太分布N ( μ , σ ), 然后通过训练得到μ , σ 。
对于假设为标准正太分布的G E L U ( x ) GELU(x)GELU(x), 论文中提供了近似计算的数学公式,如下:

在这里插入图片描述
BERT源码给出的代码如下:

def gelu(input_tensor):
	cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))
	return input_tesnsor*cdf

ReLU激活

激活函数的引入是为了增加神经网络模型的非线性,没有激活函数每层就相当于矩阵相乘。每一层输出都是上层的输入的线性函数,无论神经网络多少层,输出都是输入的线性组合,就是最原始的感知机。
加入激活函数,给神经元引入非线性因素,神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

ReLU函数是目前比较火的一个激活函数,函数公式:f ( x ) = max( 0 , x )

函数图像如下:
在这里插入图片描述

相比sigmod函数与tanh函数有以下几个优点
1)克服梯度消失的问题
2)加快训练速度
注:正因为克服了梯度消失问题,训练才会快

缺点:
1)输入负数,则完全不激活,ReLU函数死掉。
2)ReLU函数输出要么是0,要么是正数,也就是ReLU函数不是以0为中心的函数

深度学习中最大的问题是梯度消失问题,使用tanh、sigmod等饱和激活函数情况下特别严重(神经网络在进行方向误差传播时,各个层都要乘以激活函数的一阶导数,梯度每传递一层就会衰减一层,网络层数较多时,梯度G就会不停衰减直到消失),使得训练网络收敛越来越慢,而ReLU函数凭借其线性、非饱和的形式,训练速度则快很多。

文章GeLU提到论文参考链接:https://arxiv.org/abs/1606.08415

高斯误差线性单元在bert模型里,里边的激活函数不是Relu等常见的函数,是一个新的激活函数GELU。在神经网络的建模过程中,模型很重要的性质就是非线性,同时为了模型泛化能力,需要加入随机正则,例如dropout(随机置一些输出为0,其实也是一种变相的随机非线性激活), 而随机正则与非线性激活是分开的两个事情, 而其实模型的输入是由非线性激活与随机正则两者共同决定的。GELU正是在激活中引入了随机正则的思想,是一种对神经元输入的概率描述,直观上更符合自然的认识,同时实验效果要比Relu与ELU都要好。 其他可以在requirements.txt中看到 主类是GatedConvBlock在py/gated_cnn.py 。 由于门控线性单元(GLU)中存在残留连接,因此conv的填充必须same 。 让我们举个例子。 from gated_cnn import GatedConvBlock model = Sequential() model.add(Convolution2D(nb_filters, kernel_size, padding='valid', input_shape=input_shape)) model.add(Activation('relu
在Keras中使用自定义图层的ActivationFunctions 激活函数是深度学习研究的重要领域。正在开发许多新的激活函数,其中包括生物启发性激活,包括其他在内的纯数学激活函数。 尽管有这样的进步,我们通常发现自己通常使用RELU和LeakyRELU而不使用/不考虑其他人。 在以下笔记本中,我展示了使用Keras和Tensorflow中的“自定义层”移植激活功能的难易程度! 链接到主笔记本-> 已实施的激活: SElu |-- Activations.ipynb |-- utils |-- Utils.ipynb |-- utils.py references |--Ref1 |--Refn git clone https://github.com/Agrover112/A
激活函数的引入是为了增加神经网络模型的非线性,没有激活函数每层就相当于矩阵相乘。每一层输出都是上层的输入的线性函数,无论神经网络多少层,输出都是输入的线性组合,就是最原始的感知机 加入激活函数,给神经元引入非线性因素,神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 1 激活函数之ReLU函数 ReLU函数是目前比较火的一个激活函数,函数公式:,函...
本篇博文主要来源于对文章 Unwrapping The Black Box of Deep ReLU Networks: Interpretability, Diagnostics, and Simplification 的学习,同时还有部分内容摘自wiki百科。 什么是ReLU函数? ReLU,全称为:Rectified Linear Unit,是一种人工神经网络中常用的激活函数,通常意义下,其指代数学中的斜坡函数,即 f(x)=max⁡(0,x) f(x)=\max(0,x) f(x)=max(0,x
**概述:**ReLU函数的计算是在卷积之后进行的,因此它与tanh函数和sigmoid函数一样,同属于非线性激活函数。ReLU函数的倒数在正数部分是恒等于1的,因此在深度网络中使用relu激活函数就不会导致梯度小时和爆炸的问题。并且,ReLU函数计算速度快,加快了网络的训练。不过,如果梯度过大,导致很多负数,由于负数部分值为0,这些神经元将无法激活(可通过设置较小学习率来解决)。 1.ReLu:...
leetcode中国 算法岗面经整理 本项目用于整理算法岗的面经(包含计算机视觉方向、机器学习、NLP等等方向),欢迎各位大佬分享自己的面经或内推,对本项目的各种建议或意见都可以通过issue交流,会及时回复 郑重申请:本项目仅用于学习交流分享,非商业用途,内容均为网络收集的优质内容!如需转载请联系原作者 机器学习 深度学习 自然语言处理 计算机视觉 高频面试题整理 分享两款提高刷题效率和质量的神器 用动态图详细讲解算法原理 必备企业刷题网站 《剑指Offer》面试题Python实现 《剑指Offer》面试题C++实现 图像处理推荐教程和面试题整理 机器学习 机器学习推荐教程和面试题整理 深度学习 通过公式、图表和代码实验介绍了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELUGELU 这些激活函数,并比较了它们的优势和短板 梯度问题(梯度消失、梯度爆炸) 2021面经和内推整理 2021内推 神经网络为什么需要激活函数:首先数据的分布绝大多数是非线性的,而一般神经网络的计算是线性的,引入激活函数,是在神经网络中引入非线性,强化网络的学习能力。所以激活函数的最大特点就是非线性。 激活函数对神经网络的重要性自不必多言,来自丹麦技术大学的 Casper Hansen 通过公式、图表和代码实验介绍了 Sigmoid、Tanh、ReLU、Softplus、Softmax、ELU...
激活函数给神经元引入了非线性因素,如果不用激活函数,神经网络每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。 激活函数使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 sigmoid sigmoid函数的定义为: sigmoid函数的图像如下: 优点:sigmoid函数可以将实数映射到 [公式] 区间内。平滑、易于求导。 缺点:1. 激活函数含有幂运算和除法,计算量大;2. 反向传播时,很容易就会出现梯度消失的情况,从而无法完成
RELU激活函数的优点包括: 1. 计算简单:RELU函数只需判断输入值是否大于0,计算速度快。 2. 解决梯度消失问题:相比于sigmoid和tanh等函数,RELU函数在正区间上的导数恒为1,不会导致梯度消失问题。 3. 降低计算复杂度:在深度神经网络中,RELU函数能够将一部分神经元的输出直接置为0,从而减少了参数的数量和模型的计算复杂度。 RELU激活函数的缺点包括: 1. 神经元死亡问题:当输入值小于等于0时,RELU函数的导数为0,这意味着该神经元对梯度的贡献为0,从而可能导致该神经元无法更新权重。 2. 输出不是zero-centered:由于RELU函数在负区间上输出为0,因此其输出值不是zero-centered,可能对某些优化算法造成不利影响。 3. 容易出现神经元过度激活:当学习率较大时,使用RELU激活函数可能导致部分神经元过度激活,使得网络无法收敛。 GELU激活函数是一种近似高斯误差线性单元(Gaussian Error Linear Unit)的激活函数,其推导公式如下: f(x) = 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3))) 其中,x为输入值,f(x)为输出值。 GELU激活函数的优点包括: 1. 近似高斯:GELU函数在接近零的区间上表现出类似于高斯分布的形状,有助于模型更好地适应连续变量。 2. 具有平滑的导数:GELU函数的导数在整个实数域上都存在,且连续平滑,有助于提高梯度的稳定性。 GELU激活函数的缺点包括: 1. 计算复杂度较高:相比于RELU函数GELU函数的计算复杂度较高,这可能会增加训练和推理的时间成本。 2. 参数调节困难:GELU函数中的参数需要进行调节,如果参数选择不合适,可能会影响模型的性能。 总体来说,RELU激活函数在实际应用中被广泛使用,并具有较好的性能。而GELU激活函数的优势在于它更接近高斯分布,但在计算复杂度和参数调节上存在一些挑战。选择使用哪种激活函数要根据具体的任务需求和实验结果来决定。