4. 自然语言理解

注解

更新日期:2020年04月01日

4.1. 书籍推荐

  1. 《Speech and Language Processing, 2nd Edition》
    • 内容全面,覆盖面广
  2. 《统计自然语言处理》 宗成庆
  3. 《信息检索导论》
  4. 《语言本能-人类语言进化的奥秘》

4.2. 什么是 自然语言 理解?

4.2.1. 自然语言?

  1. 和编程语言相对的语言称为自然语言。

4.2.2. 自然语言理解?

  1. 目的:使计算机理解人类的自然语言。
  2. 本质:结构预测的过程。如输出一句话的句法结构或者语义结构。
  3. 从无结构化序列预测有结构的语义。
    • 词性标注、命名实体识别、依存分析、句法分析、指代消解等任务。
  4. 数据驱动的自然语言理解
    • 深度学习技术的突破
  5. 语义表示(核心)
    • one-hot (0/1)也称独热编码
      • 表示简单,但局限性很大,如相似度计算。
    • 分布式语义表示 (空间表示)
      • 目前最主要的表示形式。
      • 1986年提出的方法。

4.2.3. 自然语言的特点

  1. 歧义性多。
    ` 南京市/长江大桥。南京市长/江大桥。 ` - 关键目标:消除歧义性。
  2. 递归性
    ` 你好/不好意思。 你/好不好意思。 `
  3. 主观性
    ` 仔细体会这两句:别回了。 我没事,你忙你的。 `
  4. 社会性
    • 敬语、语言协调等

4.2.4. 难点

  1. 语言的语义表示
    • 世界(社会/客观)、心智(人/主观)、语言三者相互影响。
  2. 将人类的知识融入到语义表示的过程中。
    • 人类知识相当于给足了上下文信息
  3. 多模态复杂语境的理解 (说话的表情、手势动作、场景等)
    • 欢迎/新老/师生/前来/参观!
    • 欢迎/新老师/生前/来参观!

4.2.5. 未来

  1. 句子消歧。
  2. 引入知识。如知识图谱。
  3. 多级的跨句子建模。
  4. 生成句子更符合当下对话场景。
  5. 理解并创作。

4.2.6. 自然语言理解交叉科学

  1. 计算机科学
  2. 脑科学
  3. 语言学
  4. 语言哲学
  5. 心理学、社会学、认知学
  6. 神经语言学、汉语言学

4.3. 自然语言技术方向

  • 基于规则驱动
  • 基于数据驱动
    • 统计学语言模型
    • 深度语言模型

4.4. NLP国内外优秀学者及实验室

5. CS224n-2019-课程笔记 by Chris Manning

小技巧

  • CS224n-2019.课程源自斯坦福CS course,2019年发布的自然语言处理,算是NLP的经典吧,老爷子讲的也很风趣幽默。Ok, Hello, everyone!一起来追剧吧。
  • 题外话:课时并不多,所以暗示自己要尽量耐心地把每一节的知识搞懂(慢工出细活,理论知识很重要),自己思考的同时也要动手推导公式甚至编写代码(我就是这么弄得)来刺激大脑理解,难受一阵会发现知识理解很深刻,再回顾此前的知识,豁然开朗!

5.1. 一些说明和资源

5.2. 词向量(Word Vectors)

../../_images/preface.jpg

5.2.1. 自然语言和词义

  1. 自然语言
    • 你永远无法确定任何单词对他人意味着什么。(中文这个情况就更普遍啦)
    • 写作是另一件让人类变得强大的事情,这实现了知识的传播和共享。
  2. 语言的意义
    • 通过一个词或句子等来表达概念
    • 人们通过文字或声音信号等来表达思想、想法
    • 在写作、艺术中表达含义
