暑假的时候还认真的看完了吴恩达、李宏毅老师的的NLP网课,今天对NLP的知识做一个小summary,以后复习的时候还用得着,同样学习NLP网课的同学也可以来看看!一起讨论讨论!
网课链接:(强推)2021吴恩达深度学习-NLP序列模型_哔哩哔哩_bilibili
网课链接:(强推)李宏毅2021春机器学习课程_哔哩哔哩_bilibili
自然语言处理也是深度学习中一个比较大的领域,现在深度学习主要有三个方面:一个是CV(Computer Vision,计算机视觉),另一个是NLP(Neuro-language Programming,自然语言处理)。还有一个是RL(Reinforcement Learning,强化学习)。其中CV的三大基本任务是目标检测,图像识别和语义分割。NLP四大应用是情感分析、聊天机器人、语音识别和机器翻译。
进行自然语言处理,首先要对文字进行建模和预处理。
一、文字建模
对文字的建模方法最经典的就是有One-Hot编码。
One-Hot,顾名思义,就是独热编码。这是什么意思呢?就是假设文字(单词)总共有N个,那么就建立一个N维的向量,然后每一个文字占其中的一维。比如Abate就被编码成[1,0,0...0],Aberrant就被编码成[0,1,0,...0],ablate就被编码成[0,0,1,0,0....0]。
但是世界上的英语单词那么多,该怎么办呢?一般的情况下当然是取最常用的N个词(比如高考英语3500啦,中考1500啦),一般情况下N=10000。然后剩下的单词因为出现的频率很少,就可以用<UNK>来代替。
但是语言博大精深,汉字就有3500个常用字,常用的英文单词也不少,而不同的词语组合也有不同的意思,比如“Hot dog”就是热狗的意思,表示一种食物,通过独热编码就直接把这两个单词给区分开了。这个问题之后再说。
还有一个问题,独热编码把不同的单词独立的分到了不同的维度,这样就忽略了不同单词之间的相似性。比如“man”和“woman”的语义区别显然比“man”和“chair”更加相似,但是在经过Ont-hot编码之后,他们的欧几里得距离被统一成了根号二,因此在数学上的距离就一样了。同时,这样的建模方式在内容上也十分的稀疏,一个是很浪费存储空间,另外一个是在每一个维度上只能表现一个数,这样十分的浪费。因此,词嵌入(word embedding)就派上用场了。
二、词嵌入
由于内容太过稀疏,所以需要进行降维处理,也就是“word embedding”。
词嵌入通过降维处理学习的到一个词嵌入矩阵,通常是300维,假设原本的输入数据是10000维,这样维度就大大的降低了,而且经过训练之后,这300维中还能包含大量的有效信息。比如“boy”就被编码成了[1,0,0,...0],"girl"可能会被编码成[1.2,0,0,...0]。那么在求相应的词向量的时候,就会需要一个1*10000的独热编码乘以一个10000*300的词嵌入矩阵,最后得到了一个1*300的向量。同时,由于独热编码的特性,可以直接通过索引来得到相应的词嵌入向量,这样大大的减小了计算量。
而训练词嵌入矩阵最好的方法就是通过预测词汇(完形填空)的任务,第一个隐含层的参数就是词嵌入矩阵。
另外,对于单词预测问题,可以让算法通过观察这个空格的上一个词汇,然后来计算每一个单词在
在给定
下出现的概率
,然后取概率的最大值就OK了。
当然,也可以不仅看他的上一个词汇,还可以取last 4 words,last1 words,nearby1words,4 words on left&right。
关于词嵌入矩阵的训练,可以通过skip-gram算法,和Negative sampling,以及GloVe算法。
那么一阵捣鼓之后,词嵌入矩阵就搞定了!假设这个300维的词嵌入矩阵已经把单词之间的特征学习的差不多啦,接下来就可以真正的用算法进行建模处理了。
当然,NLP某些情况下是Seq2Seq(向量到向量)的问题,还有些情况下就是单独的分类。接下来简单介绍几个处理序列的模型。
三、RNN、GRU、LSTM
首先是RNN(循环神经网络),这是一个时序&顺序的循环神经网络。这个网络的特点就是能通过之前的单词输入(状态来预测是逐个输入、逐个输出的。最开始是一个零状态,然后和第一个经过embedding层的单词进行线性变换,然后再经过tanh激活函数(sigmoid也可以),得到了一个隐藏状态,隐含变量再进行线性变换得到第一个单词的输出
。
然后第一个单词的输出和第二个单词输入第二个单元,再进行相同的操作,直到结束。这样的计算,下一个单元的输入就能和上一个单元的输出有关,因此实现了记忆功能。在输出环节中,加入全连接层就可以了。
而在反向传播的过程中,因为输出的是单词,而且只用判断每个单词的不同,因此可以直接应用交叉熵函数。但是需要从最后一层往前逐项求导,计算量十分之大。并且在不断的迭代之后,头几层的信息往往在深层网络中体现的不是很明显,因此这是比较基本的RNN。
而RNN也有many-to-many,many-to-one,zero-to-many等不同的架构。many-to-many通常用于词性判断、人名等特殊单词识别等功能。而应用编码解码架构则可以运用到机器翻译过程中。many-to-one可以应用于评分,例如评论的好坏等二分类问题。zero-to-many通常用于生成文章或者summary。那么在这种模型中,输入的零状态就可以不是一个零向量了,可以是一个任意的向量。我们可以这么理解这个模型:假设这个训练好的RNN就是一个写手,输入的零状态就是给这个写手一个“作文题目”,然后他看到这个作文题目之后,大脑就开始飞速的运作,开始写文章。
那这个网络是怎么写文章的呢?如果用写作文来进行类比的话,那写手就是看到作文题目,然后写了一段话,然后看看自己之前写的那段话并根据自己在学习(训练中)学到的知识,然后再继续写。
然后在解码的过程中,将作为输入输入下一层的网络。而在网络架构中,<UNK>代表了不认识的单词,<EOS>代表着单词的结束。
由于RNN存在梯度消失&遗忘之前的梯度的问题,GRU、LSTM作为更加优秀的神经网络出现在视野中。比如说,写作文的时候要进行总结,网络想要总结的时候总要对之前的输出进行review吧,也就是检查隐藏状态h,但是h经过一层一层的传导早就面目全非了啊!所以就有了RNN的改进版:GRU、LSTM。
GRU(门控循环网络),其中加了一个门控单元、门控信号来控制是否需要对之前的信息进行记忆。通常c(t)是c(t-1),x(t)的线性变换,¬也是线性变换,但是在(0,1)之间,c(t)=¬Chat(t)(+(1-¬)Chat(t-1),选择记忆的信息,同时c(t)=a(t)。
而LSTM(长时记忆单元)把c(t)和a(t)独立开来计算,同时设置了门控更新单元、记忆单元、输出单元,作为GRU的进阶版,虽然训练速度更慢,但是最后拟合的效果也越好。
同时还有双向循环网络,有一个前向传播的a,还有一个反向传播的a,这样每一个输出都由过去和未来的序列共同预测,因此鲁棒性和预测的能力会更加好,但是需要全序列计算完成才能输出。时间复杂度更加大了。而深层循环神经网络就是将每一个RNN的yi作为下一层的输入x(i),然后逐渐套娃输出。计算量十分的大,因此第二层的输出隐含值a受左侧、上一层的a影响。
三、一些杂七杂八的知识
以上就是对序列信息进行建模啦。那么对图片信息是不是也可以进行建模呢?答案是:当然可以!
【关于人脸的编码】:在img图像被卷积层卷了之后再进入全连接层,就可以完成对图片的编码,然后也可以放入NLP网络的架构。
接下来还有一些NLP的应用,也稍作总结:
【找到意思相近的词】例如:man:women as Queen:?(King),就是在词嵌入矩阵找到向量差值相近的矩阵,然后再通过余弦相似度来衡量
【情感分类】
对句子进行情感分类的话,因为句子也是有很多个单词构成的嘛,把单词分别取出来,然后通过词嵌入向量embedding一下,然后相加求和取平均值,最后再通过softmax函数进行分类,当然这样也存在了一个问题,因为这是基于单词的建模,像“not bad”这种本来的意思是“不错”。但是就会被理解成“不”和“不好”的叠加。
去偏差化:将某些词去除经济社会学的偏差,比如在某些人的发言啦(南拳!女权!)导致男性和女性在不同方面的意义表现的不一样(比如在某些人的眼中男性代表事业码农噼里啪啦的,女性就代表着家庭等等,但是现在男女平等的社会这可不一定的哦!),也就是中立化。类似于PCA降维的处理。
【单词翻译】
就是一个多对多的循环神经网络,通过encoder来一个初始值a(0),然后再通过解码输出。
还有一个beam search算法,就是每一步选择概率最大的几个,然后通过这几个遍历所有单词表的组合(比如选3个,单词表10000个,就选择了30000个词组),然后对30000个词组评分,选出概率最大的三个,如此反复。
由于这个算法会输出一个概率乘积的结果,因此在目标函数上会除一个文本长度的乘方,为规范化参数。但是B越大,对内存的要求就越大,然而结果也会更好。而翻译的结果不好,可以判断P(ystar|x)和P(yhat|x)的大小(ystar更好),如果左边大,但是算法选择了右边,那beam search就有问题。如果右边大,且算法选择了右边,那就是RNN有问题。
码不动了!关于beam search,以及几个模型的细节都会之后再补充的!