本篇对Senta中token embedding中所使用的ELMO模型进行分析。
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模型源码分析到此结束,下篇将续接本篇。