以下为在Coursera上吴恩达老师的DeepLearning.ai课程项目中,第一部分《神经网络和深度学习》第二周课程部分关键点的笔记。笔记并不包含全部小视频课程的记录,如需学习笔记中舍弃的内容请至Coursera 或者 网易云课堂。同时在阅读以下笔记之前,强烈建议先学习吴恩达老师的视频课程。


同时我在知乎上开设了关于机器学习深度学习的专栏收录下面的笔记,方便在移动端的学习。欢迎关注我的知乎:大树先生。一起学习一起进步呀!^_^


神经网络和深度学习—神经网络基础

1. 二分类问题

对于二分类问题,大牛给出了一个小的Notation。

  • 样本: <nobr> (x,y) </nobr>,训练样本包含 <nobr> m </nobr>个;
  • 其中 <nobr> xRnx </nobr>,表示样本 <nobr> x </nobr> 包含 <nobr> nx </nobr>个特征;
  • <nobr> y0,1 </nobr>,目标值属于0、1分类;
  • 训练数据: <nobr> {(x(1),y(1)),(x(2),y(2)),,(x(m),y(m))} </nobr>

输入神经网络时样本数据的形状:

<center> </center>

<nobr> X.shape=(nx,m) </nobr>

目标数据的形状:

<nobr> Y=[y(1),y(2),,y(m)] </nobr>

<nobr> Y.shape=(1,m) </nobr>

2. logistic Regression

逻辑回归中,预测值:

<nobr> h^=P(y=1|x) </nobr>

其表示为1的概率,取值范围在 <nobr> [0,1] </nobr>之间。

引入Sigmoid函数,预测值:

<nobr> y^=Sigmoid(wTx+b)=σ(wTx+b) </nobr>
其中
<nobr> Sigmoid(z)=11+ez </nobr>

注意点:函数的一阶导数可以用其自身表示,

<nobr> σ(z)=σ(z)(1σ(z)) </nobr>

这里可以解释梯度消失的问题,当 <nobr> z=0 </nobr>时,导数最大,但是导数最大为 <nobr> σ(0)=σ(0)(1σ(0))=0.5(10.5)=0.25 </nobr>,这里导数仅为原函数值的0.25倍。

参数梯度下降公式的不断更新, <nobr> σ(z) </nobr>会变得越来越小,每次迭代参数更新的步伐越来越小,最终接近于0,产生梯度消失的现象。

3. logistic回归 损失函数

Loss function

一般经验来说,使用平方错误(squared error)来衡量Loss Function:

<nobr> L(y^,y)=12(y^y)2 </nobr>

但是,对于logistic regression 来说,一般不适用平方错误来作为Loss Function,这是因为上面的平方错误损失函数一般是非凸函数(non-convex),其在使用低度下降算法的时候,容易得到局部最优解,而不是全局最优解。因此要选择凸函数。

逻辑回归的Loss Function:

<nobr> L(y^,y)=(ylogy^+(1y)log(1y^)) </nobr>
  • <nobr> y=1 </nobr>时, <nobr> L(y^,y)=logy^ </nobr>。如果 <nobr> y^ </nobr>越接近1, <nobr> L(y^,y)0 </nobr>,表示预测效果越好;如果 <nobr> y^ </nobr>越接近0, <nobr> L(y^,y)+ </nobr>,表示预测效果越差;
  • <nobr> y=0 </nobr>时, <nobr> L(y^,y)=log(1y^) </nobr>。如果 <nobr> y^ </nobr>越接近0, <nobr> L(y^,y)0 </nobr>,表示预测效果越好;如果 <nobr> y^ </nobr>越接近1, <nobr> L(y^,y)+ </nobr>,表示预测效果越差;
  • 我们的目标是最小化样本点的损失Loss Function,损失函数是针对单个样本点的。

Cost function

全部训练数据集的Loss function总和的平均值即为训练集的代价函数(Cost function)。

<nobr> J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))] </nobr>
  • Cost function是待求系数w和b的函数;
  • 我们的目标就是迭代计算出最佳的w和b的值,最小化Cost function,让其尽可能地接近于0。

4. 梯度下降

用梯度下降法(Gradient Descent)算法来最小化Cost function,以计算出合适的w和b的值。

每次迭代更新的修正表达式:

<nobr> w:=wαJ(w,b)w </nobr>

<nobr> b:=bαJ(w,b)b </nobr>

在程序代码中,我们通常使用dw来表示 <nobr> J(w,b)w </nobr>,用db来表示 <nobr> J(w,b)b </nobr>

5. 逻辑回归中的梯度下降法

对单个样本而言,逻辑回归Loss function表达式:

<nobr> z=wTx+by^=a=σ(z)L(a,y)=(ylog(a)+(1y)log(1a)) </nobr>

反向传播过程: <center> </center>

前面过程的da、dz求导:

<nobr> da=La=ya+1y1adz=Lz=Laaz=(ya+1y1a)a(1a)=ay </nobr>

再对 <nobr> w1w2 </nobr>和b进行求导:

<nobr> dw1=Lw1=Lzzw1=x1dz=x1(ay) </nobr>