一般通过下面这种语言方式进行有意义的思考:
    signifier(symbol)⇔signified(idea or thing) =denotational semantics
  1. 语义计算
    • 常见方案的不足
      • 类似 WordNet 一个面向语义的英语词典,包含上义词(hypernyms)、同义词(synonym sets)。
        • 没有考虑上下文,忽略一个词的细微差别
        • 不能及时更新。
        • Can’t compute accurate word similarity
      • 传统NLP的做法。离散符号表示。one-hot,0-1进行编码:Means one 1, the rest 0s
        • 向量大小就是词汇表的大小(很多无用的信息)
        • 无法计算相似度。如下例两个词向量是正交的,点积为0.
        motel = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
        hotel = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
        
    • 提取新方案
      • Could try to rely on WordNet’s list of synonyms to get similarity?
      • learn to encode similarity in the vectors themselves(学习词自身的编码信息)
  2. 通过上下文表示词
    • 分布式语义:一个词的含义往往是由附近高频出现的词决定的。
    • word出现在文本中,这个Word周围会有由词的集合组成的Context出现。这个上下文是固定一个窗口size的。
    • 我们可以使用存在Word的大量 语料 来学习其向量表示。比如学习“中国科学院”词(实际中会学习每个词),在下列的语料中。
      1. 先向获得2009年度国家最高科学技术奖的 中国科学院 院士、复旦大学数学研究所名誉所长谷超豪和
      2. 院士、复旦大学数学研究所名誉所长谷超豪和 中国科学院 院士、中国航天科技集团公司高级技术顾
      3. 大国”向“造船强国”迈进。 由 中国科学院 和上海市政府共同建设的上海同步辐射光源工
      4. 丽;河南卓越工程管理有限公司董事长邬敏 中国科学院 研究生院教授杨佳十人“全国三八红旗手

5.2.2. Word Vectors(词向量)

  • 根据一个的词的上下文,来为词构建密集的向量,以使得该向量与出现在类似上下文中的词相似
  • 引出词向量,也称词嵌入或词表示。
    • word vectors are sometimes called word embeddings or word representations.
    • They are a distributed representation.
    • 例如“中国”这个词经过训练后的词向量为:
\[\begin{split}中国 = \begin{pmatrix} 0.286\\ 0.792\\ −0.177\\ −0.107\\ 0.109\\ −0.542\\ 0.349\\ 0.271 \end{pmatrix}\end{split}\]

5.2.3. Word2Vector介绍

注解

Word2vec (Mikolov et al. 2013) 是一种学习词向量的 框架

5.2.3.1. 主要思想

  1. 我们有个比较大的文本数据集。
  2. 文本中的每个词通过一个固定长度的词向量表示。
  3. 扫描文本中每一个位置 t 所表示的词,其中有一个中心词 c 和上下文词 o
  4. 通过c和o的词向量的相似性,计算在给定c,即中心词来计算o,即上下文的概率。反之亦然。
  5. 不断调整词向量来最大化上面提到的概率。
  • 举例如下

    ../../_images/w2v_ex-1.png ../../_images/w2v_ex-2.png

5.2.4. Word2Vector目标函数

  1. 思路(后面要说的Skip-grams模型)

    在每个位置 \(t\) (t = 1,……,T),给定一个中心词 \(w_j\) 和一段固定长度的窗口 \(m\),预测上下文中每个单词的概率。

\[ \begin{align}\begin{aligned}\begin{split}Likelihood = L(\theta) = \prod_{t=1}^{T}\prod _{\substack{-m\leq j \leq m \\ j\neq 0}}P(w_{t+j}|w_t;\theta)\end{split}\\其中 \theta 是一个需要全局优化的变量\end{aligned}\end{align} \]
  • 目标函数 \(J(\theta)\) (也称为 代价或损失函数),是一个负对数似然:

    \[\begin{split}J(\theta) = -\frac{1}{T}logL(\theta) = -\frac{1}{T}\sum_{t=1}^{T}\sum _{\substack{-m\leq j \leq m \\ j\neq 0}}P(w_{t+j}|w_t;\theta)\end{split}\]

Q1: 如何计算 \(P(w_{t+j}|w_t;\theta)\)?

A1: 每个词w用两个向量表示

  • 当w是中心词时用向量 \(v_w\) 表示
  • 当w是上下文词时用向量 \(u_w\) 表示

那么对于一个中心词c和上下文词o可用如下形式表示

\[P(o|c) = \frac{exp(u_o^T v_c)}{\sum_{w\in V} exp(u_w^Tv_c)}\]

其中,\(u_o^T v_c\) 目的是为了对整个词汇表进行标准化。

  • softmax function

    softmax函数作用是将任意标量 \(x_i\)

    \[softmax(x_i) = \frac{exp(x_i)}{\sum_{j=1}^{n} exp(u_w^Tv_c)} = p_i\]
    • “max”对比较大的 \(x_i\) 映射比较大的概率
    • ”soft” 对那些小的 \(x_i\) 也会给予一定概率
    • 这是一种常见的操作,如深度学习

小技巧

  • 利用对数的特性将目标函数转换为对数求和,减少计算的复杂度。
  • 最小化目标函数 ⟺最大化预测的准确率
  • 通过不断的优化参数最小化误差来训练模型。
  • 为了训练模型,需要计算所有向量的梯度
    • \(\theta\) 用一个很长的向量表示所有模型的参数。
    • 每个单词有个两个向量。
      • Why two vectors? àEasier optimization. Average both at the end.
    • 利用不断移动的梯度来优化这些模型的参数。

