深度神经网络大家族一览

释放双眼,带上耳机,听听看~!
本文介绍了深度神经网络家族中的DNN、FNN、CNN、RNN等模型,以及它们的工作原理和应用。通过生动的比喻和实际代码示例,帮助读者更全面地了解深度学习和人工智能领域的知识。

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

beginning

   
一提到深度神经网络,大家脑海中第一个浮现的无疑是卷积神经网络(Convolutional Neural Network,CNN),并且通过前几节的学习,我相信盆友们已经可以很熟练地掌握一些CNN的应用啦🌻🌻🌻然而,CNN只是深度学习神经网络中的一小部分,深度神经网络家族还有许多其他成员。今天,我就把压箱底的宝贝拿出来啦,向大家介绍一下庞大的深度神经网络家族,让盆友们对人工智能和深度学习有更全面深入的认识🎈🎈🎈

1.深度神经网络简介

   
深度神经网络(Deep Neural Network,DNN)是一种由多个神经元层组成的计算模型。每个神经元接收来自上一层的输入,并通过激活函数处理后输出给下一层。它的核心思想是通过训练来学习输入与输出之间的映射关系。训练过程中,网络根据输入进行前向传播计算,并与真实输出进行比较计算损失函数;然后通过反向传播算法来调整网络中的权重和偏置,以减小损失函数,从而优化网络性能。(这几个名词是不是很熟悉腻🌴🌴🌴前几节都介绍过啦,看来深度学习的尽头是卷积狗头保命

深度神经网络大家族一览

   
让我们来生动形象地理解一下DNNcolor{blue}{让我们来生动形象地理解一下DNN}:你是一个勇敢的探险家,踏上了深度神经网络的冒险之旅。冒险队由许多小伙伴组成,每个小伙伴都是一个神奇的火花。他们住在一个神秘的迷宫中,你要帮助他们解开谜题。第一层火花接受来自世界的各种信息,如图片、文字或声音,并相互交流,然后传递给下一层的火花。随着你们深入迷宫,火花们变得越来越聪明和敏锐。他们通过调整形状和颜色捕捉不同类型的信息。有的善于辨认形状,有的擅长辨别颜色,有的对声音敏感。他们相互协作,将智慧传递给下一层。在迷宫深处发现许多宝藏,这些宝藏是对火花们智慧和努力的奖励。有时,他们能识别图片中的物体,猜测隐藏在声音背后的情感,还能创作音乐。你扮演导师角色,观察并给予有益反馈。通过训练和调整,火花变得更聪明。最终,成功解开迷宫谜题,展示令人惊叹的智慧和能力。他们可以翻译语言、预测天气,甚至创造艺术作品。总的来说,DNN是一个充满无限可能的世界。

2.六大深度神经网络模型

2.1前馈神经网络FNN

   
前馈神经网络(Feedforward Neural Network)也被称为多层感知机,是一种最常见和基本的人工神经网络模型。它由多个神经元层组成,这些层按顺序连接,并且信号只在一个方向上前进,从输入层到输出层,没有循环反馈。

以下是前馈神经网络的一般结构和工作原理

  1. 输入层(Input Layer):接收外部输入数据的神经元层。每个输入特征都与输入层中的一个神经元相对应。
  2. 隐藏层(Hidden Layer):位于输入层和输出层之间的神经元层。可以有一个或多个隐藏层。每个隐藏层中的神经元通过权重和激活函数来处理输入信息,并将结果传递给下一层。
  3. 输出层(Output Layer):生成最终预测或输出结果的神经元层。输出层的神经元数量通常与问题的要求相关。
  4. 权重(Weights):每个神经元与其他神经元的连接都有一个权重值,它决定连接的强弱及信息传递的效果。
  5. 激活函数(Activation Function):应用于每个神经元的数学函数。它将加权输入转换为神经元的输出值,引入非线性性质,增加网络的表达能力。

前馈神经网络训练过程:初始化权重、前向传播、计算损失、反向传播、更新权重和重复迭代。

以下是一个简单的使用TensorFlow实现前馈神经网络的代码,有利于理解:

import tensorflow as tf
# 定义前馈神经网络
def ffn_model():
    # 创建模型
    model = tf.keras.models.Sequential()
    # 添加隐藏层
    model.add(tf.keras.layers.Dense(64, activation='relu', input_shape=(input_size,)))
    # 添加输出层
    model.add(tf.keras.layers.Dense(output_size, activation='softmax'))
    return model

# 定义输入和输出的维度
input_size = 100
output_size = 10
# 创建模型
model = ffn_model()
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(train_data, train_labels, epochs=10, batch_size=32)
# 使用模型进行预测
predictions = model.predict(test_data)

2.2卷积神经网络CNN

关于卷积神经网络的原理介绍及一些应用,前几节已经讲解很多啦,没看过的来看看叭➡

2.3循环神经网络RNN

   
循环神经网络(Recurrent Neural Network,RNN)也叫递归神经网络,是一种具有循环连接的人工神经网络模型,专门用于处理序列数据,具有记忆能力。相比于前馈神经网络,RNN不仅接收当前输入的信息,还会接收之前时间步的输出信息。

   
RNN的核心思想是引入隐藏状态(hidden state)来传递信息。在每个时间步,RNN会接收当前输入和前一个时间步的隐藏状态,并产生当前时间步的输出和新的隐藏状态。这种循环结构使得RNN可以捕捉到序列数据的上下文信息,并在处理长序列时具有较好的表现。

   
RNN的隐藏状态更新公式如下:

ht=f(Wxt+Uht−1+b){h_t} = f(W{x_t} + U{h_{t – 1}} + b)

   
其中,ht表示当前时间步t的隐藏状态,xt表示当前时间步t的输入,U和W是可学习的权重矩阵,b是偏置向量,f()是激活函数。

深度神经网络大家族一览

   
RNN的训练通常使用反向传播算法和梯度下降优化方法,其中关键是通过时间反向传播(Backpropagation Through Time,BPTT)算法来计算梯度,并使用梯度下降法来更新权重和偏置。

以下是一个简单的使用TensorFlow实现RNN的代码:

import tensorflow as tf
# 定义RNN模型,其中包含一个SimpleRNN层和一个输出层
def rnn_model():
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.SimpleRNN(64, activation='relu', input_shape=(time_steps, input_size)))
    model.add(tf.keras.layers.Dense(output_size, activation='softmax'))
    return model

