2022.12.10 第12次周报

目录

  • 摘要
  • 深度学习
    • 1、RNN数据处理方式
    • 2、RNN文本处理
    • 3、简单RNN代码实现
  • 文献阅读
    • 1、摘要
    • 2、DeFINE提出背景
    • 3、DeFINE
    • 4、实验结果
    • 4、结论
  • 总结

摘要

This week, I studied RNN and learned about its data and text processing method, in which data processing is mainly introduced to One-hot coding and text processing is mainly carried out in three steps, followed by a simple RNN code implementation; in addition, I read a paper on deep factorised input token embeddings for neural sequence modelling in natural language processing, in which introduced DeFINE for neural sequence modelling, which implements a complex token embedding function approximated with fewer parameters.
本周,我学习了RNN,了解了其数据和文本处理方式,其中数据处理主要介绍了One-hot coding,文本处理主要分为三步进行,接着介绍了简单的RNN代码实现;另外,我学习了一篇有关自然语言处理的用于神经序列建模的深度因子化输入标记嵌入法的论文,论文中介绍了用于神经序列建模的DeFINE,实现了用更少的参数来近似复杂的标记嵌入函数。

深度学习

1、RNN数据处理方式

categorical feature(类别特征)的常见处理方式:One-hot coding(独热编码)
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
举例:

2022.12.10 第12次周报_第1张图片
如上图,这张表的每一行是一个人的数据 包括年龄、性别、国籍,我们需要把这些数据变成机器学习模型可以理解的数值特征: 第一列是年龄,年龄本身就是数值特征,所以不用做处理(数值可直接比较大小); 第二列是性别, 性别是二元特征,我们可以用一个数字来表示性别,用数字0表示女性,用1表示男性。这样一来,性别就表示为一个标量,0或者1; 第三列是国籍,比如美国、中国、印度。世界上约有197个国家,国籍是不同的类别特征,机器学习并不理解国籍,所以我们要把国籍编码成数值向量,但是如果单纯使用1-197之间的整数表示,不能表示出不同类别,因此就需要对国籍做one-hot Encoding(独热编码)。
2022.12.10 第12次周报_第2张图片

2、RNN文本处理

在自然语言处理(NLP)的应用中,数据都是文本,文本可以分割成很多单词,我们需要把单词表示成数值向量,每个单词就是一个类别,如果字典里有10000个单词,那么就有10000个类别。显然单词就是Categorical Features(类别特征),我们用处理Categorical Features(类别特征)的方法,把单词变成数值向量:
第一步:把文本分割成单词,一段话、一篇文章或者一本书可以表示成一个字符串。可以把document分割成很多单词,这个操作叫做tokenization(分词)。
第二步:计算词频,也就是每个单词出现的次数可以用一个哈希表来计数。假如单词w不在表里面,这就说明w还没有出现在文本里,到目前为止,我只看到w一次,所以我把w加入哈西表 让他的词品等于1;假如单词w在哈希表里面,说明w之前出现在文本里,只需要把它的词频加1。
第三步:对单词做one-hot Encoding,首先通过查字典把每个单词进行设到一个正整数,一个单词的列表就变成了正整数的列表,如果有必要,就进一步把这些正整数变成one-hot向量。
2022.12.10 第12次周报_第3张图片

3、简单RNN代码实现

'数据集读取与预处理'
# 此处使用Keras库自带函数进行简洁实现(从零开始实现请看上一节)
# 使用keras的embedding层处理文字数据(同样使用imdb数据集)
 
from keras.datasets import imdb
from keras import preprocessing
 
max_feature = 10000  # 词汇量(作为特征的单词个数)
maxlen = 500  # 在500个单词以后截断文本
 
(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_feature)
# y_train、y_test分别表示训练集和测试集的标签
# max_words=10000:只考虑数据集中前10000个最常见的单词
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
 
print('sequence 格式:(samples*time)')
input_train = preprocessing.sequence.pad_sequences(input_train, maxlen=maxlen)
input_test = preprocessing.sequence.pad_sequences(input_test, maxlen=maxlen)
# 此处相当于对齐序列(补0或者阶段评论)
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)

运行结果:
2022.12.10 第12次周报_第4张图片

'定于模型:Simple RNN'
from keras.models import Sequential   # Sequential:把神经网络的层按顺序搭起来
from keras.layers import SimpleRNN, Dense, Embedding  # 从Keras到Layers里面导入flatten、dense以及Embedding这三种层
 
