学习总结

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

文章目录

  • 学习总结
  • 一、课程安排
  • 二、Word2vec算法
    • 2.1 引子
    • 2.2 滑动窗口
    • 2.3 目标函数
    • 2.4 预测函数
  • 三、训练
    • 3.1 激活函数
    • 3.2 梯度下降
    • 3.3 负采样
  • 四、代码实现
  • Reference

一、课程安排

CS224n 课程介绍:

课程主页
课程资料
课程国内观看链接
课程油管观看地址
答疑平台

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

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

ddl打卡安排如下:

Week Due Lecture Quiz Projects
1 Sun 11/21 24:00 P11 - Introduction and Word Vectors 1:24:28 1-2周后选题
2 Sun 11/28 24:00 P22 - Neural Classifiers 1:15:19
3 Sun 12/05 24:00 P33 - Backprop and Neural Networks 1:22:29 Quiz 1
4 Sun 12/12 24:00 P44 - Dependency Parsing 1:21:22
5 Sun 12/19 24:00 P55 - Language Models and RNNs 1:19:18
P66 - Simple and LSTM RNNs 1:21:38
Quiz 2
6 Sun 12/26 24:00 P77 - Translation, Seq2Seq, Attention 1:18:55 Quiz 3
7 Sun 01/02 24:00 P99 - 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 4
8 Sun 01/09 24:00 P1111 - Question Answering 1:51:53 (二选一)
P1212 - Natural Language Generation1:17:27 (二选一)
Quiz 5 Quiz 6
9 Sun 01/16 24:00 P1414 - T5 and Large Language Models 1:35:14
10 Sun 01/23 24:00 P1515 - Add Knowledge to Language Models 1:17:26 Quiz 7
11 Sun 01/30 24:00 P1818 - Future of NLP + Deep Learning 1:20:06 Quiz 8
12 Sun 02/05 24:00

作业简要介绍:

课程项目:

  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 引子

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

2.2 滑动窗口

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

2.3 目标函数

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

(2)因为一般我们是最小化目标函数,所以进行了取log和负平均的操作,修改后的目标函数:

为了求出上面损失函数最里面的概率P(wt+j∣wt;θ)P\left(w_{t+j} \mid w_{t} ; \theta\right)P(wt+jwt;θ),对于每个单词都用2个vector表示:

  • 当w是中心词时,表示为vwv_wvw
  • 当w是上下文词时,表示为uwu_wuw

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

2.4 预测函数

所以对于一个中心词c和一个上下文次c有:P(o∣c)=exp⁡(uoTvc)∑w∈Vexp⁡(uwTvc)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(oc)=wVexp(uwTvc)exp(uoTvc)将任意值xix_ixi映射到概率分布中,即如下:

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

三、训练

3.1 激活函数

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

3.2 梯度下降

又是熟悉的通过minimize loss来优化更新参数,注意一开始说了每个单词都有2个vector表示,其中vector是d维度的,一共有V个单词,我们想要得到的模型参数:θ=[vaardvarkva⋮vzebrauaardvarkua⋮uzebra]∈R2dV\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} θ=vaardvarkvavzebrauaardvarkuauzebraR2dV
梯度下降就是通过链式求导法则,这里我们对里面那项概率求导:log⁡p(o∣c)=log⁡exp⁡(uoTvc)∑w=1Vexp⁡(uwTvc)\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)} logp(oc)=logw=1Vexp(uwTvc)exp(uoTvc)
在每个窗口中,我们通过梯度下降求出当前窗口的所有参数,我们上面是用的CBOW,即根据上下文预测中心词。

并且在更新参数时,是要设定超参数——学习率:

上面的梯度下降实际上需要对语料库(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=1w,c)表示c和w共现的概率P(D=1∣w,c)=σ(vw⋅vc′)P(D=1 \mid w, c)=\sigma\left(v_{w} \cdot v_{c}^{\prime}\right) P(D=1w,c)=σ(vwvc)

四、代码实现

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

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


这里我们的损失函数选用nn.NLLLoss(),可以回顾上次学习pytorch图片多分类时的图:

我们之前经常使用的torch.nn.CrossEntropyLoss如下(将下列红框计算纳入)。注意右侧是由类别生成独热编码向量。

具体细节见代码注释:

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:continuefor i in range(context_size, len(sentence) - context_size):# 模型输入:左右分别取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)# CBOW模型部分
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)# 计算隐含层:对上下文词向量求平均,得到Wt的上下文表示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# 读取文本数据,构建CBOW模型训练数据集
corpus, vocab = load_reuters()
dataset = CbowDataset(corpus, vocab, context_size=context_size)
data_loader = get_loader(dataset, batch_size)nll_loss = nn.NLLLoss()
# 构建CBOW模型,并加载至device
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 = 0for batch in tqdm(data_loader, desc=f"Training Epoch{epoch}"):# 1.准备数据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}")# 保存词向量(model.embeddings)
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()

