Datawhale九月组队学习:情感分析
往期指路:
文章目录
前言
在这一小节中,我们将学习一种不使用RNN的方法:我们将实现论文 Bag of Tricks for Efficient Text Classification 中的模型,这个简单的模型实现了与第二章情感分析相当的性能,但训练速度要快得多。
笔记要点:
1. 模型搭建流程:
1、数据预处理
2、构建模型
3、训练模型
4、模型验证
2. 数据预处理要点记录:
与Task2不同,FastText分类模型与其他文本分类模型最大的不同之处在于其计算了输入句子的n-gram,并将n-gram作为一种附加特征来获取局部词序特征信息添加至标记化列表的末尾。n-gram的基本思想是,将文本里面的内容按照字节进行大小为n的滑动窗口操作,形成了长度是n的字节片段序列,其中每一个字节片段称为gram。具体而言,在这里我们使用bi-grams。
因此构建了【generate_bigrams函数】获取一个已经标注的句子,计算bigrams并将其附加到标记化列表的末尾。
3. 模型搭建要点记录:
FastText是一种典型的深度学习词向量的表示方法,通过将Embedding层将单词映射到稠密空间,然后将句子中所有单词在Embedding空间中进行平均,进而完成分类。所以这个模型参数量相较于上一章中的模型会减少很多。
pooled = F.avg_pool2d(embedded, (embedded.shape[1], 1)).squeeze(1)
关于squeeze()和unsqueeze()的理解如下:
-
squeeze()函数:对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行
-
unsqueeze()函数:函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度,比如原本有个三行的数据(3),在0的位置加了一维就变成一行三列(1,3)。
4. 模型训练要点记录:
model.train()和model.eval()用法和区别:参考链接点这里
1、model.train()和model.eval()的区别主要在于Batch Normalization和Dropout两层。
2、如果模型中有BN层(Batch Normalization)和 Dropout,需要在训练时添加model.train()。model.train()是保证BN层能够用到每一批数据的均值和方差。对于Dropout,model.train()是随机取一部分网络连接来训练更新参数。
3、如果模型中有BN层(Batch Normalization)和Dropout,在测试时添加model.eval()。model.eval()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。对于Dropout,model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。训练完train样本后,生成的模型model要用来测试样本。在model(test)之前,需要加上model.eval(),否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有BN层和Dropout所带来的的性质。
总结
以上就是Task03的全部内容了,接下来的学习继续坚持呀~。