5.2.5. 梯度计算推导

下面开始推导 \(P(w_{t+j}|w_t;\theta)\): 对 \(v_c\) 求偏微分

\[ \begin{align}\begin{aligned}\begin{split}\frac{\partial}{\partial v_c }logP(o|c) &= \frac{\partial}{\partial v_c }log\frac{exp(u_o^T v_c)}{\sum_{w\in V} exp(u_w^Tv_c)}\\ &=\frac{\partial}{\partial v_c}\left(\log \exp(u_o^Tv_c)-\log{\sum_{w\in V}\exp(u_w^Tv_c)}\right)\\ &=\frac{\partial}{\partial v_c}\left(u_o^Tv_c-\log{\sum_{w\in V}\exp(u_w^Tv_c)}\right)\\ &=u_o-\frac{\sum_{w\in V}\exp(u_w^Tv_c)u_w}{\sum_{w\in V}\exp(u_w^Tv_c)}\\ &=u_o-\sum_{w\in V}\frac{\exp(u_w^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)}u_w\\ &=u_o-\sum_{w\in V}P(w|c)u_w\\\end{split}\\\begin{split}其中,u_o是我们观测到每个词的值,\sum_{w\in V}P(w|c)u_w是模型的预测值,\\ 利用梯度下降不断使两者更为接近,使偏微为0.\end{split}\end{aligned}\end{align} \]

还有对 \(u_o\) 的偏微过程,大家动手推导下,比较简单的。

小技巧

补充一点边角知识,在上面的推导过程中用的到:

  • 向量函数与其导数 \(\frac{\partial Ax}{\partial x} = A^T, \frac{\partial x^T A}{\partial x} = A\)
  • 链式法则:\(log'f[g(x)] = \frac{1}{f[g(x)]}g'(x)\)

5.2.6. word2vector的概览

前面提到的Word2Vector是一种学习词向量的框架(模型),它包含两个实现算法:

  1. Skip-grams (SG) (课上讲的就类似这种)

    • 根据中心词周围的上下文单词来预测该词的词向量
  2. Continuous Bag of Words (CBOW)

    • 根据中心词预测周围上下文的词的概率分布。

另外提到两个训练的方式:

  1. negative sampling (比较简单的方式)

    • 通过抽取负样本来定义目标
  2. hierarchical softmax

    • 通过使用一个树来计算所有词的概率来定义目标。

5.2.7. 优化:梯度下降与随机梯度下降算法的要点

  • 梯度下降(Gradient Descent,GD)
    1. 最小化的目标(代价)函数 \(J(\theta)\)
    2. 使用梯度下降算法去优化 \(J(\theta)\)
    3. 对于当前 \(\theta\) 采用一个合适的步长(学习率)不断重复计算 \(J(\theta)\) 的梯度,朝着负向梯度方向。
    ../../_images/SG.jpg
    1. 更新等式(矩阵)

      \[ \begin{align}\begin{aligned}\theta^{new} = \theta^{old} - \alpha\nabla_\theta J(\theta)\\其中,\theta = 步长(学习率)\end{aligned}\end{align} \]
    2. 更新等式(单个参数)
      \[\theta_j^{new} = \theta_j^{old} - \alpha\frac{\partial}{\partial \theta_j^{old}}J(\theta)\]
  • 随机梯度下降(Stochastic Gradient Descen, SGD)
    • 目的
      进一步解决 \(J(\theta)\) 的训练效率(因为目标函数包含所有的参数,而且数据集一般都是很大的)问题:太慢了。
    • Repeatedly sample windows, and update after each one

5.2.8. 小结

  • 本节首先从语言的语义问题开始讲起,然后为了表示语义,引出了词向量概念,接着着重讲了Word2Vector框架、原理、算法推导等,最后简单提了下目标函数的优化的方式。
  • 看完并梳理完本节知识,我产生了几个问题:
    • 词向量提了好多次,那么每个词的词向量究竟是如何产生(计算)的呢?存在哪些方法?
    • 有几个点的原理还需进一步深入理解:
      • 负采样、层次采样;区别和前后的优势在哪里?
      • SG、CBOW算法的细节;本质区别和各自优势是什么?

5.3. 词向量和语义

注解

本节课后,我们就能够开始读一些关于词嵌入方面的论文了。

../../_images/preface-2.png

5.3.1. Review:word2vec

5.3.1.1. 主要思想

  • 这里以skip-gram)模型为例
    1. 遍历整个语料库的每个词,通过中心词向量预测周围的词向量
    2. 算法学到的词向量能用来计算词的相似度或语义等相关需求。

