PyTorch 实现 Skip-gram

代码实现:https://github.com/zhangxiann/Skip-gram

这是我用于学习 Skip-gram 的笔记。

文中会有一些公式,如果 github 出现公式乱码问题,请通过我的博客查看:https://zhuanlan.zhihu.com/p/275899732

下面废话不多说,教你手把手实现 Skip-gram。

CBOW 和 Skip-gram 是两种训练得到词向量的方法。其中 CBOW 是从上下文字词推测目标字词,而 Skip-gram 则是从目标字词推测上下文的字词。在大型数据集上,CBOW 比 Skip-gram 效果好;但是在小的数据集上,Skip-gram 比 CBOW 效果好。本文使用 PyTorch 来实现 Skip-gram 模型,主要的论文是:Distributed Representations of Words and Phrases and their Compositionality

以“the quick brown fox jumped over the lazy dog”这句话为例,我们要构造一个上下文单词与目标单词的映射关系,以quick为目标单词,假设滑动窗口大小为 1,也就是左边和右边各取 1 个单词作为上下文,这里是thebrown,可以构造映射关系:(the, quick),(brown, quick),这样我们就构造出两个正样本。

此外,对于这个滑动窗口外的其他单词,我们需要构造负样本,但是负样本可以是滑动窗口之外的所有单词。为了减少训练的时间,我们对负样本进行采样 k 个,称为 Negative Sampling。如 k=2,就是对每个正样本,分别构造两个负样本;例如对于(the, quick),采样两个负样本 (lazy , quick),(dog, quick)。Negative Sampling 的损失函数表示如下: arg ⁡ max ⁡ θ log ⁡ σ ( v w O ′ ⊤ w I ) + ∑ i = 1 k E w i ∼ P n ( w ) [ log ⁡ σ ( − v w i ′ T w I ) ] \underset{\theta}{\arg \max }\log \sigma\left(v_{w_{O}}^{\prime} \top_{w_{I}}\right)+\sum_{i=1}^{k} \mathbb{E}_{w_{i} \sim P_{n}(w)}\left[\log \sigma\left(-v_{w_{i}}^{\prime} T_{w_{I}}\right)\right] θargmaxlogσ(vwOwI)+i=1kEwiPn(w)[logσ(vwiTwI)]。其中 σ ( x ) \sigma(x) σ(x) 表示 sigmoid 函数, w I w_{I} wI 表示目标单词, w o w_{o} wo 表示正样本的上下文单词,

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
skip-gram 是一种词向量表示方法,用于将单词转换为向量表示。在实际应用中,我们可以使用类似于 TensorFlow 和 PyTorch 这样的深度学习框架来训练 skip-gram 模型。 以下是使用 TensorFlow 进行 skip-gram 模型训练的示例代码: ```python import tensorflow as tf # 定义训练数据集 data = ["apple", "banana", "orange", "grape", "pear"] vocabulary = list(set("".join(data))) vocabulary_size = len(vocabulary) # 定义 skip-gram 模型 embedding_size = 32 num_sampled = 3 inputs = tf.placeholder(tf.int32, shape=[None]) labels = tf.placeholder(tf.int32, shape=[None, 1]) embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0)) embed = tf.nn.embedding_lookup(embeddings, inputs) nce_weights = tf.Variable(tf.truncated_normal([vocabulary_size, embedding_size], stddev=1.0 / tf.sqrt(embedding_size))) nce_biases = tf.Variable(tf.zeros([vocabulary_size])) loss = tf.reduce_mean(tf.nn.nce_loss(weights=nce_weights, biases=nce_biases, labels=labels, inputs=embed, num_sampled=num_sampled, num_classes=vocabulary_size)) # 定义优化器和训练操作 optimizer = tf.train.AdamOptimizer().minimize(loss) # 训练模型 num_epochs = 1000 batch_size = 5 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(num_epochs): for i in range(len(data)): batch_inputs = [vocabulary.index(c) for c in data[i]] batch_labels = [[vocabulary.index(c)]] * len(data[i]) _, loss_val = sess.run([optimizer, loss], feed_dict={inputs: batch_inputs, labels: batch_labels}) print("epoch %d, iteration %d, loss: %f" % (epoch, i, loss_val)) ``` 在这个示例中,我们首先定义了训练数据集和词汇表,然后使用 TensorFlow 定义了 skip-gram 模型,并使用交叉熵作为损失函数。接着,我们定义了 Adam 优化器来最小化损失,并使用训练数据对模型进行训练。在每个 epoch 和每个 iteration 中,我们会输出当前的损失值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值