task1

作者: 欧飞红 | 来源:发表于2020-02-14 16:37 被阅读0次

    线性回归

    反向传播算法

    什么叫反向传播,有没有直观理解?

    如何直观地解释 backpropagation 算法?

    推荐里面的第一、第二个答案

    pytorch常用函数

    本视频用了许多pytorch的函数,由于不是太了解pytorch内的函数,因此查询记录了一下。
    torch.ones()/torch.zeros(),与MATLAB的ones/zeros很接近。初始化生成
    均匀分布
    torch.rand(sizes, out=None) → Tensor
    返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。
    标准正态分布
    torch.randn(
    sizes, out=None) → Tensor
    返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。
    torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵
    torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵
    torch.Tensor是一种包含单一数据类型元素的多维矩阵,定义了7种CPU tensor和8种GPU tensor类型。
    random.shuffle(a):用于将一个列表中的元素打乱。shuffle() 是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。
    backward()是pytorch中提供的函数,配套有require_grad:
    1.所有的tensor都有.requires_grad属性,可以设置这个属性.x = tensor.ones(2,4,requires_grad=True)
    2.如果想改变这个属性,就调用tensor.requires_grad_()方法:   x.requires_grad_(False)

    yield

    彻底理解Python中的yield

    测试集与数据集

    模型训练的过程其实就是在求【参数】的过程,我们先假定某类【模型】(比如决策树模型),然后用【训练集】来训练,学习到对应的最优的【参数】。但是问题在于,我们没有办法保证我们假设的那个【模型】是最优的,我们极有可能假设错误对吧。那怎么办呢?有一个简单的解决方案就是我们假设一堆的模型,然后用【训练集】分别对这些模型来进行训练,学习到每一个【模型】中分别对应的参数——这是第一步,也就是【训练集】的任务。
    那么我们已经学习到了一堆的模型了,哪一个模型是最好的呢?这其实就是要来考察不同结构的模型在这些data上的优劣程度了。通常来说,我们用【超参数】来控制模型的结构(例如正则项系数、神经网络中隐层的节点个数,k值等)。那这个时候,我们就可以找一些数据来训练和学习我们具体的超参数了。用什么样的数据呢?直接用【训练集】肯定是不行的,因为我们现在的每一个模型都是用【训练集】来学习出来的,他们在【训练集】上的效果已经很好了,继续用它们来训练超参数不会有太大的效果,所以说我们就选择了使用【验证集】来选择这些超参数。这是第二步,也就是【验证集】的任务,我们也通常称之为【调参】。
    最后,当我们学习到了【参数】和【非参数】后,我们就确定了我们具体的模型结构,这个时候我们再用一些数据来测试这个模型在新的数据上的效果。因此,我们就不能够使用之前已经使用过的数据了,而要选择一个全新的数据集,这既是【测试集】。这个时候我们就要来看最后的结果怎么样,如果结果很好,那么说明一切顺利,但是如果结果很差,那问题出在哪里呢?其中可能的一个原因就是我们事先假定的那一类的【模型】(比如我们最先选择的决策树模型)并不是适合来分析这些数据,因此哪怕我们选择出了这一堆决策树模型中最好的一个(超参数的选择过程),它的效果依旧不怎么样。
    这里还有两个遗留的问题:
    (1)训练集、验证集和测试集的比例应该怎么去进行分配呢?
    传统上是6:2:2的比例,但是不同的情况下你的选择应当不同。这方面的研究也有很多,如果你想要知道我们在设置比例的时候应当参考那些东西,可以去看Isabelle Guyon的这篇论文:A scaling law for the validation-set training-set size ratio 。他的个人主页(http://www.clopinet.com/isabelle/)里也展示了他对于这个问题的研究。
    (2)训练集、验证集和测试集的数据是否可以有所重合?
    有些时候我们的数据太少了,又不想使用数据增强,那么训练集、验证集和测试集的数据是否可以有所重合呢?这方面的研究就更多了,各种交叉方法,感兴趣的话可以去看Filzmoser这一篇文章Repeated double cross validation

    Softmax与分类模型

    交叉熵到底是什么

    为什么交叉熵(cross-entropy)可以用于计算代价?

    答案1,2,4

    简单的交叉熵损失函数,你真的懂了吗?

    softmax函数为什么要用e的指数归一化

    softmax公式的得出方法大概解释可以解释为:
    首先假设样本与理论标准函数的误差(类似于线性回归那一章中生成数据时叠加上的高斯误差)服从正态分布(高斯分布),并且不同样本之间独立同分布,
    通过贝叶斯公式计算各个分类的概率,将高斯分布的公式带入公式之后化简得到。
    在一些地方softmax函数又被称为归一化指数(normalized exponential)

    补充说明一下,以上说明方法来自书籍pattern recognition and machine learning中的一种线性分类概率生成式模型,原文中softmax函数形式为

    p(C_{k}|x) = \frac{p(x|C_{k})p(C_{k})}{\sum_{j}p(x|C_{j})p(C_{j})}=\frac{\exp(a_{k})}{\sum_{j}\exp(a_{j})}

    其中

    a_{k}=\ln p(x|C_{k})p(C_{k})

    k为当前计算类别,j代表所有类别的索引
    本说明方式中softmax函数处理的是经过处理之后已经生成的概率

    网上另有证明多项式分布属于指数分布族后推导softmax函数的方法,处理的数据也是概率数据

    以上为目前学习得出的softmax函数为什么使用exp函数的说明,如有谬误欢迎指正

    反向传播算法要点

    反向传递求梯度前一定要梯度清零,以免累增。

    首先初始化梯度,计算完一次梯度,更新完之后,清零梯度,进行下一次的计算。

    SGD: Stochastic gradient descent

    关于softmax函数选择

    看完代码,明显softmax和其他模型最与众不同的特点就是softmax函数了,那么为什么选择softmax函数呢?
    softmax函数是来自于sigmoid函数在多分类情况下的推广,他们的相同之处:
    1.都具有良好的数据压缩能力是实数域R→[ 0 , 1 ]的映射函数,可以将杂乱无序没有实际含义的数字直接转化为每个分类的可能性概率。
    2.都具有非常漂亮的导数形式,便于反向传播计算。
    3.它们都是 soft version of max ,都可以将数据的差异明显化。
    相同的,他们具有着不同的特点,sigmoid函数可以看成softmax函数的特例,softmax函数也可以看作sigmoid函数的推广。
    1.sigmoid函数前提假设是样本服从伯努利 (Bernoulli) 分布的假设,而softmax则是基于多项式分布。首先证明多项分布属于指数分布族,这样就可以使用广义线性模型来拟合这个多项分布,由广义线性模型推导出的目标函数即为Softmax回归的分类模型。
    2.sigmoid函数用于分辨每一种情况的可能性,所以用sigmoid函数实现多分类问题的时候,概率并不是归一的,反映的是每个情况的发生概率,因此非互斥的问题使用sigmoid函数可以获得比较漂亮的结果;softmax函数最初的设计思路适用于首先数字识别这样的互斥的多分类问题,因此进行了归一化操作,使得最后预测的结果是唯一的。

    softmax函数的常数不变性

    即softmax(x)=softmax(x+c),推导如下:

    softmax(x_i)=\frac{exp(x_i)}{\sum_jexp(x_j)}

    (softmax(x+c))_i=\frac{exp(x_i+c)}{\sum_j exp(x_j+c)}=\frac{exp(c)exp(x_i)}{exp(c)\sum_jexp(x_j)}=\frac{exp(x_i)}{\sum_jexp(x_j)}=(softmax(x))_i

    上面的exp(c)之所以可以消除,是因为exp(a+b)=exp(a)*exp(b)这个特性将exp(c)提取出来了。
    在计算softmax概率的时候,为了保证数值稳定性(numerical stability),我们可以选择给输入项减去一个常数,比如x的每个元素都要减去一个x中的最大元素。当输入项很大的时候,如果不减这样一个常数,取指数之后结果会变得非常大,发生溢出的现象,导致结果出现inf。

    多层感知机

    激活函数的选择

    ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

    用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

    在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。

    在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。

    梯度消失

    简单地说,根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0。下面是数学推导推导。

    误差反向传播(BP)算法中为什么会产生梯度消失?

    回答一、二、三

    relu激活函数比sigmoid效果好为什么还用sigmoid?

    回答一

    Flatten Layer

    Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

    相关文章

      网友评论

          本文标题:task1

          本文链接:https://www.haomeiwen.com/subject/qzcjfhtx.html