5.3.1.2. 关于梯度计算

  • GD。计算效率低,每次对所有样本进行梯度计算
  • SGD。每次只对一个固定大小的样本窗口进行更新,效率较高。
  • 梯度计算存在稀疏性(0比较多)
    • But in each window, we only have at most 2m + 1 words, so it is very sparse!
    • 解决方案:
      • only update certain rows of full embedding matrices U and V. (使用稀疏矩阵仅更新稀疏性低的词向量矩阵U和V)
      • you need to keep around a hash for word vectors (使用hash来更新,即k-v,k表示word,v表示其词向量)

5.3.1.3. 基于负采样(negative sample)方法计算

  1. 计算下列式子:
    \[P(o|c) = \frac{exp(u_o^T v_c)}{\sum_{w\in V} exp(u_w^Tv_c)}\]

    其中 :math:` {sum_{win V} exp(u_w^Tv_c)}` 计算代价非常大(整个语料库计算),如何降低这一块的计算复杂度就是需要考虑的问题。

  2. 负采样方法介绍
    • 主要思想:train binary logistic regressions。除了对中心词窗口大小附近的上下文词取样以外(即true pairs),还会随机抽取一些噪声和中心词配对(即noise pairs)进行计算,而不是遍历整个词库。
    • 这个 指的是噪声数据(无关的语料词 noise pairs)
  3. 负采样计算细节

  • 最大化下面的目标函数

    \[J(\theta) = \frac{1}{T}\sum_{t=1}^{T}J_{t}(\theta)\]
    \[ \begin{align}\begin{aligned}J_{t}(\theta)=\log \sigma(u_{o}^{T} v_{c})+\sum_{i=1}^{k} \mathbb{E}_{j \sim P(w)}[\log \sigma(-u_{j}^{T} v_{c})]\\其中,\sigma(x)=\frac{1}{1+e^{-x}}\end{aligned}\end{align} \]
    • 公式第一项表示最大化真实的中心词和其上下文词的概率;第二项是最小化负采样的噪声值(中心词及其上下文)的概率,j表示负采样的样本,并以P(w)大小进行随机采样。

    注解

    • P(w),这里使用了N元统计模型且N取1,即一元统计模型(unigram),表示每个词都和其它词独立,和它的上下文无关。每个位置上的词都是从多项分布独立生成的。
    • 补充N元统计模型,N=2时就为二元统计模型,即每个词和其前1个词有关。一般的,假设每个词 \(x_t\) 只依赖于其前面的n−1个词(n 阶马尔可夫性质)。
    • 通过N元统计模型,我们可以计算一个序列的概率,从而判断该序列是否符合自然语言的语法和语义规则。
    • 这个方法在构建词向量时最大的问题就是 数据稀疏性,大家可以思考下为什么?还能想到改进或其他更好的方法?

5.3.2. 基于共现矩阵生成词向量

But why not capture co-occurrence counts directly? 1. 主要思想

  • 有一个共现矩阵x,其可选的粒度有两种:固定窗口大小的window、文档级的document
    • window级别的共现矩阵: 类似有word2vector,利用每个词使用固定的窗口大小来获取其语法或语义信息。
      • 例如,window_len = 1的单词与单词同时出现的次数来产生基于窗口的co-occurrence matrix。
        • 语料: I like deep learning. I like NLP. I enjoy flying. c
        ../../_images/co_matrix.png
      • 解释下上述矩阵的含义:按窗口为1,同时出现的原则,I I语料没有这样的表达即同时出现的次数为0,I like 前两条都出现了,即为2。

      • 简单观察矩阵,就会发现很稀疏,存在大量的0,而且随着语料库的增大,维数也会增大,这显然不是最佳方法,得想办法增加空间的利用率,目标就是稀疏变稠密,以免因稀疏性对下游任务造成影响。

    • document级别的共现矩阵:基本假设是文档若存在相关联,则其会出现同样的单词。一般使用“Latent Semantic Analysis”(LSA)潜在语义分析方法进行矩阵的生成

  1. 问题:怎么对共现矩阵进行降维呢?

    • Singular Value Decomposition(SVD)奇异值分解

      • 将矩阵X分解为 \(U \Sigma V^{\top} \Sigma\) 是对角阵,其主对角线的每个值都是奇异值;U和 \(V^{\top}\) 两个正交矩阵
      ../../_images/SVD.png

      注解

      1. SVD就是将一个线性变换分解为两个线性变换,一个线性变换代表旋转,一个线性变换代表拉伸。
      2. 正交矩阵对应的变换是旋转变换,对角矩阵对应的变换是伸缩变换。
      3. 这里我们可以再联想对比另外一个经典的降维算法PCA。
  2. Hacks to X

    • 按比例缩放计数会有很大帮助。(怎么讲?)哦,就是对一些高频的功能性(has、the等)词进行缩放,缩放后不会影响句法结构或者语义等
      • min(X,t), with t ≈ 100
      • 忽略这些词
    • 定义一个Ramped windows,统计距离很小(关联度高)的的词。(距离越小,代表关联度越高)
    • 使用皮尔逊相关系数来替换直接计数方式,并设无关联值为0。

    注解

    Pearson相关系数是衡量向量相似度的一种方法。输出范围为-1到+1, 0代表无相关性,负值为负相关,正值为正相关。

