【花师小哲】面向一般大众的神经网络科普(2)-NLP领域
这篇主要讲神经网络在NLP(自然语言处理)领域的应用,主要原因是在NLP领域有一些非常重要的模型突破,这些突破实质上也促进了整体上神经网络的发展。

2.神经网络在NLP领域的应用
2.0 embedding
讲之前,先讲一下上篇预留的小问题,即词语、文字是怎样输入到神经网络中的。对于英文字母还好说,有些人可能熟悉ASCII码,或者说,在计算机中,很多字符底层存储仍然是数字。
但是这种方法并不能解决我们的所有问题,很多时候我们是要将一个英文单词或中文词语作为整体进行输入的,这时候,就有了一种比较笨的编码方式,也是分类问题中常用的编码:one-hot。
one-hot的想法很简单,我们给定一个句子“Wangcai is a dog.”我们可以这样编码:
Wangcai :[1,0,0,0]
is :[0,1,0,0]
a :[0,0,1,0]
dog :[0,0,0,1]
但这样有个问题,就是每个词语变成一个一维数组或者向量后都是相互独立的,而实际上Wangcai和dog是有相关性的,如果是下面这种编码可能更好:
Wangcai :[0.6,0,0,0.4]
is :[0,1,0,0]
a :[0,0,1,0]
dog :[0.4,0,0,0.6]
于是乎,经典的Word2Vec就被提出了,Word2Vec想做的就是把一个词语映射到一个欧式空间中,在这个空间中,相似的词语挨得比较近,甚至想要达到Word2Vec(母亲)-Word2Vec(女性)+Word2Vec(男性)=Word2Vec(父亲)的效果。有了Word2Vec,我们似乎就可以把自然语言处理文字变成一个计算问题。
好,讲了这么多,这些和embedding有什么关系呢?简单来说,embedding就是用一个向量来表示另一个事物,这个事物可以是上面提到的词语,可以是一个物体,甚至可以是另一个向量。
构造embedding的方法也是多种多样,可以用一些数学或者统计的方法构造embedding,例如我们用一个长数组的k阶矩来表示这个数组;也可以用神经网络的方法,从上面所说的ont-hot编码训练出Word2Vec向量。如果是从向量到向量的embedding,即可以变小,也可以变大,一切都取决于解决问题的需要。
2.1循环神经网络RNN
传统的MLP存在一个问题,即它的输入和输出数目是固定的,而自然语言处理中,输入和输出不一样的情况很正常,于是就有了RNN:

简单来说,最基础的RNN可以接受任意数量的输入,但是是一个接一个地输入到网络之中的,每一次输入不只和权值W有关,也和上一轮的输入有关。这样,神经网络就能接受任意的输入,可以进行任意的输出了。
而且我们知道,当我们说话的时候,我们说出的词语都不是独立存在的,都是和前后文有关系的,RNN保留了上一轮运行的结果,这也会影响到后面的结果。
同样也是一个非常简单的模型,但是实际应用中确实是有用武之地的,例如如果我们用RNN来做下一个字符的预测,我们是能够得到一些表面上看上去很好的输出的,例如如果我们输入很多代码进行训练,RNN是会吐出很多结构上像代码的东西的,当然,其中很少能运行;如果我们输入很多数学证明论文进行训练,RNN是会吐出看上去像模像样的论文的,它甚至会画图、写公式,当然这也只是看上去像,实质上还是符号的堆积。
2.2长短期记忆LSTM
RNN是存在很多问题的,一个问题就是长程依赖(这个术语不一定准确,主要是我对这方面也不是很熟悉)。例如我们给一个长句子:“旺财是一只拥有白色毛发、喜欢在院子里打滚的小狗。”很明显,“旺财”和“小狗”是有联系的,但是RNN很难建立起这个联系的,举个粗略的例子:
假设有一排人,第一个人有一块饼干,每个人都会接收上个人的饼干,掰一半传递给下一个人。可以看到,这块饼干传递几个人就变得很小了。
RNN也面临这个问题,“旺财”的影响是很难传递到“小狗”的,于是就有了长短期记忆——LSTM:

