1. Gated Recurrent Unit (GRU)
1.1 概述
Gated Recurrent Unit (GRU) 是一种改进的循环神经网络(RNN),旨在解决传统 RNN 在长期序列数据上的梯度消失和梯度爆炸问题。GRU 通过引入门控机制,使网络能够更好地捕获序列数据中的长期依赖关系。
1.2 结构
GRU 由三个门(更新门、重置门和输出门)和一个候选状态组成。更新门决定多少旧信息被保留,重置门决定旧状态信息的程度,输出门则控制新状态信息的输出。
1.3 代码示例
class GRUCell(nn.Module):
def __init__(self, input_size, hidden_size):
super(GRUCell, self).__init__()
self.hidden_size = hidden_size
self.weight_ih = nn.Linear(input_size + hidden_size, hidden_size)
self.weight_hh = nn.Linear(hidden_size, hidden_size)
self.bias = nn.Parameter(torch.zeros(hidden_size))
def forward(self, input, hidden):
h_t = hidden.repeat(1, 1, 1)
gate = torch.tanh(self.weight_ih(torch.cat([input, h_t], 1) + self.bias))
i_t = torch.sigmoid(self.weight_hh(torch.cat([input, h_t], 1) + self.bias))
o_t = torch.sigmoid(self.weight_hh(torch.cat([input, h_t], 1) + self.bias))
h_next = (1 - i_t) * h_t + o_t * gate
return h_next
2. Long Short-Term Memory (LSTM)
2.1 概述
LSTM(Long Short-Term Memory)是一种特殊的 RNN 结构,通过引入三个门(输入门、遗忘门和输出门)和单元状态,来解决长期依赖问题。
2.2 结构
LSTM 由输入门、遗忘门和输出门三个门和单元状态、候选状态组成。通过这三个门和单元状态,LSTM 可以学习到序列中的长期依赖关系。
2.3 代码示例
class LSTMCell(nn.Module):
def __init__(self, input_size, hidden_size):
super(LSTMCell, self).__init__()
self.hidden_size = hidden_size
self.weight_ih = nn.Linear(input_size + hidden_size, hidden_size)
self.weight_hh = nn.Linear(hidden_size, hidden_size)
self.bias = nn.Parameter(torch.zeros(hidden_size))
def forward(self, input, hidden):
h_t, c_t = hidden
gates = torch.tanh(self.weight_ih(torch.cat([input, h_t], 1) + self.bias))
i_t, f_t, o_t = gates.split(1, 1)
i_t, f_t, o_t = torch.sigmoid(i_t), torch.sigmoid(f_t), torch.sigmoid(o_t)
c_t = f_t * c_t + i_t * gates
h_t = o_t * torch.tanh(c_t)
return h_t, c_t
3. Bidirectional GRU (BiGRU)
3.1 概述
BiGRU 是 GRU 的双向版本,通过同时处理正向和反向序列信息,提高模型的表达能力。
3.2 结构
BiGRU 由两个 GRU 单元组成,分别处理正向和反向序列。两个单元的输出合并后作为最终结果。
3.3 代码示例
class BiGRUCell(nn.Module):
def __init__(self, input_size, hidden_size):
super(BiGRUCell, self).__init__()
self.gru = GRUCell(input_size, hidden_size)
self.hidden_size = hidden_size
def forward(self, input, hidden):
hidden = self.gru(input, hidden)
return hidden
4. Convolutional Neural Network (CNN)
4.1 概述
CNN(卷积神经网络)是一种主要用于图像处理的神经网络,具有强大的特征提取能力。
4.2 结构
CNN 由卷积层、池化层、全连接层组成。卷积层用于提取图像特征,池化层用于降低特征维度,全连接层用于分类。
4.3 代码示例
class Conv2d(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
super(Conv2d, self).__init__()
self.weight = nn.Parameter(torch.randn(out_channels, in_channels, kernel_size, kernel_size))
self.bias = nn.Parameter(torch.zeros(out_channels))
def forward(self, x):
return F.conv2d(x, self.weight, self.bias, stride, padding)
5. Recurrent Neural Network (RNN)
5.1 概述
RNN(循环神经网络)是一种处理序列数据的神经网络,通过循环机制捕获序列中的长期依赖关系。
5.2 结构
RNN 由循环单元(如 LSTM、GRU)和全连接层组成。循环单元用于处理序列数据,全连接层用于分类或回归。
5.3 代码示例
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.rnn = nn.LSTM(input_size, hidden_size)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.rnn(x)
out = self.fc(out[:, -1, :])
return out
6. Attention Mechanism
6.1 概述
Attention 机制是一种使神经网络能够根据上下文信息自动分配注意力的方法,广泛应用于自然语言处理和机器翻译等领域。
6.2 结构
Attention 机制主要由注意力得分函数、注意力权重和注意力输出组成。注意力得分函数计算输入序列中每个元素与查询的相关度,注意力权重根据得分函数计算得到,注意力输出为输入序列与注意力权重的乘积。
6.3 代码示例
class Attention(nn.Module):
def __init__(self, hidden_size):
super(Attention, self).__init__()
self.hidden_size = hidden_size
self.linear_in = nn.Linear(hidden_size, hidden_size)
self.softmax = nn.Softmax(dim=-1)
def forward(self, query, key):
score = self.linear_in(torch.cat([query, key], 1))
weight = self.softmax(score)
output = torch.sum(weight * key, dim=-1)
return output
7. Transformer
7.1 概述
Transformer 是一种基于自注意力机制的深度神经网络,在自然语言处理领域取得了显著的成果。
7.2 结构
Transformer 由多头自注意力层、前馈神经网络和层归一化组成。多头自注意力层用于学习输入序列的上下文关系,前馈神经网络用于学习局部特征,层归一化用于缓解梯度消失问题。
7.3 代码示例
class MultiHeadAttention(nn.Module):
def __init__(self, hidden_size, num_heads):
super(MultiHeadAttention, self).__init__()
self.hidden_size = hidden_size
self.num_heads = num_heads
self.linear_q = nn.Linear(hidden_size, hidden_size)
self.linear_k = nn.Linear(hidden_size, hidden_size)
self.linear_v = nn.Linear(hidden_size, hidden_size)
self.linear_o = nn.Linear(hidden_size, hidden_size)
self.softmax = nn.Softmax(dim=-1)
def forward(self, query, key, value):
q = self.linear_q(query)
k = self.linear_k(key)
v = self.linear_v(value)
q = q.reshape(-1, self.num_heads, self.hidden_size // self.num_heads)
k = k.reshape(-1, self.num_heads, self.hidden_size // self.num_heads)
v = v.reshape(-1, self.num_heads, self.hidden_size // self.num_heads)
attn = torch.matmul(q, k.transpose(-2, -1)) / self.hidden_size ** 0.5
attn = self.softmax(attn)
output = torch.matmul(attn, v)
output = output.reshape(-1, self.hidden_size)
output = self.linear_o(output)
return output
8. Generative Adversarial Network (GAN)
8.1 概述
GAN(生成对抗网络)是一种无监督学习模型,由生成器和判别器组成。生成器生成数据,判别器判断数据是否真实。
8.2 结构
GAN 由生成器、判别器和对抗训练组成。生成器生成数据,判别器判断数据是否真实,对抗训练使生成器生成的数据越来越接近真实数据。
8.3 代码示例
class Generator(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(Generator, self).__init__()
self.fc = nn.Linear(input_size, hidden_size)
self.output = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = torch.relu(self.fc(x))
x = self.output(x)
return x
9. Variational Autoencoder (VAE)
9.1 概述
VAE(变分自编码器)是一种无监督学习模型,通过编码器和解码器学习数据的潜在分布。
9.2 结构
VAE 由编码器、解码器和潜在空间组成。编码器将输入数据映射到潜在空间,解码器将潜在空间数据映射回输入数据。
9.3 代码示例
class VAE(nn.Module):
def __init__(self, input_size, hidden_size, latent_size):
super(VAE, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, latent_size)
)
self.decoder = nn.Sequential(
nn.Linear(latent_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, input_size)
)
def forward(self, x):
mu, logvar = self.encoder(x)
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
z = mu + eps * std
x_hat = self.decoder(z)
return x_hat, mu, logvar
10. Capsule Network
10.1 概述
Capsule Network(胶囊网络)是一种基于向量的神经网络,能够更好地处理具有层次结构的特征。
10.2 结构
Capsule Network 由多个胶囊层组成,每个胶囊层包含多个胶囊。胶囊层通过动态路由算法将特征传递到下一层。
10.3 代码示例
class CapsuleLayer(nn.Module):
def __init__(self, num_capsules, num_classes, in_channels, out_channels, kernel_size, stride):
super(CapsuleLayer, self).__init__()
self.num_capsules = num_capsules
self.num_classes = num_classes
self.in_channels = in_channels
self.out_channels = out_channels
self.kernel_size = kernel_size
self.stride = stride
self.capsules = nn.ModuleList([
nn.Conv2d(in_channels, out_channels, kernel_size, stride)
for _ in range(num_capsules)
])
self Routing = DynamicRouting()
def forward(self, x):
outputs = [capsule(x) for capsule in self.capsules]
outputs = self.Routing(outputs, self.num_classes)
return outputs