5.3.3. Glove词向量模型

小技巧

可参考阅读 Glove 主页

  1. 基于计数和直接预测的比较

    ../../_images/count_predict.png
    • 基于计数(统计理论)
    • 直接预测(概率模型或神经网络)

    到底哪一个方法是正法呢,还是说走向合作呢?答案是合作,相互借鉴才能发挥更大价值(1+1>2)

  2. 探索在向量间的差异中挖掘语义
    • 方向:能在共现矩阵的概率的比值中看出语义相关
    ../../_images/co_matrix_ratio.png
    • 解释下表所传递的信息:当需知道ice冰和steam气的关系时,可借助词k:
      • 当k=solid,k和ice近似,这时ratio>>1;==> solid与ice有关
      • 当k=gas,k和steam接近时,ratio<<1;==> gas与steam有关
      • 当k=water/fashion等与2个词都不相关时,ratio≈1。==> 之间无关

通俗的讲下这个比值:1为阈值,当远大于1或远小于1就说明词之间有相关度的;当接近于1时证明无关

  1. 如何表示共现矩阵的概率的比值呢?

    • Log-bilinear model:\(w_i \cdot w_j = log P(i|j)\)
    • 使用向量差值表示:\(w_x \cdot(w_a - w_b) = log \frac{P(x|a)}{P(x|b)}\)
  2. Glove目标函数为:
    \[J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}-\log X_{i j}\right)^{2}\]
    • 其中f(x)如下图所示:

      ../../_images/glove_fun.png
    • \(X_{i j}\) 表示词j在词i的上下文中出现的次数。

  3. Glove的优势
    • 训练速度快
    • 可扩展到大语料库
    • 即时小预料库,其效果也不错

5.3.4. 怎样评估词向量?

  1. 问题:如何评估NLP的模型。

  2. 主要从两个方面:内部和外部
    • 内部(自身评估)
      • 评估特定或中间子过程:速度快、有利于理解整个模型
    • 外部(将词向量应用到下游任务,如推荐、搜索、对话等系统中)
      • 在真实场景下进行评估:消耗时间可能过长、不明确子系统是否有交互问题。
      • 如果用一个子系统替换另外一个子系统后能提高准确率,那这个模型就很棒了
      • 词向量应用到搜索、问答等领域来进行效果评估
  3. 评估:词向量
    • 通过计算余弦距离后并求和来获取语义和相似的句法。
    • 技巧:丢弃输入的几个关键词,以此来验证词向量的相似度计算性能
    • 例:a:b :: c:? man:woman :: king:? man–>king那么woman–>?
      • 在语料中找到一点 \(x_i\),即为和woman最为相近的词
    \[d=\arg \max _{i} \frac{\left(x_{b}-x_{a}+x_{c}\right)^{T} x_{i}}{\left\|x_{b}-x_{a}+x_{c}\right\|}\]
    ../../_images/w2v_eva.png
    • 下面是glove的某些词向量相似度可视化的结果

      ../../_images/glove_vi.png
  4. 评估:相似性和参数
    • Glove的语义或句法相似度表现的更好,如下表:

      ../../_images/glove_w2v.png
    • 特点:语料的规模要大、词向量维数为300更合适

      ../../_images/glove_dim.png
  5. 相关性评估(距离)

    ../../_images/glove_corr_eva.png
  6. 外部评估
    • 词向量好不好最直接的方法就是应用到实际场景,比如最常用的NER(命名实体识别)任务中

      ../../_images/glove_ner.png
    • glove对于NER任务表现理论上还说的过去,但凭上表中的准确率在工业领域中还是很难拿来用的。那么还有什么好的模型或者思路呢?

    • 从下一小节就开始尝试将词向量输入到神经网络中,来进一步提升下游任务的性能。

5.3.5. 语义及其歧义性

