# CNN for Sentence Classification **Repository Path**: RyanDm/CNN_for_Sentence_Classification ## Basic Information - **Project Name**: CNN for Sentence Classification - **Description**: 使用 CNN 来进行句子情感分类 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-08 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CNN for Sentence Classification ### 前言:CNN for Sentence Classification 是一篇关于 如何使用CNN 来将句子分类的。文章地址:https://arxiv.org/abs/1408.5882 ### 准备: #### 需要技能:1.CNN 2.Embedding 3.PyTorch基础 #### CNN 介绍: CNN(Convolutional Neural Networks,卷积神经网络) 了解什么是CNN,首先要知道 什么是神经网络,神经网络是有一个个神经元组成,那什么是神经元呢? ![神经元](C:/Users/Ryan/Desktop/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/CNN%20for%20Sentence%20Classification/img/neuron.png) 这就是 一个神经元。它包括输入(A = [ $a_{1}$,$a_{2}$, ...] 和 偏置 1),权重(W=[ $w_{1}$, $w_{2}$ , ...]),激活函数(f)和输出 (t) 常见的激活函数有 sigmoid,softmax 等 关系为 $t = f(W^{T} * A + b)$ 通常 $a_{0}$= 1, $w_{0}$= b,就可以简写为 $t = f(w^{T} * A)$ ![神经网络](C:/Users/Ryan/Desktop/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/CNN%20for%20Sentence%20Classification/img/neuron_networks.jpg) 而神经网络 就是多个神经元组成的,前一个的输出是后一个的输入。 通常吧第一层成为 输入层(input layer),最后一层 称为 输出层(output layer),中间所有 称为 隐藏层 (hidden layer) 关系为 $a_{j + 1}^{i + 1} = f_{j}^{i}(W_{j}^{iT} * A_{i})$(上标是层数, 下标是属性) #### CNN CNN 的组成 1.卷积计算层(conv) 2.激励层(relu) 3.池化层(pool) 4.全连接层(fc) ##### 卷积层(conv) 使用一个滤波器(convolution kernel)从左到右 从上到下 进行线性乘积 求和。每次移动stride位置(stride 自己设 置)得到一个新的矩阵 例如下图 ![conv](C:/Users/Ryan/Desktop/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/CNN%20for%20Sentence%20Classification/img/cnn_conv.png) 输入形状为: [$N$, $C_{in}$, $H_{in}$, $W_{in}$] (N为样本数,$C_{in}为输入的层数, $H_{in}$为输入样本的高度,$W_{in}$为输入样本的宽度) 例如 一张有RGB 三通道的 128px * 128px 的图片 输入形状为:[N, 3, 128, 128] 输出形状为: [$N$, $C_{out}$, $H_{out}$, $W_{out}$] 其中:padding, stride, dilation, kernel_size 为一个[1, 2] 的数组 例如 [1, 2], $C_{out}$ 为输出通道 $$H_{out} = ⌊\frac{H_{in} + 2 * padding[0] - dilation[0] *(kernel\_size[0] - 1)}{stride[0]} + 1⌋ $$ $$W_{out} = ⌊\frac{W_{in} + 2 * padding[1] - dilation[1] *(kernel\_size[1] - 1)}{stride[]} + 1⌋ $$ 例如$C_{out} = 32$, padding = [0, 0], stride = [2, 2] dilation = [0, 0] , kernel_size=[2, 2]时: 输出为$[N, 32, 64, 64]$ ##### 激励层(ReLU) ReLU 是sigmoid 的变种 $$ z = W^{T} * A $$ $$ \begin{equation} ReLU(z)=\left\{ \begin{aligned} z ,&& z > 0 \\ z ,&& z <= 0 \\ \end{aligned} \right. \end{equation} $$ 图像为 ![relu](C:/Users/Ryan/Desktop/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/CNN%20for%20Sentence%20Classification/img/relu.jpg) ReLU的优点是收敛快,求梯度简单。 只改变数值不改变形状 ##### 池化层(pool) 有 最大值池化(maxpool),均值池化(averagepooling)等 池化层就是设置一个特定大小的矩阵,maxpool就是在这个矩阵中找到最大的,averagepooling就是取这个矩阵的 均值 maxpool: kernel_size= (2, 2),stride = 2 ![maxpool](C:/Users/Ryan/Desktop/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/CNN%20for%20Sentence%20Classification/img/maxpool.jpg) 经历过N次的 卷积层,激励层,池化层 最后 到达全连接层 输入形状为: [$N$, $C$, $H_{in}$, $W_{in}$] (N为样本数,$C_{in}$为输入的层数, $H_{in}$为输入样本的高度,$W_{in}$为输入样本的宽度) 例如 一张有RGB 三通道的 128px * 128px 的图片 输入形状为:[N, 3, 128, 128] 输出形状为: [$N$, $C$, $H_{out}$, $W_{out}$] 其中:padding, stride, dilation, kernel_size 为一个[1, 2] 的数组 例如 [1, 2], $C_{out}$ 为输出通道 $$H_{out} = ⌊\frac{H_{in} + 2 * padding[0] - dilation[0] *(kernel\_size[0] - 1)}{stride[0]} + 1⌋ $$ $$W_{out} = ⌊\frac{W_{in} + 2 * padding[1] - dilation[1] *(kernel\_size[1] - 1)}{stride[]} + 1⌋ $$ 例如padding = [0, 0], stride = [2, 2] dilation = [0, 0] , kernel_size=[2, 2]时: 输出为$[N, 3, 64, 64]$ ##### ##### 全连接层 经过上述的操作之后,图片(或其他)就已经被分割成各个部分,而全连接层的任务就是 将各个部分连接在一起, 最后 进行分类(或其他预测)。 ![fully](C:/Users/Ryan/Desktop/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/CNN%20for%20Sentence%20Classification/img/full.jpg) #### Embeding Embedding 是一个将离散变量转为连续向量表示的一个方式。比如本文是word embedding 将每个字映射成一个向量,意思相近的词其对应的向量距离也十分相近,这是one-hot 编码做不到的。 本文使用的是google 的Word2Vec 假设有一个长度为 n的句子,即[$w_{1}$, $w_{2}$, $w_{3}$, ... ,$w_{n}$] (其中$w_{i}$ 为一个单词),假设每个单词与其最近的单词意思最相近(l例如:$w_{i}$ 与 $w_{i -1}$ , $w_{i+1}$ 意思十分相近),这样的话每个词都由其相近的词所决定或附近的词决定了这个单词。 所以我们就可以这样设置样本,利用$w_{i}$ 来预测[$w_{i-c}$, ..., $w_{i-1}$, $w_{i+1}$, ..., $w_{i+c}$] 。然后就可以看成是多分类问题使用softmax就好。 参考文章: 参考代码:https://github.com/graykode/nlp-tutorial/tree/master/1-2.Word2Vec