【CS224n】(lecture1)课程介绍和word2vec

学习总结

(1)明确课程时间安排和task概况。
(2)简单复习:word2vec通过滑动窗口截取词构成样本,输入向量矩阵的行向量即所需的单词embedding;另外为了优化训练,还有负采样和SGD等方法。另外manning老爷子木有讲分层 softmax(Hierarchical Softmax),这个后续跟进。

【CS224n】(lecture1)课程介绍和word2vec

文章目录

; 一、课程安排

CS224n 课程介绍:

【CS224n】(lecture1)课程介绍和word2vec
课程主页
课程资料
课程国内观看链接
课程油管观看地址
答疑平台

总时长:12周
(1)week1-4: 词向量,分类,神经网络,分词
(2)week5-8: RNN和语言模型,梯度消失和seq2seq,机器翻译、注意力和子词模型
(3)week9-12: Transformers,预训练模型,自然语言生成(可选),基于知识的语言模型(可选)

要求:
(1)观看视频,笔记输出,要有自己的思考;
(2)完成课后的quiz(不多,共8个,大概10道选择题);
(3)一起组队做一个项目(自选一个NLP任务);

ddl打卡安排如下:

WeekDueLectureQuizProjects1Sun 11/21 24:00P11 – Introduction and Word Vectors 1:24:281-2周后选题2Sun 11/28 24:00P22 – Neural Classifiers 1:15:193Sun 12/05 24:00P33 – Backprop and Neural Networks 1:22:29Quiz 14Sun 12/12 24:00P44 – Dependency Parsing 1:21:225Sun 12/19 24:00P55 – Language Models and RNNs 1:19:18

P66 – Simple and LSTM RNNs 1:21:38Quiz 26Sun 12/26 24:00P77 – Translation, Seq2Seq, Attention 1:18:55Quiz 37Sun 01/02 24:00P99 – Self- Attention and Transformers 1:16:57

P1010 – Transformers and Pretraining 1:21:46 (可选)

P20 BERT and Other Pre-trained Language Models 54:29 (可选)Quiz 48Sun 01/09 24:00P1111 – Question Answering 1:51:53 (二选一)

P1212 – Natural Language Generation1:17:27 (二选一)Quiz 5 Quiz 69Sun 01/16 24:00P1414 – T5 and Large Language Models 1:35:1410Sun 01/23 24:00P1515 – Add Knowledge to Language Models 1:17:26Quiz 711Sun 01/30 24:00P1818 – Future of NLP + Deep Learning 1:20:06Quiz 812Sun 02/05 24:00

作业简要介绍:

【CS224n】(lecture1)课程介绍和word2vec
课程项目:
  1. N-Gram Language Models (Lectures 1-4) (语音识别)
  2. Word Alignment Models for Machine Translation (Lectures 5-9)(机器翻译)
  3. Maximum Entropy Markov Models & Treebank Parsing (Lectures 10-3)(命名实体识别和句法分析)

; 二、Word2vec算法

2.1 引子

理解单词意思的最常见的语言方式:语言符号与语言符号的意义的转化。

【CS224n】(lecture1)课程介绍和word2vec

; 2.2 滑动窗口

为了得到每个单词的高质量稠密embedding(相似上下文的单词的vector应该相似),word2vec是通过一个滑动窗口的滑动,同时计算P ( w t + j ∣ w t ) P\left(w_{t+j} \mid w_{t}\right)P (w t +j ​∣w t ​)。下面就是一个栗子, window_size=2

【CS224n】(lecture1)课程介绍和word2vec

2.3 目标函数

(1)一开始我们将刚才得到的一坨P ( w t + j ∣ w t ) P\left(w_{t+j} \mid w_{t}\right)P (w t +j ​∣w t ​)相乘,并且是对于每个t,所以有2个累乘:

【CS224n】(lecture1)课程介绍和word2vec
(2)因为一般我们是最小化目标函数,所以进行了取log和负平均的操作,修改后的目标函数:
【CS224n】(lecture1)课程介绍和word2vec
为了求出上面损失函数最里面的概率P ( w t + j ∣ w t ; θ ) P\left(w_{t+j} \mid w_{t} ; \theta\right)P (w t +j ​∣w t ​;θ),对于每个单词都用2个vector表示:
  • 当w是中心词时,表示为v w v_w v w ​
  • 当w是上下文词时,表示为u w u_w u w ​

