神经网络和深度学习基本概念

本文是深度学习课程的第一部分,介绍了神经网络的基本概念,包括监督学习、神经网络的构成以及为何深度学习受到重视。内容涵盖欢迎、神经网络定义、监督学习和深度学习兴起的原因。同时,讲解了逻辑回归的基础知识,如代价函数和梯度下降法,以及计算图和向量化在神经网络编程中的重要性。

第一门课 神经网络和深度学习(Neural Networks and Deep Learning)

第一周:深度学习引言(Introduction to Deep Learning)

1.1 欢迎(Welcome)

  • 在第一门课程中,你将学习如何建立神经网络(包含一个深度神经网络),以及如何在数据上面训练他们。在这门课程的结尾,你将用一个深度神经网络进行辨认猫。
  • 在第二门课中,我们将使用三周时间。你将进行深度学习方面的实践,学习严密地构建神经网络,如何真正让它表现良好,因此你将要学习超参数调整、正则化、诊断偏差和方差以及一些高级优化算法,比如MomentumAdam算法,犹如黑魔法一样根据你建立网络的方式。第二门课只有三周学习时间。
  • 在第三门课中,我们将使用两周时间来学习如何结构化你的机器学习工程。事实证明,构建机器学习系统的策略改变了深度学习的错误。
  • 在第四门课程中,我们将会提到卷积神经网络(CNN(s))
  • 在第五门课中,你将会学习到序列模型,以及如何将它们应用于自然语言处理,以及其它问题。
    • 序列模型包括的模型有循环神经网络(RNN)、全称是长短期记忆网络(LSTM)。你将在课程五中了解其中的时期是什么含义,并且有能力应用到自然语言处理(NLP)问题。

1.2 什么是神经网络?(What is a Neural Network)

image-20200921195656970

R e l u = m a x ( 0 , x ) Relu = max(0,x) Relu=max(0,x)

让我们来看一个例子,我们不仅仅用房屋的面积来预测它的价格,现在你有了一些有关房屋的其它特征,比如卧室的数量,或许有一个很重要的因素,一家人的数量也会影响房屋价格,这个房屋能住下一家人或者是四五个人的家庭吗?而这确实是基于房屋大小,以及真正决定一栋房子是否能适合你们家庭人数的卧室数。

换个话题,你可能知道邮政编码或许能作为一个特征,告诉你步行化程度。比如这附近是不是高度步行化,你是否能步行去杂货店或者是学校,以及你是否需要驾驶汽车。有些人喜欢居住在以步行为主的区域,另外根据邮政编码还和富裕程度相关(在美国是这样的)。但在其它国家也可能体现出附近学校的水平有多好。

image-20200921195849415

在图上每一个画的小圆圈都可以是ReLU的一部分,也就是指修正线性单元,或者其它稍微非线性的函数。基于房屋面积和卧室数量,可以估算家庭人口,基于邮编,可以估测步行化程度或者学校的质量。最后你可能会这样想,这些决定人们乐意花费多少钱。

对于一个房子来说,这些都是与它息息相关的事情。在这个情景里,家庭人口、步行化程度以及学校的质量都能帮助你预测房屋的价格。

以此为例, x x x 是所有的这四个输入, y y y是你尝试预测的价格,把这些单个的神经元叠加在一起,我们就有了一个稍微大一点的神经网络。

image-20200921200110823

1.3 神经网络的监督学习(Supervised Learning with Neural Networks)

到目前几乎所有由神经网络创造的经济价值,本质上都离不开一种叫做监督学习的机器学习类别

在监督学习中你有一些输入 x x x,你想学习到一个函数来映射到一些输出 y y y,比如我们之前提到的房价预测的例子,你只要输入有关房屋的一些特征,试着去输出或者估计价格 y y y

监督学习的一些例子

