[Character Embedding]论文实现:Text Understanding from Scratch

简介: [Character Embedding]论文实现:Text Understanding from Scratch

论文:Text Understanding from Scratch

作者:Xiang Zhang,Yann LeCun

时间:2016

In this article we show that text understanding can be handled by a deep learning system without artificially embedding knowledge about words, phrases, sentences or any other syntactic or semantic structures associated with a language.

这篇论文展示了文本理解可以通过深度学习系统来处理,而不需要人工嵌入关于单词、短语、句子或任何其他与一种语言相关的句法或语义结构的知识。

一、完整代码

为了方便直接使用,这里直接展示完整代码:

import tensorflow as tf
import numpy as np
import pandas as pd
s = 'abcdefghijklmnopqrstuvwxyz0123456789,;.!?:’"/\|_@#$%ˆ&*˜‘+-=<>()[]{}'
vocabulary = list(s)
text_vectorizer = tf.keras.layers.TextVectorization(output_mode="int", vocabulary=vocabulary, split='character', output_sequence_length=500)
x_train = [
    'i do"t think you will win',
    'you are so bad',
    'you are unbelievable',
    'its taste is not good',
    'good',
    'so funny',
    'i"m so glad to hear that'
]
x_train = text_vectorizer(x_train).numpy()
y_train = np.array([0,0,0,0,1,1,1])
model = tf.keras.models.Sequential([
    tf.keras.layers.Input(shape=500),
    tf.keras.layers.Embedding(text_vectorizer.vocabulary_size(), 500),
    tf.keras.layers.Conv1D(filters=256, kernel_size=7, padding='same', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=3,data_format='channels_first'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=7, padding='same', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=3,data_format='channels_first'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=3,data_format='channels_first'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1024, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(1024, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(),
    metrics=['accuracy'],
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)
)
history = model.fit(x=x_train, y=y_train, epochs=100, verbose=2)
pd.DataFrame(history.history).plot()

二、论文解读

在本节中,我们将介绍对文本理解的convnet的设计。该设计是模块化的,其中梯度是通过反向传播获得的来执行优化。

2.1 关键模块

两个模型非常经典,自行了解不多介绍,只贴一下论文解释:

Convolution 1-D (一维卷积)

Max pooling 1-D (一维最大池化)

2.2 字符量化

    文本其实就是一串字符,我们理解文本就是依据不同的字符组成的词来进行理解,从论文标题text understanding from scratch可以看出处理方法与我们一般方法不同,论文是直接根据字符串序列来理解文本的;

    论文的模型接受一系列编码的字符作为输入。编码是通过为输入语言指定一个大小为 m m m的字典完成的,然后使用独热编码来量化每个字符。然后,将该字符序列转换为一个固定长度为 l l l的 m m m个大小的向量序列。字符串中任何长度超过 l l l的字符都将被忽略,而任何不在字母表中的字符,包括空白字符,都将被量化为全零向量。字符量化顺序是向后的,因此对字符的最新读取总是放置在输出的开始点附近,这使得完全连接的层很容易将权重与最新读取关联起来;

    论文中的字典大小为70,其中包括26个英语字母、10位数字、新行和33个其他字符;如下所示:

这里量化后我们得到类似于下图的结果:

字符串量化之后我们得到一个大小为 l ∗ m l*m lm的矩阵,多个字符串的话就是 B ∗ l ∗ m B*l*m Blm,接下来进行模型结构;

2.3 模型结构

    论文中展示的模型结构如下所示,但是这里并不直观;

    模型流程大概是这样:先把Some Text进行量化,得到一个one-hot矩阵,矩阵大小为 B ∗ l ∗ m B*l*m Blm,然后把one-hot矩阵使用Embedding进行嵌入,相当于乘一个 m ∗ d m*d md矩阵,得到矩阵大小为 B ∗ l ∗ d B*l*d Bld,紧接着跟6个1维卷积1维最大池化,然后平铺后进行三次全连接,在每两层全连接中掺插dropout层;最后的一次全连接取决于需要做的任务;

    论文中设置了一个大模型和一个小模型,模型参数设置如下:

1维卷积1维最大池化

全连接

这里模型的构造就完毕了;

2.4 数据增强

许多研究者发现,适当的数据增强技术对于控制深度学习模型的泛化误差是有用的。当我们能够找到模型应该具有的适当的不变性属性时,这些技术通常工作得很好。就文本而言,像在图像或语音识别中那样使用信号转换来增加数据是不合理的,因为字符的确切顺序可能会形成严格的句法和语义意义。因此做数据增强的最好方法是使用人类重组句子,但这是不现实的和昂贵的,因为在我们的数据集中有大量的样本。因此,对我们来说,数据扩充中最自然的选择是用它们的同义词替换单词或短语。即使用同义词典增强数据

三、过程实现

3.1 导包

这里用到的包有tensorflow,numpy,pandas;

import tensorflow as tf
import numpy as np
import pandas as pd

3.2 数据准备和字符量化

这里可以直接使用tensorflow中的TextVectorization函数进行处理:

s = 'abcdefghijklmnopqrstuvwxyz0123456789,;.!?:’"/\|_@#$%ˆ&*˜‘+-=<>()[]{}'
vocabulary = list(s)
# 这里的500表示的是最大长度即上文分析的l
text_vectorizer = tf.keras.layers.TextVectorization(output_mode="int", vocabulary=vocabulary, split='character', output_sequence_length=500) 
# 得到vocabulary的大小
text_vectorizer.vocabulary_size()
x_train = [
    'i do"t think you will win',
    'you are so bad',
    'you are unbelievable',
    'its taste is not good',
    'good',
    'so funny',
    'i"m so glad to hear that'
]
x_train = text_vectorizer(x_train).numpy()
# 得到 x_train 为
# array([[10,  1,  5, ...,  0,  0,  0],
#        [26, 16, 22, ...,  0,  0,  0],
#        [26, 16, 22, ...,  0,  0,  0],
#        ...,
#        [ 8, 16, 16, ...,  0,  0,  0],
#        [20, 16,  1, ...,  0,  0,  0],
#        [10, 14,  1, ...,  0,  0,  0]], dtype=int64)
# 准备一下y_train
y_train = np.array([0,0,0,0,1,1,1])

3.3 模型建立

这里我们根据上文的参数建立一个小模型,代码如下:

model = tf.keras.models.Sequential([
    tf.keras.layers.Input(shape=500),
    tf.keras.layers.Embedding(text_vectorizer.vocabulary_size(), 500),
    tf.keras.layers.Conv1D(filters=256, kernel_size=7, padding='same', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=3,data_format='channels_first'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=7, padding='same', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=3,data_format='channels_first'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv1D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=3,data_format='channels_first'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1024, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(1024, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(),
    metrics=['accuracy'],
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)
)
# 开始训练
history = model.fit(x=x_train, y=y_train, epochs=100, verbose=2)

3.4 训练结果

训练结果如下图所示:

pd.DataFrame(history.history).plot()

四、整体总结

没什么好总结的;


目录
相关文章
|
机器学习/深度学习 数据挖掘
【提示学习】HPT: Hierarchy-aware Prompt Tuning for Hierarchical Text Classification
本文是较早把Prompt应用到层级多标签文本分类领域的论文。思路是把层级标签分层编入到Pattern中,然后修改损失函数以适应多标签的分类任务。
212 0
|
6月前
|
机器学习/深度学习 数据挖掘 API
[FastText in Text Classification]论文实现:Bag of Tricks for Efficient Text Classification
[FastText in Text Classification]论文实现:Bag of Tricks for Efficient Text Classification
37 2
|
6月前
|
机器学习/深度学习 JSON 自然语言处理
[GPT-1]论文实现:Improving Language Understanding by Generative Pre-Training
[GPT-1]论文实现:Improving Language Understanding by Generative Pre-Training
95 1
|
6月前
|
自然语言处理 算法 Python
[SentencePiece]论文解读:SentencePiece: A simple and language independent subword tokenizer...
[SentencePiece]论文解读:SentencePiece: A simple and language independent subword tokenizer...
80 0
|
6月前
|
Python
[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........
[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........
41 0
|
自然语言处理 算法
SIFRank New Baseline for Unsupervised Keyphrase Extraction Based on Pre-Trained Language Model
在社交媒体上,面临着大量的知识和信息,一个有效的关键词抽取算法可以广泛地被应用的信息检索和自然语言处理中。传统的关键词抽取算法很难使用外部的知识信息。
158 0
SIFRank New Baseline for Unsupervised Keyphrase Extraction Based on Pre-Trained Language Model
|
自然语言处理 数据挖掘 数据处理
【提示学习】Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
目前流行的第四大范式Prompt的主流思路是PVP,即Pattern-Verbalizer-Pair,主打的就是Pattern(模板)与Verbalizer(标签映射器)。   本文基于PVP,提出PET与iPET,但是关注点在利用半监督扩充自己的数据集,让最终模型学习很多样本,从而达到好效果。
109 0
|
数据挖掘
【提示学习】Prompt Tuning for Multi-Label Text Classification: How to Link Exercises to Knowledge Concept
文章这里使用的是BCEWithLogitsLoss,它适用于多标签分类。即:把[MASK]位置预测到的词表的值进行sigmoid,取指定阈值以上的标签,然后算损失。
|
机器学习/深度学习 存储 人工智能
大语言模型的预训练[3]之Prompt Learning:Prompt Engineering、Answer engineering、Multi-prompt learning、Training strategy详解
大语言模型的预训练[3]之Prompt Learning:Prompt Engineering、Answer engineering、Multi-prompt learning、Training strategy详解
大语言模型的预训练[3]之Prompt Learning:Prompt Engineering、Answer engineering、Multi-prompt learning、Training strategy详解
|
机器学习/深度学习 编解码 人工智能
Text to image综述阅读(2)A Survey and Taxonomy of Adversarial Neural Networks for Text-to-Image Synthesis
这是一篇用GAN做文本生成图像(Text to Image)的综述阅读报告。 综述名为:《A Survey and Taxonomy of Adversarial Neural Networks for Text-to-Image Synthesis》,发表于2019年,其将文本生成图像分类为Semantic Enhancement GANs, Resolution Enhancement GANs, Diversity Enhancement GANs, Motion Enhancement GANs四类,并且介绍了代表性model。
Text to image综述阅读(2)A Survey and Taxonomy of Adversarial Neural Networks for Text-to-Image Synthesis
下一篇
无影云桌面