Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【深度学习】NLP自然语言处理

【深度学习】NLP自然语言处理

作者头像
天天Lotay
发布于 2023-04-07 10:35:50
发布于 2023-04-07 10:35:50
51100
代码可运行
举报
文章被收录于专栏:嵌入式音视频嵌入式音视频
运行总次数:0
代码可运行

词向量与词嵌入

语言模型

语言模型通俗的将就是判断一句话是不是正常人说出来的。统计语言模型是所有 NLP的基础,被广泛应用与语音识别机器翻译、分词、词性标注和信息检索等任务。传统的统计语言模型是表示语言基本单位(一般为句子)的概率分布函数,这个概率分布也是该语言的生成模型。通俗的讲,如果一句话没有在语料库中出现,可以模拟句子的生成的方式,生成句子在语料库中的概率。一般语言模型可以使用各个词语条件概率的形式表示:

其中,Context 为 w_i 的上下文表示。根据 Context 的表示差异,统计语言模型又可以分为不同的类别,其中最具代表性的有 n-gram 语言模型及 nn 语言模型:

N-gram

自然语言处理(NLP)中一个非常重要的概念,通常在 NLP 中,人们基于一定的语料库,可以利用 N-gram 来做以下几类事情:

  1. 预计或者评估一个句子是否合理
  2. 评估两个字符串之间的差异程度,这也是模糊匹配中常用的一种手段
  3. 语音识别
  4. 机器翻译
  5. 文本分类

概率模型

统计语言模型实际上是一个概率模型,所以常见的概率模型都可以用于求解这些参数。

常见的概率模型有:N-gram 模型、决策树、最大熵模型、隐马尔可夫模型、条件随机场、神经网络等。目前常用于语言模型的是 N-gram 模型和神经语言模型。

可靠性与可区别性

假设没有计算和存储限制,n 是不是越大越好? 早期因为计算性能的限制,一般最大取到 n=4;如今,即使 n>10 也没有问题,但是,随着 n 的增大,模型的性能增大却不显著,这里涉及了可靠性与可区别性的问题。 参数越多,模型的可区别性越好,但是可靠性却在下降——因为语料的规模是有限的,导致 count(W) 的实例数量不够,从而降低了可靠性

OOV 问题

OOV 即 Out Of Vocabulary,也就是序列中出现了词表外词,或称为未登录词,或者说在测试集和验证集上出现了训练集中没有过的词。 一般解决方案:

  1. 设置一个词频阈值,只有高于该阈值的词才会加入词表
  2. 所有低于阈值的词替换为 UNK(一个特殊符号) 无论是统计语言模型还是神经语言模型都是类似的处理方式

平滑处理

count(W) = 0 是怎么办?

平滑方法: Add-one Smoothing (Laplace)

神经网络语言模型(NPLM)

  1. 其中 g 表示神经网络,i_w 为 w 在词表中的序号,context(w) 为 w 的上下文, V_context 为上下文构成的特征向量。
  2. V_context 由上下文的词向量进一步组合而成

N-gram 神经语言模型

这是一个经典的神经概率语言模型,它沿用了 N-gram 模型中的思路,将 w 的前 n-1 个词作为 w 的上下文 context(w),而 V_context 由这 n-1 个词的词向量拼接而成,即

1. 其中 c(w) 表示 w 的词向量 2. 不同的神经语言模型中 context(w) 可能不同,比如 Word2Vec 中的 CBOW 模型 3. 每个训练样本是形如 (context(w), w) 的二元对,其中 context(w) 取 w 的前 n-1 个词;当不足 n-1,用特殊符号填充 4. 同一个网络只能训练特定的 n,不同的 n 需要训练不同的神经网络

N-gram 神经语言模型的网络结构

【输入层】首先,将 context(w) 中的每个词映射为一个长为 m 的词向量,词向量在 训练开始时是随机的,并参与训练; 【投影层】将所有上下文词向量拼接为一个长向量,作为 w 的特征向量,该向量的维 度为 m(n-1) 【隐藏层】拼接后的向量会经过一个规模为 h 隐藏层,该隐层使用的激活函数为 tanh 【输出层】最后会经过一个规模为 N 的 Softmax 输出层,从而得到词表中每个词作为下一个词的概率分布

其中 m, n, h 为超参数,N 为词表大小,视训练集规模而定,也可以人为设置阈值 训练时,使用交叉熵作为损失函数。当训练完成时,就得到了 N-gram 神经语言模型,以及副产品词向量

整个模型可以概括为如下公式:

CBOW

需要注意的是:对于任意的单词,Input layer 和 Hidden Layer 之间的权重矩阵 W 是 参数共享的

  1. 输入层:上下文单词的 onehot. {假设单词向量空间 dim 为 V,上下文单词个数为 C}
  2. 所有 onehot 分别乘以共享的输入权重矩阵 W. {V*N 矩阵,N 为自己设定的数,初始 化权重矩阵 W}
  3. 所得的向量 {因为是 onehot 所以为向量} 相加求平均作为隐层向量, size 为 1*N.
  4. 乘以输出权重矩阵 W’ {N*V}
  5. 得到向量 {1*V} 激活函数处理得到 V-dim 概率分布 {PS: 因为是 onehot 嘛,其中的 每一维斗代表着一个单词},概率最大的 index 所指示的单词为预测出的中间词(target word)
  6. 与 true label 的 onehot 做比较,误差越小越好

所以,需要定义 loss function(一般为交叉熵代价函数),采用梯度下降算法更新 W和 W’。训练完毕后,输入层的每个单词与矩阵 W 相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的 word embedding)也叫做 look up table(其实这个 look up table 就是矩阵 W 自身),也就是说,任何一个单词的 onehot 乘以这个矩阵都将得到自己的词向量。有了 look up table 就可以免去训练过程直接查表得到单词的词向量了。

假设我们现在的 Corpus 是这一个简单的只有四个单词的 document:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{I drink coffee everyday}

我们选 coffee 作为中心词,window size 设为 2。 也就是说,我们要根据单词"I","drink"和"everyday"来预测一个单词,并且我们希望这个单词是 coffee。

假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table 应该为矩阵 W。即,任何一个单词的 one-hot 表示乘以这个矩阵都将得到自己的 word embedding。

Continuous Bag-of-Word Mode(l 连续词袋模型)和 skip-gram mode(l 跳字模型),分别对应了词向量的两种训练方法:利用 context 预测中心词以及利用中心词去预测context。

对于连续词袋模型(CBOW)来说,一般的做法是先对每个单词进行 one-of-N编码(one-hot encoded),作为训练网络的输入,接着构建一层 hidden layer,最后构建输出层,这一层是一个 softmax 层,每个 context 单词到中心单词的事件都被认为是独立的,所以将这些事件发生的概率相乘,最后构建损失函数,即:将输出概率分布和实际选中的词概率分布进行 Corss Entropy 计算,接下来使用 SGD 对参数进行更新。这里,hidden layer 的训练结果就是最终的 word vector 了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
LV.1
嵌入式工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验