RNN词嵌入层的作用
词嵌入层(Embedding Layer)在RNN中负责将离散的单词符号映射为连续的向量表示,将高维稀疏的one-hot编码转换为低维稠密的向量。这种表示能捕捉单词的语义和语法特征,提升模型对文本的理解能力。
词嵌入层的实现方式
Keras/PyTorch中的嵌入层
通过框架提供的Embedding类实现,需指定词汇表大小(vocab_size)、嵌入维度(embedding_dim)和输入长度(input_length)。
python
# Keras示例
from tensorflow.keras.layers import Embedding
embedding_layer = Embedding(
input_dim=vocab_size, # 词汇表大小
output_dim=embedding_dim, # 嵌入维度(如100、300)
input_length=max_seq_len # 输入序列长度
)
python
# PyTorch示例
import torch.nn as nn
embedding_layer = nn.Embedding(
num_embeddings=vocab_size, # 词汇表大小
embedding_dim=embedding_dim # 嵌入维度
)
预训练词嵌入的使用
预训练词向量(如Word2Vec、GloVe)可直接加载到嵌入层,提升模型效果:
python
# 加载GloVe词向量到Keras嵌入层
embedding_matrix = np.zeros((vocab_size, embedding_dim))
for word, i in word_index.items():
if word in glove_model:
embedding_matrix[i] = glove_model[word]
embedding_layer = Embedding(
input_dim=vocab_size,
output_dim=embedding_dim,
weights=[embedding_matrix],
trainable=False # 是否微调
)
词嵌入层的训练
- 随机初始化:嵌入层通常随模型一起训练,初始值为随机分布(如正态分布)。
- 微调预训练向量 :设置
trainable=True可在训练中调整预训练词向量的权重。
注意事项
- 词汇表覆盖 :确保生僻词或未登录词(OOV)有合理的处理方式(如
<UNK>标记)。 - 维度选择:嵌入维度通常为50-300,需权衡计算成本与语义表达能力。
- 序列填充:输入序列需统一长度,过短填充、过长截断。
与RNN的结合
词嵌入层的输出作为RNN的输入,形状为(batch_size, sequence_length, embedding_dim),供后续LSTM/GRU层处理时序依赖。
python
# Keras示例
model = Sequential([
Embedding(vocab_size, embedding_dim, input_length=max_seq_len),
LSTM(units=64),
Dense(1, activation='sigmoid')
])