详细摘要 摘要
生成:2025-05-15 21:36摘要详情
- 音频文件
- Stanford CS224N: NLP with Deep Learning | Spring 2024 | Lecture 5 - Recurrent Neural Networks
- 摘要类型
- 详细摘要
- LLM 提供商
- openai
- LLM 模型
- gemini-2.5-pro-preview-05-06
- 已创建
- 2025-05-15 21:36:25
摘要内容
概览/核心摘要 (Executive Summary)
本讲座(Stanford CS224N第五讲)首先回顾并补充了神经网络的一些关键概念,包括早期神经网络(80-90年代)主要使用单隐藏层,以及深度学习复兴(约2006年起)如何通过一系列“小技巧”克服了训练深层网络的困难。这些技巧包括更有效的正则化方法(如L2正则化和Dropout,后者通过随机丢弃神经元增强模型鲁棒性)、向量化运算以提升效率、审慎的参数初始化(如Xavier初始化)以打破对称性并稳定学习,以及更高级的优化器(如Adam)来改进梯度下降过程。
讲座的核心内容转向语言模型(Language Models, LMs)。语言模型的核心任务是预测给定上下文中下一个词的概率分布,或评估一段文本的整体概率。传统方法是N-gram语言模型,它基于马尔可夫假设,通过统计语料库中词语序列(n-grams)的频率来估计概率。N-gram模型简单易实现,但面临数据稀疏性(许多n-grams未出现过,导致零概率)和存储爆炸(n越大,所需存储越多)的问题,通常采用平滑和回退策略缓解,但上下文窗口受限(通常最大5-grams)。
随后,讲座引入了神经网络语言模型,首先是固定窗口神经网络语言模型,它将上下文词向量拼接后输入前馈网络预测下一个词,解决了N-gram的部分稀疏性问题,但仍受限于固定窗口大小且对不同位置的词使用不同参数。为解决这些问题,循环神经网络(Recurrent Neural Networks, RNNs)被提出。RNN通过在每个时间步共享权重并在内部维持一个隐藏状态(memory)来处理任意长度的序列,理论上能捕捉长距离依赖。RNN语言模型通过在每个时间步基于当前隐藏状态和输入词预测下一个词,并使用交叉熵损失和“教师强制”(Teacher Forcing)策略进行训练。RNN可以逐词生成文本,甚至可以构建字符级RNN用于创意应用(如生成油漆颜色名称)。尽管RNN在处理序列上有优势,但也存在计算缓慢和梯度消失/爆炸(导致难以学习长距离依赖)等问题。
神经网络概念回顾与补充
早期神经网络与深度学习的兴起
- 历史背景:
- 神经网络在20世纪80-90年代流行,主要得益于反向传播算法的提出(Jeff Hinton等)。
- 当时的神经网络通常只有一个隐藏层(输入层-隐藏层-输出层)。
- 训练更深层次的网络(多隐藏层)在很长一段时间内(约15年)被认为非常困难,效果甚至不如浅层网络。引用Yoshua Bengio等人的论文观点:“Empirically, deep networks were generally found to be not better and often worse than neural networks with one or two hidden layers.”
- 深度学习的复苏 (约2006年起):
- 通过一系列看似微小但关键的改进和新思想,深度神经网络的训练成为可能并表现优越。
- 这些改进使得模型能够从“停滞不前”转变为“表现惊人”。
关键技术点
-
正则化 (Regularization):
- 目的: 防止模型过拟合,提升泛化能力。
- 传统观点: 训练误差持续下降,但验证/测试误差在某个点后会上升(过拟合)。L2正则化(在损失函数中加入参数平方和项)旨在使参数值变小,减轻过拟合。
- 现代观点 (针对大型神经网络):
- “We don't believe that overfitting exists anymore” (以传统方式理解)。
- 大型网络可以被训练到在训练集上达到几乎零损失(完美拟合/记忆训练数据)。
- 通过有效的正则化,即使完美拟合训练数据,模型依然可以很好地泛化到新数据。验证损失会持续下降。
- Dropout:
- 一种非常流行的正则化方法,在课程作业中有所涉及。
- 训练时: 在网络的中间层,随机“丢弃”或“关闭”一部分神经元的输出(通过与一个随机的0-1掩码进行Hadamard积)。每次训练迭代使用不同的掩码。
- 效果: 强迫网络学习更鲁棒的特征,不能过度依赖少数几个输入特征,因为它们可能随时“消失”。
- 测试时: 不进行丢弃,保留所有权重,但会对权重进行相应的缩放,以弥补训练时丢弃部分神经元的影响。
- 动机解释:
- 防止特征之间的“共适应性”(co-adaptation)。
- 可以看作是同时训练一个由指数级数量的共享权重的不同网络组成的巨大模型集成(ensemble)。
- 被认为是特征依赖的正则化形式。
-
向量化 (Vectorization):
- 核心思想: 避免使用显式的for循环,转而使用向量、矩阵和张量运算。
- 优势:
- 在CPU上运行速度至少提升一个数量级。
- 在GPU或TPU上运行速度可提升两到三个数量级。
- 实践: “If I'm writing a for loop for anything that isn't some very superficial bit of input processing, I've almost certainly made a mistake.”
-
参数初始化 (Parameter Initialization):
- 重要性: 必须将权重初始化为小的随机数。
- 原因: 如果初始化为全零或相同常数,会导致对称性问题,使得网络中所有神经元学习到相同的特征,如同只有一个特征的多个副本。
- 方法:
- 初始值需要足够小以避免梯度爆炸,但又不能太小以至于梯度消失。
- Xavier初始化: 一种曾被广泛使用的方法,根据层输入和输出单元的数量来确定初始化分布的方差。
- 现代进展: 层归一化(Layer Normalization)等技术在一定程度上减轻了对精细初始化策略的依赖,但随机初始化仍然是必要的。
-
优化器 (Optimizers):
- 随机梯度下降 (SGD): 基本方法,理论上可行,但通常需要仔细调整学习率、学习率衰减策略等超参数。
- 高级优化器:
- 为每个参数累积过去的梯度信息,动态调整学习率。
- 对超参数设置不那么敏感,更稳定。
- Adagrad: 早期方法,简单但[原文描述为"tends to store worldly",可能指存储需求大或效果随时间衰减]。
- Adam: “a really good, safe place to start”,课程作业中使用。
- 针对稀疏数据(如词向量)的特定优化器(名称常以AW结尾)。
- 其他概念:动量(Momentum)、Nesterov加速等。
语言模型 (Language Modeling, LM)
定义与核心任务
- 技术术语: 在NLP中,“语言模型”特指能够预测下一个词的系统,或者更精确地说,是为下一个可能出现的词提供一个概率分布。
- 示例: "The students opened their ____" (可能的词: books, laptops, minds, etc.)
- 形式化: 给定一个词序列(上下文),语言模型计算词汇表中每个词作为下一个词的概率
P(word_next | context),且所有可能词的概率之和为1。 - 等价视角: 语言模型是一个能为任意一段文本赋予一个整体概率的系统。这通过链式法则实现:
P(x1, x2, ..., xk) = P(x1) * P(x2|x1) * P(x3|x1,x2) * ... * P(xk|x1,...,xk-1)
其中每一项P(xi | x1,...,xi-1)都由语言模型提供。 - 重要性: 语言模型是NLP的基础技术,自20世纪80年代以来一直处于核心地位(思想可追溯至50年代)。
- 应用示例: 手机键盘输入建议、搜索引擎查询自动补全。
N-gram 语言模型
原理
- 构建方法 (1975 - 约2012年): 基于统计短的词语子序列(n-grams)的出现频率。
- N-gram类型:
- Unigram (1-gram): 单个词的概率。
- Bigram (2-gram): 词对的概率。
- Trigram (3-gram): 三词序列的概率。
- 以此类推 (4-gram, 5-gram)。
- 讲者提及,从词源学角度看,应使用希腊数字前缀(如monogram, diagram),Claude Shannon在其1951年的论文中使用了diagram,但后续业界通用的是unigram, bigram等。
- N-gram类型:
- 马尔可夫假设 (Markov Assumption): 预测下一个词时,只考虑其前
n-1个词的上下文,忽略更早的词。P(xt+1 | x1, ..., xt) ≈ P(xt+1 | xt-n+2, ..., xt)
- 概率计算: 通过对大规模文本语料库中的n-gram计数实现。
P(wk | w1, ..., wk-1) ≈ Count(w1, ..., wk-1, wk) / Count(w1, ..., wk-1)- 示例 (4-gram): 预测 "students open their" 之后的词。
- 假设 "students open their" 出现1000次。
- "students open their books" 出现400次 => P(books | students open their) = 400/1000 = 0.4。
- "students open their exams" 出现100次 => P(exams | students open their) = 100/1000 = 0.1。
存在的问题
- 上下文局限性: 仅依赖固定的、较短的前文,无法捕捉长距离依赖。例如,若前文有 "As the proctor started the clock",则 "exams" 的概率应高于 "books",但n-gram模型可能因 "students open their books" 更常见而给出错误偏好。
- 数据稀疏性 (Sparsity):
- 分子为零: 某个n-gram
(w1, ..., wn)在训练语料中从未出现,导致Count(w1, ..., wn) = 0,从而P(wn | w1, ..., wn-1) = 0。- 解决方案: 平滑 (Smoothing) 技术,如加法平滑(Add-delta smoothing),给所有计数加上一个小的正值(如0.25),确保没有零概率。
- 分母为零: 上下文
(w1, ..., wn-1)在训练语料中从未出现。- 解决方案: 回退 (Backoff) 策略。如果n-gram估计不可用,则回退到 (n-1)-gram 进行估计,以此类推,直至unigram。
- 分子为零: 某个n-gram
- 存储问题:
- 随着n的增大,需要存储的n-gram数量呈指数级增长。
- 实际应用中,n通常最大为5 (5-grams)。Google N-gram语料库(万亿词规模)也只提供到5-grams。
- 优点:
- 构建简单快速,只需计数。
N-gram 模型的文本生成
- 过程:
- 从一个初始上下文开始(如 "today the")。
- 基于该上下文,使用n-gram模型计算下一个词的概率分布。
- 从该分布中随机采样一个词。
- 将采样到的词加入当前上下文,重复步骤2-3。
- 示例 (基于200万词训练的trigram模型): "Today the price of gold per ton while production of shoe lasts and shoe industry, the bank intervened just after it considered and rejected an imf demand to rebuild depleted European stocks..."
- 评价:
- 生成的文本大部分在语法上是正确的,局部连贯性尚可。
- 但整体缺乏一致性和意义,非常不连贯。
- 通过增加训练数据量和n值可以略微改善效果。在2010年代早期,主流观点是“规模解决一切”。
神经网络语言模型
固定窗口神经网络语言模型 (Fixed-Window Neural LM)
- 提出者: Yoshua Bengio等 (21世纪初)。
- 思路:
- 选择一个固定大小的上下文窗口(如前4个词)。
- 将窗口内每个词的词向量 (word embeddings) 进行拼接。
- 将拼接后的向量输入一个标准的前馈神经网络(包含隐藏层)。
- 网络的输出层使用Softmax函数,得到词汇表中每个词作为下一个词的概率分布。
- 优点:
- 解决稀疏性: 通过词向量的分布式表示,模型可以泛化到未见过的词组合,只要词向量相似。
- 无需存储n-grams: 只需存储神经网络的参数。
- 缺点:
- 固定窗口大小: 仍受限于马尔可夫假设,无法处理任意长度的上下文。扩大窗口会导致输入层参数急剧增加。
- 权重不共享: 窗口中不同位置的词由权重矩阵
W的不同部分处理,参数学习效率低。例如,"student" 在位置1和位置2是被不同参数处理的。
循环神经网络 (Recurrent Neural Networks, RNNs)
核心思想与架构
- 目标:
- 处理任意长度的输入序列。
- 在序列的不同时间步共享参数,以识别模式而无论其出现位置。
- 工作机制:
- 在每个时间步
t,RNN接收当前输入xt(通常是词向量) 和前一时间步的隐藏状态ht-1。 - 通过一个循环单元计算当前时间步的隐藏状态
ht:
ht = f(W_hh * ht-1 + W_xh * xt + b_h)
其中:ht-1是前一个隐藏状态(h0通常初始化为零向量)。xt是当前时间步的输入词向量。W_hh(或讲座中的W_h) 是连接前一隐藏状态到当前隐藏状态的权重矩阵。W_xh(或讲座中的W_e) 是连接当前输入到当前隐藏状态的权重矩阵。b_h是偏置项。f是非线性激活函数,RNN中常用 tanh。
- 权重共享:
W_hh,W_xh,b_h在所有时间步都是相同的。 - 隐藏状态
ht编码了到当前时间步为止的序列信息(“记忆”)。 - 基于当前隐藏状态
ht,可以预测输出yt(例如,下一个词的概率分布):
yt = softmax(W_hy * ht + b_y)
其中W_hy(或讲座中的U) 是连接隐藏状态到输出的权重矩阵,b_y是输出偏置。
- 在每个时间步
RNN的优缺点
- 优点:
- 可以处理任意长度的输入序列。
- 模型大小不随输入序列长度增加而改变(隐藏状态
h的维度固定)。 - 在所有时间步共享权重,处理输入的方式具有对称性,参数效率高。
- 缺点:
- 计算缓慢: 隐藏状态的计算是顺序的,难以并行化(“essentially here you're doing a for loop”)。
- 梯度消失/爆炸问题: 理论上
ht包含所有历史信息,但实践中,早期时间步的信息在向后传播多步后可能变得非常微弱(梯度消失)或过强(梯度爆炸),导致模型难以学习长距离依赖。近期词语对隐藏状态影响更大。 (此问题将在后续课程详细讨论)
训练RNN语言模型
损失函数与目标
- 数据: 大规模文本语料库。
- 过程:
- 对于语料库中的每个词(在给定其前文的条件下),RNN预测下一个词的概率分布。
- 损失函数: 预测分布与实际下一个词之间的交叉熵损失 (Cross-Entropy Loss)。
- 等价于实际下一个词的负对数似然 (Negative Log Likelihood):
-log P(actual_next_word | context)。
- 等价于实际下一个词的负对数似然 (Negative Log Likelihood):
- 总体目标函数: 整个语料库中所有词的平均交叉熵损失(或平均负对数似然),目标是最小化这个平均损失。
教师强制 (Teacher Forcing)
- 训练策略: 在训练的每个时间步
t:- 模型根据
ht-1和实际输入xt(来自训练数据的词) 预测yt。 - 计算损失
Jt(基于yt和实际的下一个词xt+1)。 - 在下一个时间步
t+1,将训练数据中的实际词xt+1作为输入,而不是模型在t时刻自己生成的词。
- 模型根据
- 原因: 这样可以保持训练过程的稳定,防止因早期错误预测导致后续输入偏离真实数据太远。
训练实践
- 数据分段: 将长文本语料库切分成较短的片段(如句子,或固定长度如100个词的块)。
- 固定长度分块便于GPU上的批处理和向量化训练。
- 反向传播通过时间 (Backpropagation Through Time, BPTT):
- 计算损失函数对于RNN参数(尤其是共享权重如
W_hh,W_xh)的梯度。 - 由于权重在多个时间步共享,其总梯度是其在每个时间步出现时对应梯度的总和。
- 截断反向传播通过时间 (Truncated BPTT): 为了计算效率和减少内存消耗,在反向传播时,梯度只回传有限的步数(如20步),即使前向传播时隐藏状态依赖于更长的历史。前向传播仍使用完整片段的上下文。
- 计算损失函数对于RNN参数(尤其是共享权重如
RNN的文本生成
生成过程 ("Rollout")
- 初始化隐藏状态
h0(通常为零向量)。 - 提供一个特殊的起始符 (start-of-sequence symbol, e.g.,
<s>) 作为第一个输入x1。 - RNN计算
h1和输出概率分布y1。 - 从
y1中采样一个词w1作为生成的第一个词。 - 将生成的词
w1作为下一个时间步的输入x2。 - RNN基于
x2和h1计算h2和y2,再从中采样w2。 - 重复此过程,直到生成一个特殊的结束符 (end-of-sequence symbol, e.g.,
</s>) 或达到预设的最大长度。 - 由于采样过程的随机性,多次运行会产生不同的文本序列。
RNN生成文本示例
- 基于奥巴马演讲训练: "The United States will step up to the cost of unnew challenges of the American people that will share the fact that we created the problem, they were attacked, and so that they have to say that all the task of the final days of war that I will not be able to get this done."
- 评价:可能比n-gram模型略好,但仍不完美。
- 基于《哈利·波特》训练: "Sorry, Harry shouted, panicking. I'll leave those brooms in London. Are they? No idea, said nearly headless neck casting loclius by Cedric, carrying the last bit of trecle charms from Harry's shoulder..."
- 基于食谱训练: "Chocolate ranch barbecue categories game casseroles, cookies cookies yield six servings, two tablespoons of parmmesan cheese, chopped, one cup of coconut milk and three eggs, beaten..."
- 评价:文本结构类似食谱,但内容不连贯,配料使用混乱。
字符级RNNs及创意应用
字符级RNN语言模型
- 单位: RNN在字符 (character) 级别而非词 (word) 级别进行操作和预测。
- 优势:
- 可以生成类似真实词汇的拼写结构。
- 词汇表大小固定且小(例如英文字母加标点)。
- 能处理未登录词(OOV words)和拼写错误。
- 应用: DNA序列、蛋白质序列分析等。
创意应用示例:油漆颜色命名
- 模型: 字符级RNN。
- 任务: 为给定的RGB颜色值生成一个有创意的油漆名称。
- 训练:
- 使用某油漆公司颜色目录(RGB值及其对应名称)进行训练。
- 上下文初始化: RNN的初始隐藏状态
h0可以用该颜色的RGB值进行初始化。
- 生成: 输入新的RGB值,模型逐字符生成颜色名称。
- 效果: 生成的名称非常富有创意且听起来很真实。
- 例如: "Gsty Pink", "Power Gray", "Navel Tan", "Bokco White", "Horble Gray", "Homstar Brown", "Dope", "Stone of Blue", "Purple Simp", "Stinky Bean", "Turdly"。
- 讲者幽默地表示这可能是一个商业机会。
总结与展望
讲座在展示完油漆颜色命名示例后结束,预告下次课程将更深入探讨神经网络(特别是RNN)的科学原理和问题。RNN虽然在处理序列数据方面相比固定窗口模型有显著进步,但其固有的计算效率和长距离依赖学习问题,将为后续更先进架构(如Transformer)的出现埋下伏笔。