大家好,我是爱酱。本篇將會系统梳理卷积神经网络(Convolutional Neural Network, CNN)循环神经网络(Recurrent Neural Network, RNN)Transformer三大深度学习架构的原理、结构、优势、典型应用与数学表达。内容非常详细,并有友善的代码解释、流程解析等,适合初学者和进阶者系统理解。

注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

注:本文章颇长近10000字,建议先收藏再慢慢观看。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!


一、卷积神经网络(Convolutional Neural Network, CNN)

1. 定义与核心思想

卷积神经网络(CNN)是一类专为处理具有网格结构(如图像、音频)的数据而设计的前馈神经网络。CNN通过局部感受野、权值共享和池化等机制,能够自动提取空间局部特征,实现平移不变性和高效的特征学习。

  • 英文专有名词:Convolutional Neural Network, CNN, Convolution, Pooling, Feature Map, ReLU

2. 结构组成

  • 卷积层(Convolutional Layer):用可学习的卷积核(filter)在输入上滑动,实现特征提取。

  • 激活函数(Activation Function):常用ReLU,增加非线性。

  • 池化层(Pooling Layer):如最大池化(max pooling)、平均池化(average pooling),用于降采样和特征压缩。

  • 全连接层(Fully Connected Layer):将提取的特征映射到最终输出,如分类概率。

3. 数学公式

单通道二维卷积计算公式:

y(i, j) = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} x(i+m, j+n) \cdot w(m, n) + b

其中$x$为输入,$w$为卷积核,$b$为偏置。

4. 主要优势

  • 局部连接权值共享极大减少参数数量,提升泛化能力。

  • 自动学习多层次空间特征,无需手工设计特征。

  • 对图像的平移、缩放等具有较强的鲁棒性。

5. 典型应用

  • 图像分类、目标检测、医学图像分析、视频识别、推荐系统、文本分类等。


二、循环神经网络(Recurrent Neural Network, RNN)

1. 定义与核心思想

循环神经网络(RNN)是一类专门处理序列数据(sequence data)的神经网络。RNN通过隐藏状态的循环连接,使得网络能够“记忆”历史信息,建模时间或序列上的依赖关系

  • 英文专有名词:Recurrent Neural Network, RNN, Hidden State, Sequence, Time Step, Backpropagation Through Time (BPTT)

2. 结构组成

  • 输入层(Input Layer):接收序列的每个元素。

  • 隐藏层(Hidden Layer):每个时刻$t$的隐藏状态$h_t$不仅依赖当前输入$x_t$,还依赖前一时刻的隐藏状态$h_{t-1}$

  • 输出层(Output Layer):输出序列的每个元素或最终结果。

3. 数学公式

RNN的基本递推公式:

h_t = f(W_{xh} x_t + W_{hh} h_{t-1} + b_h)

o_t = g(W_{ho} h_t + b_o)

其中$f$$g$为激活函数,$W_{xh}$$W_{hh}$$W_{ho}$为权重矩阵。

4. 主要优势

  • 能捕捉序列数据中的时序依赖关系,适合处理变长输入。

  • 适用于自然语言、语音、时间序列等任务。

5. 典型应用

  • 机器翻译、文本生成、语音识别、时间序列预测、情感分析等。


三、Transformer

1. 定义与核心思想

Transformer是一种基于自注意力机制(Self-Attention)的深度学习模型架构,最初由Vaswani等人在2017年提出,彻底改变了序列建模和自然语言处理(NLP)领域。Transformer通过自注意力机制捕捉序列中任意位置的依赖关系,摆脱了传统RNN对序列顺序的强依赖,实现了高效并行和更强的长距离依赖建模。

  • 英文专有名词:Transformer, Self-Attention, Multi-Head Attention, Positional Encoding

  • 核心思想:用自注意力机制(Self-Attention)为序列中每个位置动态分配对其它位置的关注权重,支持并行计算和全局建模。

2. 结构组成

Transformer主要由编码器(Encoder)和解码器(Decoder)两部分组成,每部分由多个相同的层堆叠而成。

  • 编码器层:包含多头自注意力(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Network),每个子层后有残差连接和层归一化(Layer Normalization)。

  • 解码器层:在编码器结构基础上,增加对编码器输出的注意力机制(Encoder-Decoder Attention),用于结合输入序列信息。

