目录链接:吴恩达Deep Learning学习笔记目录
1.深度学习的兴起
2.神经网络基础
3.浅层神经网络
4.深度神经网络
1.深度学习的兴起
首先,神经网络不仅仅能处理结构化的数据,同时也能处理非结构化的数据,如图片、语音、自然语言等;
其次,在早期,我们获取的数据规模都较小,SVM、logistics、regression等都能够表现出较好的性能,但随着数据规模的急剧增长,传统机器学习的性能趋于平稳,不再增长,而深度学习随着神经网络规模增加,其性能也随之增加,但前提是大量的数据(如图Scale drives deep learning progress
);
最后,神经网络在很早之前就已经出现,但并未取得令人瞩目的表现,一方面是由于数据量的限制,一方面是对于计算能力需求较大,近年来计算机Computation能力的提升,使得深度学习得以实现。此外,一些能够使神经网络运行加快的算法的提出,也促进了深度学习的发展,如从激活函数
sigmoid
到ReLu
的转变,使得计算过程中梯度不会趋向于0,避免了梯度趋向于0时导致的训练缓慢。
2.神经网络基础
2.1 Binary Classification
一张RGB图片,有三个通道,假设该图片为64x64的,则可将其表示为3个64x64的像x素矩阵,将三个矩阵展平为一个向量x=[255,231,...,255,134,...,255,134,93...]T
,将向量输入神经网络x后,输出预测结果y
,y=1
则为cat。对于训练集(X,Y)
,X.shape=x[n,m],Y.shape=[1,m]
,m为样本数。
2.2 Losistic Regression
给出图片的x
向量输入,预测该图片为一只猫的概率y^ = P(y=1|x)
,x
为n维的向量,参数w
也是一个n维向量,b
为一个实数。如果按照线性回归的方法,那么输出y^ = wT*x + b
,但在做概率预测时,希望输出值介于0~1,而线性回归无法实现。Logistic通过激活函数sigmoid
函数来实现输出结果介于(0,1),y^ = sigmoid(wT*x + b)
。
(1)损失函数
Loss函数所计算的是单个样本预测结果与真实结果之间的误差,Cost函数是用于描述整个训练集所有样本的误差,即Loss函数的平均。
(2)梯度下降
2.3 计算图
计算过程可以将其分解为计算流程图,正向计算为函数结果,通过反向计算来更新参数。
在最小化代价函数的过程中,如果我们采用
for
循环来写梯度下降过程,那么需要两层for
循环,第一层用于更新参数w
及计算代价函数,第二层用于遍历每个样本,并计算每个特征对应权重的导数及其平均值。但是,采用for循环来遍历每一个样本的效率是极低的,我们通过向量化来避免显式的
for
循环结构,以提高代码的效率。
2.4 numpy向量的tips
(1)注意向量的shape
a = np.random.randn(5,1)
b = np.random.randn(1,5)
c = np.dot(a,b)#将得到一个矩阵
#若a = np.random.randn(5),则会得到一个实数,因为此时a.shape=(5,)
(2)当不确定所得到向量的shape时,代码中添加assert(a.shape == (5,1))
,或调用reshape()
函数。
3.浅层神经网络
3.1神经网络表示
下图是一个双层的神经网络,由input layer、hidden layer、output layer构成。[]
表示层数,下标
表示单元数。
输出结果计算过程:
①单个神经元中,先进行线性计算的到z,再通过激活函数得到输出a,a将作为下一层的输入;
②这里的
x1
,x2
,x3
是指特征数量,而不是样本数,在作为神经网络输入的时候,输入矩阵为[n,m]
矩阵,m指样本数;③单个样本输入神经网络时,为
[3,1]
矩阵,W[1]i
为长度3的向量,W[1]
为[4,3]
的矩阵,所以第[1]
层Z计算过程为[u,n]*[n,1]=[u,1]
,u
为第[1]
层神经元个数。④对于多个样本的计算:
[u,n]*[n,m]=[u,m]
,每一行代表一个神经元,一行中m个值即m个样本通过该神经元计算得到的值。
3.2激活函数
(1)激活函数比较
在此之前我们一直采用的激活函数为 sigmoid
函数,但在神经网络中,其性能总是不太令人满意。
sigmoid
:存在梯度弥散,收敛速度下降、不是关于原点对称、计算exp耗时;
tanh
:解决了原点对称问题,计算比sigmoid函数更快;
ReLu
:梯度弥散未完全解决,在负x轴部分,相当于神经元死亡,且不会复活,收敛更快;
leaky ReLu
:克服了ReLu
的缺点。
在做二分类任务时,输出层采用sigmoid函数较为适用,因为其将输出限制到0-1之间,而其他层则可以采用其他激活函数,避免sigmoid函数带来的问题。
为什么神经网络需要非线性激活函数呢?
如果将非线性激活函数替换成线性激活函数,那么模型的输出仅仅是输入特征的线性组合,各层的参数叠加后,完全退缩到了线性回归的问题上,神经网络将毫无意义。或者可以将激活函数理解为神经网络的思考过程,筛选特征信息的内容,判断是否将其输出。
(2)神经网络的梯度下降
4.深度神经网络
如果用浅层网络来,要实现计算结果,理论上其时间复杂度为O(2^n),但深层网络的时间复杂度为O(log n)。