吴恩达Deep Learning学习笔记——第一课 神经网络与深度学习

目录链接:吴恩达Deep Learning学习笔记目录

1.深度学习的兴起
2.神经网络基础
3.浅层神经网络
4.深度神经网络

1.深度学习的兴起

  首先,神经网络不仅仅能处理结构化的数据,同时也能处理非结构化的数据,如图片、语音、自然语言等;
  其次,在早期,我们获取的数据规模都较小,SVM、logistics、regression等都能够表现出较好的性能,但随着数据规模的急剧增长,传统机器学习的性能趋于平稳,不再增长,而深度学习随着神经网络规模增加,其性能也随之增加,但前提是大量的数据(如图Scale drives deep learning progress);

image.png

  最后,神经网络在很早之前就已经出现,但并未取得令人瞩目的表现,一方面是由于数据量的限制,一方面是对于计算能力需求较大,近年来计算机Computation能力的提升,使得深度学习得以实现。此外,一些能够使神经网络运行加快的算法的提出,也促进了深度学习的发展,如从激活函数sigmoidReLu的转变,使得计算过程中梯度不会趋向于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为样本数。

image.png

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函数的平均。

image.png

(2)梯度下降
image.png

2.3 计算图

  计算过程可以将其分解为计算流程图,正向计算为函数结果,通过反向计算来更新参数。

image.png

  在最小化代价函数的过程中,如果我们采用for循环来写梯度下降过程,那么需要两层for循环,第一层用于更新参数w及计算代价函数,第二层用于遍历每个样本,并计算每个特征对应权重的导数及其平均值。
image.png

  但是,采用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构成。[]表示层数,下标表示单元数。

image.png

输出结果计算过程:
①单个神经元中,先进行线性计算的到z,再通过激活函数得到输出a,a将作为下一层的输入;
②这里的x1x2x3是指特征数量,而不是样本数,在作为神经网络输入的时候,输入矩阵为[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个样本通过该神经元计算得到的值。

image.png
image.png

image.png

3.2激活函数

(1)激活函数比较
  在此之前我们一直采用的激活函数为  sigmoid函数,但在神经网络中,其性能总是不太令人满意。
  sigmoid:存在梯度弥散,收敛速度下降、不是关于原点对称、计算exp耗时;
  tanh:解决了原点对称问题,计算比sigmoid函数更快;
  ReLu:梯度弥散未完全解决,在负x轴部分,相当于神经元死亡,且不会复活,收敛更快;
  leaky ReLu:克服了ReLu的缺点。
  在做二分类任务时,输出层采用sigmoid函数较为适用,因为其将输出限制到0-1之间,而其他层则可以采用其他激活函数,避免sigmoid函数带来的问题。
  为什么神经网络需要非线性激活函数呢?
  如果将非线性激活函数替换成线性激活函数,那么模型的输出仅仅是输入特征的线性组合,各层的参数叠加后,完全退缩到了线性回归的问题上,神经网络将毫无意义。或者可以将激活函数理解为神经网络的思考过程,筛选特征信息的内容,判断是否将其输出。
(2)神经网络的梯度下降

image.png

image.png

4.深度神经网络

image.png

image.png

  如果用浅层网络来,要实现计算结果,理论上其时间复杂度为O(2^n),但深层网络的时间复杂度为O(log n)。


image.png

你可能感兴趣的:(吴恩达Deep Learning学习笔记——第一课 神经网络与深度学习)