2021SC@SDUSC-山东大学软件工程与实践-Senta(5)

本篇对Senta中token embedding中所使用的ELMO模型进行分析。

2021SC@SDUSC-山东大学软件工程与实践-Senta(5)

paddlepaddle:百度深度学习的框架 paddle.fluid.layers.dropout:
丢弃或者保持x的每个元素独立。Dropout是一种正则化手段,通过在训练过程中阻止神经元节点间的相关性来减少过拟合。根据给定的丢弃概率,dropout操作符按丢弃概率随机将一些神经元输出设置为0,其他的仍保持不变。

# -*- coding: utf-8 -*

"""ELMo model."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import paddle.fluid.layers as layers
import paddle.fluid as fluid
import numpy as np
import os

cell_clip = 3.0
proj_clip = 3.0
hidden_size = 4096
vocab_size = 52445
emb_size = 512


def dropout(input):
    """
    dropout
    """
    dropout_rate = 0.5
    return layers.dropout(
        input,
        dropout_prob=dropout_rate,
        dropout_implementation="upscale_in_train",
        is_test=False)

dropout相关参数:
dropout_prob :输入单元的丢弃概率
dropout_implementation :丢弃单元的方式,有两种’downgrade_in_infer’和’upscale_in_train’两种选择,默认为’downgrade_in_infer’。

关于dropout_implementation两种丢弃方式解释:

downgrade_in_infer,在预测时减小输出结果,

train: out = input * mask

inference: out = input * (1.0 - dropout_prob)

(mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 dropout_prob )

upscale_in_train, 增加训练时的结果

train: out = input * mask / ( 1.0 - dropout_prob )

inference: out = input

(mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 dropout_prob )

def lstmp_encoder(input_seq, gate_size, h_0, c_0, para_name, proj_size, args):

    init = None
    init_b = None
    input_proj = layers.fc(input=input_seq,
                           param_attr=fluid.ParamAttr(
                               name=para_name + '_gate_w', initializer=init),
                           size=gate_size * 4,
                           act=None,
                           bias_attr=False)
    hidden, cell = layers.dynamic_lstmp(
        input=input_proj,
        size=gate_size * 4,
        proj_size=proj_size,
        h_0=h_0,
        c_0=c_0,
        use_peepholes=False,
        proj_clip=proj_clip,
        cell_clip=cell_clip,
        proj_activation="identity",
        param_attr=fluid.ParamAttr(initializer=init),
        bias_attr=fluid.ParamAttr(initializer=init_b))
    return hidden, cell, input_proj

def lstmp_encoder 的返回值 input_projf, hidden, cell,分别由paddle.fluid.layers.fc 和paddle.fluid.layers.dynamic_lstmp 得出。

fc(fully connected) 全连接层:全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来

paddle.fluid.layers.fc 参数:

input :维度为 [N1,N2,…,Nk] 的多维Tensor(或LoDTensor)或由多个Tensor(或LoDTensor)组成的list,输入Tensor的shape至少是2。数据类型为float32或float64。

size : 全连接层输出单元的数目,即输出Tensor(或LoDTensor)特征维度。

ParamAttr :指定权重参数属性的对象。默认值为None,表示使用默认的权重参数属性。

bias_attr:指定偏置参数属性的对象。默认值为None,表示使用默认的偏置参数属性。

act :应用于输出上的激活函数

paddle.fluid.layers.fc 参数:

input :维度为 [T,4∗hidden_size] 的多维 LoDTensor(必须在传入该OP前对维度为 [T,hidden_size] 的输入经过线性变换得到),其中 T 为 batch 中所有样本的长度之和,hidden_size 为隐层大小,数据类型为 float32 或者 float64。

use_peepholes :是否使用 peephole 连接。默认值为True。

h_0 :维度为 [batch_size,hidden_size] 的多维 Tensor。如果为 None,该OP会自动设置为全0的向量。默认值为None。

c_0 :维度为 [batch_size,hidden_size] 的多维 Tensor。如果为 None,该OP会自动设置为全0的向量;h0,c0 如果要设置为None,必须同时为None。默认值为None。

cell_clip : 如果该参数不为None,则在单元输出激活之前,单元状态将被此值剪裁。默认值为None。

proj_clip :如果 num_proj > 0 并且 proj_clip 不为None,那么将投影值沿元素方向剪切到[-proj_clip,proj_clip]内。默认值为None。

本篇Senta中的ELMO模型源码分析到此结束,下篇将续接本篇。

上一篇:训练更快,泛化更强的Dropout:Multi-Sample Dropout


下一篇:BERT系列-BERT模型的核心架构