LSTM看上去就头大,并且我们不展开讲,因为,LSTM只能缓解这个问题,并没有消除这个问题,我们还有更好的方案。
2.3Transformer
谷歌在2017年发表了一篇名字非常豪迈的论文,名叫Attention Is All You Need。这个标题经常被拿去玩梗,例如“xgboost is all you need”,如果去arxiv上搜这个题目,你还能看到一大堆论文题目在讨论Attention是不是all you need。
敢用这种名字并不是无知者无畏,而是论文中提到的Transformer模型真的是太强了。Transformer的结构如下所示:

看上去是不是很唬人,但实际上,整个网络结构就两部分:
输入->encoder(编码)->decoder(解码)
没错,就是我们对输入做一次编码,然后再解码得到结果。就是这样一个模型,他有两大突破点:
(1)完全舍弃RNN架构,只使用attention机制,或者说,self-attention(自注意机制)
简单介绍一下attention,之前RNN不是存在长程依赖问题嘛,LSTM使用的目的也是为了给两个相距较远的词语建立一定的联系,当然,这种联系是隐式的,那么,我们为什么不显式地把这种联系建立起来呢?
于是,就有了attention这种其实很暴力的机制,即每两个词之间都建立起联系,这种联系的强弱是可以训练的,这样,就彻底解决了“旺财是一只拥有白色毛发、喜欢在院子里打滚的小狗。”中“旺财”和“小狗”距离太远的问题。
attention具体怎么做讲起来挺复杂的,但使用起来就简单很多了。

当然,估计很多人都看到了attention的问题了,假设有N个词语,我们就要建立N^2这个数量级的联系,网络必然变得更庞大了。
(2)预训练-微调范式。
这样庞大的网络让个人笔记本这样的小电脑从头开始跑那真的是为难用户了,而且一般用户也没有那么多训练数据喂给网络。
(上篇忘了说了,神经网络的另一个问题是训练很慢,即使是小型网络也比机器学习的其他很多方法要慢多了)
那么,是谁有充足的数据又有大量的运算资源呢?互联网大公司呗。于是,这样庞大的网络就由大公司进行预训练,然后再发给用户,根据需要喂给个性化的数据进行微微的、快速的调整,就可以直接使用了。
当然,Transformer用了自监督方法,但自监督任务的设置还是BERT经典,我们BERT再讲。
2.4BERT
BERT是2018年10月由Google AI研究院提出的一种预训练模型。BERT的全称是Bidirectional Encoder Representation from Transformers。BERT表现得非常亮眼,算是NLP领域里程碑式的成就。
BERT也是一个预训练模型,其思路也是很简单,就是单纯把Transformer的encoder部分提取了出来,这样做的好处是BERT就获得了强大的特征提取能力。
也就说,BERT相当于Transformer砍了一半,只有:
输入->encoder(编码)
我们输入的数据经过BERT,就可以变成富含语义信息的编码信息。
BERT的输入也是使用了embedding:

它同时把词语本身、词语的位置信息做了embedding。可以看出,embedding的另一个重要作用是把不同的东西整合成一样的东西。
我们上篇提到一般神经网络是监督学习,监督学习意味着需要对数据进行标注,而标注费时费力,有没有更好的方法呢?有的,那就是自监督学习。
自监督学习是说,我们可以对原始数据做一些处理,给神经网络安排一些相关任务,迫使神经网络去学到一些知识。
BERT的一大亮点就是它的预训练任务的设置。
BERT设置了两个预训练任务:Masked LM和Next Sentence Prediction。
(1)Masked LM
Masked LM类似于完形填空,BERT会对输入做些处理,主要是会随机对一些词语做MASK,具体来说是有可能直接替换为[MASK]标签、随机替换为别的词语或是不变,然后去训练BERT,让它去学习自然语言的语义。
(2)Next Sentence Prediction
Next Sentence Prediction(下句话预测)试图让BERT学会句子与句子之间的关系。对于A的下一句话,可能是原下一句话(正样本),也可以是随机另一句话(负样本),我们就这样让BERT去训练。
通过这两项训练,BERT就可以输出富含语义信息的encoder结果,用户就可以用这个结果进行微调。
MASK和下句话预测的想法也在其他很多领域得到了应用。

当然,BERT后还有很多新的研究,这里不展开,下一篇主要讲讲神经网络在机器视觉领域的应用,也会涉及到图像生成。也会谈一下神经网络在其他一些网络中的运用。