3. 数学表达

  • 自注意力机制(Self-Attention)

    给定输入序列的查询(Query)$Q$,键(Key)$K$,值(Value)$V$,自注意力输出为:

    \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V

    其中,$d_k$是键的维度,用于缩放。

  • 多头注意力(Multi-Head Attention)

    \text{MultiHead}(Q, K, V) = \text{Concat}(head_1, ..., head_h)W^O

    其中每个头为:

    head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)

    $W_i^Q, W_i^K, W_i^V, W^O$可学习参数矩阵

  • 前馈网络(Feed-Forward Network)

    \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2

4. 主要优势

  • 并行计算:不依赖序列顺序,支持GPU并行加速

  • 长距离依赖建模:自注意力机制能捕捉任意位置的依赖关系,突破RNN的“短记忆”问题

  • 灵活性强:广泛应用于NLP、计算机视觉、语音等多模态任务。

5. 典型应用

  • 机器翻译(如Google翻译)、文本生成(GPT系列)、文本理解(BERT系列)

  • 图像识别(Vision Transformer, ViT)

  • 语音识别与合成


四、CNN、RNN与Transformer的结构对比与优缺点

维度 卷积神经网络(CNN) 循环神经网络(RNN) Transformer
主要结构 卷积层、池化层、全连接层 循环隐藏层、时间步递归 编码器-解码器结构,多头自注意力机制
处理数据类型 网格结构数据(图像、音频) 序列数据(文本、语音、时间序列) 序列数据,支持并行处理
计算效率 高,支持并行 低,序列依赖,难并行 高,完全并行,适合大规模训练
长距离依赖建模 有限,感受野限制 有限,梯度消失问题 优秀,自注意力捕捉任意距离依赖
参数共享 卷积核权重共享 时间步权重共享 无权重共享,注意力权重动态计算
优点 参数少,适合图像特征提取 适合序列建模,捕捉时间依赖 并行高效,长距离依赖,灵活性强
缺点 不适合长序列依赖 训练难,梯度消失,计算慢 计算资源需求高,模型复杂
典型应用 图像分类、目标检测、语音识别 机器翻译、语音识别、文本生成 机器翻译、文本理解、图像识别

五、典型应用案例与可视化示例

1. 卷积神经网络(CNN)

  • 应用案例:图像分类(如CIFAR-10、ImageNet)

  • 可视化示例:卷积层特征图(Feature Maps)

注:请大家记得先pip install tensorflow scikit-learn matplotlib等依赖!

注:请一定要把路径换为您自己图片的路径。用什么图片不重要,爱酱这里就换上一张猫猫的图片(cat.jpg)。你可以选择任何图片。

注:第一次的时候可能会要先下载一下Dataset,需要等待一下。

import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.applications import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions
from tensorflow.keras.models import Model

# 用原始字符串写法,避免Windows路径转义问题
img_path = r'D:\XXX\XXX\cat.jpg'  # 替换为你的图片路径

# 加载预训练VGG16模型(去掉顶层全连接层)
model = VGG16(weights='imagenet', include_top=False)

# 加载并预处理图片
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

# 获取所有卷积层的输出
layer_outputs = [layer.output for layer in model.layers if 'conv' in layer.name]
activation_model = Model(inputs=model.input, outputs=layer_outputs)

# 预测所有卷积层的激活
activations = activation_model.predict(x)

# 可视化第一卷积层的前16个特征图
first_layer_activation = activations[0]  # 取第一个卷积层输出,shape: (1, height, width, channels)
plt.figure(figsize=(15, 15))
for i in range(16):
    plt.subplot(4, 4, i+1)
    plt.imshow(first_layer_activation[0, :, :, i], cmap='viridis')
    plt.axis('off')
plt.suptitle('CNN Feature Maps (First Conv Layer)')
plt.show()

# 加载完整模型用于分类预测
full_model = VGG16(weights='imagenet', include_top=True)

# 重新预处理图片用于完整模型
img_for_pred = image.load_img(img_path, target_size=(224, 224))
x_pred = image.img_to_array(img_for_pred)
x_pred = np.expand_dims(x_pred, axis=0)
x_pred = preprocess_input(x_pred)