'词嵌入操作:降低输入向量维度'
embedding_dim = 32   # 设置词向量x的维度是32
model = Sequential()
model.add(Embedding(max_feature, embedding_dim, input_length=maxlen))
# 第一层是Embedding层,设定字典里10000个单词,Embedding层的输出是个500×32的矩阵,
# 只考虑每条电影评论中最后的500个单词,每个单词用32维的向量来表示
# 参数矩阵在此的维度是320000,矩阵的参数根据设定的每个单词表示的向量(32)*字典词个数10000得到
'Simple RNN Layer'
state_dim = 32   # 设置状态向量h的维度等于32
model.add(SimpleRNN(state_dim, return_state=False))
# return_state=False,不需要存储ht之前的状态
 
model.add(Dense(1, activation='sigmoid'))
# units :代表该层的输出维度或神经元个数,此处设定输出的维度为1
# activation=None:激活函数.但是默认 liner
 
'设定优化算法以及模型评价标准'
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
# optimizer: 优化器,loss:损失函数,metrics: 评价函数.
# 评价函数的结果不会用于训练过程中,可以传递已有的评价函数名称
 
'设置训练模型'
history = model.fit(
    input_train, y_train,
    epochs=10,
    batch_size=128,
    validation_split=0.2
)
# input_train:输入数据,y_train:标签,
# batch_size:整数,指定进行梯度下降时每个batch包含的样本数
# epochs:整数,训练终止时的epoch值
# validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集
model.summary()
'查看模型最终性能'
loss_and_acc = model.evaluate(input_test, y_test)
print('loss=' + str(loss_and_acc[0]))  # 分类准确率
print('acc=' + str(loss_and_acc[1]))   # 模型的准确率

运行结果:
2022.12.10 第12次周报_第5张图片

文献阅读

DeFINE: DEep Factorized INput Token Embeddings for Neural Sequence Modeling

1、摘要

对于具有大词汇量的序列模型,大部分网络参数都在输入和输出层。在这项工作中,我们描述了一种新的方法,即DeFINE,用于有效地学习深层标记表示法。我们的架构使用了一种带有新型跳过连接的分层结构,允许使用低维的输入和输出层,减少了总参数和训练时间,同时提供了与现有方法类似或更好的性能。DeFINE可以很容易地被纳入新的或现有的序列模型中。与包括自适应输入表示在内的最先进的方法相比,这种技术使困惑度下降了6%到20%。在WikiText-103上,DeFINE将Transformer-XL的总参数减少了一半,对性能的影响很小。在Penn Treebank上,DeFINE将AWD-LSTM改进了4个点,参数减少了17%,实现了与参数较少的最先进方法相媲美的性能。对于机器翻译,DeFINE将Transformer模型的效率提高了约1.4倍,同时提供了类似的性能。

2、DeFINE提出背景

用于NLP任务的神经模型,如语言建模和机器翻译,需要大量的词汇以获得通用性。这些模型通常采用类似的架构:表示为单热向量的标记(如单词、子词或字符)被映射到一个密集的连续空间;然后由上下文模型处理;最后,上下文表示被映射回一个词汇表大小的向量,用于计算下一个标记的概率。如下图,显示了一个语言建模的例子。第一步和最后一步的映射通常使用一个共享的学习查询表,被称为嵌入层,它将词汇中的每一个标记带到一个固定的m维向量。这种方法的一个缺点是,嵌入层的参数数量随着词汇量的增加而增加,这就限制了我们在大词汇量上使用小的m值。因此,作者就引入了用于神经序列建模的Deep Factorized INput token Embeddings(DeFINE)。与标准方法相比,DeFINE用更少的参数近似复杂的标记嵌入函数。
2022.12.10 第12次周报_第6张图片

3、DeFINE

DeFINE是一种在高维空间中以最小的额外参数学习深度标记表示的有效方法。方法基于MapExpand-Reduce(MER)原理,首先将输入标记映射到低维嵌入向量,然后使用计算效率高的分层组变换(HGT)将其转换到高维空间,图中c中简要说明了这一点。然后将结果向量转换到低维空间。在这些转换的过程中,我们利用一种新的连接模式,在输入层和输出层之间建立直接联系(图3),促进特征重用,并改善梯度流动。然后,DeFINE的输出层可以代替传统的嵌入,作为序列建模任务的输入。

