中文短文本分类实例六-DCNN(AConvolutionalNeuralNetworkfo。。。

更新时间:2023-07-24 19:40:07 阅读: 评论:0

中⽂短⽂本分类实例六-
DCNN(AConvolutionalNeuralNetworkfo。。。
⼀.概述
DCNN()by NalKalchbrenner等,⼜是⽂本分类论⽂的⼀⼒作。"准确表达句⼦的语义是语⾔理解的核⼼",通过学习机器学习和TextCNN,我们可以知道n-gram特征是NLP⽂本任务和句⼦表达的⼀种重要⽅法。TextCNN通过不同步长的卷积核(例如
2,3,4,5,7)构建n-gram特征,以及最⼤池化(max-pooling)选择特征,再加上神经⽹络全局优化的思想,在⽂本分类任务中取得了不错的效果。
那么,除了TextCNN外,还有没有更加先进的CNN提取n-gram信息的神经⽹络呢?
当然有啦,那就是DCNN!
DCNN名为动态卷积神经⽹络,注意,'D'代表的是动态(Dynamic )的意思,⽽不是有可能望⽂⽣义的'深度(Deep)'的意思。
DCNN,动态卷积神经⽹络的思想是什么,对⽐TextCNN有什么进步呢? ⼀句话,DCNN能够捕捉长距离词语或者是字的语义信息。具体说来,就是TextCNN中,每⼀个卷积核选择的Max-Pooling池化⼿段,只能选择⼀个n-gram信息。举个例⼦来说,⽐如说卷积核的步长是3,对于句⼦'花落惊飞⾬',如果⽂本最⼤长度是5,那么可以提取到字符级别的['花落惊'、'落惊飞', '惊飞⾬']三个n-gran信息,max-pooling就是取到其中最⼤的⼀个。
聪明的你⼀定可以发现,着不就是连词吗,没错,就是那么回事。可以发现,这些n-gram信息是没有间隔的连续的,其实和连续词袋差不多。它并不能抽取【'花落'、'⾬'】这样的特征,不得不说不是⼀种遗憾。
⽽我们今天所说的DCNN,特点就是Dynamic k-max pooling,是为了解决以上问题的。动态抽取远距离特征,思想如下:
DCNN不同于TextCNN,它有着'宽卷积'、'动态池化'和Folding层等三个特点。
⼆.DCNN原理图
2.1 ⽼规矩,还是放DCNN的⽹络原理图
2.2 DCNN⽹络层信息
如上图,DCNN主要包含one-dim宽卷积层、Dynamic k-max pooling动态topk池化层、Folding层和全连接层。
1. one-dim宽卷积层,
one-dim就是每⼀个维度,例如你有300维的word2vec作embedding层,就有300个dim,如上图⽹络原理图中的红⾊卷积所⽰。
图像任务中宽卷积层可以更有效提取图边⾓信息,在NLP⽂本分类任务中也⼀样,可以更有效提取句⼦的句⾸和句尾信息,毕竟出现得多了,提取它们也是显⽽易见的,这不难理解。通常得做法可以通过补零,然后再⽤普通卷积⽅式(如same)实现它,形式化如下图论⽂给出的图形所⽰:
2. 动态 K-Max pooling层
动态k-max池化层也很好理解,原始的avg-pooling就是所有卷积的求平均,one-max pooling就是选择最⼤的那个数。那么,顾名思义,k-max pooling就是选择最⼤的top k个数啦。
dynamic k-max pooling前⾯的动态,就是根据⽹络结构和预设的top k,通过公式动态地选择k值。我们预定义⼀个每层的最⼩k值(例如k=3,也和n-gram中的3,4,5差不多啦),那么当前层数1的k_curr= Max( k,len_max * (L - L_curr) / L ),其中L表⽰卷积⽹络深度,len_max表⽰⽂本最⼤长度,L_curr表⽰当前所在层。论⽂计算⽅式如下图:
3. Folding层
Folding层没什么可说的,论⽂中实验它也没啥作⽤,看着⾼⼤上吧。原理对于宽卷积层的one-dim,还是假设你有300维的
word2vec作embedding层,句⼦ntence的embedding也有300dim维度。那么Folding就是第⼀维和第⼆维相加,第三维和第四维相加。
直观来看,也没有什么意义,毕竟每个字向量或者是词向量的维度上的数字并没有什么特殊的含义,论⽂中,实验结果也证明了这⼀点。
4. 调参
论⽂中给出了两个实例,
损坏的近义词⼀个是有两个宽卷积核的:
句⼦长度:    7
宽卷积尺⼨:  第⼀层3,第⼆层2
池化层k值:    第⼀层5,第⼆层3;(最⼩常量为3)
另⼀个是有三个款卷积核的:
句⼦长度:    18
宽卷积尺⼨:  第⼀层7,第⼆层5,第三层3,(这个没有说,论⽂中选(10,7)、(8,5)、 (7,5))
池化层k值:    第⼀层12,第⼆层6,第三层是3;(最⼩常量可选3,4,5,6等)
三.DCNN代码实现
1. 代码实现有点⼩⿇烦,宽卷积(wide_convolution)第⼀次⽤,不太熟;动态k-max卷积实现有点⿇烦,没有keras抽象,需要⽤tf或者keras.backend实现;folding倒是简单些;
github:
2.主体代码
2.1  model
def create_model(lf, hyper_parameters):
"""
构建神经⽹络,只有3层静态
:param hyper_parameters:json,  hyper parameters of network
:return: tensor, moedl
"""
super().create_model(hyper_parameters)
embedding_output = lf.word_embedding.output
pools = []
for i in range(len(lf.filters)):
# 第⼀个,宽卷积,动态k-max池化
conv_1 = wide_convolution(name="wide_convolution_{}".format(i),
filter_num=lf.filters_num, filter_size=lf.filters[i][0])(embedding_output)
top_k_1 = lect_k(lf.len_max, len(lf.filters[i]), 1) # 求取k
dynamic_k_max_pooled_1 = dynamic_k_max_pooling(top_k=top_k_1)(conv_1)
# 第⼆个,宽卷积,动态k-max池化
conv_2 = wide_convolution(name="wide_convolution_{}_{}".format(i, i),
响片filter_num=lf.filters_num, filter_size=lf.filters[i][1])(dynamic_k_max_pooled_1)
top_k_2 = lect_k(lf.len_max, len(lf.filters[i]), 2)
喝牛奶能吃药吗
dynamic_k_max_pooled_2 = dynamic_k_max_pooling(top_k=top_k_2)(conv_2)
# 第三层,宽卷积,Fold层,动态k-max池化
conv_3 = wide_convolution(name="wide_convolution_{}_{}_{}".format(i, i, i), filter_num=lf.filters_num,
filter_size=lf.filters[i][2])(dynamic_k_max_pooled_2)
fold_conv_3 = prem_fold()(conv_3)
top_k_3 = lect_k(lf.len_max, len(lf.filters[i]), 3)  # 求取k
dynamic_k_max_pooled_3 = dynamic_k_max_pooling(top_k=top_k_3)(fold_conv_3)
pools.append(dynamic_k_max_pooled_3)
pools_concat = Concatenate(axis=1)(pools)
pools_concat_dropout = Dropout(lf.dropout)(pools_concat)
x = Flatten()(pools_concat_dropout)
output = Den(units=lf.label, activation=lf.activate_classify)(x)
# output = Den(units=lf.label, activation='linear')(pools_concat)
2.2  wide_convolution
class wide_convolution(Layer):
"""
paper: www.aclweb/anthology/P14-1062
paper title: "A Convolutional Neural Network for Modelling Sentences"
宽卷积, 如果s表⽰句⼦最⼤长度, m为卷积核尺⼨,
则宽卷积输出为 s + m − 1,
普通卷积输出为 s - m + 1.
github keras实现可以参考: /AlexYangLi/TextClassification/blob/master/models/keras_dcnn_model.py    """
def __init__(lf, filter_num=300, filter_size=3, **kwargs):
lf.filter_size = filter_size
形容炎热的词语
lf.filter_num = filter_num
super().__init__(**kwargs)
def build(lf, input_shape):
super().build(input_shape)
def call(lf, inputs):
x_input_pad = ZeroPadding1D((lf.filter_size-1, lf.filter_size-1))(inputs)
conv_1d = Conv1D(filters=lf.filter_num,
kernel_size=lf.filter_size,
strides=1,
padding='VALID',
kernel_initializer='normal', # )(x_input_pad)
activation='tanh')(x_input_pad)
return conv_1d
def compute_output_shape(lf, input_shape):
return input_shape[0], input_shape[1] + lf.filter_size - 1, input_shape[-1]
2.3  动态k-max卷积
湿疹饮食class dynamic_k_max_pooling(Layer):
"""
paper:        www.aclweb/anthology/P14-1062
paper title:  A Convolutional Neural Network for Modelling Sentences
Reference:    /questions/51299181/how-to-implement-k-max-pooling-in-tensorflow-or-keras 动态K-max pooling
k的选择为 k = max(k, s * (L-1) / L)
其中k为预先选定的设置的最⼤的K个值,s为⽂本最⼤长度,L为第⼏个卷积层的深度(单个卷积到连接层等)
github tf实现可以参考: /lpty/classifier/blob/master/a04_dcnn/model.py
"""
def __init__(lf, top_k=3, **kwargs):
super().__init__(**kwargs)
def build(lf, input_shape):
super().build(input_shape)
def call(lf, inputs):
inputs_reshape = tf.transpo(inputs, perm=[0, 2, 1])
pool_top_k = p_k(input=inputs_reshape, p_k, sorted=Fal).values
pool_top_k_reshape = tf.transpo(pool_top_k, perm=[0, 2, 1])
return pool_top_k_reshape
def compute_output_shape(lf, input_shape):
return input_shape[0], lf.top_k, input_shape[-1]
2.4  folding
办公建筑设计规范
class prem_fold(Layer):
"""
paper:      www.aclweb/anthology/P14-1062
paper title: A Convolutional Neural Network for Modelling Sentences
detail:      垂直于句⼦长度的⽅向,相邻值相加,就是embedding层300那⾥,(0+1,298+299)        github tf实现可以参考: /lpty/classifier/blob/master/a04_dcnn/model.py
"""
def __init__(lf, **kwargs):
怎么知道卵子排出来了super().__init__(**kwargs)
def build(lf, conv_shape):
super().build(conv_shape)
def call(lf, convs):
conv1 = convs[:, :, ::2]
conv2 = convs[:, :, 1::2]雪地寻踪
conv_fold = Add()([conv1, conv2])
return conv_fold
def compute_output_shape(lf, conv_shape):
return conv_shape[0], conv_shape[1], int(conv_shape[2] / 2)
希望对你有所帮助!

本文发布于:2023-07-24 19:40:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1115151.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:卷积   动态   没有   信息   神经   实现   特征   抽取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图