pytorch函数AdaptiveMaxPool2d

目录

  • 自适应最大池化
  • 应用
    • 常用词向量
      • CBOW模型
      • Skip-gram模型
    • Bert
      • Bert的输入
      • Bert的预训练过程
      • Bert的encoder
        • Transformer Encoder
        • Bert encoder
      • Bert的输出
    • 词向量的维度

自适应最大池化

torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)
  • output_size: 输出信号的尺寸,可以用(H,W)表示HW的输出。
  • return_indices: 如果设置为True,会返回输出的索引。

处理之后维度不变,后两个维度按output_size大小输出
pytorch函数AdaptiveMaxPool2d_第1张图片
看到一篇研究词向量和他对应的池化操作的论文,好像不错的样子,找时间康康:
《Baseline Needs More Love: On Simple Word-Embedding-Based Models and Associated Pooling Mechanisms》
ACL2018

应用

这里面是对bert的输出做的自适应平均池化

常用词向量

词向量定义:词汇表的单词或短语被映射到实数的向量
常见词向量及其特点:

  • One-hot:维度灾难 and 语义鸿沟
  • 矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大
  • 基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题
  • word2vec、fastText:优化效率高,但是基于局部语
  • glove:基于全局预料,结合了LSA和word2vec的优
  • elmo、GPT、bert:动态特征

CBOW模型

CBOW模型根据中心词W(t)周围的词来预测中心词
pytorch函数AdaptiveMaxPool2d_第2张图片
pytorch函数AdaptiveMaxPool2d_第3张图片
pytorch函数AdaptiveMaxPool2d_第4张图片

Skip-gram模型

Skip-gram模型则根据中心词W(t)来预测周围词
pytorch函数AdaptiveMaxPool2d_第5张图片
pytorch函数AdaptiveMaxPool2d_第6张图片

Bert

Bert的输入

pytorch函数AdaptiveMaxPool2d_第7张图片
输入嵌入组成部分是词向量(token embeddings)、段向量(segment embeddings)、位置向量(position embeddings)

  • 词向量:向量的取值在模型训练过程中自动学习,估计就是利用Word2Vector等算法进行预训练以作为初始值
  • 段向量:因为BERT里面有预测下一句的任务,所以会有两句拼接起来,上句与下句,上句有上句段向量,下句则有下句段向量,也就是图中A与B。此外,句子末尾都有加[SEP]结尾符,两句拼接开头有[CLS]符
  • 位置向量:是因为 Transformer 模型不能记住时序,所以人为加入表示位置的向量
    视频讲解

Bert的预训练过程

这篇文章写的很好
其预训练过程就是逐渐调整模型参数,使得模型输出的文本语义表示能够刻画语言的本质,便于后续针对具体NLP任务作微调。个人认为是不是也是为了更好的计算损失,不只是考虑结果,而是去关注一些细节。(句子中的其他词和句子顺序)
这一步就是用来大体上调整模型参数的,所以后面用bert的时候是不会有预训练的,直接是一个初始化好参数的模型。

Bert的encoder

如果是还不了解self-attention机制的,请先了解self-attention,Bert只使用了transformer的encoder部分

Transformer Encoder

由三步操作组成

  • 残差连接(ResidualConnection):将模块的输入与输出直接相加,作为最后的输出。这种操作背后的一个基本考虑是:修改输入比重构整个输出更容易
  • Layer Normalization:对某一层神经网络节点作0均值1方差的标准化。
  • 线性转换:对每个字的增强语义向量再做两次线性变换,以增强整个模型的表达能力。这里,变换后的向量与原向量保持长度相同
    pytorch函数AdaptiveMaxPool2d_第8张图片

Bert encoder

组装好TransformerEncoder之后,再把多个Transformer Encoder一层一层地堆叠起来,Bert的encoder就完成了

Bert的输出

对于不同的NLP任务,模型输入会有微调,对模型输出的利用也有差异

  • 单文本分类任务:对于文本分类任务,BERT模型在文本前插入一个[CLS]符号,并将该符号对应的输出向量作为整篇文本的语义表示,用于文本分类。
  • 句对分类任务:该任务的实际应用场景包括:问答(判断一个问题与一个答案是否匹配)、语句匹配(两句话是否表达同一个意思)等。对于该任务,BERT模型除了添加[CLS]符号并将对应的输出作为文本的语义表示,还对输入的两句话用一个[SEP]符号作分割,并分别对两句话附加两个不同的文本向量以作区分
  • 序列标注任务:该任务的实际应用场景包括:中文分词&新词发现(标注每个字是词的首字、中间字或末字)、答案抽取(答案的起止位置)等。对于该任务,BERT模型利用文本中每个字对应的输出向量对该字进行标注(分类),如下图所示(B、I、E分别表示一个词的第一个字、中间字和最后一个字)。

获取模型输出使用output_layer = model.get_sequence_output()output_layer = model.get_pooled_output()

  • output_layer = model.get_sequence_output()
    获取每个token的output 输出[batch_size, seq_length, embedding_size] 如果做seq2seq 或者ner 用这个
  • output_layer = model.get_pooled_output()
    获取句子的output
    bert模型对输入的句子有一个最大长度,对于中文模型,我看到的是512个字。
    当我们用model.get_sequence_output()获取每个单词的词向量的时候注意,头尾是[CLS]和[SEP]的向量。做NER或seq2seq的时候需要注意。

词向量的维度

知道了Bert的模型之后,我又有个疑惑了,为什么他的输出维度会那么高(七百多维)?输入不是每个词的一维向量吗?又说线性变换后的向量与原向量保持长度相同?

你可能感兴趣的:(深度学习,神经网络,机器学习,自然语言处理,深度学习,nlp)