注解

实际上,许多词都是一词多义的,特别是咱们的汉语,更甚有如今曾层出不穷的网络流行语,有时你不懂点八卦还真的猜不来词要表达的真实含义!这就是NLP绕不开的一个问题:歧义性,对应的任务就是:消歧。

  • 看下单词 pike 的含义

    ../../_images/w2v_ambiguity.png
    • 看上图易知词的含义还是相当丰富的,如何相对准确的捕捉到当前场景下(上下文)的真实含义就是值得思考和研究的一个问题。
  1. 论文1:Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012)

    ../../_images/cluster_word.png
    • 使用了聚类的思路:通过一些关键词来聚类,但常常出现重叠(误分)的现象

2. 论文2:Linear Algebraic Structure of Word Senses, with Applications to Polysemy 将同一词的不同语义进行线性叠加

\[ \begin{align}\begin{aligned}\begin{split}v_{\text { pike }}=\alpha_{1} v_{\text { pike }_{1}}+\alpha_{2} v_{\text { pike }_{2}}+\alpha_{3} v_{\text { pike }_{3}} \\ \alpha_{1}=\frac{f_{1}}{f_{1}+f_{2}+f_{3}}\end{split}\\f为词出现的频率\end{aligned}\end{align} \]
  • 论文的思路来自词向量的稀疏编码,

5.3.6. 分类(Classification)模型知识点回顾

