GLU

GLU,全称为“Gated Linear Units”,中文常称为“门控线性单元”,是深度学习中一种用于处理序列数据的神经网络结构。GLU最初是在论文《Language Modeling with Gated Convolutional Networks》中提出的,用于改进循环神经网络(RNN)和卷积神经网络(CNN)在自然语言处理任务中的性能。

GLU的结构灵感来源于门控循环单元(GRU)和长短期记忆网络(LSTM)中的门控机制,它通过引入门控机制来控制信息的流动,使得神经网络能够学习到如何有选择性地传递信息。

在GLU中,一个神经元的输出由两部分组成:一部分是线性变换的输出,另一部分是通过sigmoid函数的门控信号。这两部分输出在通道维度上相乘,即门控信号控制了线性变换输出中哪些信息可以通过,哪些信息需要被抑制。

具体来说,给定一个输入 $x$,GLU的操作可以表示为:

  1. 对输入 $x$ 进行线性变换,得到特征 $z = Wx + b$,其中 $W$ 和 $b$ 分别是权重矩阵和偏置项。
  2. 通过一个sigmoid激活函数,产生一个门控信号 $g = \sigma(W’x + b’)$,其中 $W’$ 和 $b’$ 是另一组权重和偏置。
  3. 将线性变换的输出与门控信号相乘,得到GLU的最终输出 $h = z \otimes g$。

GLU的门控机制可以让网络在训练过程中学习到哪些特征是有用的,哪些是不需要的,从而提高了模型的表示能力和泛化能力。GLU由于其结构的简洁性和有效性,在自然语言处理、语音识别等领域得到了广泛应用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import torch
import torch.nn as nn
import torch.nn.functional as F

class GLU(nn.Module):
    def __init__(self, input_size, output_size):
        super(GLU, self).__init__()
        # 定义线性变换部分
        self.linear = nn.Linear(input_size, output_size)
        # 定义门控部分,注意输出大小与线性变换部分相同
        self.gate = nn.Linear(input_size, output_size)

    def forward(self, x):
        # 线性变换
        z = self.linear(x)
        # 门控信号
        g = torch.sigmoid(self.gate(x))
        # 将线性变换的输出与门控信号相乘
        h = z * g
        return h

# 假设输入大小为10,输出大小也为10
input_size = 10
output_size = 10

# 创建GLU模块
glu = GLU(input_size, output_size)

# 创建一个随机输入向量
x = torch.randn(1, input_size)

# 前向传播
output = glu(x)

# 打印输出
print(output)
comments powered by Disqus