对于图像应用,我们经常在神经网络上使用卷积(Convolutional Neural Network),通常缩写为CNN。对于序列数据,例如音频,有一个时间组件,随着时间的推移,音频被播放出来,所以音频是最自然的表现。作为一维时间序列(两种英文说法one-dimensional time series / temporal sequence).对于序列数据,经常使用RNN,一种递归神经网络(Recurrent Neural Network),语言,英语和汉语字母表或单词都是逐个出现的,所以语言也是最自然的序列数据,因此更复杂的RNNs版本经常用于这些应用。

1.4 为什么深度学习会兴起?(Why is Deep Learning taking off?)

image-20200921200817127

如果你没有大量的训练集,那效果会取决于你的特征工程能力,那将决定最终的性能。假设有些人训练出了一个SVM(支持向量机)表现的更接近正确特征,然而有些人训练的规模大一些,可能在这个小的训练集中SVM算法可以做的更好。

sigmoid到Relu的转变

image-20200921201019078

在x趋向于 ± ∞ ±∞ ±的时候,梯度几乎为零,学习的速度会变得非常缓慢,因为当你实现梯度下降以及梯度接近零的时候,参数会更新的很慢,所以学习的速率也会变的很慢

神经网络换用这一个函数,叫做ReLU的函数(修正线性单元),ReLU它的梯度对于所有输入的负值都是零,因此梯度更加不会趋向逐渐减少到零。而这里的梯度,这条线的斜率在这左边是零,仅仅通过将Sigmod函数转换成ReLU函数,便能够使得一个叫做梯度下降(gradient descent)的算法运行的更快

第二周:神经网络的编程基础(Basics of Neural Network programming)

2.1 二分类(Binary Classification)

当实现一个神经网络的时候,我们需要知道一些非常重要的技术和技巧。例如有一个包含个 m m m样本的训练集,你很可能习惯于用一个for循环来遍历训练集中的每个样本,但是当实现一个神经网络的时候,我们通常不直接使用for循环来遍历整个训练集.

通常先有一个叫做前向暂停(forward pause)或叫做前向传播(foward propagation)的步骤,接着有一个叫做反向暂停(backward pause) 或叫做反向传播**(backward propagation**)的步骤

逻辑回归是一个用于二分类(binary classification)的算法。首先我们从一个问题开始说起,这里有一个二分类问题的例子,假如你有一张图片作为输入,比如这只猫,如果识别这张图片为猫,则输出标签1作为结果;如果识别出不是猫,那么输出标签0作为结果。现在我们可以用字母 y y y来 表示输出的结果标签

image-20200921201619866

存储图片的方法

2.2 逻辑回归(Logistic Regression)

y ^ = σ ( w T + b ) = P ( y = 1 ∣ x ) \hat{y}=\sigma(w^T+b)=P(y=1|x) y^=σ(wT+b)=P(y=1x)

0 ≤ y ^ ≤ 1 0\leq\hat{y}\leq1 0y^1
σ ( z ) = 1 1 + e − z \sigma(z) = {{1}\over{1 + e^{-z}}} σ(z)=1+ez1

2.3 逻辑回归的代价函数(Logistic Regression Cost Function)

为什么需要代价函数:

为了训练逻辑回归模型的参数参数和参数我们,需要一个代价函数,通过训练代价函数来得到参数和参数。先看一下逻辑回归的输出函数:

image-20200921203405449

请注意,这里的 ( i ) (i) (i)指第几个元素。我们使用这些带有圆括号的上标来区分索引和样本,训练样本 i i i所对应的预测值是 y ( i ) y^{(i)} y(i),是用训练样本的 w T x ( i ) + b w^Tx^{(i)}+b wTx(i)+b然后通过sigmoid函数来得到,也可以把定义为 z ( i ) = w T x ( i ) + b z^{(i)} = w^Tx^{(i)}+b z(i)=wTx(i)+b,我们将使用这个符号 ( i ) (i) (i)注解,上标 ( i ) (i) (i)来指明数据的第 ( i ) (i) (i)个训练样本,这就是上标的含义。

为了让模型通过学习调整参数,你需要给予一个样本的训练集,这会让你在训练集上找到参数和参数,,来得到你的输出。