# 定义输入和输出的维度
input_size = 100
output_size = 10
time_steps = 10
# 创建模型
model = rnn_model()
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(train_data, train_labels, epochs=10, batch_size=32)
# 使用模型进行预测
predictions = model.predict(test_data)

2.3.1长短期记忆网络LSTM

   
长短期记忆网络(Long Short-Term Memory,LSTM)是一种特殊类型的循环神经网络,专门用于处理序列数据,具有记忆能力。相比传统的RNN模型,LSTM能够更好地解决梯度消失和梯度爆炸问题,有效地捕捉序列数据中的长距离依赖关系

   
主要原理:引入了记忆单元(memory cell)和三个门控机制(输入门、遗忘门、输出门),通过这些机制来控制信息的流动和记忆的更新。记忆单元负责存储和更新记忆信息,三个门控机制则控制当前输入、前一时间步的隐藏状态以及记忆单元之间的交互。

   
具体来说,LSTM的记忆单元由一个细胞状态(cell state)和一个隐藏状态(hidden state)组成。细胞状态在每个时间步都会被更新,而隐藏状态则会根据当前输入和前一个时间步的隐藏状态来产生。三个门控机制都是通过使用sigmoid激活函数和逐元素乘法操作来控制信息的流动。

  • 输入门(Input Gate):控制新输入信息对细胞状态的影响程度
  • 遗忘门(Forget Gate):控制前一时间步的细胞状态对当前细胞状态的影响程度
  • 输出门(Output Gate):控制当前细胞状态对隐藏状态的影响程度

深度神经网络大家族一览

