第二课词向量简介

一、词向量

1、FizzBuzz游戏

在这里插入图片描述

import numpy as np
import torch
NUM_DIGITS=10
def binary_encode(i,num_digits):
    return np.array([i>>d&1 for d in range(num_digits)][::-1])
trX=torch.Tensor([binary_encode(i,NUM_DIGITS) for i in range(101,2**NUM_DIGITS)])
trY=torch.LongTensor([fizz_buzz_encode(i) for i in range(101,2**NUM_DIGITS)])

NUM_HIDDEN=100
model=torch.nn.Sequential(
    torch.nn.Linear(NUM_DIGITS,NUM_HIDDEN),
    torch.nn.ReLU(),
    torch.nn.Linear(NUM_HIDDEN,4)#4 logits,after softmax,we get a probablity distribution
)
if torch.cuda.is_available():
    model=model.cuda()
#为了让我们的模型学会FizzBuzz这个游戏,我们需要定义一个损失函数和一个优化算法。
#这个优化算法会不断优化(降低)损失函数,是的模型在该任务上取得尽可能低的损失值。
#损失值低往往表示我们的模型表现好,损失值高表示我们的模型表现差
#由于FizzBuzz游戏本质上是一个分类问题,我们选用Cross Entropy Loss 函数
#优化函数我们选用Stochastic Gradient Descent
loss_fn=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.SGD(model.parameters(),lr=0.05)

#以下是模型的训练代码
BATCH_SIZE=128
for epoch in range(10000):
    for start in range(0,len(trX),BATCH_SIZE):
        end=start+BATCH_SIZE
        batchX=trX[start:end]
        batchY=trY[start:end]
        
        if torch.cuda.is_available():
            batchX=batchX.cuda()
            batchY=batchY.cuda()
        y_pred=model(batchX)#forward
        loss=loss_fn(y_pred,batchY)
        print("Epoch",epoch,loss.item())
        optimizer.zero_grad()
        loss.backward()#backpass
        optimizer.step()#gradient descent

#最后我们用训练好的模型尝试在1到100这些数字上玩FizzBuzz游戏
testX=torch.Tensor([binary_encode(i,NUM_DIGITS) for i in range(1,101)])
if torch.cuda.is_available():
    testX=testX.cuda()
with torch.no_grad():
    testY=model(testX)
    
predictions=zip(range(0,101),testY.max(1)[1].cpu().data.tolist())
print([fizz_buzz_decode(i,x) for i,x in predictions])
2、词向量

在这里插入图片描述在这里插入图片描述

我们为什么需要词向量呢?因为我们希望能把单词转化为一个vector,vector是一个数字的信息,希望计算机能跟数字打交道而不是跟一个个的单词打交道,那么就希望这些单词能包含所有你想要表达的信息。如下图所示,我们希望“猫”跟下面的单词有比较近的关系,同样希望“美丽”跟下面这些单词有比较近的关系。

在这里插入图片描述
表示这些单词,人们发明了很多方法,最早人们用one-hot来表示单词,如果你有一个词典,你可以把每个数字变成每个单词,如果你有5万个单词,你就需要用5万个数字来表示。但是有个问题,这些数字并不能表示语义的信息,比如“美丽”和“漂亮”这两个单词比较接近,但是词典没办法保证这两个单词有比较近的语义表示。另一种one-hot表示只是把一个数字变成了一个向量,如果你的词典有5万个单词,你就可以弄一个5万维的向量。

在这里插入图片描述

另一种方法是bag of words,你可以把一个句子所有单词出现的次数加到one-hot里,就可以得到一个bag of words的表示,表示每个单词出现了多少次。这种表示方式也有问题,第一是单词的顺序没有被考虑,第二是语义的信息还是没有被考虑。后来人们为了表示单词的重要程度,用TF-IDF,出现次数多的单词给予较高权重,罕见的单词给较低权重,这种方法只知道了每个单词的重要性有多高,但是还是难以表示语义信息。
在这里插入图片描述

下面这两种方法还是没有解决语义的问题。
在这里插入图片描述在这里插入图片描述
后面人们就在思考,如何把这个单词编码成向量才能最好的表示它的信息,这里有不同品种的青蛙,我们希望跟“青蛙”相关的单词,变成向量之后,它们之间的距离能越近越好。词向量在空间上的距离能涵盖它语义的信息。
在这里插入图片描述

词和词之间的类比,比如King、Queen与Man和Woman应该有类比的关系;Paris、France和German、Berlin应该也有类似的关系。
在这里插入图片描述

带着这种思考,人们发明了一种分布式表示的方法。有人说如果你想知道一个单词的含义,只需要看这个单词跟什么词同时出现时,就能知道它的含义。比如你发现banking总是跟government、crises等词出现在一起,就会大概知道这个banking跟这些词有关系。banking跟信用卡周围的单词比较类似,就会知道banking和信用卡比较相近。这是我们的一个基本假设,就是一个单词可以用它周围的 单词进行表示。
在这里插入图片描述

基于这种假设,有人提出下面这个模型。输入一个中心词w(t),t:表示中心词的位置,然后用一层神经网络预测中心词周围的单词w(t-2)、w(t-1)…w(t+1)、w(t+2)。我们的目标是训练好一个词向量,这个在representation learning中非常常见,我们会定义一些假的任务,这些任务并不是我们关心的,我们的目标是训练模型的参数,把这些参数拿来用,这些参数可能在别的任务(下面的几个介绍,如词嵌入可视化等)上有好的应用。
一个单词,如果我现在能训练一个模型,这个模型的词向量能够预测它周围单词的一些信息,你就能够知道这个单词的含义是什么。给定中心词t,t周围出现的w,g等单词出现的概率越大越好。

在这里插入图片描述uo是输出的词向量,vc是输入的词向量,这两个向量做一个点积。点积后的结果越大表示它们一起出现的概率越高,点积越小表示它们一起出现的概率越低。softmax下有个submission,要跟所有周围可能出现的单词都要做点积,如果你的单词表里有50万个单词,表示你每次都要求50万个单词之和,很慢。
在这里插入图片描述为了让模型加快,我们做一个二分类任务。给定一个单词我们就预测这个单词是不是中心词周围的单词,把5万分类的问题变成一个二分类问题,给我一个中心词,一个周围词或者不是周围词,如果它是周围词,我就预测1,如果它不是周围词,就预测0。我只关心两个单词是否相邻,如果相邻,就给我一个高一点的概率,如果不相邻,就给一个低一点的概率。把loss_fn定义为一个简单的负例采样的fn。
给两个单词vc和vw,计算logistic sigmoid。给我一个中心词,我要一个正确的周围词和若干个错误的周围词,这些错误的周围词可以从单词表中随机采样,我们希望第2个公式前面和后面的部分都越大越好。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

3、实现skip-gram模型

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值