我们将它写成 y ^ \hat{y} y^,我们更希望它会接近于训练集中的值 y y y

损失函数(误差函数) L ( y ^ , y ) = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L(\hat{y},y) = -ylog(\hat{y})-(1-y)log(1-\hat{y}) L(y^,y)=ylog(y^)(1y)log(1y^)

损失函数,来衡量预测输出值和实际值有多接近

一般我们用预测值和实际值的平方差或者它们平方差的一半,但是通常在逻辑回归中我们不这么做,因为当我们在学习逻辑回归参数的时候,会发现我们的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是我们在逻辑回归模型中会定义另外一个损失函数。后面有更加详细的。

对于m个样本的,则求他们的期望值: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ , y ) = 1 m ∑ i = 1 m ( − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) ) J(w,b) = \frac{1}{m}\sum_{i=1}^m{L(\hat{y},y)} = \frac{1}{m}\sum_{i=1}^m{(-ylog(\hat{y})-(1-y)log(1-\hat{y}))} J(w,b)=m1i=1mL(y^,y)=m1i=1m(ylog(y^)(1y)log(1y^))

2.4 梯度下降法(Gradient Descent)

image-20200921205626197

可以用如图那个小红点来初始化参数 w w w b b b,也可以采用随机初始化的方法,对于逻辑回归几乎所有的初始化方法都有效,因为函数是凸函数,无论在哪里初始化,应该达到同一点或大致相同的点。

image-20200921205738963

朝最陡的下坡方向走一步,不断地迭代

image-20200921205925668

梯度下降法的细节化说明(仅有一个参数)

R e p e a t { Repeat\{ Repeat{

w : = w − a d J ( a ) d w w:=w-a\frac{dJ(a)}{dw} w:=wadwdJ(a)

} \} }

: = := :=表示更新参数,

a a a表示学习率(learning rate),用来控制步长(step),即向下走一步的长度 d J ( w ) d w \frac{dJ(w)}{dw} dwdJ(w)就是函数 J ( w ) J(w) J(w) w w w 求导(derivative),在代码中我们会使用 d w dw dw表示这个结果

image-20200921210756057

梯度下降法的细节化说明(两个参数)

image-20200921210820099

2.7 计算图(Computation Graph)

一个神经网络的计算,都是按照前向或反向传播过程组织的

假设 J ( a , b , c ) = 3 ( a + b c ) J(a,b,c) = 3(a+bc) J(a,b,c)=3(a+bc),令 u = b c , v = a + u , J = 3 v u=bc,v=a+u,J = 3v u=bc,v=a+u,J=3v

image-20200922090936075

而 为了计算导数,从右到左(红色箭头,和蓝色箭头的过程相反)的过程是用于计算导数最自然的方式。

2.8 使用计算图求导数(Derivatives with a Computation Graph)

还是前面这幅图

image-20200922091000571

如何求导的呢?

​ $\frac{dJ}{du} =\frac{dJ}{dv}\frac{dv}{du},\frac{dJ}{db} =\frac{dJ}{du}\frac{du}{db},\frac{dJ}{da} =\frac{dJ}{du}\frac{du}{da}, $

  • d J d v \frac{dJ}{dv} dvdJ

image-20200922091735037

  • d J d a \frac{dJ}{da} dadJ

image-20200922091818411

2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)

image-20200922092840348

其中 J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ , y ) = 1 m ∑ i = 1 m ( − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) ) J(w,b) = \frac{1}{m}\sum_{i=1}^m{L(\hat{y},y)} = \frac{1}{m}\sum_{i=1}^m{(-ylog(\hat{y})-(1-y)log(1-\hat{y}))} J(w,b)=m1i=1mL(y^,y)=m1i=1m(ylog(y^)(1y)log(1y^))

现在让我们来讨论通过反向计算出导数。 因为我们想要计算出的代价函数 L ( a , y ) L(a,y) L(a,y)的导数。