但是为啥要用两个vector表示每个单词呢,manning给出的解释是:更容易optimization。

; 2.4 预测函数

所以对于一个中心词c和一个上下文次c有:P ( o ∣ c ) = exp ⁡ ( u o T v c ) ∑ w ∈ V exp ⁡ ( u w T v c ) P(o \mid c)=\frac{\exp \left(u_{o}^{T} v_{c}\right)}{\sum_{w \in V} \exp \left(u_{w}^{T} v_{c}\right)}P (o ∣c )=∑w ∈V ​exp (u w T ​v c ​)exp (u o T ​v c ​)​将任意值x i x_i x i ​映射到概率分布中,即如下:

【CS224n】(lecture1)课程介绍和word2vec
分子的点积用来表示o和c之间相似程度,分母这坨东西就是基于整个词表,给出归一化后的概率分布。

三、训练

3.1 激活函数

用softmax函数,使大的更大,小的更小:

【CS224n】(lecture1)课程介绍和word2vec

; 3.2 梯度下降

又是熟悉的通过minimize loss来优化更新参数,注意一开始说了每个单词都有2个vector表示,其中vector是d维度的,一共有V个单词,我们想要得到的模型参数:θ = [ v a a r d v a r k v a ⋮ v z e b r a u a a r d v a r k u a ⋮ u z e b r a ] ∈ R 2 d V \theta=\left[\begin{array}{l} v_{a a r d v a r k} \ v_{a} \ \vdots \ v_{z e b r a} \ u_{a a r d v a r k} \ u_{a} \ \vdots \ u_{z e b r a} \end{array}\right] \in \mathbb{R}^{2 d V}θ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​v a a r d v a r k ​v a ​⋮v z e b r a ​u a a r d v a r k ​u a ​⋮u z e b r a ​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​∈R 2 d V
梯度下降就是通过链式求导法则,这里我们对里面那项概率求导:log ⁡ p ( o ∣ c ) = log ⁡ exp ⁡ ( u o T v c ) ∑ w = 1 V exp ⁡ ( u w T v c ) \log p(o \mid c)=\log \frac{\exp \left(u_{o}^{T} v_{c}\right)}{\sum_{w=1}^{V} \exp \left(u_{w}^{T} v_{c}\right)}lo g p (o ∣c )=lo g ∑w =1 V ​exp (u w T ​v c ​)exp (u o T ​v c ​)​
在每个窗口中,我们通过梯度下降求出当前窗口的所有参数,我们上面是用的CBOW,即根据上下文预测中心词。

【CS224n】(lecture1)课程介绍和word2vec
并且在更新参数时,是要设定超参数——学习率:
【CS224n】(lecture1)课程介绍和word2vec
上面的梯度下降实际上需要对语料库(corpus)的所有窗口都计算后才更新参数。所以为了训练更高效,可以使用SGD,SGD是对一个窗口进行更新参数,并且重复采样窗口。
while True:
    window = sample_window(corpus)
    theta_grad = evaluate_gradient(J, window, theta)
    theta = theta - alpha * theta_grad

3.3 负采样

CBOW或者skip-gram这类模型的训练,在当词表规模较大且计算资源有限时,这类多分类模型会因为输出层概率的归一化计算效率的影响,训练龟速。

所以负采样提供了另一个角度:给定当前词与上下文,任务是最大化两者的共现概率。
也即将多分类问题简化为:针对(w, c)的二分类问题(即共现or不共现),从而避免了大词表上的归一化复杂计算量。

如P ( D = 1 ∣ w , c ) P(D=1 \mid w, c)P (D =1 ∣w ,c )表示c和w共现的概率P ( D = 1 ∣ w , c ) = σ ( v w ⋅ v c ′ ) P(D=1 \mid w, c)=\sigma\left(v_{w} \cdot v_{c}^{\prime}\right)P (D =1 ∣w ,c )=σ(v w ​⋅v c ′​)

