动手学深度学习Pytorch版本学习笔记 Task1

1. 深度学习基础模型

1.1 线性回归模型

线性回归的基本要素主要包括:模型、数据集、损失函数、优化函数。

在pytorch的实现中,可以自己从零开始实现,这样能更好的理解模型和神经网络底层的原理,但是pytorch有更加简洁的实现方式,这样能更加快速的完成模型的设计与实现。

在看代码过程中,再次回顾了python中yield的用法。可以先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器)。可以参考博客:https://blog.csdn.net/mieleizhi0522/article/details/82142856

1.2 softmax分类模型

直接使用输出层会有两个问题,一方面输出层的输出值的范围不确定,难以直观上判断值的意义,另一方面,由于真是标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量,softmax运算符很好的解决以上两个问题,它可以讲输出值变换成为正且和为1的概率分布。

从过这次的习题,思考了softmax的一个很容易理解但是容易忽略的特性,即softmax(x)=softmax(x-a),a为常数,很容易推导,在分子分母上同时约掉多出来的就还是原来的公式。这样还能很好的解决softmax运算的上溢和下溢问题。可以参考知乎:https://zhuanlan.zhihu.com/p/29376573

1.3 多层感知机

多层感知机主要由输入层,隐藏层和输出层组成。这一节主要总结了一下不同激活函数的进一步理解。神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

a.Sigmoid函数

特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.

缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。

缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

b.Tanh函数

它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

c.ReLU函数

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh

ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
 

 

 

你可能感兴趣的:(深度学习)