从word2vec到Attention,一篇全解
你是否曾经好奇:为什么谷歌翻译能把一段中文准确翻译成英文?为什么聊天机器人能理解你在说什么?为什么搜索引擎能猜到你想搜什么?
答案就藏在自然语言处理和深度学习这两个领域中。
今天要和大家分享的是斋藤康毅所著的《深度学习进阶:自然语言处理》这本书的核心内容。作为《深度学习入门:基于Python的理论与实现》的续作,这本书专注于讲解如何用深度学习技术处理自然语言。
作为一名技术作者,斋藤康毅有着独特的写作风格——他坚持“从零开始创建”的理念,不使用现成的框架,而是带着读者一步步实现每个算法。这种**“凡我不能创造的,我就不能理解”**的态度,让他的书格外适合真正想搞懂原理的人。
下面,我就把这本书中最核心的10个技术点整理出来,分享给大家。
01 神经网络复习:打好基础
在正式进入自然语言处理之前,书中先快速复习了神经网络的基础知识。
神经网络的核心是层的概念。每一层接收输入,进行变换,输出结果。最基本的层是全连接层(Affine层),它做的事就是:
输出 = 输入 × 权重 + 偏置
神经网络的学习过程分为三步:
- 1. 前向传播:数据从输入层流向输出层,计算出预测结果
- 2. 计算损失:用损失函数(如交叉熵误差)衡量预测与真实答案的差距
- 3. 反向传播:将损失从输出层反向传回,计算每个参数的梯度,然后更新参数
书中特别强调了计算图的重要性。通过计算图,我们可以直观地看到数据流动的方向,也能轻松理解反向传播的原理。
专业解读:计算图的核心价值在于将复杂的复合函数求导问题转化为局部导数的乘积问题,这就是链式法则的图形化表达。无论网络多深,每一层的反向传播只需要关注“从上游传来的梯度”和“本地的导数”。
02 词的分布式表示:从One-Hot到密集向量
要让计算机理解单词,首先得把单词表示成数字。最原始的方法是One-Hot表示:词汇量有多大,向量就有多长,只有一个位置是1,其余都是0。
但这有个致命问题:100万个单词就需要100万维的向量,太稀疏了,而且看不出单词之间的关系。
于是有了分布式表示——用密集向量表示单词。核心思想来自分布式假设:一个单词的含义由它周围的单词决定。
“You shall know a word by the company it keeps.” —— J.R. Firth
基于这个假设,我们可以统计单词的上下文,构建共现矩阵,然后用**SVD(奇异值分解)**降维,得到每个单词的密集向量。
书中的实验表明,这种方法得到的词向量确实有语义上的相似性——比如“car”和“auto”的向量非常接近。
专业解读:SVD降维的本质是在保持向量间几何关系(内积)的前提下,找到信息量最大的低维子空间。共现矩阵的每一行是一个高维稀疏向量,SVD通过正交变换将其映射到低维稠密空间,同时去除了噪声。
03 word2vec:推理方法的崛起
基于计数的方法(共现矩阵+SVD)虽然有效,但有短板:需要处理整个矩阵,计算量大,而且新词加入要全部重算。
于是有了word2vec——基于推理的方法。
word2vec有两种模型:
- • CBOW(Continuous Bag-of-Words):用上下文预测中间词
两种模型都是简单的2层神经网络。输入是上下文的One-Hot向量,经过隐藏层得到中间表示,再输出每个词的概率。
训练完成后,输入层的权重矩阵就是我们要的词向量——每一行对应一个词的稠密向量。
专业解读:CBOW和Skip-gram的本质区别在于计算效率与表征质量的权衡。CBOW对多个上下文向量取平均,计算量小但可能丢失顺序信息;Skip-gram每个上下文独立预测,计算量大但对低频词的表征更好。实践中,Skip-gram更常用。
04 word2vec的高速化:两大改进
原始的word2vec实现有两个性能瓶颈:
瓶颈一:输入层计算
One-Hot向量与权重矩阵相乘,实际上只取了矩阵的一行。这太浪费了!
解决方案:引入Embedding层。它不真正做矩阵乘法,而是直接根据索引“查表”取出对应的行向量。
瓶颈二:输出层计算
输出层需要计算所有词的概率,词汇量越大计算量越大。
解决方案:负采样。不计算所有词,只计算正例(正确词)和少数负例(随机抽样的错误词)的损失。这样就把多分类问题转化成了二分类问题,计算量大大降低。
专业解读:负采样的巧妙之处在于用“判断目标词是否为正例”替代了“预测目标词是哪一个”。损失函数从Softmax变为Sigmoid,计算复杂度从O(V)降为O(K),其中K是负采样数(通常5-20),V是词汇量(可达百万级)。
05 RNN:处理时序数据的利器
前馈网络有个致命缺陷:不能处理变长的序列数据,而且对顺序不敏感。
**RNN(循环神经网络)**解决了这个问题。它的核心是“循环”——每个时刻的输出不仅取决于当前输入,还取决于上一时刻的隐藏状态。
RNN的数学表达式:
h_t = tanh(W_x · x_t + W_h · h_{t-1} + b)
这个简单的结构让RNN能“记住”历史信息,非常适合处理文本、语音、时间序列等数据。
训练RNN用的是BPTT(Backpropagation Through Time)——按时间展开的反向传播。对于长序列,可以使用Truncated BPTT:只截取固定长度进行反向传播,正向传播则继续传递隐藏状态。
专业解读:RNN的本质是对序列数据建立递归状态空间模型。隐藏状态h_t是过去所有输入的“压缩摘要”,理论上可以编码无限长的历史信息。但实践中,由于梯度消失/爆炸问题,原始RNN很难记住超过10步的信息。
06 LSTM & GRU:解决梯度消失问题
原始RNN有个大问题:梯度消失/爆炸。随着时间步增加,反向传播的梯度会指数级衰减或增长。
**LSTM(长短期记忆网络)**引入“门”机制来解决这个问题:
LSTM还引入了一个“细胞状态”,专门负责长期记忆,梯度可以在这个通道上无衰减地传播。
**GRU(门控循环单元)**是LSTM的简化版:合并了遗忘门和输入门为“更新门”,取消了细胞状态。参数更少,计算更快,效果通常与LSTM相当。
专业解读:LSTM的梯度能长距离传播的关键在于细胞状态的更新是加法操作(c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t),而不是乘法。加法让梯度可以直接“绕过”激活函数,避免了连乘带来的指数衰减。这就是所谓的“Constant Error Carousel”。
07 基于RNN的文本生成
有了语言模型,就可以用来生成文本了。过程很简单:
书中用PTB数据集训练了一个LSTM语言模型,然后输入“the meaning of life is”,模型生成了:
“the meaning of life is not a good version of paintings.”
虽然有些无厘头,但这确实是模型从数据中学到的“知识”。
专业解读:文本生成时的采样策略至关重要。贪婪采样(每次都选概率最高的词)会产生重复、乏味的文本;随机采样能增加多样性但可能产生不通顺的内容。Temperature参数可以调节概率分布的“陡峭程度”:低温让分布更集中(更保守),高温让分布更平滑(更有创造力)。
08 seq2seq:序列到序列的转换
seq2seq由两个RNN组成:
- • 编码器:读入输入序列,输出最后一个隐藏状态(编码了整句话的信息)
seq2seq的应用非常广泛:
书中用seq2seq做了一个加法器的实验:输入“57+5”,输出“62”。模型成功学会了加法规则!
专业解读:seq2seq的一个问题是编码器需要把整个输入序列压缩成一个固定长度的向量,信息瓶颈限制了模型处理长序列的能力。这也是后续Attention机制被提出的直接动机——让解码器在每个时刻都能“回看”编码器的所有输出。
09 Attention:聚焦关键信息
原始seq2seq的最大问题是:编码器输出的向量长度固定。无论输入多长,都得塞进一个固定大小的向量里。
Attention机制解决了这个问题:
- 1. 解码器每个时刻都计算一个“注意力权重”——与编码器各个时刻的隐藏状态的相似度
- 2. 用这些权重对编码器的隐藏状态做加权平均,得到上下文向量
- 3. 上下文向量与解码器的隐藏状态一起用于预测输出
Attention有两个关键好处:
- • 解码器可以“看到”输入序列的所有信息,没有信息瓶颈
- • 注意力权重可以可视化,让我们看到模型“关注”了输入的哪些部分
书中用日期转换任务展示了Attention的神奇效果:当模型输出月份时,它会聚焦在输入中的月份单词上。
专业解读:注意力机制通过“对齐”输入和输出序列,让模型学习到词与词之间的对应关系。这实际上是软对齐——每个输出词与所有输入词都有一定的匹配度,匹配度之和为1。可微分的Softmax使得这种“软选择”可以端到端训练。
10 前沿展望:Transformer与未来
Attention不仅是一个插件,还可以替代RNN。
Transformer就是完全基于Attention的模型,它用自注意力(Self-Attention)捕捉序列内部的依赖关系,用多头注意力(Multi-Head Attention)从不同角度关注信息。
Transformer的优势:
- • 效果通常更好(BERT、GPT都基于Transformer)
专业解读:Transformer用位置编码来弥补Self-Attention丢失的顺序信息,用Layer Normalization稳定训练,用残差连接让梯度能直接传播到浅层。这些设计共同造就了当前大语言模型的基础架构。
另外,书末还提到了NTM(神经图灵机)——给神经网络加上外部存储,让它能执行更复杂的算法操作。
总结:从Word2vec到Attention
回顾这本书的核心技术路线:
词表示:从One-Hot → 共现矩阵+SVD → word2vec,我们得到了有语义的稠密词向量。
序列建模:从RNN → LSTM/GRU,我们解决了长期依赖问题。
序列转换:从seq2seq → seq2seq+Attention → Transformer,我们实现了高效的序列到序列转换。
每一步的改进都有清晰的问题驱动:性能瓶颈、梯度消失、信息瓶颈、串行计算……
这本书最大的价值不在于让你学会用某个框架,而在于带你理解每个技术为什么存在、解决了什么问题、背后的原理是什么。
正如费曼所说:“凡我不能创造的,我就不能理解。”
如果你真的想搞懂深度学习和自然语言处理,建议你像这本书一样——从零开始,自己实现一遍。这个过程会很费时,但你收获的将是无法被替代的深度理解。
关注我,持续分享AI/深度学习硬核内容!
#深度学习 #自然语言处理 #word2vec #RNN #LSTM #Attention #Transformer