美文网首页AI
NLP讲座1:引言和词向量

NLP讲座1:引言和词向量

作者: 泥人冷风 | 来源:发表于2020-06-21 22:12 被阅读0次

    讲座计划

    1. 课程介绍(10分钟)
    2. 人类语言和词义(15分钟)
    3. Word2vec 介绍(15分钟)
    4. Word2vec梯度的导数(25分钟)
    5. 优化:梯度下降(5分钟)
    6. CS224n:深度学习的自然语言处理

    补充材料(缩简及代码)

    1. 课程介绍

    1. 1. 课后辅导简介

    • 指导老师:克里斯托弗·曼宁
    • 助教主任兼联合讲师:阿比盖尔湖
    • 助教:很多牛人!看网站
    • 时间:周二 4:30-5:50,Nvidia音频(-》视频)
    • 其他信息:请参阅课程网页

    1.2. 我们希望教什么?

    1.2.1. 了解有效的深度学习现代方法

    • 基础第一,然后是NLP中使用的关键方法:循环网络,注意事项等

    1.2.2. 全面了解人类语言以及理解和产生人类语言的困难

    1.2.3. 对NLP中一些主要问题的理解和构建系统的能力(使用PyTorch)

    • 词义,依存关系解析,机器翻译,问题解答

    1.3. 今年有什么不同?

    • 讲座(包括嘉宾讲座)涵盖了新材料:
      角色模型(character models),变压器(transformers),安全/公平(safety/fairness),多任务学习(multitask learn)。
    • 1周5个作业,而不是2周3个作业
    • 涵盖新材料的作业(关注NMT,ConvNets,subword建模)
    • 使用PyTorch而不是TensorFlow
    • 课前(下午4:30)之前不于午夜交作业
    • 稳固但较早开始:
      • 第一次任务很容易,但是要从今天起一周
    • 没有期中

    1.4. 课程工作和评分政策

    • 5 x 1周作业:6%+ 4 x 12%:54%
      • HW1今天发布! 下周二到期! 下午4:30
      • 请为您的Gradescope帐户使用@ stanford.edu电子邮件
    • 最终默认或自定义课程项目(1-3人):43%
      • 项目建议书:5%,里程碑:5%,海报:3%,报告:30%
      • 预计最终的海报会议出席!(请参阅网站)
      • 3月20日,5 pm-10pm星期三(将其放入日历!)
    • 参与度:3%
      • (来宾)讲座,广场,宴会,业力-请访问网站!
    • 迟到政策
      • 6天免费延迟;后记,每天延迟10%折扣
      • 每次作业迟到3天后不接受作业
    • 合作政策:阅读网站和荣誉守则! 了解允许的“协作”以及如何记录

    1.5. 问题集高级计划

    • 希望HW1可以轻松实现-IPython Notebook
    • HW2是纯Python(numpy),但希望您进行(多变量)演算,以便您真正了解基础知识
    • HW3引入了PyTorch
    • HW4和HW5在GPU上使用PyTorch(Microsoft Azure)
      • PyTorch,Tensorflow(以及Chainer,MXNet,CNTK,Keras等)等库正在成为DL的标准工具
    • 对于FP,您要么
      • 进行默认项目,即SQuAD问题解答
        • 不限成员名额,但更轻松的开始;对于大多数人来说是个不错的选择
      • 提出一个我们认可的自定义最终项目
        • 您将收到来自导师的反馈(助教 /教授/博士后/博士)
      • 可以1-3人一组工作;可以使用任何语言

    2. 人类语言和词义


    2.1. 我们如何表示一个单词的含义?

    定义:含义(韦伯斯特词典)

    • 用词,词组等表示的想法
    • 一个人想用单词,符号等表达的想法
    • 在写作,艺术等作品中表达的想法
      最普遍的意义语言学思维方式:
      符号(符号)<->符号化(思想或事物)
      =指称语义

    2.2. 我们在计算机中如何具有可用的含义?

    常见解决方案:使用 WordNet,一个同义词库,包含同义词集和上位词列表(“是”关系)

    例如 包含“good”的同义词集

    # 导入初始包
    # pip install nltk
    import nltk
    #必须下载对应的wordnet包
    nltk.download('wordnet')
    from nltk.corpus import wordnet as wn
    poses = {'n':'noun','v':'verb','s':'adj(s)','a':'adj','r':'adv'}
    for synset in wn.synsets("good"):
        print("{}:{}".format(poses[synset.pos()],",".join([l.name() for l in synset.lemmas()])))
    

    noun:good
    noun:good,goodness
    noun:good,goodness
    noun:commodity,trade_good,good
    adj:good
    adj(s):full,good
    adj:good
    adj(s):estimable,good,honorable,respectable
    adj(s):beneficial,good
    adj(s):good
    adj(s):good,just,upright
    adj(s):adept,expert,good,practiced,proficient,skillful,skilful
    adj(s):good
    adj(s):dear,good,near
    adj(s):dependable,good,safe,secure
    adj(s):good,right,ripe
    adj(s):good,well
    adj(s):effective,good,in_effect,in_force
    adj(s):good
    adj(s):good,serious
    adj(s):good,sound
    adj(s):good,salutary
    adj(s):good,honest
    adj(s):good,undecomposed,unspoiled,unspoilt
    adj(s):good
    adv:well,good
    adv:thoroughly,soundly,good

    例如 "panda"的化身

    # 导入初始包
    # pip install nltk
    import nltk
    #必须下载对应的wordnet包
    nltk.download('wordnet')
    from nltk.corpus import wordnet as wn
    panda = wn.synset("panda.n.01")
    hyper = lambda s: s.hypernyms()
    list(panda.closure(hyper))
    

    [Synset('procyonid.n.01'),
    Synset('carnivore.n.01'),
    Synset('placental.n.01'),
    Synset('mammal.n.01'),
    Synset('vertebrate.n.01'),
    Synset('chordate.n.01'),
    Synset('animal.n.01'),
    Synset('organism.n.01'),
    Synset('living_thing.n.01'),
    Synset('whole.n.02'),
    Synset('object.n.01'),
    Synset('physical_entity.n.01'),
    Synset('entity.n.01')]

    2.3. 像WordNet这样的资源,存在的问题

    • 作为资源很好,但缺少细微差别
      例如 “proficient”被列为“good”的同义词
      <这仅在某些情况下是正确的>
    • 缺少单词的新含义
      例如,wicked,badass,nifty,wizard,genius,ninja,bombest
      <不可能保持最新>
    • 主观
    • 需要人工来创造和适应
    • 无法计算准确的单词相似度

    2.4. 将单词表示为离散符号

    在传统的自然语言处理中,我们将单词视为离散符号:
    hotel,conference,motel - 地方代表
    单词可以用一热向量表示:
    <表示一个1,其余0s>
    motel=[000000000010000]
    hotel = [000000010000000]
    向量维数=词汇中的单词数(例如:500,000)

    2.5. 单词作为离散符号存在的问题

    示例:在网络搜索中,如果用户搜索“Seattle motel”,我们希望匹配包含“Seattle hotel”的文档
    但是:
    motel=[000000000010000]
    hotel = [000000010000000]
    这两个向量是正交的。
    一热向量没有自然的相似性概念

    《解决方案》

    • 可以尝试依靠WordNet的同义词列表来获得相似性吗?
      • 但是众所周知严重失败:不完整等。
    • 替代:学习在向量本身中编码相似性

    2.6. 通过上下文来表示单词

    • 分布语义:一个单词的含义由经常出现的单词给出
      • “您将知道它所经营的公司的一句话”(J.R. Firth 1957:11)
      • 现代统计NLP最成功的想法之一!
    • 当单词w出现在文本中时,其上下文是附近出现的一组单词(在固定大小的窗口内)
    • 使用w的许多上下文来构建w的表示


    2.7. 词向量

    我们将为每个单词构建一个密集的向量,并选择它,使其类似于出现在相似上下文中的单词的向量



    注意:单词向量有时也称为单词嵌入或单词表示形式,它们是分布式表示形式。

    2.8. 词义作为神经词向量-可视化

    3. Word2vec 介绍

    Word2vec(Mikolov et al.2013)是用于学习单词向量的框架
    想法:

    • 我们有大量的语料库
    • 固定词汇表中的每个单词都由一个向量表示
    • 遍历文本中的每个位置t,该位置具有中心词c和上下文(“outside”)词o
    • 使用c和o的词向量的相似度来计算o给定c的概率(反之亦然)
    • 不断调整单词向量以最大程度地提高这种可能性

    3.1. Word2Vec概述

    采样窗口和计算下图的过程


    公式
    演进过程1

    下一步:


    演进过程2

    3.2. Word2vec:目标函数

    对于每个位置t = 1,...,T,在给定中心词wj的情况下,在固定大小m的窗口中预测上下文词。


    优化公式

    目标函数J(θ)是平均负对数似然度:
    <J(θ):有时称为成本或损失函数>


    损失函数
    • 我们想要最小化目标函数:


      最小化目标函数
    • 问题:怎样计算P(Wt+j | Wt;θ)
    • 回答:在每个单词w我们将使用两个向量:
      • Vw 当w是中心词时
      • Uw 当w是上下文词时
    • 然后对于中心词c和上下文词o:


      表达式

    3.3. 带矢量的Word2Vec概述

    • 计算P(Wt + j | Wt)的采样窗口和过程
    • P(Uproblems | Vinto)的缩写P(problems| into; Uproblems,Vinto,θ)


    3.4. Word2vec:预测功能

    预测功能
    • 这是softmax函数的一个例子:


      softmax函数
    • softmax函数将任意值xi映射到概率分布pi
      • “ max”,因为放大了最大xi的概率
      • “soft”,因为仍然为较小的xi分配了一些概率

    3.5. 通过优化参数来训练模型

    为了训练模型,我们调整参数以最大程度地减少损失
    例如,对于下面两个参数的简单凸函数
    等高线显示目标函数的级别


    等高线

    3.6. 训练模型:计算所有矢量梯度!

    • 召回:θ表示所有模型参数,在一个长矢量中
    • 在我们以d维向量和V个单词为例的情况下:


    • 记住:每个词都有两个向量
    • 我们通过沿着梯度走来优化这些参数

    4. Word2vec梯度的导数

    • 白板-如果您不在课堂上,请观看视频
    • 基本的乐高积木
    • 有用的基础知识:


    • 如有疑问:写出索引
    • 链式法则! 如果y = f(u)和u = g(x),即 y = f(g(x)),然后:


      链式法则

    4.1. 链式法则

    • 链式法则! 如果y = f(u)和u = g(x),即 y = f(g(x)),然后:


      链式法则
    • 简单的例子:


      简单的例子

      -》首先,展开成y对u的函数:


      y对u的函数
      -》接着,y对u求导:
      y对u求导

      -》其次,在展开u对x的函数:


      u对x的函数
      -》 接着,u对x求导:
      u对x求导
      -》最后,根据链式法则:
      链式法则求解

    4.2. 交互式白板会议!


    让我们一起得出中心词的梯度
    对于一个采样窗口和一个采样外部单词:



    然后,您还需要为上下文单词添加梯度(类似;左侧为作业),这就是这里的所有参数θ。

    4.3. 计算所有梯度!

    • 我们对一个窗口中的每个中心向量v进行了渐变
    • 我们还需要外部向量u的梯度
      • 回家吧!
    • 通常在每个窗口中,我们都会计算该窗口中正在使用的所有参数的更新,例如:


    4.4. Word2vec:更多详细信息

    为什么要选择两个向量?->简化优化。最后将两个向量平均。
    两种模型类型:

    1. Skip-grams(SG)
      根据给定的中心词来预测上下文(“外部”)词(与位置无关)
      2.Continuous Bag of Words(CBOW)
      从上下文词袋中预测中心词

    到目前为止的讲座:Skip-gram模型
    在训练中进一步提高效率:
    1.负采样
    到目前为止:专注于朴素的softmax(简单的训练方法)

    这两种模型细节请参见https://blog.csdn.net/dn_mug/article/details/69852740

    5. 优化:梯度下降

    • 我们有一个成本函数J(θ)我们想要最小化
    • 梯度下降是最小化J(θ)的算法
    • 思路:对于θ的当前值,计算J(θ)的梯度,然后朝负梯度的方向走一小步。重复。
      <注意:我们的目标可能不会像这样凸出>


    5.1. 梯度下降

    • 更新公式(以矩阵表示法):


    • 更新公式(对于单个参数):


    • 算法:

    while True:
         theta_grad = evalute_gradient(J,corpus,theta)
         theta = theta - alpha * theta_grad
    

    5.2. 随机梯度下降

    • 问题:J(θ)是语料库中所有窗口的函数(可能是数十亿!)
      • 因此∇θJ(θ)的计算非常昂贵
    • 您可能需要等待很长时间才能进行单个更新!
    • 对于几乎所有的神经网络来说,这都是一个非常糟糕的主意!
    • 解决方案:随机梯度下降(SGD)
      • 重复采样窗口,并在每个窗口之后进行更新
    • 算法:
    while True:
        window = sample_window(corpus)
        theta_grad = evaluate_gradient(J,window,theta)
        theta = theta - alpha * theta_grad
    

    6. CS224n:深度学习的自然语言处理

    6.1. 介绍自然语言处理

    6.1.1. NLP有什么特别之处

    6.1.2. 任务示例

    6.1.3. 如何代表单词

    6.2. 词向量

    6.3. 基于SVD的方法

    6.3.1. Word文档矩阵

    6.3.2. 基于窗口的共生矩阵

    6.3.3. 将SVD应用于共生矩阵

    6.4. 基于迭代的方法-Word2vec

    6.4.1. 语言模型(Unigrams,Bigrams,等)

    6.4.3. 连续词袋模型(CBOW)

    6.4.4. Skip-Gram模型

    6.4.5. 负采样

    6.4.6. 分层Softmax

    参考文档cs224n-2019

    相关文章

      网友评论

        本文标题:NLP讲座1:引言和词向量

        本文链接:https://www.haomeiwen.com/subject/lqczxktx.html