LSTM的简单代码和上面的差不多,只不过是定义模型有了些改变:

# 定义LSTM模型,其中包含一个LSTM层和一个输出层
def lstm_model():
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.LSTM(64, activation='tanh', input_shape=(time_steps, input_size)))
    model.add(tf.keras.layers.Dense(output_size, activation='softmax'))
    
    return model

2.4生成对抗网络GAN

   
生成对抗网络(GAN)是一种由两个神经网络组成的框架,旨在生成逼真的合成数据。

  • GAN 的核心思想是通过训练一个生成器网络(Generator)和一个判别器网络(Discriminator)来进行对抗学习。生成器试图生成逼真的合成数据样本,而判别器则试图区分真实样本和生成样本。

  • 对于生成器网络,它接收一个随机噪声向量作为输入,并输出一个与真实样本类似的合成样本。生成器的目标是欺骗判别器,使得判别器无法准确区分生成的样本和真实的样本。

  • 对于判别器网络,它接收真实样本或生成器生成的样本作为输入,并输出一个表示样本真实性的概率值。判别器的目标是尽可能准确地区分真实样本和生成的样本。

GAN 的训练过程可以概括为以下步骤:

  1. 生成器生成合成样本;
  2. 判别器对真实样本和生成的样本进行分类,并计算损失;
  3. 生成器根据判别器的反馈调整生成策略,并计算损失;
  4. 重复步骤 1-3,直到生成器和判别器达到一个动态平衡。

   
真实的 GAN 模型需要更复杂的架构、更多的样本数据、更多的训练技巧才能获得高质量的合成样本。同时,还有很多其他更高级的 GAN 变体和改进方法可以探索和尝试,下图是GAN家族的演变。

深度神经网络大家族一览

2.5深度Q网络DQN

   
深度强化学习网络(Deep Reinforcement Learning Network,DRLN)是将深度学习和强化学习相结合的方法,其原理基于强化学习的框架。在强化学习中,智能体通过与环境的交互来学习最优策略,以最大化累积奖励;而深度学习网络则用于逼近值函数或策略函数,将状态映射为动作。

   
DRLN的原理基于强化学习的框架,其中主要包括环境、智能体、状态、动作和奖励等要素。智能体根据当前状态(State)选择相应的动作(Action),并根据环境的反馈获得相应的奖励(Reward)。通过不断与环境交互,智能体逐步学习出最优的策略,使累积奖励最大化。它引入了深度神经网络作为智能体的决策模型,用于将状态映射到动作空间。

   
典型的DRLN模型是深度Q网络(Deep Q-Network,DQN)。DQN论文提出了一种使用深度神经网络进行Q值函数逼近的方法。通过将当前状态作为输入,神经网络输出每个动作的Q值,智能体根据Q值选择动作。DQN采用经验回放(Experience Replay)来存储和随机选择过去的经验样本,以减小样本之间的关联性,并且使用固定Q目标(Fixed Q-Targets)来提高训练的稳定性。

   
关于DRLN,因为涉及到强化学习,属实是超出了我的学习范围(只有大佬才配学高难度滴强化学习),所以只能介绍这么些啦🧸🧸🧸

