Embeding技术:word2vec Parameter Learning Explained

本文深入解析word2vec模型,包括CBOW和skip-gram两种模型的原理,以及分层softmax和负采样两种优化技术,帮助理解词嵌入的参数学习过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接

一、主要内容:

  • word2vec模型:
    • CBOW 模型:continuous bag-of-word
    • SG模型:skip-gram
  • 优化技术:
    • 分层softmax:hierarchical softmax
    • 负采样:negative sampling

二、CBOW 模型:

  • 1、One-word context 模型:
    • 模型图:
    • 上图是一个全连接神经网络,在预测当前此时我们只使用前一个词作为上下文信息,就像一个二元模型(bigram model)一样。
    • 输入层是一个单词的one-hot表示, V V V是词汇表的大小,隐藏层单元个数为 N N N
    • 输入层到隐藏层:连接矩阵为 W V × N W_{V×N} WV×N,隐藏层与输入层的连接是简单的线性连接(即没有激活函数),两层的连接公式为:
    • v w I T v_{wI}^T vwIT W T W^T WT的列(即 W W W的行), w I w_I wI是输入的词。
    • 由于 X X X是单词的one-hot表示,若 X X X表示词汇表的第 k k k个单词,则 X X X列向量除了第 k k k个元素为1以外其他元素都是0,这样 h = W T X h=W^TX h=WTX,这相当于取出 W T W^T WT的第 k k k列(即 W W W的第 k k k行)作为 h h h,实质这就是第 k k k个单词的embeding表示.
    • 隐藏到输出层:连接矩阵为 W N × V ′ W_{N × V}' WN×V, 两层的连接公式为: U = W ′ T h U={W'}^T h U=WTh U U U是一个大小为 V V V的列向量,每个元素对于词汇表的一个词,我把每个元素称为其对应词的分数 (score),第 j j j个词的分数就是公式如下:
      u j u_j uj是词汇表中第 j j j个词的得分也是输出层每个单元的输入, v w j ′ T { {v_{wj}}'}^T vwjT W ′ W' W的第 j j j列。
    • 然后将 U U U经过一softmax层(softmax:一个对数线性分类模型)得到每个单词的后验分布(即概率值),softmax层表达式(第 j j j个词的后验概率):
      上式的含义是输入词汇表的第 I I I个单词输出第 j j j个词的概率,即第 j j j个词在第 I I I个词后面的概率,其中 y j y_j yj是输出层第 j j j个单元的输出,对应于词汇表的第 j j j个词。
    • 注意: v w v_w vw v w ′ v_w' vw是对应单词 w w w的两表示,我们将他们分别称为 w w w输入向量与输出向量,输入向量 v w v_w vw是输入层到隐藏层连接矩阵 W W W的行,输出向量是隐藏层到输出层连接矩阵 W ′ W' W的列
    • 隐藏层到输出层参数 W ′ W' W更新:
      • 优化的目标函数如下
### 嵌入(Embedding)技术的实现方法 #### 1. 序列样本中的嵌入 在序列样本中,嵌入技术通常通过神经网络模型来学习向量表示。例如,在自然语言处理领域,Word2Vec 和 GloVe 是两种经典的词嵌入方法[^1]。这些方法的核心思想是将词语映射到低维连续空间中,使得具有相似语义或上下文关系的词语在该空间中距离较近。 对于更复杂的场景,可以采用基于子词单元的方法,比如 FastText 提供了一种高效的解决方案。它不仅能够捕捉单词级别的信息,还能利用字符 n-gram 特征来增强对未知词和形态变化的支持[^3]。 以下是使用 Python 的 `gensim` 库加载预训练 Word2Vec 模型的一个示例: ```python from gensim.models import KeyedVectors # 加载 Google News 预训练的 Word2Vec 模型 model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True) # 查找某个词的最近邻 similar_words = model.most_similar('king') print(similar_words) ``` --- #### 2. 图结构数据中的嵌入 当面对图结构的数据时,Graph Embedding 成为了一个重要分支。这类方法旨在将节点、边或者整个图转化为固定长度的向量表示,以便后续用于分类、聚类或其他任务。DeepWalk 和 Node2Vec 是两个典型的例子,它们借鉴了随机游走的思想并结合 Skip-Gram 或 CBOW 模型完成学习过程。 下面是一个简单的 DeepWalk 实现框架伪代码片段: ```python import networkx as nx from gensim.models import Word2Vec def deepwalk(graph, walk_length=80, num_walks=10): walks = [] nodes = list(graph.nodes()) for _ in range(num_walks): for node in nodes: walk = [node] current_node = node while len(walk) < walk_length: neighbors = list(graph.neighbors(current_node)) if not neighbors: break next_node = random.choice(neighbors) walk.append(next_node) current_node = next_node walks.append([str(x) for x in walk]) # 使用 Gensim 训练 Word2Vec 模型 model = Word2Vec(sentences=walks, vector_size=128, window=5, min_count=0, sg=1, workers=4) return model.wv graph = nx.karate_club_graph() embeddings = deepwalk(graph) ``` --- #### 3. 多模态与异构特征下的嵌入 随着应用场景复杂度增加,单一类型的嵌入已无法满足需求。因此出现了针对多模态或多源数据设计的新一代嵌入技术。例如,DSSM (Deep Structured Semantic Model) 将文本与其他形式的信息联合建模;而 Transformer 架构则进一步推动了跨域表征能力的发展。 以 BERT 为代表的预训练语言模型展示了强大的泛化性能,其内部机制依赖于自注意力层提取全局关联特性。BERT 可被微调至各种下游任务上,从而获得定制化的 embedding 表达方式。 下面是用 Hugging Face Transformers 库获取句子 embedding 的一段代码: ```python from transformers import BertTokenizer, BertModel import torch tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') text = "This is an example sentence." encoded_input = tokenizer(text, return_tensors='pt', padding=True, truncation=True) with torch.no_grad(): outputs = model(**encoded_input) sentence_embedding = outputs.last_hidden_state.mean(dim=1).squeeze().numpy() print(sentence_embedding.shape) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值