1. 2020-02-14
训练回归模型所需要的信息包含-数据、模型、损失函数、优化函数(梯度下降算法)。
step 1:对数据进行预处理使其可以fit到模型中
step 2:构建模型
step 3:选择损失函数(回归模型一般用mse)和优化函数
step 4:迭代训练模型中的参数,并进行预测
回归问题转化为分类问题,分类问题相当于回归的输出是多个值。
回归的输出是实值可通过softmax将其转化为对应的概率值,且数组中的最大值所处的index不变。
引用交叉墒损失函数-衡量两个概率分布差异的测量函数。化简得最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。
多个全连接层的stack等价于一个全连接层,问题的根源在于全连接层只是对数据做仿射变换,而多个仿射变换的叠加仍然是一个仿射变换。可以通过解决非线性函数来解决该问题。
非线性激活函数如下:
1、ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素,该函数定义为 可以看出,ReLU函数只保留正数元素,并将负数元素清零。
2、Sigmoid函数可以将元素的值变换到0和1之间。 .导数在当输入为0时,sigmoid函数的导数达到最大值0.25;当输入越偏离0时,sigmoid函数的导数越接近0。
3、tanh(双曲正切)函数可以将元素的值变换到-1和1之间。
激活函数的选择
ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。
预处理通常包括四个步骤:
现有的分词工具,nltk.tokenize->word_tokenize;spacy
n元语法,防止序列长度增加,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。元语法通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面n个词相关,即n阶马尔可夫链。
元语法可能有哪些缺陷?参数空间过大,数据稀疏
两种采样方式,随机采样和相邻采样。对应的初始化方式不同。
卷积操作前w、h的长度
note: 为卷积后的w长度,p为padding长度,s为步长,k为卷积核大小。
卷积层与全连接层的对比:
二维卷积层经常用于处理图像,与此前的全连接层相比,它主要有两个优势:
一是全连接层把图像展平成一个向量,在输入图像上相邻的元素可能因为展平操作不再相邻,网络难以捕捉局部信息。而卷积层的设计,天然地具有提取局部信息的能力。
二是卷积层的参数量更少。
note:卷积核大小和图像大小相同时等价于全连接层。
训练误差:指模型在训练数据集上表现出的误差。
泛化误差:指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。
target:降低泛化误差。
数据集可分为:训练集、测试集、验证集(模型选择,例如-超参数)。
note:由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈,因此采用k折交叉验证。
欠拟合是模型无法得到较低的训练误差,我们将这一现象称作欠拟合;
过拟合是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合。
模型复杂度和训练数据集大小-过拟合及欠拟合的影响
模型复杂度越高越容易发生过拟合;
如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些。
过拟合的方法:正则化L1和L2及弹性网络,丢弃法-droupout。
当层数较多时,梯度的计算容易出现梯度消失或爆炸。
数据集可能存在的协变量、标签和概念偏移。
随着循环神经网络层数的增加可以出现梯度爆炸及消失,对应的使用梯度裁剪解决梯度爆炸。
困惑度是对交叉熵损失函数做指数运算后得到的值,使用它来对语言模型进行判定。特别地,
1、最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
2、最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
3、基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。
encoder:输入到隐藏状态
decoder:隐藏状态到输出
在训练时,将decoder的输出不作为它的属于。
可以关注到任意长度的字符信息。
有两种实现方式:点方式和多层感知器方式
Transformer同样基于编码器-解码器架构,其区别主要在于以下三点:
Transformer blocks:将seq2seq模型重的循环网络替换为了Transformer Blocks,该模块包含一个多头注意力层(Multi-head Attention Layers)以及两个position-wise feed-forward networks(FFN)。对于解码器来说,另一个多头注意力层被用于接受编码器的隐藏状态。
Add and norm:多头注意力层和前馈网络的输出被送到两个“add and norm”层进行处理,该层包含残差结构以及层归一化。
Position encoding:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。
一共包含7层:十分类问题。
卷积6x28x28-平均池化6x14x14-卷积16x10x10-平均池化16x5x5-全连接120-全连接84-全连接10。
卷积神经网络就是含卷积层的网络。 LeNet交替使用卷积层和最大池化层后接全连接层来进行图像分类。
AlexNet
1×1卷积核作用
1.放缩通道数:通过控制卷积核的数量达到通道数的放缩。
2.增加非线性。1×1卷积核的卷积过程相当于全连接层的计算过程,并且还加入了非线性激活函数,从而可以增加网络的非线性。
3.计算参数少
GoogLeNet
2. 训练机器学习模型时,如何判断数据量是否足够
需要观察拟合程度,一般来说如果出现明显的欠拟合,则是数据量不够,应该增大数据量到欠拟合不再明显为止。
3. CS231n-K近邻与线性分类器
1.易于理解,实现简单。
2.算法的训练不需要花时间,因为其训练过程只是将训练集数据存储起来。
1.测试要花费大量时间计算
2.Nearest Neighbor分类器在某些特定情况(比如数据维度较低)下,可能是不错的选择。但是在实际的图像分类工作中,很少使用。因为图像都是高维度数据(他们通常包含很多像素),而高维度向量之间的距离通常是反直觉的。
介绍了 图像分类 问题。在该问题中,给出一个由被标注了分类标签的图像组成的集合,要求算法能预测没有标签的图像的分类标签,并根据算法预测准确率进行评价。
介绍了一个简单的图像分类器: 最近邻分类器(Nearest Neighbor classifier) 。分类器中存在不同的超参数(比如k值或距离类型的选取),要想选取好的超参数不是一件轻而易举的事。
选取超参数的正确方法是:将原始训练集分为训练集和 验证集 ,我们在验证集上尝试不同的超参数,最后保留表现最好那个。
如果训练数据量不够,使用 交叉验证 方法,它能帮助我们在选取最优超参数的时候减少噪音。
一旦找到最优的超参数,就让算法以该参数在测试集跑且只跑一次,并根据测试结果评价算法。
最近邻分类器能够在CIFAR-10上得到将近40%的准确率。该算法简单易实现,但需要存储所有训练数据,并且在测试的时候过于耗费计算能力。
最后,我们知道了仅仅使用L1和L2范数来进行像素比较是不够的,图像更多的是按照背景和颜色被分类,而不是语义主体分身。
在接下来的课程中,我们将专注于解决这些问题和挑战,并最终能够得到超过90%准确率的解决方案。该方案能够在完成学习就丢掉训练集,并在一毫秒之内就完成一张图片的分类。
如果你希望将k-NN分类器用到实处(最好别用到图像上,若是仅仅作为练手还可以接受),那么可以按照以下流程:
预处理你的数据:对你数据中的特征进行归一化(normalize),让其具有零平均值(zero mean)和单位方差(unit variance)。在后面的小节我们会讨论这些细节。本小节不讨论,是因为图像中的像素都是同质的,不会表现出较大的差异分布,也就不需要标准化处理了。
如果数据是高维数据,考虑使用降维方法,比如PCA( wiki ref , CS229ref , blog ref )或 随机投影 。
将数据随机分入训练集和验证集。按照一般规律,70%-90% 数据作为训练集。这个比例根据算法中有多少超参数,以及这些超参数对于算法的预期影响来决定。如果需要预测的超参数很多,那么就应该使用更大的验证集来有效地估计它们。如果担心验证集数量不够,那么就尝试交叉验证方法。如果计算资源足够,使用交叉验证总是更加安全的(份数越多,效果越好,也更耗费计算资源)。
在验证集上调优,尝试足够多的k值,尝试L1和L2两种范数计算方式。
如果分类器跑得太慢,尝试使用Approximate Nearest Neighbor库(比如 FLANN )来加速这个过程,其代价是降低一些准确率。
对最优的超参数做记录。记录最优参数后,是否应该让使用最优参数的算法在完整的训练集上运行并再次训练呢?因为如果把验证集重新放回到训练集中(自然训练集的数据量就又变大了),有可能最优参数又会有所变化。在实践中, 不要这样做 。千万不要在最终的分类器中使用验证集数据,这样做会破坏对于最优参数的估计。 直接使用测试集来测试用最优参数设置好的最优模型 ,得到测试集数据的分类准确率,并以此作为你的kNN分类器在该数据上的性能表现。
引用:知乎-智能单元-杜客
CS231n课程笔记翻译:图像分类笔记(上)
CS231n课程笔记翻译:图像分类笔记(下)
4. 数据量不够,如何在少部分数据的基础上生成大量的数据
这类似于半监督学习,先把少量数据生成标签,并统计出分布规律,然后按照相同分布,采用半监督方法,让计算机自动生成类似的大量数据。
5. 当数据量不够大的时候,有什么方法可以提高CNN训练效果
做图像增强,扭曲翻转等等,keras里面好像有集成
6. 数据增强的方法有哪些
1 什么是数据增强?
数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。
比如上图,第1列是原图,后面3列是对第1列作一些随机的裁剪、旋转操作得来。
每张图对于网络来说都是不同的输入,加上原图就将数据扩充到原来的10倍。假如我们输入网络的图片的分辨率大小是256×256,若采用随机裁剪成224×224的方式,那么一张图最多可以产生32×32张不同的图,数据量扩充将近1000倍。虽然许多的图相似度太高,实际的效果并不等价,但仅仅是这样简单的一个操作,效果已经非凡了。
如果再辅助其他的数据增强方法,将获得更好的多样性,这就是数据增强的本质。
数据增强可以分为,有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强和多样本数据增强方法,无监督的数据增强分为生成新的数据和学习增强策略两个方向。
2 有监督的数据增强
有监督数据增强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据增强和多样本数据增强,其中单样本又包括几何操作类,颜色变换类。
2.1. 单样本数据增强
所谓单样本数据增强,即增强一个样本的时候,全部围绕着该样本本身进行操作,包括几何变换类,颜色变换类等。
(1) 几何变换类
几何变换类即对图像进行几何变换,包括翻转,旋转,裁剪,变形,缩放等各类操作,下面展示其中的若干个操作。
水平翻转和垂直翻转
随机旋转
随机裁剪
变形缩放
翻转操作和旋转操作,对于那些对方向不敏感的任务,比如图像分类,都是很常见的操作,在caffe等框架中翻转对应的就是mirror操作。
翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。通常在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,一般都是裁剪输入的多个版本然后将结果进行融合,对预测的改进效果非常明显。
以上操作都不会产生失真,而缩放变形则是失真的。
很多的时候,网络的训练输入大小是固定的,但是数据集中的图像却大小不一,此时就可以选择上面的裁剪成固定大小输入或者缩放到网络的输入大小的方案,后者就会产生失真,通常效果比前者差。
(2) 颜色变换类
上面的几何变换类操作,没有改变图像本身的内容,它可能是选择了图像的一部分或者对像素进行了重分布。如果要改变图像本身的内容,就属于颜色变换类的数据增强了,常见的包括噪声、模糊、颜色变换、擦除、填充等等。
基于噪声的数据增强就是在原来的图片的基础上,随机叠加一些噪声,最常见的做法就是高斯噪声。更复杂一点的就是在面积大小可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以Coarse Dropout方法为代表,甚至还可以对图片上随机选取一块区域并擦除图像信息。
添加Coarse Dropout噪声
颜色变换的另一个重要变换是颜色扰动,就是在某一个颜色空间通过增加或减少某些颜色分量,或者更改颜色通道的顺序。
颜色扰动
还有一些颜色变换,本文就不再详述。
几何变换类,颜色变换类的数据增强方法细致数还有非常多,推荐给大家一个git项目:
https://github.com/aleju/imgaug
预览一下它能完成的数据增强操作吧。
2.2. 多样本数据增强
不同于单样本数据增强,多样本数据增强方法利用多个样本来产生新的样本,下面介绍几种方法。
(1) SMOTE[1]
SMOTE即Synthetic Minority Over-sampling Technique方法,它是通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能。
类不平衡现象是很常见的,它指的是数据集中各类别数量不近似相等。如果样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占总体的1%,则即使小样本被错误地全部识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到99%,但由于没有学习到小样本的特征,实际分类效果就会很差。
SMOTE方法是基于插值的方法,它可以为小样本类合成新的样本,主要流程为:
第一步,定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率N;
第二步,对每一个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点,满足以下公式:
第三步,重复以上的步骤,直到大、小样本数量平衡。
该方法的示意图如下。
在python中,SMOTE算法已经封装到了imbalanced-learn库中,如下图为算法实现的数据增强的实例,左图为原始数据特征空间图,右图为SMOTE算法处理后的特征空间图。
(2) SamplePairing[2]
SamplePairing方法的原理非常简单,从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。
经SamplePairing处理后可使训练集的规模从N扩增到N×N。实验结果表明,因SamplePairing数据增强操作可能引入不同标签的训练样本,导致在各数据集上使用SamplePairing训练的误差明显增加,而在验证集上误差则有较大幅度降低。
尽管SamplePairing思路简单,性能上提升效果可观,符合奥卡姆剃刀原理,但遗憾的是可解释性不强。
(3) mixup[3]
mixup是Facebook人工智能研究院和MIT在“Beyond Empirical Risk Minimization”中提出的基于邻域风险最小化原则的数据增强方法,它使用线性插值得到新样本数据。
令(xn,yn)是插值生成的新数据,(xi,yi)和(xj,yj)是训练集随机选取的两个数据,则数据生成方式如下
λ的取值范围介于0到1。提出mixup方法的作者们做了丰富的实验,实验结果表明可以改进深度学习模型在ImageNet数据集、CIFAR数据集、语音数据集和表格数据集中的泛化误差,降低模型对已损坏标签的记忆,增强模型对对抗样本的鲁棒性和训练生成对抗网络的稳定性。
SMOTE,SamplePairing,mixup三者思路上有相同之处,都是试图将离散样本点连续化来拟合真实样本分布,不过所增加的样本点在特征空间中仍位于已知小样本点所围成的区域内。如果能够在给定范围之外适当插值,也许能实现更好的数据增强效果。
3 无监督的数据增强
无监督的数据增强方法包括两类:
(1) 通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN[4]。
(2) 通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment[5]。
3.1 GAN
关于GAN(generative adversarial networks),我们已经说的太多了。它包含两个网络,一个是生成网络,一个是对抗网络,基本原理如下:
(1) G是一个生成图片的网络,它接收随机的噪声z,通过噪声生成图片,记做G(z) 。
(2) D是一个判别网络,判别一张图片是不是“真实的”,即是真实的图片,还是由G生成的图片。
GAN的以假乱真能力就不多说了。
2 Autoaugmentation[5]
AutoAugment是Google提出的自动选择最优数据增强方案的研究,这是无监督数据增强的重要研究方向。它的基本思路是使用增强学习从数据本身寻找最佳图像变换策略,对于不同的任务学习不同的增强方法,流程如下:
(1) 准备16个常用的数据增强操作。
(2) 从16个中选择5个操作,随机产生使用该操作的概率和相应的幅度,将其称为一个sub-policy,一共产生5个sub-polices。
(3) 对训练过程中每一个batch的图片,随机采用5个sub-polices操作中的一种。
(4) 通过模型在验证集上的泛化能力来反馈,使用的优化方法是增强学习方法。
(5) 经过80~100个epoch后网络开始学习到有效的sub-policies。
(6) 之后串接这5个sub-policies,然后再进行最后的训练。
总的来说,就是学习已有数据增强的组合策略,对于门牌数字识别等任务,研究表明剪切和平移等几何变换能够获得最佳效果。
7. NLP中简单的数据增强方法
训练机器学习或深度学习模型时,良好的数据往往是影响模型的效果最重要的因素之一。而数据不足时数据增强是一个常用的方法。
数据增强的方法可以作为我们训练nlp模型时一个快速改善 数据不平衡 或 数据缺失 的等问题。
1,增加训练的数据量,提高模型的泛化能力
2,增加噪声数据,提升模型的鲁棒性
现有NLP的Data Augmentation大致有两条思路,
(1) 同义词替换(SR: Synonyms Replace): 不考虑stopwords,在句子中随机抽取n个词,然后从同义词词典中随机抽取同义词,并进行替换。
Eg: “我非常喜欢这部电影” —> “我非常喜欢这个影片”,句子仍具有相同的含义,很有可能具有相同的标签。
(2) 随机插入(RI: Randomly Insert): 不考虑stopwords,随机抽取一个词,然后在该词的同义词集合中随机选择一个,插入原句子中的随机位置。该过程可以重复n次。
Eg : “我非常喜欢这部电影” —> “爱我非常喜欢这部影片”。
(3) 随机交换(RS: Randomly Swap): 句子中,随机选择两个词,位置交换。该过程可以重复n次。
Eg: “如何评价 2017 知乎看山杯机器学习比赛?” —> “2017 机器学习?如何比赛知乎评价看山杯”。
(4) 随机删除(RD: Randomly Delete): 句子中的每个词,以概率p随机删除。
Eg: “如何评价 2017 知乎看山杯机器学习比赛?" —> “如何 2017 看山杯机器学习 ”。
回翻方法中,我们用机器翻译把一段中文翻译成另一种语言,然后再翻译回中文。
Eg: “周杰伦是一位华语乐坛的实力唱将,他的专辑卖遍了全球。
" —>“Jay Chou is a strength singer in the Chinese music scene, his albums are sold all over the world.
”—>“周杰伦是中国音乐界的优秀歌手,他的专辑畅销全世界。”
这个方法已经成功的被用在Kaggle恶意评论分类竞赛中。反向翻译是NLP在机器翻译中经常使用的一个数据增强的方法,其本质就是 快速产生一些翻译结果达到增加数据的目的 。
回译的方法往往能 够增加文本数据的多样性 ,相比替换词来说,有时可以改变句法结构等,并保留语义信息。但是,回译的方法产生的数据依赖于 翻译的质量 ,大多数出现的翻译结果可能并不那么准确。
采用深度学习模型的方法主要为 生成和原数据相类似的数据 。
(1)增加的数据要保证和原数据一致的语义信息。
(2)增加的数据需要多样化。
抄自原文:
8. 数据少合适用卷积神经网络进行训练测试吗
具体得看少到什么程度了
扭曲变形确实能提高一些样本数据数量,但数据太少的话,不如直接用线性分类器或者SVM
9. 神经网络,训练样本500条,为什么比训练样本6000条,训练完,500条预测比6000条样本好!
并非训练样本越多越好,因课题而异。 1、样本最关键在于正确性和准确性。你所选择的样本首先要能正确反映该系统过程的内在规律。我们从生产现场采得的样本数据中有不少可能是坏样本,这样的样本会干扰你的神经网络训练。通常我们认为坏样本只是个别现象,所以我们希望通过尽可能大的样本规模来抵抗坏样本造成的负面影响。 2、其次是样本数据分布的均衡性。你所选择的样本最好能涉及到该系统过程可能发生的各种情况,这样可以极大可能的照顾到系统在各个情况下的规律特征。通常我们对系统的内在规律不是很了解,所以我们希望通过尽可能大的样本规模来“地毯式”覆盖对象系统的方方面面。 3、再次就是样本数据的规模,也就是你要问的问题。在确保样本数据质量和分布均衡的情况下,样本数据的规模决定你神经网络训练结果的精度。样本数据量越大,精度越高。由于样本规模直接影响计算机的运算时间,所以在精度符合要求的情况下,我们不需要过多的样本数据,否则我们要等待很久的训练时间。 补充说明一下,不论是径向基(rbf)神经网络还是经典的bp神经网络,都只是具体的训练方法,对于足够多次的迭代,训练结果的准确度是趋于一致的,方法只影响计算的收敛速度(运算时间),和样本规模没有直接关系。如何确定何时训练集的大小是“足够大”的? 神经网络的泛化能力主要取决于3个因素: 1.训练集的大小 2.网络的架构 3.问题的复杂程度 一旦网络的架构确定了以后,泛化能力取决于是否有充足的训练集。合适的训练样本数量可以使用Widrow的拇指规则来估计。 拇指规则指出,为了得到一个较好的泛化能力,我们需要满足以下条件(Widrow and Stearns,1985;Haykin,2008): N = nw / e 其中,N为训练样本数量,nw是网络中突触权重的数量,e是测试允许的网络误差。 因此,假如我们允许10%的误差,我们需要的训练样本的数量大约是网络中权重数量的10倍。