1. 样本(数据集):\(\{x^{(i)},y^{(i)}\}_{1}^{N}\),其中x_i为输入(词、句、文档等)y_i就是标签, 预测的分类目标(正负向、文档主题等)`

  1. 例如简单的二分类

    ../../_images/cls_ex.png
  2. 一般的机器学习方法或统计方法:假定 \({x_i}\) 为固定大小,我们使用sofmax或逻辑回归算法训练权重参数W,以此来寻找一个决策边界。 + 例如softmax算法,对于固定的 \({x}\) 预测y:

    \[p(y\mid x)=\frac{exp(W_{j.}x)}{\sum_{c=1}^{C}exp(W_{c.}x)}\]
    ../../_images/softmax_detail.png
    • 我们的目标就是最大化正确类别y的概率,不过我们一般为了降低运算的复杂度,会转为下式进行计算:
    \[-log P(y|x) = -log(\frac{exp(f_y)}{\sum_{c=1}^{C}exp(f_c)})\]
  3. 交叉熵损失
    1. 交叉熵的概念源自信息论中的知识,对于样本实际的概率分布P与模型产生的结果概率分布q,其交叉熵可表示为下式:

      \[H(p,q) = -\sum_{c=1}^{C}p(c)logq(c)\]
    2. 整个数据集 \(\{x^{(i)},y^{(i)}\}_{1}^{N}\) 的交叉熵可表示为:
      \[J(\theta) = \frac{1}{N}\sum_{i=1}^{N} - log\bigg(\frac{e^{f_{y_i}}}{\sum_{c=1}^{C}e^{f_c}}\bigg)\]

      \(f_y = f_y(x)=W_y·x=\sum_{j=1}{d}W_{y_j}·x_j\)

  4. 优化

  • 传统机器学习方法优化

对于 \(\theta\) 的数量一般和权重W的维数一致,线性决策模型至少需要一个d维的词向量输入和生成一个 C个类别的分布。因此更新模型的权值,我们需要 C⋅d个参数

\[\begin{split}\theta = \begin{bmatrix}{W_{.1}} \\ \vdots \\ {W_{.d}} \end{bmatrix} = W(::)\in\mathbb{R}^{Cd}\end{split}\]
梯度优化:更新决策边界的参数
\[\begin{split}\nabla_{\theta}J(\theta) = {\begin{bmatrix} \nabla_{W_{.1}} \\ \vdots \\ \nabla_{W_{.d}} \end{bmatrix}}\in\mathbb{R}^{Cd}\end{split}\]

6. 使用神经网络+词向量分类 一般的分类算法其通常解决的是一些线性问题,表达能力有限,对一些非线性的决策边界无法更好的建模,借用神经网络模型可进一步提升模型的能力。

  • 基于神经网络分类(模型的预测能力更强)
    ../../_images/neural_cls.jpg
  • 词向量与神经网络模型结合
    • 同时学习权重W和词向量x,参数量为:cd+vd,非常大的参数量,C表示分类大数量,d表示每个词向量维数,V表示词汇表的大小。
    \[\begin{split}\begin{eqnarray} \nabla_{\theta}J(\theta) = \begin{bmatrix}\nabla_{W_{.1}} \\ \vdots \\ \nabla_{W_{.d}} \\ \nabla_{aardvark} \\ \vdots \\ \nabla_{zebra} \end{bmatrix} \nonumber \end{eqnarray}\\\end{split}\]
    • 参数量大意味着表达(拟合数据)能力很强(这里可以联系数学中的多项式,参数多了意味着多项式越长,图像也就越复杂),但过犹不及,容易造成过拟合,模型泛化能力不足,怎么办呢?常见做法就是加入 正则项

5.3.7. 小结

本节首先讲了词向量的训练基本过程和常用方法:解决维数高、复杂度高的问题;其次,讲了Golve的主要思想;最后通过分类引出神经网络的优势:非线性能力,能够更好地获取语义信息。后续小节将开始神经网络的篇章。

5.4. 神经网络

../../_images/preface-3.png

注解

本小节主要讲神经网络的基础知识和NLP中的命名实体识别(NER)任务。

5.4.1. Neural NetWork基础

  1. 神经网络是指由很多人工神经元构成的网络结构模型,这些人工神经元之间的连接强度是可学习的参数。

  2. 人工神经网络(Artificial Neural Network,ANN)是一种模拟人脑神经网络而设计的数据模型或计算模型,它从结构、实现机理和功能上模拟人脑神经网络。

  3. 神经元(Neuron),是构成神经网络的基本单元,其主要是模拟生物神经元的结构和特性,接受一组输入信号并产出输出。
    • 例如神经元可以是一个二元的逻辑回归单元,典型的结构如下图:
    \[h_{w,b}(x)=f(w^Tx+b)\]
    ../../_images/neuron.png

    其中, \(f(z) = \frac{1}{1+e^{-z}}\) 。f称为 激活函数 例如sigmoid函数:Logistic、Tanh;w称为 权重,表示信号的强弱(特征的重要程度);b称为 偏置;h称为 隐藏层;x表示 输入的特征值。 在本例的逻辑回归模型中,w,b就是这个神经元的参数。

    ../../_images/activate_fun.png

4. 神经网络结构 还是上面的神经元,但是是同时运行多个逻辑回归单元。比如有一下几种形式:

../../_images/NN_1.png ../../_images/NN_2.png ../../_images/NN_3.png
  • 每一次神经元用矩阵符号表示
../../_images/NN_4.png
\[ \begin{align}\begin{aligned}a_1 = f(W_{11} x_{1}+W_{12} x_{2}+W_{13} x_{3}+b_{1}\\a_2 = f(W_{21} x_{1}+W_{22} x_{2}+W_{23} x_{3}+b_{2}\\...\end{aligned}\end{align} \]
可用矩阵符号表示:
\[ \begin{align}\begin{aligned}z = WX + b\\a = f(z)\end{aligned}\end{align} \]

激活函数f(x)逐元素进行相乘。 \(f([z_1,z_2,z_3]) = [f(z_1),f(z_2),f(z_3)]\)

  1. 为什么需要非线性f激活函数
    • 一句话总结:提高模型的表示能力或者学习能力。为什么呢?
    • 因为没有非线性变化,我们就无需选择神经网络模型了,因为只能进行线性变换和传统的机器学习模型类似了
    • 因为线性变换组合后还是线性变换,不能进行深层次的特征学习
    • 非线性变换的层数(隐藏层)越多,那么模型的就能拟合更为复杂的数据(联想下多项式函数,一次、二次、三次甚至更高次函数拟合样本点程度是完全不同的,当然复杂度也是递增的),不过也很容易造成过拟合,这个度要想拿捏的好,是一门玄学(运气+实力)
    • 这里补充点关于激活函数的知识:

    注解

    • 激活函数:
      • 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数。
      • 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
      • 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。
    • 常见激活函数
      • Sigmoid型激活函数:是指一类S型曲线函数,为两端饱和函数。常用的Sigmoid型函数有Logistic函数和Tanh函数。
      • 修正线性单元(Rectified Linear Unit,ReLU)。常用的激活函数之一,图像类似一个斜坡。
      • 指数线性单元(Exponential Linear Unit,ELU)。是一个近似的零中心化的非线性函数。

5.4.2. 命名实体识别介绍

注解

命名实体识别(Named Entity Recognition,NER)。NLP领域的一个基础型子任务。

  1. 一些用途
    • 获取文档中的实体名称。
    • 问答、对话等系统需要实体。
    • 从实体与实体之间的关联中获取信息。
    • 也可扩展到填槽(slot-filling)分类的任务中。在对话系统中 填槽 指的是为了让用户意图转化为用户明确的指令而补全信息的过程。
    • 在构建知识库/知识图谱的过程中,获取命名实体也是重要的一环。
  2. 思路
    • 首先通过上下词对单词进行 分类 ,然后将实体提取为词 序列 来预测实体。
      • 我们可发现NER不仅是分类问题,还是一个序列问题,也称为序列标注问题
    • BIO标注体系:B-实体起始位置、I-实体结束位置、O-非实体
    ../../_images/NER.png
    • 补充一点NER的知识:

    注解

    • NER的目的是从一段文本中找出实体同时也需要标注出实体的位置,实体一般包含人名、地名、组织名等。
    • NER标注是使用的标签体系包括:IO、BIO(常用)、BMEWO、BMEWO+,一般地,标签体系越复杂其标注结果也更准确。
    • NER常用算法:BiLSTM+CRF、BiLSTM-LAN、也可结合词典进行实体识别,具备扩展性
    • 标注工具:brat
  3. NER的难点何在?
    • 边界问题。NER任务在文本的处理中是很常用的一个工具,但其本身会对一些文本中的实体边界识别有偏差。这一点在我的实际业务中也遇到过:“股东**李杨楠**近日……”,对人名会识别为:“杨楠”,而实际是:“李杨楠”,我的处理策略之一就是加一个人名词典。
    • 实体似是而非问题。“Future School”是一个学校(ORG)名称,还是其本意未来的学校。
    • 不确定是人还是机构或地点。
    • 实体识别依赖上下文。我遇到的实际业务问题:公司xxx先生,由于公司干扰会将PER:xxx识别为ORG。

个人结合实际对于上述难点问题有两个解决思路:一是模型本身的调整(语料、结合实体上下文进行分类、引入知识等);二是维护一个词典,将识别有误的实体添加到字典,这个方法感觉比较常用。

  1. 尝试:词基于窗口(上下文)分类
    • 思路:classify a word in its context window of neighboring words.

    • 例如:在实体的上下文中判断是人名、地名、机构名或者什么也不是。

    • 实现策略
      • 之一:每个词的上下文存在差别,所以可对上下文窗口的词向量进行平均化,然后再进行单词分类。
        • 缺点:丢失位置信息。(为什么呢?我想是word embedding被运算的造成的)
      • 之二:Softmax
        • 训练一个softmax分类器对实体以及其窗口词(上下文)整体进行分类
        ../../_images/ner_base_windows.png
        • 数学含义

          softmax分类器:

          \[\widehat{y}_y = p(y|x) = {exp(W_y \cdot x) \over \sum ^C_{c=1}exp(W_c \cdot x)}\]

          交叉熵损失函数:

          \[J(\theta) = {1\over N} \sum^N_{i=1} -log({e^{f_{yi}}\over \sum^C_{c=1}e^{f_c}})\]
      • 进阶之三:多层感知机
        • 参考论文 (2011)Natural Language Processing (Almost) from Scratch

        • 思路:在softmax分类器加入中间层(引入非线性)提升分类器的分类能力(复杂性)。根据是否是需要分类的实体进行权重的分配。

        • 神经网络前向计算

          ../../_images/ner_softmax_nerul.png
        • 中间层可与输入的词向量进行非线性的变换(赋予不同的权重)

        • Objective Function 我们可使用Hinge损失函数(Max-margin loss)。目的是使目标窗口得分更高,其他窗口得分降低
          • \(s = score("museums \ in \ Paris \ are \ amazing”)\)
          • \(s_c = score("Not \ all \ museums \ in \ Paris)\)
          • \(Minimize(J) =\max(0,1-s+s_{c})\)
          • 函数为不连续可微,因此可计算梯度。

      注解

      Hinge损失函数(又称,max-margin objective)对于两类分类问题,假设y 和f(x, θ)的取值为{−1, +1}。Hinge 损失函数(Hinge Loss Function)为:

      \[L(y, f(x, \theta))=\max(0, 1-yf(x, \theta))\]

小练习: 理解并使用Python实现Softmax分类算法。

5.5. 矩阵计算与BP(反向传播)算法

5.5.1. 矩阵的梯度计算

  • 都是基础的高数计算,可直接查看 幻灯
    • 求导链式法则
    • 复合函数求导
    • Jacobian matrix(Jacobian: Vector in, Vector out)
    • 推荐补充一份关于微分及BP的 文稿

5.5.2. BP算法(重点)

甜点 Yes you should understand backprop

注解

  • 进行微分并使用链式法则。共享参数以减少计算量。
  1. 计算图和BP
  2. BP算法核心知识
  3. 计算效率

5.5.3. 总结