3.5 嵌入(Embedding)
在序列建模中,嵌入(Embedding)是将离散的符号(如单词、字符、类别等)映射到连续向量空间的过程。嵌入是将高维离散特征转换为低维连续特征的一种方式,这种转换有助于提取序列数据中的语义和上下文信息,从而改善序列模型的性能。
3.5.1 嵌入介绍
嵌入层是深度学习中的一种常见层类型,通常用于自然语言处理(NLP)和推荐系统等任务,其中输入数据通常是符号序列。通过嵌入,每个符号(例如单词)被映射为一个稠密向量,这个向量可以捕捉到符号的语义和语境信息。
在下面列出了嵌入在序列建模中的一些重要应用场景:
- 自然语言处理(NLP):在文本处理任务中,嵌入可以将单词或字符映射到连续的向量表示,使得模型能够捕获词语之间的语义关系和上下文信息。Word2Vec、GloVe和BERT等模型都使用了嵌入技术。
- 推荐系统:在推荐系统中,嵌入可以用于表示用户和物品(如商品、电影等),从而构建用户-物品交互矩阵的表示。这种表示可以用于预测用户对未知物品的兴趣。
- 时间序列预测:对于时间序列数据,嵌入可以用于将时间步和历史数据映射为连续向量,以捕获序列中的趋势和模式。
- 序列标注:在序列标注任务中,嵌入可以用于将输入的序列元素(如字母、音素等)映射为向量,供序列标注模型使用。
- 图像描述生成:在图像描述生成任务中,嵌入可以将图像中的对象或场景映射为向量,作为生成描述的输入。
3.5.2 PyTorch嵌入层的特征提取
当使用 PyTorch 进行文本数据的特征提取时,可以使用嵌入层来将单词映射为连续向量表示。以下是一个完整的示例代码,演示了在 PyTorch 中使用嵌入层进行文本数据的特征提取的过程。
实例3-9:在 PyTorch 中使用嵌入层提取文本数据的特征(源码路径:daima\3\qian.py)
实例文件qian.py的具体实现代码如下所示。
# 生成一些示例文本数据
texts = ["this is a positive sentence",
"this is a negative sentence",
"a positive sentence here",
"a negative sentence there"]
labels = [1, 0, 1, 0]
# 构建词汇表
word_counter = Counter()
for text in texts:
tokens = text.split()
word_counter.update(tokens)
vocab = sorted(word_counter, key=word_counter.get, reverse=True)
word_to_index = {word: idx for idx, word in enumerate(vocab)}
# 文本数据预处理和转换为索引
def preprocess_text(text, word_to_index):
tokens = text.split()
token_indices = [word_to_index[token] for token in tokens]
return token_indices
texts_indices = [preprocess_text(text, word_to_index) for text in texts]
# 划分训练集和验证集
train_data, val_data, train_labels, val_labels = train_test_split(texts_indices, labels, test_size=0.2, random_state=42)
# 自定义数据集和数据加载器
class CustomDataset(Dataset):
def __init__(self, data, labels):
self.data = data
s