动手学深度-Task1

大兔子大兔子 提交于 2020-02-16 10:10:09

线性回归:
太熟悉了,没什么需要记录的内容。

Softmax回归:
交叉熵
H(y(i),y^(i))=j=1qyj(i)logy^j(i), H\left(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}\right ) = -\sum_{j=1}^q y_j^{(i)} \log \hat y_j^{(i)},
分类问题中常用的损失函数,对比起平方损失函数,交叉熵只关心正确类别的概率(当一个样本只有一个标签时,公示中只有某个y^j(i)\hat y_j^{(i)}的值为1,其余为0, 因此损失函数可以进行简化)

softmax函数

  • 输出问题
    直接使用输出层的输出有两个问题:
    1. 一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果o1=o3=103o_1=o_3=10^3,那么输出值10却又表示图像类别为猫的概率很低。
    2. 另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。

softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:

y^1,y^2,y^3=softmax(o1,o2,o3) \hat{y}_1, \hat{y}_2, \hat{y}_3 = \text{softmax}(o_1, o_2, o_3)

其中

y^1=exp(o1)i=13exp(oi),y^2=exp(o2)i=13exp(oi),y^3=exp(o3)i=13exp(oi). \hat{y}1 = \frac{ \exp(o_1)}{\sum_{i=1}^3 \exp(o_i)},\quad \hat{y}2 = \frac{ \exp(o_2)}{\sum_{i=1}^3 \exp(o_i)},\quad \hat{y}3 = \frac{ \exp(o_3)}{\sum_{i=1}^3 \exp(o_i)}.

容易看出y^1+y^2+y^3=1\hat{y}_1 + \hat{y}_2 + \hat{y}_3 = 10y^1,y^2,y^310 \leq \hat{y}_1, \hat{y}_2, \hat{y}_3 \leq 1,因此y^1,y^2,y^3\hat{y}_1, \hat{y}_2, \hat{y}_3是一个合法的概率分布。这时候,如果y^2=0.8\hat{y}_2=0.8,不管y^1\hat{y}_1y^3\hat{y}_3的值是多少,我们都知道图像类别为猫的概率是80%。此外,我们注意到

argmaxioi=argmaxiy^i \underset{i}{\arg\max} o_i = \underset{i}{\arg\max} \hat{y}_i

因此softmax运算不改变预测类别输出。
课后习题做完后,发现softmax函数具有平移不变的特点
是否可以在softmax前对输入进行减均值的处理,从而减少softmax的运算量

吐槽开始:
以为课程真的从小白开始,结果上来就是pytorch, 机器学习向来”动口不动手“(惭愧)的我,一下子就蒙蔽了,里面很多对象用法以及函数都是完全蒙圈,咋办?自己从零开始。。。

基本概念

tensor

张量,跟numpy中的ndarray 多维数组很像,但不一样的在于tensor能被gpu加速,待加深理解

动态计算图

动态计算图(Dynamic Computation Graph)是PyTorch的最主要的特性
它可以让我们的计算模型更灵活、复杂
它可以让反向传播算法随时进行
ps: 不明觉厉
在这里插入图片描述
动态计算图就是一种算法模型。让我们很清晰的构建自己的算法,如上图,椭圆表示pytorch中一系列的计算过程,而方块表示变量,箭头表示依赖关系

自动微分

在训练一个神经网络的时候,梯度的计算是一个关键的步骤,它为神经网络的优化提供了关键的数据。但是在面临复杂神经网络的时候,导数的计算就会成为一个难题,要求人们解出复杂的、高维的方程式不现实的。这就是自动微分出现的原因,当前最流行的深度学习框架如PyTorch、Tensorflow等都提供了自动微分的支持,让人们只需要少量的工作就能自动计算出复杂函数的梯度

autograd

Tensor是PyTorch实现多维数组计算和自动微分的关键数据结构,一方面,它类似于numpy的ndarray,用户可以对Tensor进行各种数学计算;另一方面,当设置.requires_grad=True之后,在其上进行的各种操作就会被记录下来,用于后续的梯度计算,其内部实现的机制被称为动态计算图.

Variable变量:在pyTorch早期版本中,Tensor只负责多维数组的计算,自动微分的功能是由Variable来完成的。在现在的版本中,二者合二为一了

autograd机制能够记录作用于Tensor上的所有操作,生成一个动态计算图,图的叶子节点是输入的数据,根节点是输出的结果。当在根节点上调用.backward()的时候,就会从根到叶应用链式法则计算梯度。默认情况下,只有.require_grad和is_leaf两个属性都为True的节点才会被计算导数,并存储到grad中。
requires_grad属性

requires_grad属性默认为False,也就是Tensor变量默认是不需要求导的。如果一个节点的requires_grad是True,那么所有依赖它的节点requires_grad也会是True.换而言之,如果一个节点依赖的所有节点都不需要求导,那么它的requires_grad也会是FAlse。在反向传播的过程中,该节点所在的子图会被排除在外。
————————————————
版权声明:本文为CSDN博主「ronaldo_hu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ronaldo_hu/article/details/91359018

好吧。。。要补的内容还挺多的,线性回归倒是没什么特别值得记录的地方

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!