2.6Transformer

   
Transformer是一种基于自注意力机制(self-attention)的深度学习模型,核心思想是完全基于注意力机制来建模序列间的依赖关系,而不依赖于传统的循环神经网络(RNN)或卷积神经网络(CNN)。它使用自注意力机制来实现并行计算,使得模型能够更好地捕捉文本中不同位置的上下文信息。

   
自注意力机制允许模型在计算每个位置的表示时,考虑到输入序列中其他位置的语义关系。通过对输入序列中所有位置的软注意力权重进行加权求和,Transformer能够更好地捕捉上下文信息,并有效地建模长距离依赖关系。

   
Transformer模型由编码器和解码器组成:

  • 编码器(Encoder):编码器将输入序列进行特征提取和编码,生成一系列表示输入序列的上下文向量。编码器由多个相同的层堆叠而成,每层包含以下两个子层:
    1. 多头自注意力机制(Multi-head Self-Attention):该机制允许模型在计算每个位置的表示时,同时考虑到输入序列中其他位置的信息。它通过将输入序列映射为查询、键和值,计算注意力权重并对值进行加权求和,生成每个位置的表示;
    2. 前馈神经网络(Feed Forward Network):该网络在每个位置上进行独立的全连接层操作,用于进一步处理自注意力机制的输出。它通过两层线性变换和一个激活函数,对每个位置的表示进行非线性变换;
  • 解码器(Decoder):解码器根据编码器生成的上下文向量,以及已生成的部分输出序列,预测下一个输出。解码器也由多个相同的层堆叠而成,每层包含以下三个子层:
    1. 多头自注意力机制:与编码器中的自注意力机制类似,但在计算注意力权重时,解码器还会考虑输入序列的其他位置;
    2. 多头注意力机制(Multi-head Attention):该机制通过对编码器的输出进行注意力计算,将解码器的表示与编码器的上下文信息对齐,从而更好地捕捉输入序列的相关信息;
    3. 前馈神经网络:与编码器中的前馈神经网络相同;

   
通过编码器和解码器的协同工作,Transformer模型能够准确捕捉输入序列的上下文信息,并生成高质量的输出序列。

深度神经网络大家族一览

这几年Transformer可太火了,用处太多,下面简单介绍几个它的变体

  1. BERT(Bidirectional Encoder Representations from Transformers):BERT是一种双向Transformer编码器的预训练语言模型。它通过在大规模无标注文本上进行预训练,学习到丰富的语言表示。其在各种NLP任务中取得了显著的性能提升,并成为自然语言处理领域的重要里程碑。
  2. GPT(Generative Pre-trained Transformer):GPT是一种基于Transformer的自回归语言模型。它通过在大规模文本上进行预训练,学习到语言的概率分布,并能生成连贯且合理的文本。GPT在文本生成、机器翻译等任务中表现出色。
  3. XLNet:XLNet是一种自回归的、用于语言建模的Transformer模型。与传统的自回归模型不同,XLNet考虑了所有可能的因果关系,通过对所有排列的输入序列进行建模,克服了传统自回归模型中的限制,并在多项NLP任务上取得了最先进的结果。
  4. T5(Text-To-Text Transfer Transformer):T5是一种通用的预训练Transformer模型,它将多个自然语言处理任务(如文本分类、命名实体识别、问答等)统一成文本到文本的转换问题进行建模。它通过大规模无监督预训练和有监督微调,在多个任务上取得了很好的性能。
  5. ViT(Vision Transformer):ViT是一种将Transformer应用于计算机视觉领域的模型。它将图像分割成一组小的图像块,并通过Transformer编码器来提取特征,然后进行分类或其他视觉任务。ViT在图像分类等任务中达到或超过了传统卷积神经网络的性能。

3.其他经典深度学习技术

3.1自动编码器AE

   
自动编码器(Autoencoder,AE)是一种无监督学习的神经网络模型,通过将输入数据压缩成低维度的表示并尝试将其重构回原始输入,从而实现数据的特征提取和降维。

   
AE由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器将输入数据映射到潜在空间(也称为编码或隐藏层),而解码器则将潜在表示映射回原始数据空间。整个模型的目标是最小化重构误差,使得重构的输出尽可能接近原始输入。

深度神经网络大家族一览

训练过程可以分为两个阶段:

  1. 编码阶段:输入数据通过编码器进行压缩,得到低维的潜在表示
  2. 解码阶段:将潜在表示通过解码器进行重构,得到与原始输入相似的输出

   
