> 文章列表 > 激活函数高频面试题集合

激活函数高频面试题集合

激活函数就像是神经网络的调味料,能让模型焕发出丰富的表现力!没有它们,模型就是一盘“白水煮菜”,索然无味。常见的激活函数如ReLU、Gelu和Leaky ReLU各有千秋。ReLU简单又高效,但偶尔会“偷懒”让神经元失活;Gelu则更温和,像一位优雅的调和师,尤其在复杂任务中表现出色;而Leaky ReLU则在黑暗中点燃了一盏小灯,防止神经元完全“罢工”。那问题来了,为什么BERT和GPT偏爱Gelu?就像谈恋爱,合适的才是最好的!选择激活函数要考虑任务需求和模型架构,别让“梯度消失”或“爆炸”毁了你的模型。记住,激活函数的顺序也很重要,别让BN和Relu闹别扭哦!最后,Dropout是“减肥”还是“增肌”,放的位置可得想清楚!

激活函数高频面试题集合

激活函数

  • 激活函数的作用是什么?
  • 常用的激活函数
    • Relu
      • 引入Relu的原因
      • Relu顺序
      • relu在零点可导吗,不可导如何进行反向传播?
    • Gelu
    • leaky relu
      • 优点
      • 缺点
    • softmax
    • sigmoid
      • 缺陷
    • tanh
      • 缺点
  • 如何选择激活函数
  • Bert、GPT、GPT2中用的激活函数是什么?为什么?
  • transformer FFN层用的激活函数是什么?为什么?
  • dropout在激活函数之前做,还是激活函数之后做?

激活函数的作用是什么?

最主要的是引入了非线性因素,可以提高模型的表达能力。
如果没有激活函数,那么模型就只有线性变换,可想而知线性模型能表达的空间是有限的。而激活函数引入了非线性因素,比线性模型拥有更大的模型空间。

常用的激活函数

Relu,Gelu,leaky relu,softmax,sigmoid,tanh

Relu

引入Relu的原因

第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现 梯度消失 的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。

第三,ReLu会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。网络的稀疏性可以理解为让不同的神经元各司其职。

Relu顺序

一般是卷积-BN-Relu.
Sigmoid:如果先BN再Sigmoid,由于BN后方差接近于1,均值接近于0,使得BN后的数据接近于Sigmoid的线性区域,降低了激活函数的非线性能力,这种情况下建议Sigmoid+BN。

Relu:如果先Relu再BN,Relu后部分神经元已经失活,失活的神经元将对BN的归一化产生影响,这种情况下建议BN+Relu。

relu在零点可导吗,不可导如何进行反向传播?

不可导,人为将梯度规定为0.

import numpy as np
import matplotlib.pyplot as pltdef relu(x):return np.maximum(0, x)x = np.linspace(-10, 10, 100)
y = relu(x)plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('ReLU(x)')
plt.title('ReLU Function')
plt.grid()
plt.show()

激活函数高频面试题集合

Gelu

import numpy as np
import matplotlib.pyplot as pltdef gelu(x):return 0.5 * x * (1 + np.tanh(np.sqrt(2/np.pi) * (x + 0.044715 * np.power(x, 3))))x = np.linspace(-10, 10, 100)
y = gelu(x)plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('GeLU(x)')
plt.title('GeLU Function')
plt.grid()
plt.show()

激活函数高频面试题集合

leaky relu

优点

该方法与ReLU不同的是在x小于0的时候取f(x) = ax,其中a是一个非常小的斜率(比如0.01)。这样的改进可以使得当x小于0的时候也不会导致反向传播时的梯度消失现象。

缺点

无法避免梯度爆炸的问题。
神经网络不学习\\alphaα值。
在求导的时候,两部分都是线性的。

import numpy as np
import matplotlib.pyplot as pltdef leakyrelu(x, alpha=0.01):return np.maximum(x, alpha * x