0%

一文搞懂词向量

一问搞懂词向量

词向量

将数据从高维空间向低维空间映射,虽然降维了,但是包含语意信息

word2vec

两种网络结构:

  • CBOW:输入$w_t$周边,得到$w_t$
  • Skip-gram:输入$w_t$,得到其周边

优化方式

  • 负采样
  • 层次softmax

FastText

TextCNN

transfromer论文笔记

transformer提出的目的:

  1. 解决rnn/lstm等序列过长时出现的长期依赖问题
  2. 解决序列模型并行化的问题,rnn类模型当前$t$时刻的计算需要依赖$t-1$时刻的计算结果

Transformer做出的贡献:

  1. 抛除了CNN/RNN,完全采用注意力机制,增加了并行度
  2. 采用position encode,将序列距离缩放到常量
  3. 在nlp任务重能达到当前最先进的

网络结构

image-20211205163557052

transformer整体采用的是一个encoder-decoder架构

关于KQV讲得不错的一篇博客

https://zhuanlan.zhihu.com/p/410776234

Encoder和Decoder层

Encoder

Encoder包含6层网络,每一层网络有两层子网络。第一层是多头注意力机制,第二个子层是简单神经网络。

对于一层网络的两个子层之间,采用残差网络来连接。每一个子层之间都是用layer normalization,所以每个子层的输出为

并且为了实现残差连接,每个子层的embedding输出的维度$d_{model}$都相等,为512维

Decoder

和encoder一样,由6层网络组成,每层网络比encoder多了一层mask multi-head attention layer的子层,防止编码位置泄露,使得预测的每一个位置都依赖的是前面已知的输出,其实就是防止数据泄露。

nlp常用mask操作

Attention

注意力机制,其实就是query和value向量映射到一个输出向量,输出向量作为value的加权和。

Scaled Dot-Product Attention

其实就是一个普通的attention归一化了。

Attention的输出为

国外一篇博客的翻译

https://zhuanlan.zhihu.com/p/48508221

解释了使用Dot Attention和归一化的原因

  • 使用Dot-product attention而不是Addive attention的原因是在实际实现当中,Dot Attention更快并且空间效率更高。
  • 当$d_k$的值比较小的时候,两种注意力机制结果差不多。$d_k$的值比较大的时候,加法表现得更好。因此论文假设当$d_k$维度比较大的时候,点乘的结果会变得很大,导致softmax的函数出现梯度消失的问题。为了克服这个影响,进行了归一化。

Multi-Head Attention

image-20211206004115066

multi-head其实也很好理解,其实就是将一个self-attention映射了多次,然后将其结果拼接起来。这么做的好处是可以将不同位置的不同表达子空间关联起来。

论文中说明了h=8,$d_k=d_v=d_{model}/h=64$.

论文总结了在transformer中使用注意力机制的三个不同的方式

  • Position-wise Feed-Forward Networks

FNN的计算公式为

Embeddings and Softmax

暂时没看出来写了个啥

Positional Encoding

由于没有RNN或者卷积,所以为了使用序列的顺序,transformer在输入的embedding底部都加了position encoding,positional encoding和embedding有相同的维度$d_{model}$,方便两者相加。

Positional encoding有两种计算方式, sin和cos

pos表示当前词的位置,i表示的是纬度,所以假设某个词的位置编码为pos=1,那么对应的编码为

采用positional encoding的原因

  • 需要体现一个单词在不同位置的区别
  • 体现先后次序,一定范围内编码差异不依赖长度
  • 能够将编码的值缩放到一定的范围

https://www.zhihu.com/question/347678607

https://zhuanlan.zhihu.com/p/44121378

https://zhuanlan.zhihu.com/p/48508221

bert

主要贡献:

  • 提出了双向预训练模型的表示,使用MLM 语言模型能够预训练双向深度表示。因为对于语言模型来说,一个词的意思不仅和左边有关系,可能和右边的句子也存在着关系。
  • 证明了预训练表示能够降低对于特定任务专门设计架构的需求
  • 在11项nlp任务达到当前领先的水平

框架架构:

bert主要有两个步骤,一是pre-training,二是fine-tune

pre-training一般是在未标注数据上训练的,fine-tune则是在不同的模型上进行训练微调,bert最显著的特点就是统一了不同任务的结构,意思是bert具有通用性。

bert模型结构

bert是一个多层双向transformer组成的,在论文中提到了$Bert_{base}$和$Bert_{larg}$两个模型,其实就是参数不一致。



对比来说GPT采用的是单向transformer,ELmo采用是双向lstm,但是目标函数其实是不一样的,ELMo的目标函数分别为$P(w_i|w_1,w_2,…,w_{i-1})$和$P(w_i|w_{i+1},w_{i+2},…,w_{i+n})$。

Bert输入表示

image-20211219170322265

Bert输入表示分为三个embedding

  • Token Embeddings:词向量embedding,对于每一句的开头,都有cls标识,最后隐藏层对应这个token的作为分类任务的表示
  • Segment Embeddings:判断当前的token到底是属于sentence A还是sentence B
  • Position Embeddings:每个词向量的位置embedding,不同于transformer,Bert的位置embedding是学出来的

需要注意的一点,bert在处理句子对的时候,是将其打包起来,和单个句子一样处理,但是有sep作为分隔符。

关于三个embedding的理解

pre-training

MLM

masked language model,随机将句子中的某些词进行遮掩,然后预测被遮掩的词。在所有的Token当中随机选择15%的词用[mask]遮掩掉。但是不能一直使用[masked]作为遮掩,因为在fine-tune阶段,并不会碰到[mask],所以为了减少影响,采用三种不同的策略。

  • 80%的token使用[mask]来遮掩
  • 10%的token使用真实token代替
  • 10%的token不进行遮掩操作。

这样做的目的是使模型不知道哪个token被mask了,所以会关注每一个词。

NSP

Next Sentence Prediction,对于不同的下游任务,例如问答系统或者自然语言推理是基于两个句子的关系,这没有被语言模型直接捕捉到,所以在建模的时候,输入句子A和句子B,B有一半的机率是A的下一句,50%的机率从句子中随机选择的,然后通过模型来预测A和B是否为下一句,模型准确率能达到97%。

Fine-Tune

由于Transformer的attention机制,可以直接使用bert来处理下游的任务。对于包含文本对的输入/输出,其他方法是先分开编码然后再拼接。而bert直接拼接在一起使用双向self-attention,化繁为简。

对于分类任务,直接去[cls]最后输出层的final hidden state然后接入softmax做预测。文章也讲了下可调参数,其实也没啥,就batch size,learning_rate之类的。

参考资料:

https://zhuanlan.zhihu.com/p/46652512

https://zhuanlan.zhihu.com/p/49271699

Graph embedding

deepwalk

node2vec

line

eges

https://zhuanlan.zhihu.com/p/49271699

nlp几大基本任务

https://zhuanlan.zhihu.com/p/109122090

坚持原创技术分享,您的支持将鼓励我继续创作!