# 预测分类结果
preds = full_model.predict(x_pred)

# 解码预测结果
decoded_preds = decode_predictions(preds, top=3)[0]

# 打印预测结果
print("Top 3 Predictions:")
for i, (imagenet_id, label, prob) in enumerate(decoded_preds):
    print(f"{i+1}. {label}: {prob*100:.2f}%")

爱酱的猫猫图片:

结果:

注:tabby就是虎斑猫

说明:

  • 前半部分:可视化第一卷积层的16个特征图,帮助你理解CNN如何“看”图片。

  • 后半部分:用完整VGG16模型对图片进行分类预测,并输出Top 3类别及其概率,让你看到“模型识别了什么”。

  • 路径用原始字符串,避免Windows路径报错。

  • 若模型预测结果不是猫,可能是因为猫的品种或姿态与ImageNet训练集不同,属于正常现象。


2. 循环神经网络(RNN)

  • 应用案例:文本情感分析

  • 可视化示例:RNN隐藏状态随时间步变化

注:请大家记得先pip install tensorflow scikit-learn matplotlib等依赖!

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense
from sklearn.model_selection import train_test_split

# 生成简单序列数据
np.random.seed(0)
X = np.random.rand(1000, 10, 1)  # 1000个样本,序列长度10,特征1
# 目标是序列中每个样本的和是否大于5(二分类)
Y = (np.sum(X, axis=1) > 5).astype(int).reshape(-1)

# 划分训练和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=42)

