PaddlePaddle(飞桨)NLP课程学习总结

写在前面:
推荐一波百度PaddlePaddle深度学习框架,百度架构师手把手教你深度学习入门,每天还会赠送12小时的GPU算力,非常诱人。
进入正题,,,,,,下面是NLP小白跟随百度大神学习NLP的一些学习总结(作为CV领域的研究生就这么跟CV课程完美的错过了,已哭晕在厕所。。。。。。)

词向量表示(word2vec)

在自然语言处理中,那首先需要面对的一个问题就是怎样把我们所说的语言转化为计算机能处理的语言。词向量就是一种自然语言中单词处理的方式,就是我们可以把每一个词都表示为数学空间中的一个点,比如“深度”,我们可以用[0.1, 0.2, 0.3,…,0.9]这样一个向量来表示,“学习”,我们可以用[0.9,0.8,…,0.1]来表示。是不是和图像中的矩阵表示相似呢?我是这样理解的,只不过图像是N X N的矩阵表示,这里是用1 X N的向量表示一个词。形象如下图所示,这样我们就可以把自然语言计算转化为向量计算了。
在这里插入图片描述
具体在实现上,其实就是把语料库中的每个词都进行one-hot编码,构建一个大矩阵,矩阵中的每一行就表示唯一的一个词语,这样通过矩阵运算,我们就可以很方便的提取词语的向量表示,这个过程就称为Embedding的过程,具体如下图所示。
在这里插入图片描述
将单词表示完之后,还会有接下来的问题,我们人是知道单词的语义信息的,什么样的单词连在一起构成句子,但是计算机怎么知道呢?我们怎样能让我们构建的向量有语义的信息呢?
要回答这个问题,那么我们先先一下人是怎么了解语义信息的,给你“苹果”这个词,你会想到什么呢?请看下面的例子:

“苹果的产品质量确实不错,就是价格有点贵。”
“这个苹果很好吃,非常脆。”

在上面两句话中,我们可以很容易的知道第一个是指苹果公司,第二个是指水果。也就是,我们是从上下文中获得单词的语义信息的! 因此,模仿人类,我们也可以从上下文中,让计算机学习单词的语义信息,两个经典模型是CBOW和Skip-gram。CBOW模型是根据上下文的信息来预测中心词;Skip-gram模型是根据中心词预测上下文。
在这里插入图片描述
说明: 一般来说,CBOW比Skip-gram训练速度快,训练过程更加稳定,原因是CBOW使用上下文average的方式进行训练,每个训练step会见到更多样本。而在生僻字(出现频率低的字)处理上,skip-gram比CBOW效果更好,原因是skip-gram不会刻意回避生僻字。因为CBOW是用周围K个词预测中心词V,只进行一次梯度更新,周围的K个词从中心词V那里学习信息,更新自己的embedding,而且梯度会同样的作用到每一个词当中,也就是说CBOW对周围的K个词进行统一的调整,因此他没有专门针对生僻字的训练。CBOW每次预测一个中心词,预测次数和文本词数差不多,复杂度为O(V)。skip-gram是用中新词V预测周围K个词,预测次数多,复查度为O(KV)。在skip-gram中,每个词都会受到周围K个词的影响。因此当数据少,或者有生僻词时,通过周围K个词多次的调整,会使得词向量相对更准确一些。
看到一篇知乎上的说法很形象:CBOW就像是1个老师 VS K个学生,学生(周围词)从老师(中心词)那里共同学习知识,老师一视同仁,至于你学的好坏,要看你能跟老师学习几次(再次作为周围词出现)。skip-gram就像1个学生 VS K个老师,老师(周围词)对学生(中心词)进行针对性的训练,这样学生能力(向量)相对更强一些。

情感分析

情感分析就是给一段文本,输出文本中的情感倾向,可以定义为一个分类问题。
在这里插入图片描述
通常可以把情感分成三分类问题:正向,负向,其他。对于有些句子,还需要细化到句子的“各部分进行分析”,例如:

这个薯片口味有点咸,太辣了,不过口感很脆。

这句话前半句(咸、辣)都是负向的评价,而后半句(脆)又是正向的评价。
在使用深度学习分析句子情感时,有两个问题需要解决:1.句子的长度不一致怎么办?2.句子的结构怎么学习?
1.句子的长度不一致
神经网络的输入,一般都是定长的,因此需要变通。通常的做法是根据语料信息,设置一个固定的长度值max_len;再将句子进行处理,将不同的句子组成mini-batch,用于神经网络的学习和处理。通常采用截断+填充的方式进行处理,在填充时可以前向填充,也可以后向填充。
在这里插入图片描述
2.句子的结构
先看两个例子:

我不爱吃你做的饭。
你不爱吃我做的饭。

