Neural Language Models
本文最后更新于 2026年3月25日 上午
北京大学信息科学技术学院 自然语言处理基础(2026春)的课程笔记
第五部分:Neural Language Models
语言模型作为分类问题
语言模型的核心是计算条件概率$p(\omega_i|\omega_1,\omega_2,…,\omega_{i-1})$
可以将其看作一个分类问题,给定上下文$h_{1:i-1}$,预测下一个词$\omega_i$是词汇表中的哪一个
在 1990 年代,人们尝试使用前面讲过的对数线性模型来做语言模型
其中$f$是特征函数,需要手工设计大量特征(如上下文词、词性等)。
优点:理论上可以避免零概率问题,且能融合任意特征。
缺点:特征工程复杂,计算开销大,优化困难(尤其在 1990 年代硬件条件下)被认为不实用
神经网络基础
经典的线性神经网络:$z=\Sigma_i (\omega_i x_i+b)$
加一个非线性的激活函数$f$,令$y=f(z)$即可
下面介绍了几种经典的激活函数
$y=sigmoid(z)=\frac{1}{1+e^{-z}}$
$y=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}$
$y=RELU(z)=max(z,0)$
NLM-1阶段 前馈神经网络
如上,其实就是把线性层和非线性层缝合了
$m_{\omega_j}$是词$\omega_j$的词嵌入,通过查找矩阵$M$得到,矩阵$M$为$V×d$维,$\omega_{i}^{T}M=m_i$
矩阵$M$也可以视为参数,在训练中学习,无需提前给出
$A_j$,$T_j$为线性变换参数,$b$,$u$为偏置
采用了$tanh$为激活函数,最后进行$softmax$
关于参数:
设词汇表大小$V$,,嵌入维度$d$,隐藏层维度$H$,上下文长度$n$
词嵌入矩阵$M$:$V×d$
直接连接矩阵$A$:$(n-1)×d×V$
隐藏层输入矩阵$T$:$(n-1)×d×H$
隐藏层到输出矩阵$W$:$H×V$、
偏置$b$,$u$
在Bengio et al. (2003)的实验中,$V\approx18000$,$d=30$ or $60$,$H=50$ or $100$,$n=6$,总参数量为$460V+3w$
简化版本:连续词袋(CBOW)
若将$A$矩阵设为$0$,并对多个词的嵌入取平均,可以得到连续词袋模型(CBOW),进一步减少参数。
由上可知它仍属于n-gram语言模型,但为何表现更优?
主要是神经网络线性层与非线性层的多层结构可以达到纯线性模型无法实现的效果
关于训练:经典的MLE和SGD
多数情况下,对数似然函数是非凸的,若只使用cpu的话速度极慢
模型位置绑定太过紧密、死板?无法识别big blue ball and blue big ball的区别
NLM-2阶段 卷积神经网络
希望模型能够处理更长的历史,并自动提取局部特征
考虑从位置0开始,直至当前目标词$\omega_t$,其历史向量$h=[\omega_1,\omega_2,…,\omega_{t-1}]$
进行词嵌入后得到$X=[m_{\omega_1},m_{\omega_2},…,m_{\omega_{t-1}}]$
如上式,卷积层通过一组滤波器(filter)在时间维上滑动,计算局部特征
$f$为非线性激活函数,如$tanh$,$sw$为窗口宽度
$C^{(k)}$为第$k$个滤波器的权重,$b_k$为偏置
$X^{(l)}[*,m]$可视为第$l$层第$m$个词的隐藏状态
每个滤波器提取一种局部模式,输出一个新的特征序列
在最后一层(第$D$层),我们有矩阵$X^{(D)}$$(d×(t-1))$维
我们需要将其转化成一个固定长度的向量,这一过程即为池化
分为最大池化和平均池化两种,池化后我们就可以通过$softmax$得到最终概率分布
训练:每个单词进行交叉熵损失,随机梯度下降
NLM-3阶段 循环神经网络
RNN
在每个词位置使用隐状态存储$\omega_i$的完整历史记录,使用固定长度向量$s_{i-1}$存储$h_{1:i-1}$的历史信息
$W_\omega$,$W_s$,$W_p$为共享参数
理论上,$s_i$包含了从开头到位置$i$的所有信息
训练目标:采用交叉熵损失,$-logp(\omega_i|h_{1:i-1})$
然而,标准 RNN 在长序列上训练时,梯度在反向传播中会指数衰减,导致梯度消失,使得模型难以学习长距离依赖。同时,隐状态每次更新变化较大,容易“忘记”早期信息
改进
为了解决这些问题,我们提出了LSTM & GRU
LSTM:引入细胞状态(cell state)和三个门(输入门、遗忘门、输出门),通过加法连接让梯度更容易流动,从而保留长期记忆。
GRU:简化版本,将遗忘门和输入门合并为更新门,并引入重置门,参数更少,计算更快。

这两者通过堆叠神经网络,将一个模块的输入作为下一个模块的输出,有效避免了梯度消失和遗忘问题
不过它们没过多久就被更先进的transformer取代了……Attention is all you need!