目录
一、Word Embedding介绍
二、One-Hot 表示
三、Distributed 表示
四、word2vec表示
五、BERT任务
六、BERT与其他模型的调用
word embedding,又名词嵌入、词向量,在近几年的NLP领域变得越来越热,从概念上讲,它涉及从每个单词一维的空间到具有更低维度的连续向量空间的数学嵌入。当它用作底层文本输入表示时,单词和短语嵌入已经被证明可以提高NLP任务的性能,例如语法分析和情感分析。
word embedding的意思是:给出一个文档,文档就是一个单词序列比如 “A B A C B F G”, 希望对文档中每个不同的单词都得到一个对应的向量(往往是低维向量)表示。
比如,对于这样的“A B A C B F G”的一个序列,也许我们最后能得到:A对应的向量为[0.1 0.6 -0.5],B对应的向量为[-0.2 0.9 0.7] (此处的数值只用于示意)
之所以希望把每个单词变成一个向量,目的还是为了方便计算,比如“求单词A的同义词”,就可以通过“求与单词A在cos距离下最相似的向量”来做到。
word embedding不是一个新的topic,很早就已经有人做了,比如bengio的paper“Neural probabilistic language models”,这其实还不算最早,更早的时候,Hinton就已经提出了distributed representation的概念“Learning distributed representations of concepts”(只不过不是用在word embedding上面) ,AAAI2015的时候问过Hinton怎么看google的word2vec,他说自己20年前就已经搞过了,估计指的就是这篇paper。
现在,word embedding有One-Hot Representation 、Distributed Representation、Word2Vec等方法。下面将对这几种方法做一个简要的介绍
这种方法是表示文本最简单的方法,一般使用很长的向量去表示一个词。向量的长度其实就是文本中词典的数目,一篇文章中有2000个词,则词向量的维度就是2000。而每个维度对应字典里的一个词,除了这个词对应维度上的值是 1,其他元素都是 0。大概One-Hot 的意思就是在该向量上用1突出要表示的词。
例如,' 石家庄 ' = [1,0,0,0......0,0,0] (这个向量的维度大约有2000)。代码就放在下面
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
array = enc.transform([[0,1,3]]).toarray()
print(array)
One-Hot 在特征提取上属于词袋模型(bag of words)。但是,这种表示方法没有考虑到词与词之间的相关性,缺乏语义信息,无法使用余弦相似度去度量词的相关性,而且会产生数据稀疏的问题,会浪费很多的存储空间。而我们熟知的向量空间模型(VSM),虽然从表示文本的方式上与 One-Hot 类似,把对文本内容的处理简化为向量空间中的向量运算,并且以空间上的相似度表达语义的相似度(余弦相似度),但是它默认词与词之间是独立的,没有考虑词间的语义关联性,因此在现如今的文本表示中不是特别实用。
分布式表示。最早由Hinton提出,可以克服one-hot representation的上述缺点,基本思路是通过训练将每个词映射成一个固定长度的短向量,所有这些向量就构成一个词向量空间,每一个向量可视为该空间上的一个点[1]。此时向量长度可以自由选择,与词典规模无关。这是非常大的优势。还是用之前的例子[“面条”,”方便面”,”狮子”],经过训练后,“面条”对应的向量可能是[1,0,1,1,0],而“方便面”对应的可能是[1,0,1,0,0],而“狮子”对应的可能是[0,1,0,0,1]。这样“面条”向量乘“方便面”=2,而“面条”向量乘“狮子”=0 。这样就体现出面条与方便面之间的关系更加紧密,而与狮子就没什么关系了。这种表示方式更精准的表现出近义词之间的关系,比之稀疏向量优势很明显。可以说这是深度学习在NLP领域的第一个运用
关于word2vec的介绍,博主推荐看 通俗理解word2vec 的文章,语言比较幽默,通俗易懂,推荐看一波
至于word2vec的表示与词的相似性判断,推荐 基于gensim的word2vec实战
至于有关BERT的介绍,推荐大家看一下 从Word Embedding到Bert模型——自然语言处理预训练技术发展史 这篇文章。
这里是BERT模型的传送门 BERT模型 。至于BERT的源码解析,我是看了这位大佬的文章bert 源码解读(基于gluonnlp finetune-classifier) 才理解了一部分,但还是没有搞到完全清楚,之后还要通过实践去理解BERT这个神级模型
近期博主看到一篇分享,将最近NLP任务中热门的预训练模型可以实现一键调用,文章传送门 Pytorch-Transformers 1.0 发布,支持六个预训练框架,含 27 个预训练模型
代码传送门 pytorch-transformers
关于Word Embedding的介绍就是这些了,稍后有其他的理解将会陆续更新到本文中。相信自己,一定要继续加油呀