四、代码实现

这里的数据集我们用了 nltk库的reuters数据集:

reuters = LazyCorpusLoader(
    "reuters",
    CategorizedPlaintextCorpusReader,
    "(training|test).*",
    cat_file="cats.txt",
    encoding="ISO-8859-2",
)

【CS224n】(lecture1)课程介绍和word2vec
这里我们的损失函数选用 nn.NLLLoss(),可以回顾上次学习pytorch图片多分类时的图:
【CS224n】(lecture1)课程介绍和word2vec
我们之前经常使用的 torch.nn.CrossEntropyLoss如下(将下列红框计算纳入)。注意右侧是由类别生成独热编码向量。
【CS224n】(lecture1)课程介绍和word2vec
具体细节见代码注释:
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import Dataset
from torch.nn.utils.rnn import pad_sequence
from tqdm.auto import tqdm
from utils import BOS_TOKEN, EOS_TOKEN, PAD_TOKEN
from utils import load_reuters, save_pretrained, get_loader, init_weights

class CbowDataset(Dataset):
    def __init__(self, corpus, vocab, context_size=2):
        self.data = []
        self.bos = vocab[BOS_TOKEN]
        self.eos = vocab[EOS_TOKEN]
        for sentence in tqdm(corpus, desc="Dataset Construction"):
            sentence = [self.bos] + sentence+ [self.eos]

            if len(sentence) < context_size * 2 + 1:
                continue
            for i in range(context_size, len(sentence) - context_size):

                context = sentence[i-context_size:i] + sentence[i+1:i+context_size+1]

                target = sentence[i]
                self.data.append((context, target))

    def __len__(self):
        return len(self.data)

    def __getitem__(self, i):
        return self.data[i]

    def collate_fn(self, examples):
        inputs = torch.tensor([ex[0] for ex in examples])
        targets = torch.tensor([ex[1] for ex in examples])
        return (inputs, targets)

class CbowModel(nn.Module):
    def __init__(self, vocab_size, embedding_dim):
        super(CbowModel, self).__init__()

        self.embeddings = nn.Embedding(vocab_size, embedding_dim)

        self.output = nn.Linear(embedding_dim, vocab_size)
        init_weights(self)

    def forward(self, inputs):
        embeds = self.embeddings(inputs)

        hidden = embeds.mean(dim=1)

        output = self.output(hidden)
        log_probs = F.log_softmax(output, dim=1)
        return log_probs

embedding_dim = 64
context_size = 2
hidden_dim = 128
batch_size = 1024
num_epoch = 10

corpus, vocab = load_reuters()
dataset = CbowDataset(corpus, vocab, context_size=context_size)
data_loader = get_loader(dataset, batch_size)

nll_loss = nn.NLLLoss()

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = CbowModel(len(vocab), embedding_dim)
model.to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)

model.train()
for epoch in range(num_epoch):
    total_loss = 0
    for batch in tqdm(data_loader, desc=f"Training Epoch {epoch}"):

        inputs, targets = [x.to(device) for x in batch]

        optimizer.zero_grad()

        log_probs = model(inputs)

        loss = nll_loss(log_probs, targets)

        loss.backward()

        optimizer.step()
        total_loss += loss.item()
    print(f"Loss: {total_loss:.2f}")

save_pretrained(vocab, model.embeddings.weight.data, "cbow.vec")

Reference

(1)课程ppt:https://web.stanford.edu/class/cs224n/slides/
(2)Speech and Language Processing :https://web.stanford.edu/~jurafsky/slp3/
(3)课程官网:https://see.stanford.edu/Course/CS224N#course-details
(4)https://datawhale.feishu.cn/docs/doccncx2cwCD9jtZCp6kKhlKdee#
(5)pytorch损失函数之nn.CrossEntropyLoss()、nn.NLLLoss()

Original: https://blog.csdn.net/qq_35812205/article/details/121433041
Author: 山顶夕景
Title: 【CS224n】(lecture1)课程介绍和word2vec

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/548513/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球