THE MAP-EXPAND-REDUCE PRINCIPLE (MER)
Token嵌入通常被视为一个单热向量到密集连续空间的简单函数。因此,嵌入层可以被认为是一个由单一线性变换组成的宽而浅的网络。在其核心部分,这个网络近似的函数(称为f)将一个标记从其正字法形式转化为其形态-句法和语义属性的表示,这与标记可能出现的任意数量的语境建模有关。大多数NLP研究假设一个简单的嵌入层可以充分地近似于难以解决的函数f。作者假设,由于f的复杂性,一个浅层网络需要特殊的能力来学习一个好的近似。时间和数据的限制禁止学习这样一个高容量的浅层网络。作者最近的理论结果提出,一个较深的网络可以用比浅层网络少得多的参数来近似f。
2022.12.10 第12次周报_第7张图片

HIERARCHICAL GROUP TRANSFORMATION (HGT)
如上图c所示,以有效地学习深度标记表征。HGT包括一个由N层组成的堆栈。在每一层,HGT使用不同数量的组,允许它从不同的输入子集学习表征。HGT在第一层开始使用gmax组,然后在每一层将组的数量减少2倍。这种分层分组机制使全连接(或线性)层中的连接变得稀疏,使我们能够用较少的参数有效地学习表征。类似于全连接层的堆叠,HGT中的第N层可以通过多个路径访问第一层的每个输入元素,因此,允许它学习有效的表征。

DEFINE UNIT
DeFINE单元是由HGT变换组成的,它是利用MER原理设计的。虽然HGT层是计算上昂贵的全连接层的有效近似,但随着DeFINE单元的深度N的增加,它们可能会阻碍训练。剩余连接已被证明对缓解这一问题非常有效,然而,这种连接很难在HGT中实现,因为每个层的输入和输出维度是不同的。为了最大限度地提高信息流并促进更深层次的DeFINE单元的训练,作者引入了一个简单的新的跳过连接,在HGT的任何一层与输入ei之间建立直接的联系。
2022.12.10 第12次周报_第8张图片

4、实验结果

不同转换的影响(表6):HGT与线性变换一样有效,而学习的参数却少了200万。与分组线性变换(GLT)相比,HGT在学习类似数量的参数的同时,提高了大约5个点的困惑度。此外,当我们与输入建立直接联系时(详见第3.2节),性能进一步提高了2.9个点,对参数数量的影响最小,这表明DeFINE学习了良好的表征。
缩放深度(N)和宽度(k)的影响(表7):缩放实验的结果,对于相同的k值,语言模型的性能随着深度N的增加而提高。然而,当我们在深度N的固定值下扩展宽度k时,性能并没有提高。这可能是因为,当我们增加k的大小时,更多的神经元从相同的维度子集接收它们的输入,从而学习了许多冗余的参数。
具有不同连接的DeFINE(表8a):DeFINE中剩余连接的影响,为了促进DeFINE内部的残余连接,将DeFINE中每个层的尺寸ˆel i固定为k/2,而不是从n到k的线性跨度。我们可以清楚地看到,拟议的跳过连接更有效。
MER中减少操作的影响(表8b):在MER策略中,我们将高维向量投射到低维空间,然后再将其送入上下文模型,如LSTM。我们根据经验发现,有和没有这个减少步骤的性能是相似的,然而,没有减少步骤的模型会学到更多的参数。
2022.12.10 第12次周报_第9张图片

4、结论

DeFINE使用深度的、分层的、稀疏的网络与新的跳过连接来有效地学习更好的标记嵌入。使用DeFINE的序列模型(如Transformer和LSTM)在参数较少的情况下与最先进的方法表现相当或更好。实验表明,所提出的架构决定都有助于提高DeFINE单元的有效性。在未来的工作中,把DeFINE应用于其他序列建模任务。例如,预训练的语言模型架构,如ELMo和BERT,可以从纳入DeFINE中受益,以提高效率和性能。另一个方向是将DeFINE的组件–特别是MER、HGT和混合层–用于神经结构搜索过程。

总结

本周学习了RNN的数据处理、文本处理以及代码实现,另外本周阅读了一篇有关自然语言处理的用于神经序列建模的深度因子化输入标记嵌入法的论文。下周,我将继续深入地学习LSTM和GRU,掌握其中的原理。

你可能感兴趣的:(深度学习,nlp,rnn)