更新时间:2024-05-20 10:13:37作者:佚名
在《卷积神经网络》中我们探讨了如何使用2D卷积神经网络来处理2D图像数据。 在之前的语言模型和文本分类任务中,我们将文本数据视为只有一维的时间序列网络情感文章,很自然地使用递归神经网络来表示此类数据。 事实上,我们也可以将文本视为一维图像,这样我们就可以使用一维卷积神经网络来捕获相邻单词之间的关联。
目录
介绍
它是一种利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在《for》中提出。
结构图:
第一层将单词嵌入到低维向量中。 下一层使用多个过滤器大小对嵌入的词向量执行卷积。 例如,一次滑动 3、4 或 5 个单词。 接下来,将卷积层的结果 max-pool 为长特征向量,添加正则化,并使用 分类结果。 与传统的图像CNN网络相比,网络结构没有变化(甚至更简单)。 从图中可以看出,实际上只有一层卷积,一层max-,最后输出外接n个分类。
与图像中的CNN网络相比,最大的区别在于输入数据的不同:图像是二维数据,图像的卷积核从左到右、从上到下滑动进行特征提取。 自然语言是一维数据。 虽然通过word-生成二维向量,但是通过从左向右滑动来对词向量进行卷积是没有意义的。 例如“今天”对应的向量为[0, 0, 0, 0, 1],根据1*2的窗口大小,从左向右滑动得到四个向量[0,0],[ 0,0]、[0,0]、[0, 1],分别对应“今天”这个词汇,这个滑点没有帮助。
成功并不是网络结构的成功,而是引入已经训练好的词向量,在多个数据集上实现超越的性能,这进一步证明更好的构建是提高各种nlp任务的关键能力。
最大的优点是网络结构简单。 当模型网络结构如此简单的时候,引入已经训练好的词向量仍然有非常好的效果,超越了很多数据集。 网络结构简单,参数数量少,计算量小,训练速度快。 在单卡v100机器上,训练165万个数据,迭代26万步,半小时左右即可实现收敛。
过程
分词构建词向量
使用预先训练的词向量作为层。 对于数据集中的所有单词,因为每个单词都可以表示为一个向量,所以我们可以得到一个嵌入矩阵M,M中的每一行都是一个词向量。 这个M可以是(),即固定的。 可以是非静态的,即可以基于反向传播进行更新。
如图所示,第一段“今天天气很好,出来玩”变成“今天的/天气/很好/,/出来/玩”,将每个单词映射成5维(维度可以自己指定)词向量,如“今天”->[0,0,0,0,1],“天气”->[0,0,0,1,0],“很好”- >[0 ,0,1,0,0] 等等。
这样做的主要好处是将自然语言数字化,以方便后续处理。 从这里也可以看出,不同的映射方法会对最终的结果产生巨大的影响。 nlp中最热门的研究方向是如何将自然语言映射成更好的词向量。 构建完词向量后,我们将所有词向量连接起来形成一个 6*5 的二维矩阵作为初始输入。
卷积
输入一个句子,首先对句子进行分词,假设有s个单词。 对于每个单词,连同句子嵌入矩阵M,可以获得词向量。 假设词向量共有d维。 那么对于这句话,我们就可以得到s行d列的矩阵$AR^{stimes d}$。 我们可以将矩阵A视为图像,并使用卷积神经网络来提取特征。 由于句子中相邻单词之间的相关性总是很高,因此可以使用一维卷积。 卷积核的宽度是词向量的d维,高度是可以设置的超参数。
假设有一个卷积核,它是一个宽度为d、高度为h的矩阵w,那么w有h*d个参数需要更新。 对于一个句子,经过层之后就可以得到矩阵$R^{stimes d}$。 $A[i:j]$表示A的第i行到第j行,那么卷积运算可以用下面的公式表示: $o_i = w cdot A[i:i+h-1 ]$
叠加偏置b并使用激活函数f激活它以获得所需的特征。 公式如下:$c_i=f(o_i+b)$
对于一个卷积核,可以得到特征$cR^{s-h+1}$,总共$s−h+1$个特征。 我们可以使用更多不同高度的卷积核来获得更丰富的特征表达。
卷积是一种数学运算符。我们用一个简单的例子来说明
就是卷积后的输出。 输入的6*5矩阵通过卷积运算映射成3*1矩阵。 这个映射过程与特征提取的结果非常相似,所以最终的输出称为map。 一般来说,卷积之后会跟一个激活函数。 为了简化这里的解释,我们将激活函数设置为 f(x) = x
CNN经常提到一个词。 图中深红色矩阵和浅红色矩阵形成两个卷积核。 从这张图也可以看出,每一个并不一定要严格一样。 每个4*5矩阵与输入矩阵进行卷积运算,得到一张图。 在计算机视觉中,由于彩色图像中有R、G、B三种颜色英语作文,因此每种颜色代表一种颜色。 根据原论文作者的描述,最初引入它是希望防止过拟合(通过确保学习到的数据不会偏离输入太多)以在小数据集上获得更好的性能。 后来发现直接使用正则化效果更佳。 好的。 不过,与单次使用相比,每次都可以使用不同的单词。 比如可以对词向量进行no-(梯度可以反向传播)的微调,使得词向量更适合当前的训练。 至于是否有用,从论文的实验结果来看,Duo 并没有显着提高模型的分类能力。 七个数据集中有五个的表现优于 Duo。
这里我们也介绍一下论文中四种模型的区别:
池化
不同尺寸的卷积核得到的特征(图)尺寸也不同,因此我们对每个图使用池化函数,使它们具有相同的尺寸。 最常用的是1-max,提取地图照片的最大值。 这样网络情感文章,每个卷积核得到的特征就是一个值。 所有卷积核都使用1-max,然后级联得到最终的特征向量。 然后将该特征向量输入到该层进行分类。 这里可以使用drop out来防止过拟合。
得到=[1,1,2]后,选择一个最大值[2]作为输出,即max-。 max-在保持主要特征的同时,大大减少了参数数量。 从图中可以看出,地图从三维变成了一维。 好处如下:
它本身不能带来平移不变性(图中有一个字母A,这个字母A无论出现在图片的哪个位置,CNN网络中都能被识别),只能共享卷积核的权值。 max-的原理主要是从多个值中选择一个最大值,这是不能做到的。 CNN之所以能够实现平移不变性,是因为在滑动卷积核时,所使用的卷积核的权重保持固定(权重共享)。 假设卷积核被训练来识别字母A,当这个卷积核在整张图像上滑动时,它当然可以识别整张图像中的所有A。
使用k分类
如图所示,我们将max-拼接起来,喂入其中,得到各个类别,比如标签为1的概率和标签为-1的概率。 如果是预测的话,整个过程就到这里了。 如果是训练的话,会根据此时的预测标签和实际标签,以及函数、max-函数、激活函数和依次计算卷积核函数来更新它们。 四个函数中的参数完成一轮训练。
总结
上述过程可以用下图直观地表示:
使用Keras构建卷积神经网络进行情感分析
在自然语言领域,卷积的作用就是利用文本的局部特征。 一个词前后的词必须与该词本身相关,它们构成了该词所代表的词组。 然后词组将影响段落文本的含义并确定该段落是积极的还是消极的。 与传统方法相比,使用词袋、TF-IDF等,它们的思路是相似的。 但最大的区别在于,传统方法是人为构造特征进行分类,而深度学习中的卷积则让神经网络来构造特征。 以上就是卷积在自然语言处理中广泛应用的原因。 接下来,我们将介绍如何使用Keras构建卷积神经网络来处理情感分析的分类问题。
以下代码构建了卷积神经网络的结构:
from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv1D, MaxPooling1D from keras.models import Sequential from keras.layers.embeddings import Embedding from keras.datasets import imdb import numpy as np from keras.preprocessing import sequence (X_train, y_train), (X_test, y_test) = imdb.load_data() max_word = 400 X_train = sequence.pad_sequences(X_train, maxlen=max_word) X_test = sequence.pad_sequences(X_test, maxlen=max_word) vocab_size = np.max([np.max(X_train[i]) for i in range(X_train.shape[0])]) + 1 # 这里1 代表空格,其索引被认为是0。 model = Sequential() model.add(Embedding(vocab_size, 64, input_length=max_word)) model.add(Conv1D(filters=64, kernel_size=3, padding='same', activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(Dropout(0.25)) model.add(Conv1D(filters=128, kernel_size=3, padding='same', activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=100) scores = model.evaluate(X_test, y_test, verbose=1) print(scores)
整个模型的结构如下:
Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_1 (Embedding) (None, 400, 64) 5669568 _________________________________________________________________ conv1d_1 (Conv1D) (None, 400, 64) 12352 _________________________________________________________________ max_pooling1d_1 (MaxPooling1 (None, 200, 64) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 200, 64) 0 _________________________________________________________________ conv1d_2 (Conv1D) (None, 200, 128) 24704 _________________________________________________________________ max_pooling1d_2 (MaxPooling1 (None, 100, 128) 0 _________________________________________________________________ dropout_2 (Dropout) (None, 100, 128) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 12800) 0 _________________________________________________________________ dense_1 (Dense) (None, 64) 819264 _________________________________________________________________ dense_2 (Dense) (None, 32) 2080 _________________________________________________________________ dense_3 (Dense) (None, 1) 33 ================================================================= Total params: 6,528,001 Trainable params: 6,528,001 Non-trainable params: 0 _________________________________________________________________
超参数调整
在只有一层卷积的最简单结构中,以下超参数对模型性能有影响:
参考链接:
相关文章: 多层全连接神经网络与情感分析 深度学习算法 卷积神经网络(CNN) 机器学习算法 - Learn 中的异常检测算法 机器学习算法 朴素贝叶斯