【CS224n】(lecture1)课程介绍和word2vec相关推荐

  1. 【01】 课程介绍 - 计算机视觉概述

    1.本课学习内容.学习目标 1.1 课程介绍 什么是计算机视觉: 计算机视觉,顾名思义就是针对视觉数据进行研究: 计算机视觉课程的重性: 海量的视觉数据(youtube为例): 介绍讲师,都是李飞飞老 ...

  2. python课程将主要介绍哪些内容-熊学堂 · 人工智能 | 课程介绍

    原标题:熊学堂 · 人工智能 | 课程介绍 从AlphaGo赢了李世石那一天开始,人工智能就成为了数据科学领域最火热的分支(没有之一),不知道有多少互联网公司默默地把自己的数据团队改名叫"A ...

  3. ue4相机_纳格数字创意课程介绍 |UE4虚拟现实技术室内方向

    VR建筑与室内表现是一个时代呼唤下的新兴技术领域,它对建筑和室内进行可视化设计, 依托数字图像技术, 通过效果图.动画.交互.体验等方式,对未来场景进行虚拟呈现, 实现从"无"到& ...

  4. MyBatis-学习笔记01【01.Mybatis课程介绍及环境搭建】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  5. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象

    课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  6. jQuery课程介绍、Query的介绍、Query初次体验、jQuery再次体验、jQuery中的顶级对象

    jQuery课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  7. Linux零基础入学之1-1课程介绍了解RHEL7安装RHEL7

    [本节内容] * 课程介绍 * RHEL7了解 * RHEL7.2的安装 * 实战:组装服务器 [Linux介绍] 服务器种类:刀片式.塔式(机架式) 1U:4.45cm   三指宽   指服务器的高 ...

  8. ASP.NET Core分布式项目实战(课程介绍,MVP,瀑布与敏捷)--学习笔记

    任务1:课程介绍 课程目标: 1.进一步理解 ASP.NET Core 授权认证框架.MVC 管道 2.掌握 Oauth2,结合 Identity Sercer4 实现 OAuth2 和 OpenID ...

  9. tdd测试驱动开发课程介绍_测试驱动开发的实用介绍

    tdd测试驱动开发课程介绍 by Luca Piccinelli 通过卢卡·皮奇内利 测试驱动开发很难! 这是不为人知的事实. (Test Driven Development is hard! Th ...

  10. 计算机组成原理中英对照篇,信息科学系课程介绍(中英对照).doc

    文档介绍: 信息科学系课程介绍(中英对照)序号:1课程编码:14001010课程名称:计算机基础学分:1周学时:2开课系部:信息科学系预修课程:无修读对象:信息管理与信息系统专业本科生课程简介:主要介 ...

最新文章

  1. 取出表A中第31到第40记录
  2. 暴力关闭Windows defender
  3. 如何编写 Nagios 插件
  4. “中国好创意” CCF全国青年大数据创新大赛启动仪式 暨大数据大师论坛议程...
  5. 【总结】Qt+Mysql5.5中文乱码解决
  6. Visual Studio 自定义控件不显示在工具箱
  7. pycharm(Idea)破解到2100年
  8. 多幸运用计算机演奏的乐谱,多幸运钢琴简谱-数字双手-韩安旭
  9. 天行健,君子以自强不息;地势坤,君子以厚德载物的权威解释
  10. 心理学效应:阿基米德与酝酿效应
  11. 虚幻引擎的像素流技术:边缘计算与RTC架构的设计思路
  12. JAVA的GUI编程02——事件监听(ActionListener)、TextField事件监听、(组合、内部类)
  13. 海德汉仿真软件+海德汉西门子视频教程
  14. QQ聊天对话框(Js实现,支持表情插入文本中间)
  15. python装饰器与闭包_python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)。...
  16. 365天挑战LeetCode1000题——Day 103 400题 检查二进制字符串字段 最大子序列交替和 最低票价 K 站中转内最便宜的航班
  17. Unix道德经(英文版)
  18. 快速构建智慧社区场景的一种技术方案
  19. 替换空格(C++和Python 实现)
  20. C/C++ 数字1234,能组成多少个互不相同且无重复的三位数数字。

热门文章

  1. python 实现相关系数计算和检验
  2. 交付管理——怎样推动项目验收
  3. 使用telnet发送email(内嵌图片,附件)
  4. 计算机配置很高 但是很卡,电脑配置高但很卡_电脑配置很高但还是很卡是怎么回事啊?...
  5. 安装Flash Builder4.6遇到的问题
  6. flash builder激活
  7. 【实战案例】利用Python做出趣味版防沉迷小程序
  8. C# 简单实现QQ截图功能
  9. dotnetbar 控件使用总结(一)
  10. 最简单的OSPF配置实验(Cisco路由器)