AE的训练过程可以使用反向传播算法进行优化,通过最小化重构误差来更新网络的参数。一般情况下,常用的重构误差函数是均方差(Mean Squared Error,MSE)。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 自动编码器模型定义
def build_autoencoder(input_dim, latent_dim):
    # 编码器部分
    encoder_inputs = keras.Input(shape=(input_dim,))
    encoded = layers.Dense(64, activation='relu')(encoder_inputs)
    encoded = layers.Dense(latent_dim, activation='relu')(encoded)
    # 解码器部分
    decoder_inputs = layers.Dense(latent_dim, activation='relu')(encoded)
    decoded = layers.Dense(64, activation='relu')(decoder_inputs)
    decoded = layers.Dense(input_dim, activation='sigmoid')(decoded)
    # 定义自动编码器模型
    autoencoder = keras.Model(encoder_inputs, decoded)
    return autoencoder

# 加载并预处理数据集
(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0

# 构建自动编码器模型
input_dim = 784
latent_dim = 64
autoencoder = build_autoencoder(input_dim, latent_dim)

# 编译模型并训练
autoencoder.compile(optimizer='adam', loss='mse')
autoencoder.fit(x_train, x_train, epochs=10, batch_size=128, validation_data=(x_test, x_test))

# 使用训练好的自动编码器进行重构
encoded_imgs = autoencoder.encoder.predict(x_test)
decoded_imgs = autoencoder.decoder.predict(encoded_imgs)

   
上述代码是一个简单AE的实现示例。在代码中,定义了一个具有一个隐藏层的编码器和一个解码器的自动编码器模型。我们以 MNIST 数据集为例,将输入图像压缩为 64 维的潜在表示,并尝试将其重构回原始图像。通过编译模型并使用均方差损失函数进行训练,我们可以得到训练好的自动编码器模型。然后,可以使用训练好的自动编码器对新样本进行重构,从而实现数据的降维和重建。

3.2深度残差网络DRN

   
深度残差网络(Deep Residual Network,DRN)是一种深度学习架构,通过引入残差连接来解决深层网络训练过程中的梯度消失和模型退化问题,使得可以更容易地训练和优化非常深的神经网络。

   
原理:传统的深层神经网络在训练过程中可能遇到梯度消失和模型退化的问题。当网络变得很深时,反向传播算法在更新参数时梯度会逐渐减小,导致难以有效地训练网络。为了解决这个问题,DRN引入了残差连接(Residual Connection)。残差连接可以看作是一种跨层的直接连接,通过将前一层的特征与后续层的特征相加,使得网络可以更容易地学习残差(即前后层特征之间的差异)。这样,对于深度网络中较浅的层,即使网络的学习函数近似于恒等映射,也可以通过残差连接传递正确的梯度信息,避免梯度消失问题。具体而言,DRN的基本单元是残差块(Residual Block),它由两个或三个卷积层组成。残差块的输入通过跳过一个或多个卷积层,直接与块内最后一个卷积层的输出相加,然后经过激活函数得到最终的输出。

深度神经网络大家族一览

import torch
import torch.nn as nn
class ResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(out_channels)
        
        if stride != 1 or in_channels != out_channels:
            self.skip_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride)
        else:
            self.skip_conv = None

    def forward(self, x):
        identity = x
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
        out = self.conv2(out)
        out = self.bn2(out)
        if self.skip_conv is not None:
            identity = self.skip_conv(identity)
            
        out += identity
        out = self.relu(out)
        
        return out

