查看全课大纲(第 40 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

CNN 原理及其在 NLP 中的应用

小象实战讲义 · 自然语言处理

在掌握了神经网络的基本原理后,我们面临一个核心问题:如何将神经网络高效地应用于文本这类具有结构特点的数据?卷积神经网络(CNN)最初在计算机视觉领域大放异彩,其关键在于能够自动学习图像中从局部到全局的层次化特征。本节我们将深入剖析 CNN 的核心思想——卷积、池化与层次化特征学习,并探讨如何巧妙地将其迁移到自然语言处理任务中,例如文本分类和情感分析。理解 CNN 在 NLP 中的应用,是连接传统词袋模型与更复杂的序列模型(如 RNN)的重要桥梁。

💡 核心导读

  • 深度学习的本质:深度网络(如 CNN)的强大之处不在于参数多,而在于其“深度”能够自动构建从底层到高层的层次化特征表示(Representation Learning)。
  • CNN 的核心操作:通过卷积核(局部连接、权重共享)提取局部特征,再通过池化(如 Max Pooling)进行降采样和特征选择,保留最显著的信息。
  • 从图像到文本的迁移:将文本视为“一维图像”,词向量作为像素,卷积核在句子长度方向滑动,捕捉 n-gram 级别的局部语义模式。
  • CNN 在 NLP 中的优势:能够并行处理文本,高效捕捉局部上下文特征,在文本分类等任务上表现优异,为后续理解更复杂的序列模型(如 RNN 和 Transformer)奠定基础。

从全连接到局部:CNN 的诞生与核心思想

在深度神经网络中,一个常见的误解是模型的强大仅仅源于其庞大的参数量。我们可以设想构建一个非常“宽”但“浅”的网络(层数少,每层节点多),其参数总量同样巨大,但实验表明,这样的网络性能往往远不如一个“深”的网络,且更容易过拟合。

深度神经网络(Deep Neural Networks)的真正威力在于“深度”本身。这个“深度”意味着网络能够进行层次化的特征学习(Hierarchical Feature Learning)或表示学习(Representation Learning)。以 CNN 处理图像为例:

  1. 底层特征:最初的卷积层可能学习到检测边缘、角点、颜色斑块等基础模式。
  2. 中层特征:基于这些边缘和斑块,更高层的卷积层可以组合出更复杂的形状,如眼睛、轮子、纹理。
  3. 高层特征:更深层的网络则可能组合出整个物体部件或甚至整个物体的概念,如“猫的脸”、“汽车的车身”。

整个 CNN 的训练过程,就是通过调整网络中各层的权重,自动地选择和组合不同层次的特征,以最优的方式完成最终任务(如图像分类)。对于某些任务,底层特征更重要;对于另一些,可能是中层或高层特征的组合起决定性作用。这种自动构建和筛选特征的能力,使得 CNN 在特征工程复杂的领域(如图像、文本)取得了革命性成功。

CNN 的设计灵感部分来源于生物视觉系统。1981年诺贝尔生理学或医学奖授予了 David H. Hubel 和 Torsten N. Wiesel,表彰他们对视觉系统信息处理的研究。他们发现,视觉皮层中的神经元具有感受野(Receptive Field),只对视野中特定区域的特定模式(如特定方向的边缘)敏感,并且这些神经元也是分层组织的。CNN 中的卷积核正对应了这种对局部区域敏感的特性,而网络的深度结构则模仿了视觉通路的层次化处理过程。

CNN 的基本原理:卷积、池化与参数共享

卷积操作:从数学定义到直观理解

数学上,两个一维函数 ff 和 gg 的卷积定义为: (f∗g)(t)=∫−∞∞f(τ)g(t−τ)dτ(f * g)(t) = \int_{-\infty}^{\infty} f(\tau) g(t - \tau) d\tau 对于离散情况(如图像和文本): (f∗g)[n]=∑m=−∞∞f[m]g[n−m](f * g)[n] = \sum_{m=-\infty}^{\infty} f[m] g[n - m]

一个直观的比喻是:在一条直线上做两步随机游走,第一步从原点出发、位移为 aa 的概率密度为 f(a)f(a),第二步从当前位置再走一个位移 bb、密度为 g(b)g(b)。最终位置 cc 是两段位移的有符号叠加 c=a+bc=a+b;对所有能到达 cc 的中间位置(即所有满足 c=a+bc=a+b 的 a,ba,b 组合)把概率密度相加,这正是 ff 和 gg 的卷积 (f∗g)(c)(f*g)(c)。这里叠加的是一维有符号位移,不是平面上的欧氏距离——两段径向距离一般不能直接相加得到终点到原点的距离。

在 CNN 的语境下,我们通常不进行这种翻转操作,而是执行互相关(Cross-correlation),但习惯上仍称之为“卷积”。对于一个二维图像 II 和一个卷积核(或滤波器)KK,其计算过程如下:

# 示例:一个简单的二维卷积(互相关)计算
import numpy as np

# 假设一个 5x5 的灰度图像(像素值 0-1)
image = np.array([
    [1, 1, 0, 0, 2],
    [0, 1, 1, 2, 0],
    [0, 0, 1, 1, 1],
    [2, 0, 0, 1, 0],
    [1, 2, 1, 0, 1]
])

# 定义一个 3x3 的卷积核
kernel = np.array([
    [1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]
])

# 手动实现步长(stride)为1的卷积操作
def conv2d(image, kernel):
    i_h, i_w = image.shape
    k_h, k_w = kernel.shape
    o_h = i_h - k_h + 1
    o_w = i_w - k_w + 1
    output = np.zeros((o_h, o_w))
    for i in range(o_h):
        for j in range(o_w):
            region = image[i:i+k_h, j:j+k_w]
            output[i, j] = np.sum(region * kernel) # 对应元素相乘后求和
    return output

feature_map = conv2d(image, kernel)
print("原始图像:")
print(image)
print("\n3x3卷积核:")
print(kernel)
print("\n卷积后得到的特征图(feature map):")
print(feature_map)
原始图像:
[[1 1 0 0 2]
 [0 1 1 2 0]
 [0 0 1 1 1]
 [2 0 0 1 0]
 [1 2 1 0 1]]

3x3卷积核:
[[1 0 1]
 [0 1 0]
 [1 0 1]]

卷积后得到的特征图(feature map):
[[3. 3. 6.]
 [3. 5. 2.]
 [3. 3. 5.]]

卷积核像一个滑动窗口,遍历整个输入图像。每次滑动,计算窗口内图像像素与卷积核权重的内积,生成特征图中的一个值。这个值反映了该局部区域与卷积核所检测模式的匹配程度。

局部连接与权重共享:CNN 的两大关键特性

与传统全连接神经网络相比,CNN 引入了两个关键概念以大幅减少参数量并增强泛化能力:

  1. 局部连接(Local Connectivity):在卷积层中,每个神经元(即特征图上的一个点)只与输入数据的一个局部区域(即其感受野)相连,而不是与全部输入相连。这符合图像中相邻像素关联性更强的先验知识。
  2. 权重共享(Shared Weights):同一个卷积核在整个输入数据上滑动并重复使用。这意味着,无论卷积核滑动到哪个位置,其检测的都是同一种特征(如垂直边缘)。这极大地减少了需要学习的参数数量。
全连接 vs 局部连接(权重共享)示意图:

全连接:
输入 X0-X8 -> 每个隐藏层神经元 A 连接所有输入 (W0...W8)
权重矩阵 W 是稠密的 9xN。

局部连接(以1D为例,感受野大小为2):
输入: X0, X1, X2, X3, ...
隐藏层神经元 A0 连接 X0, X1 (权重 W0, W1)
隐藏层神经元 A1 连接 X1, X2 (权重 W0, W1) // 共享同一组权重
隐藏层神经元 A2 连接 X2, X3 (权重 W0, W1) // 共享同一组权重
...
权重矩阵 W 是稀疏的,且大量权重是重复的。

在图像 CNN 中,卷积核是三维的(宽 x 高 x 输入通道数)。对于 RGB 图像(3通道),一个 5x5 的卷积核实际上是 5x5x3,它在所有三个通道上同时进行卷积操作,最后将三个通道的结果相加(并加上偏置),生成特征图上的一个标量值。

池化层:降采样与特征不变性

卷积层之后通常会接一个池化层(Pooling Layer),最常见的是最大池化(Max Pooling)。池化层的主要作用有:

  • 降维(降低计算量):减少特征图的空间尺寸(宽度和高度)。
  • 引入平移不变性:即使特征在输入中发生微小平移,池化后仍可能捕获到该特征。
  • 防止过拟合:提供了一种温和的降采样形式。

最大池化的操作很简单:在特征图上定义一个窗口(如 2x2),取出窗口内的最大值作为输出。


# —— 重新构建上文用到的微型数据(本节各代码块相互独立,可单独运行)
import numpy as np
image = np.array([
    [1, 1, 0, 0, 2],
    [0, 1, 1, 2, 0],
    [0, 0, 1, 1, 1],
    [2, 0, 0, 1, 0],
    [1, 2, 1, 0, 1]
])
kernel = np.array([
    [1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]
])
def conv2d(image, kernel):
    i_h, i_w = image.shape
    k_h, k_w = kernel.shape
    o_h = i_h - k_h + 1
    o_w = i_w - k_w + 1
    output = np.zeros((o_h, o_w))
    for i in range(o_h):
        for j in range(o_w):
            region = image[i:i+k_h, j:j+k_w]
            output[i, j] = np.sum(region * kernel) # 对应元素相乘后求和
    return output
feature_map = conv2d(image, kernel)

# 示例:最大池化操作
def max_pooling_2d(feature_map, pool_size=2, stride=2):
    f_h, f_w = feature_map.shape
    p_h = (f_h - pool_size) // stride + 1
    p_w = (f_w - pool_size) // stride + 1
    pooled = np.zeros((p_h, p_w))
    for i in range(0, f_h - pool_size + 1, stride):
        for j in range(0, f_w - pool_size + 1, stride):
            region = feature_map[i:i+pool_size, j:j+pool_size]
            pooled[i//stride, j//stride] = np.max(region)
    return pooled

# 使用上一节卷积得到的特征图
pooled_map = max_pooling_2d(feature_map, pool_size=2, stride=2)
print("卷积特征图:")
print(feature_map)
print("\n经过 2x2 最大池化后的结果:")
print(pooled_map)
卷积特征图:
[[3. 3. 6.]
 [3. 5. 2.]
 [3. 3. 5.]]

经过 2x2 最大池化后的结果:
[[5.]]

为什么用最大池化而不是平均池化?考虑一个极端例子:在人脸识别中,嘴边的一颗痣是一个关键特征。在降采样时,如果取平均值,痣的特征会被周围皮肤的颜色“稀释”掉。而取最大值,则更有可能保留这个与众不同的显著特征。这类似于一些美图软件用均值滤波来平滑皮肤、去除瑕疵的原理。

经典 CNN 架构示例

一个典型的用于图像分类的 CNN 架构遵循“卷积 -> 激活 -> 池化”的重复模式,最后接上全连接层进行分类。例如 LeNet-5(1998年):

  1. 输入层(32x32 灰度图)
  2. C1: 卷积层(6个 5x5 卷积核) -> 特征图 (28x28x6)
  3. S2: 子采样层(2×2 非重叠:每个单元把四个输入先求和,乘以可训练系数、再加可训练偏置,结果经 sigmoid;并非普通 2×2 平均池化,现代变体常换成 2×2 最大池化) -> 特征图 (14x14x6)
  4. C3: 卷积层(16个 5x5 卷积核) -> 特征图 (10x10x16)
  5. S4: 子采样层(同 S2:可训练系数、可训练偏置加 sigmoid 的子采样;现代变体常用最大池化) -> 特征图 (5x5x16)
  6. C5: 全连接层(120个神经元)
  7. F6: 全连接层(84个神经元)
  8. OUTPUT: 输出层。原版 LeNet-5 采用 RBF 径向基单元(按类别模板计算距离),并非 Softmax;现代常见复现才在全连接层后接 Softmax 输出 10 个数字类别的概率。

随着数据和计算力的增长,更深的网络如 AlexNet, VGGNet, GoogLeNet (Inception), ResNet, DenseNet 等被提出,它们在 ImageNet 等竞赛中取得了突破性成果。这些网络的核心思想依然是层次化特征学习和卷积操作,但在深度、宽度、连接方式等方面进行了创新。

CNN 如何应用于自然语言处理

将 CNN 应用于 NLP 的关键在于重新定义“输入数据”和“局部区域”。

文本的“图像化”表示

  1. 词作为基本单元:在图像中,基本单元是像素;在文本中,基本单元是词(或子词)。我们无法对词的一部分进行卷积,因为“i”的一部分和“like”的一部分组合起来没有意义。因此,卷积核在词向量维度(通道方向)上的高度必须与词向量维度 dd 对齐。
  2. 句子作为“一维图像”:一个句子可以表示为一个矩阵。假设句子有 nn 个词,每个词用 dd 维的词向量表示(通过 Word2Vec、GloVe 或随机初始化得到),那么这个句子就是一个 n×dn \times d 的矩阵。其中:
    • 长度(n):句子的词数,对应图像的“宽度”。
    • 通道/深度(d):词向量的维度,对应图像的“高度”或“通道数”。

一维卷积操作

在 NLP 中,我们通常使用一维卷积。卷积核的高度固定为 dd(与词向量维度一致),宽度(即卷积核大小)kk 是一个超参数,表示一次考虑多少个连续的词。

例如,对于一个 n×dn \times d 的句子矩阵,使用一个宽度为 kk、高度为 dd 的卷积核进行卷积。这个卷积核在句子长度方向(即 nn 的方向)上滑动,每次覆盖 kk 个连续的词(k×dk \times d 的区域)。卷积计算这 kk 个词向量与卷积核权重的内积,并加上偏置,通过一个非线性激活函数(如 ReLU),生成一个标量值。

特征图长度由输入长度 nn、卷积核大小 kk、步长 ss(stride)和填充 pp(padding,两端补零的层数)共同决定: Lout=⌊n+2p−ks⌋+1L_{\text{out}} = \left\lfloor \frac{n + 2p - k}{s} \right\rfloor + 1 以 n=7n=7、k=3k=3 为例:步长 1、无填充(p=0p=0)时 Lout=5L_{\text{out}}=5;步长 2、无填充时 Lout=3L_{\text{out}}=3;步长 1、两端各补 1 层(p=1p=1)时 Lout=7L_{\text{out}}=7。上面 (n−k+1)(n-k+1) 的写法只是 s=1s=1、p=0p=0 的特例。

# 示例:模拟 NLP 中的一维卷积思想(使用伪代码说明)
import numpy as np

# 假设我们有 7 个词,每个词用 5 维向量表示(例如通过 Word2Vec 得到)
# 句子矩阵 shape: (7, 5)
sentence_matrix = np.random.randn(7, 5) # 随机初始化代替真实词向量

# 假设我们使用 3 个不同的卷积核,大小分别为 2, 3, 4(宽度),高度均为5(词向量维度)
kernel_sizes = [2, 3, 4]
num_filters_per_size = 2 # 每种尺寸的卷积核数量

# 伪代码流程(实际实现需使用深度学习框架如 PyTorch/TensorFlow):
# 1. 对于每个 kernel_size (k):
#    - 初始化 num_filters_per_size 个形状为 (k, 5) 的卷积核权重。
# 2. 对于每个卷积核:
#    - 在 sentence_matrix 上滑动(步长通常为1)。
#    - 对每个覆盖的 kx5 窗口,计算卷积核与窗口的内积,加上偏置,通过 ReLU。
#    - 得到一个长度为 (7 - k + 1) 的一维特征图。
# 3. 对每个特征图进行全局最大池化(Global Max Pooling over Time):
#    - 取该特征图所有位置的最大值。这样,无论句子多长,每个卷积核只输出一个标量。
#    - 这个标量代表该卷积核所检测的"特征"(如某种特定的二元组、三元组模式)在整个句子中的最强响应。
# 4. 将所有卷积核(本例共 3*2=6 个)的池化后标量连接起来,形成一个 6 维的句子特征向量。
# 5. 将这个句子特征向量输入全连接层,进行最终分类(如情感分析:正面/负面)。

print("句子矩阵形状(模拟):", sentence_matrix.shape)
print("卷积核配置:")
for ks in kernel_sizes:
    print(f"  尺寸 {ks}x5 的卷积核,共 {num_filters_per_size} 个")
print("每个卷积核经过一维卷积和全局最大池化后,输出一个标量。")
print("最终句子表示维度:", len(kernel_sizes) * num_filters_per_size)
句子矩阵形状(模拟): (7, 5)
卷积核配置:
  尺寸 2x5 的卷积核,共 2 个
  尺寸 3x5 的卷积核,共 2 个
  尺寸 4x5 的卷积核,共 2 个
每个卷积核经过一维卷积和全局最大池化后,输出一个标量。
最终句子表示维度: 6

多尺寸卷积核与特征组合

在图像中,卷积核大小通常是固定的(如 3x3, 5x5)。在文本 CNN 中,一个常见且有效的策略是使用多种不同宽度的卷积核(例如 2, 3, 4, 5)。这相当于同时考虑不同长度的 n-gram 特征:

  • 宽度为 2 的卷积核:捕捉二元组(Bigram)级别的特征。
  • 宽度为 3 的卷积核:捕捉三元组(Trigram)级别的特征。
  • 宽度为 4 的卷积核:捕捉四元组级别的特征。

网络并不预先知道对于当前任务,是二元组、三元组还是四元组更重要。通过训练,网络会自动学习到不同尺寸卷积核的权重,从而自动选择出对分类最有帮助的 n-gram 特征组合。这比手工设计 n-gram 特征更加灵活和有效。

一个完整的文本 CNN 情感分析流程

以句子 “I love this movie very much !” 的情感分析(正面/负面)为例:

  1. 输入表示:将每个词转换为 dd 维词向量。句子变为 7×d7 \times d 矩阵。
  2. 卷积层:使用多组不同宽度(如 2, 3, 4)的卷积核进行卷积,每组包含多个卷积核以捕捉不同模式。每个卷积核产生一个特征图。
  3. 池化层:对每个特征图进行全局最大池化(取整个特征图的最大值)。这样,每个卷积核贡献一个最重要的特征值。这一步替代了图像中常用的固定尺寸池化,能处理可变长度的句子。
  4. 特征拼接:将所有卷积核池化后的特征值拼接成一个一维特征向量。
  5. 输出层:将拼接后的特征向量输入全连接层,最后通过 Softmax 输出正面和负面的概率。

通过这种方式,CNN 成功地将图像处理中的层次化特征学习思想迁移到了文本领域。它能够有效捕捉文本中的局部语义模式(n-gram),并且由于卷积和池化的特性,模型对词的位置变化具有一定的鲁棒性,计算效率也高于 RNN。

CNN vs. RNN 与未来展望

CNN 在 NLP 中的应用,尤其是在文本分类、情感分析、垃圾邮件检测等任务上,取得了非常出色的效果。其优势在于:

  • 并行计算能力强:卷积操作可以高度并行化,训练速度快。
  • 局部特征捕捉能力强:擅长捕捉短语级别的局部语义模式。
  • 层次化特征:通过叠加卷积层,理论上可以捕捉更长的依赖关系(尽管不如 RNN 直接)。

然而,CNN 在处理长距离依赖和严格的序列顺序信息方面存在天然局限。卷积核的感受野有限,虽然深层网络可以扩大感受野,但捕捉长程依赖的效率不如专门为序列设计的循环神经网络(RNN)及其变体 LSTM 和 GRU。

值得注意的是,CNN 在 NLP 中的成功,以及后来 RNN 与注意力机制(Attention Mechanism)的结合,都为 Transformer 模型的诞生铺平了道路。Transformer 完全基于自注意力(Self-Attention)机制,能够高效地处理序列中任意两个位置的关系,同时具备 CNN 的并行计算优势。如今,基于 Transformer 的预训练大模型(如 BERT、GPT)已成为 NLP 的主流。

因此,学习 CNN 在 NLP 中的应用,不仅是为了掌握一种有效的文本建模工具,更是为了理解“如何为不同类型的数据设计合适的神经网络结构”这一核心思想,为我们后续学习更强大的序列模型奠定坚实的基础。

📝 动手练一练

  1. 概念辨析:全连接层、卷积层、池化层的主要区别是什么?请从连接方式、参数数量、功能三个方面进行简要对比。
👉 点击查看参考答案
  • 全连接层:
    • 连接方式:每个神经元与上一层的所有神经元相连。
    • 参数数量:极其庞大(输入维度 x 输出维度),容易过拟合。
    • 功能:进行全局的特征组合与变换,通常用于网络的最后几层进行分类或回归。
  • 卷积层:
    • 连接方式:局部连接(每个神经元只连接输入的一个小区域)且权重共享(同一卷积核在不同位置重复使用)。
    • 参数数量:远少于全连接层,由卷积核大小、数量和输入通道数决定,与输入尺寸无关。
    • 功能:自动提取输入数据的局部特征(如图像的边缘、纹理,文本的 n-gram 模式)。
  • 池化层:
    • 连接方式:对输入特征图的一个小区域进行下采样操作(如取最大值、平均值)。
    • 参数数量:无需要训练的参数。
    • 功能:降低特征图的空间尺寸,减少计算量;引入平移不变性;防止过拟合。
  1. 手算练习:假设有一个极短的句子“AB”,其中词“A”的词向量是 [1, 0, 1],词“B”的词向量是 [0, 1, 1]。我们使用一个宽度为2(即 Bigram)、高度为3的卷积核 W = [[0.5, 0, 0.5], [0, 1, 0]] 和偏置 b = 0.1 进行卷积,激活函数为 ReLU(ReLU(x) = max(0, x))。请计算卷积后得到的特征值。
👉 点击查看参考答案
  1. 将句子矩阵化:句子矩阵 S 为 2x3。
    S = [ [1, 0, 1],   # A
          [0, 1, 1] ]  # B
  1. 卷积核 W 形状为 2x3,覆盖整个句子(因为句子长度=卷积核宽度)。
  2. 计算内积(对应元素相乘后求和):
    元素相乘:
    S * W = [ [1*0.5, 0*0, 1*0.5],
              [0*0, 1*1, 1*0] ]
          = [ [0.5, 0, 0.5],
              [0, 1, 0] ]
    求和: 0.5 + 0 + 0.5 + 0 + 1 + 0 = 2.0
  1. 加上偏置:2.0 + 0.1 = 2.1
  2. 通过 ReLU 激活函数:max(0, 2.1) = 2.1 因此,卷积后得到的特征值为 2.1。

本章小结

本节我们深入探讨了卷积神经网络(CNN)的核心原理及其在自然语言处理中的创新应用。我们从深度网络的核心优势——层次化特征学习出发,理解了 CNN 如何通过卷积、池化等操作自动构建从局部到全局的特征表示。重点在于掌握如何将文本数据(句子)重新表述为类似图像的矩阵形式,从而利用一维卷积捕捉 n-gram 级别的局部语义特征。CNN 为 NLP 提供了一种高效、并行的文本建模方式,特别是在文本分类任务上表现出色,是连接传统词袋模型与复杂序列模型的重要一环。

📋 行动清单

  • 在脑海中复述 CNN 的三大核心特性:局部连接、权重共享、池化,并理解它们如何共同作用以减少参数、提升效率。
  • 尝试用纸笔或代码模拟一个简单句子(如“I like AI”)的词向量矩阵,并思考一个宽度为2的卷积核是如何在其上滑动并计算特征值的。
  • 对比思考:CNN 处理文本和 RNN 处理文本的根本区别是什么?(提示:从对序列顺序的建模方式和计算并行性角度考虑)

—— 小象教研组