循环神经网络与自然语言处理
1. 序列模型基础
序列模型是理解和预测数据点序列中的关系的工具,特别适用于时间序列数据如文本和语音。这些模型可以捕获时间动态和长期依赖关系。
数学基础:
考虑一个简单的自回归模型,模型预测当前状态基于一定数量的先前状态:
x
t
=
ϕ
1
x
t
−
1
+
ϕ
2
x
t
−
2
+
⋯
+
ϕ
p
x
t
−
p
+
ϵ
t
x_t = \phi_1 x_{t-1} + \phi_2 x_{t-2} + \cdots + \phi_p x_{t-p} + \epsilon_t
xt=ϕ1xt−1+ϕ2xt−2+⋯+ϕpxt−p+ϵt
其中,
ϕ
1
,
ϕ
2
,
…
,
ϕ
p
\phi_1, \phi_2, \ldots, \phi_p
ϕ1,ϕ2,…,ϕp 是模型参数,
x
t
x_t
xt 是时间点
t
t
t的观测值,
ϵ
t
\epsilon_t
ϵt 是噪声项。
2. 数据预处理详解
数据预处理的目的是将原始数据转换为适合机器学习模型的格式。
- 文本清洗实例:例如,在处理bilibili url数据时,我们需要删除URLs、用户标签和特殊符号。
- 分词实例:对于英语文本,“Don’t be late”可以分词为“Do”, “n’t”, “be”, “late”。
- 构建词汇表实例:统计所有独特词汇,并赋予每个词汇一个唯一的整数索引。
- 文本向量化实例:使用One-hot编码将“cat”转换成一个稀疏向量,其中向量长度等于词汇表大小,"cat"所在位置为1,其余为0。
3. 文本处理与词嵌入技术
Word2Vec是理解词嵌入的一个典型例子,其通过上下文预测当前词或通过当前词预测上下文来训练词向量。
- Skip-gram模型:
P ( w O ∣ w I ) = exp ( v w O ⊤ v w I ) ∑ w = 1 W exp ( v w ⊤ v w I ) P(w_{O} | w_I) = \frac{\exp({v_{w_O}^\top v_{w_I}})}{\sum_{w=1}^W \exp({v_w^\top v_{w_I}})} P(wO∣wI)=∑w=1Wexp(vw⊤vwI)exp(vwO⊤vwI)
其中 w I w_I wI是输入词, w O w_O wO是输出词, v w v_{w} vw是词 w w w的向量表示, W W W是词汇表的大小。
4. RNN模型深入
RNN核心结构
- 基础RNN单元:
h t = tanh ( W h h h t − 1 + W x h x t + b h ) h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h) ht=tanh(Whhht−1+Wxhxt+bh)
这里, tanh \tanh tanh是激活函数,使得输出值被压缩在-1到1之间,有助于处理和传递在时间序列中出现的非线性特征。
LSTM详解
- LSTM单元结构:
- 遗忘门:决定信息是否从细胞状态中丢弃。
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) ft=σ(Wf⋅[ht−1,xt]+bf) - 输入门:决定哪些新信息被存储在细胞状态中。
i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) it=σ(Wi⋅[ht−1,xt]+bi) - 候选层:创建一个候选细胞状态的新版本。
C ~ t = tanh ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) C~t=tanh(WC⋅[ht−1,xt]+bC) - 细胞状态更新:更新细胞状态。
C t = f t ∗ C t − 1 + i t ∗ C ~ t C_t = f_t * C_{t-1} + i_t * \tilde{C}_t Ct=ft∗Ct−1+it∗C~t - 输出门:决定输出值。
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) ot=σ(Wo⋅[ht−1,xt]+bo)
h t = o t ∗ tanh ( C t ) h_t = o_t * \tanh(C_t) ht=ot∗tanh(Ct)
- 遗忘门:决定信息是否从细胞状态中丢弃。
5. RNN模型实现与应用案例
例如,构建一个用于情感分析的LSTM模型,我们首先定义网络结构,初始化参数,选择合适的损失函数(如交叉熵损失),然后通过实际数据集进行训练。
- 参数初始化:通常使用Xavier初始化方法来帮助保持输入和输出的方差一致,有助于梯度稳定。
- 损失函数:
L = − 1 N ∑ i = 1 N [ y i log ( y ^ i ) + ( 1 − y i ) log ( 1 − y ^ i ) ] L = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] L=−N1∑i=1N[yilog(y^i)+(1−yi)log(1−y^i)]
其中, N N N是批次中样本的数量, y i y_i yi是真实标签, y ^ i \hat{y}_i y^i是预测概率。
6. 训练和误差反传
训练过程中,使用BPTT方法计算梯度,并应用如Adam或SGD的优化算法更新网络权重。
- BPTT公式:
∂ L ∂ W = ∑ t = 1 T ∂ L t ∂ W \frac{\partial L}{\partial W} = \sum_{t=1}^T \frac{\partial L_t}{\partial W} ∂W∂L=∑t=1T∂W∂Lt
7. 高级RNN架构
双向RNN利用了未来的信息来改进对当前数据点的理解,特别适用于需要从整个序列动态中学习的应用,如语音识别或实体识别。
- 双向RNN公式:
h → t = f → ( W x h → x t + W h h → h → t − 1 + b h → ) \overrightarrow{h}_t = \overrightarrow{f}(W_{x\overrightarrow{h}} x_t + W_{h\overrightarrow{h}} \overrightarrow{h}_{t-1} + b_{\overrightarrow{h}}) ht=f(Wxhxt+Whhht−1+bh)
h ← t = f ← ( W x h ← x t + W h h ← h ← t + 1 + b h ← ) \overleftarrow{h}_t = \overleftarrow{f}(W_{x\overleftarrow{h}} x_t + W_{h\overleftarrow{h}} \overleftarrow{h}_{t+1} + b_{\overleftarrow{h}}) ht=f(Wxhxt+Whhht+1+bh)
y t = W h y [ h → t , h ← t ] + b y y_t = W_{hy} [\overrightarrow{h}_t, \overleftarrow{h}_t] + b_y yt=Why[ht,ht]+by