d a = d L ( a , y ) a d = − y a + 1 − y 1 − a da = \frac{dL(a,y)}{ad}=-\frac{y}{a}+\frac{1-y}{1-a} da=addL(a,y)=ay+1a1y d L d z = a − y \frac{dL}{dz} = a-y dzdL=ay

所以根据链式法则

d z = d L ( a , y ) a d = d L d z = ( d L d a ) ( d a d z ) = ( − y a + 1 − y 1 − a ) ⋅ a ( 1 − a ) = a − y dz =\frac{dL(a,y)}{ad} = \frac{dL}{dz} = (\frac{dL}{da})(\frac{da}{dz})= (-\frac{y}{a} + \frac{1-y}{1-a})·a(1-a) = a-y dz=addL(a,y)=dzdL=(dadL)(dzda)=(ay+1a1y)a(1a)=ay

现在进行最后一步反向推导,也就是计算和变化对代价函数的影响

d w 1 = x 1 ⋅ d z dw^1=x^1·dz dw1=x1dz

然后: 更新 w 1 = w 1 − α d w 1 w_1=w_1-\alpha dw_1 w1=w1αdw1, 更新 w 2 = w 2 − α d w 2 w_2=w_2-\alpha dw_2 w2=w2αdw2, 更新 b = b − α d b b=b-\alpha db b=bαdb。 这就是关于单个样本实例的梯度下降算法中参数更新一次的步骤。

2.10 m 个样本的梯度下降(Gradient Descent on m Examples)

首先记得损失函数的定义

J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ , y ) = 1 m ∑ i = 1 m ( − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) ) J(w,b) = \frac{1}{m}\sum_{i=1}^m{L(\hat{y},y)} = \frac{1}{m}\sum_{i=1}^m{(-ylog(\hat{y})-(1-y)log(1-\hat{y}))} J(w,b)=m1i=1mL(y^,y)=m1i=1m(ylog(y^)(1y)log(1y^))

# 累加后除样本总量
J=0;dw1=0;dw2=0;db=0;
for i = 1 to m
    z(i) = wx(i)+b;
    a(i) = sigmoid(z(i));
    J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
    dz(i) = a(i)-y(i);
    dw1 += x1(i)dz(i);
    dw2 += x2(i)dz(i);
    db += dz(i);
J/= m; 
dw1/= m;
dw2/= m;
db/= m;
w=w-alpha*dw
b=b-alpha*db

缺点:for循环太多,样本一个for,特征值一个for

2.11 向量化(Vectorization)

#非向量化的方法
z=0
for i in range(n_x):
    z+=w[i]*x[i]
z+=b
# 向量化的方法
z = np.dot(w,x)+b

image-20200922095233389

why?

  • Python是解释语言,这意味着你的指令进行分析,并在每次执行解释。由于它们不是静态类型的,因此循环必须在每次迭代时评估操作数的类型,这导致计算开销。
  • 向量化可以使一条指令并行地对多个操作数执行相同的操作(SIMD(单指令,多数据)操作)

image-20200922110054363

总结一下,在这张幻灯片中我们已经看到,不需要for循环,利用 m m m个训练样本一次性计算出小写 z z z 和小写 a a a ,用一行代码即可完成。

Z = np.dot(w.T,X) + b

这一行代码: A = [ a ( 1 ) . . . . a ( m ) ] = σ ( Z ) A = [a^{(1)}....a^{(m)}]= \sigma(Z) A=[a(1)....a(m)]=σ(Z) ,通过恰当地运用 σ \sigma σ一次性计算所有 a a a 。这就是在同一时间内你如何完成一个所有 个训练样本的前向传播向量化计算。

image-20200922110829560

image-20200922110838711

2.18 (选修)logistic 损失函数的解释(Explanation of logistic regression cost function)

损失函数为: L = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L= -ylog(\hat{y})-(1-y)log(1-\hat{y}) L=ylog(y^)(1y)log(1y^)

我们知道。

image-20200922111645784

可以将

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值