1、简单描述一下Transformer中的前馈神经网络?使用了什么激活函数?相关优缺点?
前馈神经网络采用了两个线性变换,激活函数为Relu,公式如下:
F
F
N
(
x
)
=
m
a
x
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
FFN(x) = max(0, xW_1 + b_1) W_2 + b_2
FFN(x)=max(0,xW1+b1)W2+b2
优点:
- SGD算法的收敛速度比 sigmoid 和 tanh 快;(梯度不会饱和,解决了梯度消失问题)
- 计算复杂度低,不需要进行指数运算;
- 适合用于后向传播。
缺点:
- ReLU的输出不是zero-centered;
- ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。,Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数永远不会被更新(在负数部分,梯度为0)。产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。 解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
- ReLU不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。
2、为什么要 加入 Layer normalization 模块?
动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸;
原因:
数据经过该网络层的作用后,不再是归一化,偏差会越来越大,所以需要将 数据 重新 做归一化处理;
目的:
在数据送入激活函数之前进行normalization(归一化)之前,需要将输入的信息利用 normalization 转化成均值为0方差为1的数据,避免因输入数据落在激活函数的饱和区而出现 梯度消失 问题
3、为什么transformer块使用LayerNorm而不是BatchNorm?LayerNorm 在Transformer的位置是哪里?
Normalization目的就是让分布稳定下来(降低各维度数据的方差)。
这个问题换个问法就是:为什么图像处理用batch normalization效果好,而自然语言处理用 layer normalization好?
LayerNorm是对隐层状态维度进行归一化,而batch norm是对样本batch size维度进行归一化。在NLP任务中由于不像图像任务中batch size是固定的,通常是变化的,所以batch norm的方差会更大一些。而layer norm可以缓解该问题。
参考资料:
关于Transformer的那些个为什么