一、词向量:让文字变成数学的语言

自然语言处理的第一步,就是把文字转换成计算机能理解的数字。比如"苹果"这个词,在计算机眼里可能就是一个长长的数字列表,比如[0.12, -0.45, 0.89, ...]。这种表示方式就叫词向量。

早期的词向量技术比如Word2Vec,它通过分析大量文本,学习词语之间的关系。比如它会发现"国王" - "男" + "女" ≈ "女王"。下面用Python的Gensim库演示Word2Vec的简单用法:

from gensim.models import Word2Vec

# 准备训练数据(这里用简单示例)
sentences = [
    ["苹果", "是", "水果"],
    ["香蕉", "和", "苹果", "都", "很甜"],
    ["计算机", "处理", "自然语言"]
]

# 训练模型(技术栈:Python + Gensim)
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)

# 查看"苹果"的词向量
print(model.wv["苹果"])  # 输出100维的向量

# 计算相似度
print(model.wv.similarity("苹果", "香蕉"))  # 输出相似度分数

注意:实际使用时需要更大规模的语料库,min_count参数通常要设置更高以过滤低频词。

词向量的优点是能捕捉语义关系,但缺点也很明显:一个词永远对应同一个向量,无法解决一词多义问题(比如"苹果"既可以指水果也可以指公司)。

二、注意力机制:让模型学会"重点看哪里"

想象老师批改作文时,会特别关注某些关键句子——这就是注意力机制的核心思想。在深度学习中,它通过给不同部分分配不同的权重来实现。

举个简单例子,当翻译"我爱自然语言处理"为英文时,"爱"和"处理"可能需要更多关注。下面用PyTorch实现一个最简单的注意力层:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 技术栈:Python + PyTorch
class SimpleAttention(nn.Module):
    def __init__(self, hidden_size):
        super().__init__()
        self.attention = nn.Linear(hidden_size, 1)
        
    def forward(self, inputs):
        # inputs形状: [batch_size, seq_len, hidden_size]
        weights = F.softmax(self.attention(inputs), dim=1)
        return torch.sum(weights * inputs, dim=1)

# 示例使用
attention = SimpleAttention(hidden_size=64)
sample_input = torch.rand(2, 10, 64)  # 2个样本,序列长度10,隐藏层64维
output = attention(sample_input)
print(output.shape)  # 输出: torch.Size([2, 64])

关键点

  1. 注意力权重通过softmax归一化
  2. 最终输出是加权求和的结果
  3. 这种基础实现常被称为"Bahdanau注意力"

注意力机制的突破性在于:它让模型可以动态关注不同位置,而不是像RNN那样只能按固定顺序处理。

三、Transformer:彻底改变游戏规则的架构

2017年提出的Transformer模型,完全基于注意力机制,抛弃了传统的RNN/CNN结构。它的核心是多头注意力(Multi-Head Attention),可以同时关注不同位置的不同关系。

来看一个简化版的Transformer编码器实现:

class TransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, nhead):
        super().__init__()
        self.self_attn = nn.MultiheadAttention(d_model, nhead)
        self.linear1 = nn.Linear(d_model, d_model * 4)
        self.linear2 = nn.Linear(d_model * 4, d_model)
        
    def forward(self, src):
        # 多头注意力
        attn_output, _ = self.self_attn(src, src, src)
        # 前馈网络
        return self.linear2(F.relu(self.linear1(attn_output)))

# 使用示例
encoder = TransformerEncoderLayer(d_model=512, nhead=8)
x = torch.rand(10, 32, 512)  # [序列长度, batch大小, 特征维度]
output = encoder(x)
print(output.shape)  # 输出: torch.Size([10, 32, 512])

关键组件解析

  1. d_model:向量的维度(通常512或768)
  2. nhead:注意力头的数量(常设为8或12)
  3. 前馈网络提供非线性变换能力

Transformer的优势在于:

  • 并行计算效率远高于RNN
  • 长距离依赖处理能力更强
  • 适合大规模预训练

但缺点也很明显:

  • 内存消耗随序列长度平方级增长
  • 需要大量训练数据

四、实战应用与选型建议

在实际项目中,这些技术如何选择?以下是典型场景分析:

场景1:文本分类

  • 适用技术:词向量 + 简单神经网络
  • 原因:任务简单,不需要复杂建模
  • 示例架构:
class TextClassifier(nn.Module):
    def __init__(self, vocab_size, embed_dim):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.fc = nn.Linear(embed_dim, 2)  # 二分类
        
    def forward(self, x):
        return self.fc(self.embedding(x).mean(dim=1))

场景2:机器翻译

  • 必须使用Transformer架构
  • 推荐直接使用HuggingFace的预训练模型:
from transformers import AutoModelForSeq2SeqLM

model = AutoModelForSeq2SeqLM.from_pretrained("facebook/bart-large")

注意事项

  1. 资源不足时优先考虑蒸馏版模型(如DistilBERT)
  2. 中文任务注意tokenizer是否支持
  3. 部署时考虑使用ONNX优化推理速度

五、技术展望与总结

当前最前沿的模型如GPT-4、PaLM等,都是在Transformer基础上的扩展。未来可能的发展方向包括:

  1. 更高效的注意力变体(如稀疏注意力)
  2. 多模态统一建模
  3. 小样本学习能力提升

对于初学者,建议的学习路径:

  1. 先掌握Word2Vec/GloVe等传统方法
  2. 深入理解注意力机制数学原理
  3. 通过HuggingFace库实践现代Transformer模型

无论技术如何发展,理解这些底层原理都能让你在NLP领域走得更远。就像建筑师需要了解材料特性一样,算法工程师也需要明白模型的构建基石。