# 构建RNN模型
model = Sequential([
    SimpleRNN(32, activation='relu', input_shape=(10, 1)),
    Dense(2, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 训练模型
history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test), verbose=1)

# 预测测试集
y_pred = model.predict(X_test)

# 可视化训练过程
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Val Loss')
plt.title('RNN Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Val Accuracy')
plt.title('RNN Training Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

# 打印部分预测结果
print('Sample predictions (probabilities) for first 5 test samples:')
print(y_pred[:5])
print('Predicted classes:')
print(np.argmax(y_pred[:5], axis=1))
print('True classes:')
print(y_test[:5])

说明:

  • 前半部分:训练RNN并可视化loss和accuracy曲线,帮助你理解RNN的训练过程。

  • 后半部分:输出部分预测概率、预测类别和真实类别,让你看到RNN的“识别/判断”能力。


3. Transformer

  • 应用案例:机器翻译

  • 可视化示例:注意力权重热力图

注:请大家记得先pip install tensorflow matplotlib等依赖!

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, MultiHeadAttention, LayerNormalization, Dropout
from tensorflow.keras.models import Model

# 简单Transformer编码器层定义
class TransformerEncoderLayer(tf.keras.layers.Layer):
    def __init__(self, d_model, num_heads, dff, rate=0.1):
        super(TransformerEncoderLayer, self).__init__()
        self.mha = MultiHeadAttention(num_heads=num_heads, key_dim=d_model)
        self.ffn = tf.keras.Sequential([
            Dense(dff, activation='relu'),
            Dense(d_model)
        ])
        self.layernorm1 = LayerNormalization(epsilon=1e-6)
        self.layernorm2 = LayerNormalization(epsilon=1e-6)
        self.dropout1 = Dropout(rate)
        self.dropout2 = Dropout(rate)

    def call(self, x, training, mask=None):
        attn_output, attn_scores = self.mha(x, x, x, attention_mask=mask, return_attention_scores=True)
        attn_output = self.dropout1(attn_output, training=training)
        out1 = self.layernorm1(x + attn_output)
        ffn_output = self.ffn(out1)
        ffn_output = self.dropout2(ffn_output, training=training)
        out2 = self.layernorm2(out1 + ffn_output)
        return out2, attn_scores

# 构建简单Transformer模型
input_seq = Input(shape=(10, 16))  # 序列长度10,特征维度16
encoder_layer = TransformerEncoderLayer(d_model=16, num_heads=2, dff=64)
encoder_output, attn_scores = encoder_layer(input_seq, training=False)

model = Model(inputs=input_seq, outputs=[encoder_output, attn_scores])

# 生成随机输入数据
np.random.seed(0)
input_data = np.random.rand(1, 10, 16).astype(np.float32)

# 预测
encoder_out, attention_weights = model.predict(input_data)

# 可视化第一个头的注意力权重
plt.figure(figsize=(8, 6))
plt.imshow(attention_weights[0, 0], cmap='viridis')
plt.colorbar()
plt.title('Transformer Attention Weights (Head 1)')
plt.xlabel('Key Positions')
plt.ylabel('Query Positions')
plt.show()

# 打印编码器输出形状
print('Encoder output shape:', encoder_out.shape)
print('Attention weights shape:', attention_weights.shape)

说明:

  • 前半部分:构建并运行一个简单的Transformer编码器,输入随机序列。

  • 可视化部分:展示Transformer自注意力权重热力图,直观理解模型“关注”序列中的哪些位置。

  • 后半部分:输出编码器的输出shape和注意力权重shape,帮助理解模型输出结构。


总结:卷积神经网络(CNN)vs. 循环神经网络(RNN)vs. Transformer

卷积神经网络(CNN)、循环神经网络(RNN)和Transformer是深度学习领域三大经典架构,各自针对不同类型的数据和任务展现出独特优势。理解它们的结构原理、特性及适用场景,对于AI系统设计和工程落地至关重要。

卷积神经网络(CNN)

CNN以卷积操作为核心,利用局部感知和权重共享机制,能够高效提取图像、音频等网格结构数据中的局部特征。其主要优势在于参数数量少,计算效率高,能有效捕捉空间相关性和层次结构,广泛应用于图像分类、目标检测、医学影像等领域。CNN通过多层堆叠实现从低级到高级的特征抽取,是计算机视觉领域的主力模型。

局限性在于:感受野有限,难以直接捕获长距离依赖或全局上下文信息;对序列建模能力有限,处理文本、时间序列等任务时表现不如RNN和Transformer。

循环神经网络(RNN)

RNN通过隐藏状态的循环连接,能够“记忆”历史信息,专门设计用于处理序列数据,如文本、语音、时间序列等。RNN适合捕捉时序依赖和变长输入,广泛应用于机器翻译、语音识别、文本生成等任务。

主要优势在于能建模时间动态行为和短距离依赖,但局限性也很明显:传统RNN难以捕捉长距离依赖(长期依赖问题),容易出现梯度消失或爆炸,训练效率低,难以并行处理长序列数据。为此,LSTM、GRU等变种被提出以缓解这些问题。

Transformer

Transformer基于自注意力机制(Self-Attention),彻底改变了序列建模方式。它能够直接建模序列中任意位置的全局依赖关系,大幅提升了长距离特征捕获能力。Transformer结构支持完全并行计算,极大提高了训练和推理效率,尤其适合大规模数据和长序列任务。

核心优势包括:

  • 全局上下文捕获能力强,能动态关注序列中任意位置的信息。

  • 并行化效率高,适合GPU/TPU等硬件加速。

  • 归纳偏置少,适应性强,能处理文本、图像、音频等多模态数据。

  • 在NLP、CV等领域设立了多个新基准,成为BERT、GPT、ViT等主流大模型的基础。

局限性在于模型参数多、计算资源需求高,且在极短序列或小数据场景下不一定优于传统方法。

综合对比

  • 特征提取能力:Transformer > RNN ≈ CNN(全局语义特征,尤其在长序列/复杂结构中Transformer最强)。

  • 长距离依赖建模:Transformer ≈ RNN > CNN(RNN和Transformer均能捕捉长距离依赖,但Transformer更高效)。

  • 并行计算:Transformer > CNN > RNN(RNN需顺序处理,Transformer和CNN可高效并行)。

  • 适用场景:CNN主攻图像、RNN主攻序列、Transformer适合文本、图像、语音及多模态任务。

结论

三大架构各有千秋,CNN擅长局部特征提取和空间建模,RNN适合时序建模和短期依赖,Transformer则以自注意力机制实现全局特征捕获和高效并行,推动了AI在NLP、CV等领域的突破。未来,随着多模态、长序列和大模型的发展,Transformer及其变体将持续引领AI架构创新,但CNN和RNN在特定场景下依然不可替代。理解并灵活运用这三类模型,是AI工程与研究的基础能力。


谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力

如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