两句话中的字完全一样,但是表达的意思却完全不一样!(语言的魅力。。。)针对这种情况,我们是把句子看做一个序列来处理。比如“我爱人工智能”这句话,就可以表示为:

P(我,爱,人工,智能)=P(我∣<s>)∗P(爱∣<s>,我)∗P(人工∣<s>,我,爱)∗P(智能∣<s>,我,爱,人工)∗P(</s><s>,我,爱,人工,智能)

在这里插入图片描述
要处理序列问题,那么自然想到的就是循环神经网络RNN.
在这里插入图片描述
RNN就是按顺序依次读入序列的每一部分,用同一个cell对读进来的信息进行处理,处理之后保存在记忆单元中,并给出一个输出。再下一次读取时,将提取到的信息和之前记忆的信息融合,作为新的记忆,再给出一个输出,这样循环往复,直到读取完序列中的所有信息,那么这时记忆单元中应该就会保留序列中的所有信息,这时的输出就可以看做网络学习到了序列的语义信息,最后的输出就是网络理解语义之后的结果。
说明:

在实现当前输入x(t)和已有记忆h(t−1)融合的时候,循环神经网络采用相加并通过一个激活函数tanh的方式实现:h(t)=tanh(x(t)+h(t−1))
tanh函数是一个值域为(-1,1)的函数,其作用是长期维持内部记忆在一个固定的数值范围内,防止因多次迭代更新导致数值爆炸。同时tanh的导数是一个平滑的函数,会让神经网络的训练变得更加简单。

但是这样会有一个问题,每次都用一个cell记录记忆信息,如果序列太长了怎么办?举个极端的例子比如一篇文章,记忆单元还能吃下吗?还能记住所有信息吗?记住的信息还能准确的表达序列的含义吗?这时候,LSTM应运而生!
在这里插入图片描述
LSTM也是通过不断调整一个cell来逐次处理语义信息,但是和RNN不同的是,LSTM会在自己的脑子中(cell)对提取的信息再处理一下,提取更加精华的信息存到记忆力,而不是像RNN一样傻傻的,不管有用没用全部吃下,结果最后把自己撑住了。。。。将LSTM的cell放大来看:
在这里插入图片描述
在这里插入图片描述
通过学习这些门的权重设置,LSTM可以根据当前的输入信号和记忆信息,有选择性地忽略或者强化当前的记忆或是输入信号,帮助网络更好地学习长句子的语义信息
在这里插入图片描述

文本匹配(一点点)

假设给定两个句子:

句子1:我不爱吃烤冷面,但是我爱吃冷面
句子2:我爱吃菠萝,但是不爱吃地瓜

使用LSTM网络,把每个句子抽象成一个向量表示,通过计算这两个向量之间的相似度,就可以快速完成文本相似度计算任务。在实际场景里,我们也通常使用LSTM网络的最后一步hidden结果,将一个句子抽象成一个向量,然后通过向量点积,或者cosine相似度的方式,去衡量两个句子的相似度。
在这里插入图片描述
一般情况下,在训练阶段有point-wise和pair-wise两个常见的训练模式:

  • point-wise训练模式: 在point-wise训练过程中,我们把不同的句子对儿分为两类(或者更多类别):相似、不相似。通过这种方式把句子相似度计算任务转化为了一个分类问题,通过常见的二分类函数(如sigmoid)即可完成分类任务。在最终预测阶段,使用sigmoid函数的输出,作为两个不同句子的相似度值。
  • pair-wise训练模式: pair-wise训练模式相对更复杂一些,假定给定3个句子,A,B和C。已知A和B相似,但是A和C不相似,那么原则上,A和B的相似度值应该高于A和C的相似度值。因此我们可以构造一个新的训练算法:对于一个相同的相似度计算模型m,假定m(A,B)是m输出的A和B的相似度值,m(A,C)是m输出的A和C的相似度值,那么hinge-loss:
    L   =   λ − ( m ( A , B ) − m ( A , C ) )   i f   m ( A , B ) − m ( A , C ) < λ   e l s e   0 \displaystyle L\ =\ \lambda -( m( A,B) -m( A,C)) \ if\ m( A,B) -m( A,C) < \lambda \ else\ 0 L = λ(m(A,B)m(A,C)) if m(A,B)m(A,C)<λ else 0
    这个损失函数要求对于每个正样本m(A,B)的相似度值至少高于负样本m(A,C)一个阈值λ。
    hinge-loss的好处是没有强迫进行单个样本的分类,而是通过考虑样本和样本直接的大小关系来学习相似和不相似关系。相比较而言,pair-wise训练比point-wise任务效果更加鲁棒一些,更适合如搜索,排序,推荐等场景的相似度计算任务。

参考链接:
https://aistudio.baidu.com/aistudio/projectdetail/300463
https://aistudio.baidu.com/aistudio/projectdetail/313877
https://zhuanlan.zhihu.com/p/37477611

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值