class DRN(nn.Module):
    def __init__(self, num_classes):
        super(DRN, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.layer1 = self._make_layer(64, 64, 2)
        self.layer2 = self._make_layer(64, 128, 2, stride=2)
        self.layer3 = self._make_layer(128, 256, 2, stride=2)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(256, num_classes)

    def _make_layer(self, in_channels, out_channels, num_blocks, stride=1):
        layers = []
        layers.append(ResidualBlock(in_channels, out_channels, stride))
        
        for _ in range(1, num_blocks):
            layers.append(ResidualBlock(out_channels, out_channels))
        
        return nn.Sequential(*layers)

    def forward(self, x):
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
        out = self.maxpool(out)
        out = self.layer1(out)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.avgpool(out)
        out = torch.flatten(out, 1)
        out = self.fc(out)
        
        return out
# 使用示例
model = DRN(num_classes=10)
input = torch.randn(1, 3, 224, 224)
output = model(input)

   
上述代码是使用PyTorch框架实现DRN的示例。其中,ResidualBlock类定义了残差块的结构,而DRN类定义了整个DRN网络的结构。通过堆叠不同层数和输出通道数的残差块,可以构建具有可变深度的DRN网络。

3.3胶囊网络CapsNet

   
胶囊网络(Capsule Network,CapsNet)是由Geoffrey Hinton等人于2017年提出的一种神经网络架构。与传统的卷积神经网络不同,胶囊网络引入了胶囊层(Capsule Layer)来代替传统网络中的卷积层和全连接层。胶囊层利用胶囊(Capsule)来表达特征向量,并且能够编码实体的姿态信息。胶囊网络的设计目标是解决传统卷积神经网络在处理视觉问题时对空间层次化信息建模不足的问题。

   
胶囊网络的核心原理是利用胶囊来表示实体的各种属性,例如位置、方向、大小等,并通过动态路由(Dynamic Routing)机制来学习不同胶囊之间的权重关系。每个胶囊都输出一个向量,该向量包含了实体的属性信息,而不是单纯的激活值。

   
在胶囊网络中,第一个胶囊层被称为主胶囊层(Primary Capsule Layer),它类似于传统卷积层,用于提取低级特征。然后,主胶囊层的输出会通过动态路由算法,分配给下一层的胶囊,这样高级特征可以通过胶囊表示。动态路由算法根据两个胶囊之间的一致性来调整它们之间的权重,使得具有相似属性的胶囊可以更好地进行通信和合作。

   
胶囊网络的最后一层为分类胶囊层(Capsule Layer),每个分类胶囊对应一个类别,并输出一个向量表示实体属于该类别的概率。通过计算分类胶囊的长度(向量的范数),可以确定实体是否属于某个类别。

深度神经网络大家族一览

   
损失函数:胶囊网络通常使用多样本边缘损失函数(Margin Loss)作为训练的目标函数。多样本边缘损失函数主要通过比较目标类别的胶囊向量与其他类别的胶囊向量之间的距离来进行优化。这样可以使得目标类别的胶囊向量在空间上与其他类别的胶囊向量相隔较远,增强分类的鲁棒性。

3.4深度信念网络DBN

   
深度信念网络(Deep Belief Network,DBN)是一种由多个堆叠的受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)组成的深度神经网络,它是一种生成式模型,通过无监督学习的方式对数据进行建模和特征学习。

受限玻尔兹曼机(RBM):

  • RBM是一种基于能量的概率模型,由可见层和隐藏层节点组成。它通过学习数据的联合分布来提取特征,并具有双向的可见-隐藏连接
  • RBM中的节点是二值的(0或1),并且节点之间的连接权重是可调参数。
  • RBM使用Gibbs采样算法来进行推断和训练。在训练过程中,通过最大似然估计和对比散度算法来更新连接权重。

深度神经网络大家族一览

DBN的训练包括两个主要步骤:逐层预训练和全局微调

预训练阶段:对于每一层,RBM会被训练来对观测数据建模,并将上一层的隐藏层作为下一层的可见层输入。这一过程是无监督的,并且每个RBM只关注单层之间的信息传递;

微调阶段:在预训练完成后,整个DBN进行端到端的监督训练。使用反向传播算法来更新所有层之间的连接权重,并通过最大似然估计来拟合训练数据的标签。

# DBN模型定义
class DBN(nn.Module):
    def __init__(self, input_size, hidden_sizes):
        super(DBN, self).__init__()
        self.rbm_layers = nn.ModuleList()
        
        # 创建多个RBM层
        for i in range(len(hidden_sizes)):
            visible_size = input_size if i == 0 else hidden_sizes[i-1]
            rbm_layer = RBM(visible_size, hidden_sizes[i])
            self.rbm_layers.append(rbm_layer)
            
    def forward(self, x):
        # 逐层传递输入数据
        for rbm in self.rbm_layers:
            x = rbm(x)
        return x

