文本情感分类
作为nlp的常见任务,属于词嵌入模型的下游应用,情感分析应用场景广泛(也是我想写的方面)
使用CNN
一层卷积

def corr1d(X, K):
'''
@params:
X: 输入,形状为 (seq_len,) 的张量
K: 卷积核,形状为 (w,) 的张量
@return:
Y: 输出,形状为 (seq_len - w + 1,) 的张量
'''
w = K.shape[0] # 卷积窗口宽度
Y = torch.zeros((X.shape[0] - w + 1))
for i in range(Y.shape[0]): # 滑动窗口
Y[i] = (X[i: i + w] * K).sum()
return Y
X, K = torch.tensor([0, 1, 2, 3, 4, 5, 6]), torch.tensor([1, 2])
print(corr1d(X, K))
时序最大池化层
TextCNN模型
TextCNN 模型主要使用了一维卷积层和时序最大池化层。假设输入的文本序列由𝑛个词组成,每个词用𝑑维的词向量表示。那么输入样本的宽为𝑛,输入通道数为𝑑。TextCNN 的计算主要分为以下几步:
- 定义多个一维卷积核,并使用这些卷积核对输入分别做卷积计算。宽度不同的卷积核可能会捕捉到不同个数的相邻词的相关性。
- 对输出的所有通道分别做时序最大池化,再将这些通道的池化输出值连结为向量。
-
通过全连接层将连结后的向量变换为有关各类别的输出。这一步可以使用丢弃层应对过拟合。
下图用一个例子解释了 TextCNN 的设计。这里的输入是一个有 11 个词的句子,每个词用 6 维词向量表示。因此输入序列的宽为 11,输入通道数为 6。给定 2 个一维卷积核,核宽分别为 2 和 4,输出通道数分别设为 4 和 5。因此,一维卷积计算后,4 个输出通道的宽为 11−2+1=10,而其他 5 个通道的宽为 11−4+1=8。尽管每个通道的宽不同,我们依然可以对各个通道做时序最大池化,并将 9 个通道的池化输出连结成一个 9 维向量。最终,使用全连接将 9 维向量变换为 2 维输出,即正面情感和负面情感的预测。
TextCNN
数据增强
图像增广
图像增广(Image Augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。图像增广的另一种解释是,随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。例如,我们可以对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。我们也可以调整亮度、色彩等因素来降低模型对色彩的敏感度。
裁剪和翻转
左右翻转图像不改变物体的类别
Notes:
- 常用方法是左右翻转,不是上下翻转;
- 池化层能降低卷基层对目标位置的敏感(即使目标不在中心);
- 可以通过对图像随即裁剪让物体以不同的比例出现在不同的位置➡️降低模型对目标位置的敏感性;
变化颜色
可以从四个方面改变图像的颜色:
亮度(Brightness)、对比度(Contrast)、饱和度(Saturation)和色调(Hue)
同时设置上述四种参数
color_aug = torchvision.transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)
叠加多个图像增广
augs = torchvision.transforms.Compose([
torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)
使用图像增广训练模型
为了在预测时得到确定的结果,我们通常只将图像增广应用在训练样本上,而不在预测时使用含随机操作的图像增广。在这里我们只使用最简单的随机左右翻转。此外,我们使用ToTensor将小批量图像转成PyTorch需要的格式,即形状为(批量大小, 通道数, 高, 宽)、值域在0到1之间且类型为32位浮点数。
Steps
- 先定义train函数使用GPU训练并评价模型;
- 然后用定义train_with_data_aug函数使用图像增广训练模型;
- 使用Adam算法优化训练模型;
- 将图像增广应用于训练集数据之上;
- 调用刚才定义的train函数训练并评价模型
模型微调
为了避免不必要的数据过拟合,理论上的解决方法是收集更多数据,在考虑数据采集成本之后,我们将采用迁移学习(Transfer Learning)的思想,将从源数据集学到的知识迁移到目标数据集上。