<nobr> db=Lb=Lzzb=1dz=ay </nobr>

梯度下降法:

<nobr> w1:=w1αdw1 </nobr>

<nobr> w2:=w2αdw2 </nobr>

<nobr> b:=bαdb </nobr>

6. m个样本的梯度下降

对m个样本来说,其Cost function表达式如下:

<nobr> z(i)=wTx(i)+by^(i)=a(i)=σ(z(i))J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))] </nobr>

Cost function 关于w和b的偏导数可以写成所有样本点偏导数和的平均形式:

<nobr> dw1=1mi=1mx(i)1(a(i)y(i)) </nobr>

<nobr> db=1mi=1m(a(i)y(i)) </nobr>

7. 向量化(Vectorization)

在深度学习的算法中,我们通常拥有大量的数据,在程序的编写过程中,应该尽最大可能的少使用loop循环语句,利用python可以实现矩阵运算,进而来提高程序的运行速度,避免for循环的使用。

逻辑回归向量化

  • 输入矩阵X: <nobr> nx,m </nobr>
  • 权重矩阵w: <nobr> nx,1 </nobr>
  • 偏置b:为一个常数
  • 输出矩阵Y: <nobr> 1,m </nobr>

所有m个样本的线性输出Z可以用矩阵表示:

<nobr> Z=wTX+b </nobr>

python代码:

Z = np.dot(w.T,X) + b
A = sigmoid(Z)
 
  • 1
  • 2

逻辑回归梯度下降输出向量化

  • dZ对于m个样本,维度为 <nobr> 1,m </nobr>,表示为:

    <nobr> dZ=AY </nobr>
  • db可以表示为:

    <nobr> db=1mi=1mdz(i) </nobr>

    python代码:
db = 1/m*np.sum(dZ)
 
  • 1
  • dw可表示为:
    <nobr> dw=1mXdZT </nobr>

    python代码:
dw = 1/m*np.dot(X,dZ.T)
 
  • 1

单次迭代梯度下降算法流程

Z = np.dot(w.T,X) + b
A = sigmoid(Z)
dZ = A-Y
dw = 1/m*np.dot(X,dZ.T)
db = 1/m*np.sum(dZ)

w = w - alpha*dw
b = b - alpha*db
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

8. python的notation

  • 虽然在Python有广播的机制,但是在Python程序中,为了保证矩阵运算的正确性,可以使用reshape()函数来对矩阵设定所需要进行计算的维度,这是个好的习惯;

  • 如果用下列语句来定义一个向量,则这条语句生成的a的维度为(5,),既不是行向量也不是列向量,称为秩(rank)为1的array,如果对a进行转置,则会得到a本身,这在计算中会给我们带来一些问题。

a = np.random.randn(5)
 
  • 1
  • 如果需要定义(5,1)或者(1,5)向量,要使用下面标准的语句:
a = np.random.randn(5,1)
b = np.random.randn(1,5)
 
  • 1
  • 2
  • 可以使用assert语句对向量或数组的维度进行判断。assert会对内嵌语句进行判断,即判断a的维度是不是(5,1),如果不是,则程序在此处停止。使用assert语句也是一种很好的习惯,能够帮助我们及时检查、发现语句是否正确。
assert(a.shape == (5,1))
 
  • 1
  • 可以使用reshape函数对数组设定所需的维度
a.reshape((5,1))
 
  • 1

8. logistic regression代价函数的解释

Cost function的由来:

预测输出 <nobr> y^ </nobr>的表达式:

<nobr> y^=σ(wTx+b) </nobr>

其中,

<nobr> σ(z)=11+ez </nobr>

<nobr> y^ </nobr>可以看作预测输出为正类(+1)的概率:

<nobr> y^=P(y=1|x) </nobr>

<nobr> y=1 </nobr>时, <nobr> P(y|x)=y^ </nobr>;当 <nobr> y=0 </nobr>时, <nobr> P(y|x)=1y^ </nobr>

将两种情况整合到一个式子中,可得:

<nobr> P(y|x)=y^y(1y^)(1y) </nobr>

对上式进行log处理(这里是因为log函数是单调函数,不会改变原函数的单调性):

<nobr> logP(y|x)=log[y^y(1y^)(1y)]=ylogy^+(1y)log(1y^) </nobr>

概率 <nobr> P(y|x) </nobr>越大越好,即判断正确的概率越大越好。这里对上式加上负号,则转化成了单个样本的Loss function,我们期望其值越小越好:

<nobr> L(y^,y)=(ylogy^+(1y)log(1y^)) </nobr>

对于m个训练样本来说,假设样本之间是独立同分布的,我们总是希望训练样本判断正确的概率越大越好,则有:

<nobr> maxi=1mP(y(i)|x(i)) </nobr>

同样引入log函数,加负号,则可以得到Cost function:

<nobr> J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))] </nobr>

本周(Week2)的课后编程题请参见:

吴恩达Coursera深度学习课程 DeepLearning.ai 编程作业(1-2)

版权声明:本文为博主原创文章,未经允许不得转载。