# RBM模型定义
class RBM(nn.Module):
    def __init__(self, visible_size, hidden_size):
        super(RBM, self).__init__()
        self.W = nn.Parameter(torch.randn(visible_size, hidden_size))
        self.v_bias = nn.Parameter(torch.randn(visible_size))
        self.h_bias = nn.Parameter(torch.randn(hidden_size))
        
    def forward(self, x):
        h_prob = torch.sigmoid(torch.matmul(x, self.W) + self.h_bias) #计算隐藏层激活概率
        h = torch.bernoulli(h_prob)  # 根据概率生成二值化的隐藏层输出
        v_prob = torch.sigmoid(torch.matmul(h, self.W.t()) + self.v_bias)  # 计算可见层激活概率
        return v_prob

上述代码是一个简单的DBN实现,从中可以看出包括了DBN模型确实包含了多个RBM模型

3.5注意力网络AN

   
注意力网络(Attention Network,AN)是一种神经网络结构,AN的主要目标是通过计算输入序列中每个元素的权重,使模型能够专注于与当前任务相关的部分。AN的核心思想是注意力机制(Attention Mechanism),它允许模型能够根据上下文的需求,动态地为不同的输入元素分配不同的权重。这种注意力权重的计算方式可以基于输入元素之间的相关性、重要性或其他任务特定的条件来确定。

   
以下是Attention Network的基本原理和步骤

  1. 输入表示:AN的输入通常是一个序列,可以是文本中的单词序列,图像中的像素序列等。每个输入元素都有对应的表示向量,可以通过嵌入层、卷积神经网络等方法进行编码;
  2. 注意力权重计算:AN通过一系列的运算来计算每个输入元素的注意力权重。常用的计算方法包括点积注意力、缩放点积注意力、双线性注意力等。这些计算方式可以考虑元素之间的相似性、相关性、关联性等信息;
  3. 上下文向量计算:根据注意力权重和输入元素的表示向量,可以计算得到一个上下文向量。上下文向量是对输入序列中与当前任务相关的部分进行加权求和或拼接得到的。它捕捉了与任务有关的信息,并为后续的处理和预测提供了有效的特征;
  4. 输出生成:根据上下文向量,可以进行不同的操作,如分类、回归、生成等,具体取决于任务的需求和模型的设计。

   
注意力网络的优势在于它能够处理长序列和复杂信息,避免了信息衰减或过于关注某些部分的问题。通过动态调整注意力权重,AN可以自动地选择与任务相关的元素,并且在不同任务和场景下表现出良好的性能和泛化能力。

   
Attention Network的变种和扩展

  • 自注意力(Self-Attention):自注意力机制是一种注意力机制的变种,它允许模型将输入元素之间的相互作用编码为每个元素的注意力权重。自注意力机制在Transformer模型中得到了广泛的应用;
  • 多头注意力(Multi-Head Attention):多头注意力机制使用多组注意力权重计算并行地对输入进行表示,可以提高模型的表达能力和泛化能力。

4.深度神经网络模型图

   
除了这些DNN外,还有很多深度神经网络没介绍到,例如Hopfield Network(HN)、Deep Convolutional Inverse Graphics Network(DCIGN)等等,关于这个庞大的神经网络动物园,如果你还想了解更多,可以在这里再学一手:The Neural Network Zoo🎈🎈🎈

   
下面给出了DNN的大家族及模型图:

深度神经网络大家族一览

深度神经网络大家族一览

深度神经网络大家族一览

ending

   
好啦,今天关于深度神经网络就介绍到这儿啦。很开心能把学到的知识以文章的形式分享给大家。如果你也觉得我的分享对你有所帮助,please一键三连嗷!!!下期见

深度神经网络大家族一览

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

免费!炸裂!GPT 3.5强势登场,Poe AI搜索助手震撼上线,Google颤抖吧

2023-11-17 20:50:14

AI教程

如何访问New Bing?解决总是跳转到国内版(cn.bing.com)的问题

2023-11-17 20:58:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索