作者: 大树先生
博客: http://blog.csdn.net/koala_tree
GitHub:https://github.com/KoalaTree
2017 年 09 月 20 日
以下为在Coursera上吴恩达老师的DeepLearning.ai课程项目中,第一部分《神经网络和深度学习》第二周课程部分关键点的笔记。笔记并不包含全部小视频课程的记录,如需学习笔记中舍弃的内容请至Coursera 或者 网易云课堂。同时在阅读以下笔记之前,强烈建议先学习吴恩达老师的视频课程。
同时我在知乎上开设了关于机器学习深度学习的专栏收录下面的笔记,方便在移动端的学习。欢迎关注我的知乎:大树先生。一起学习一起进步呀!^_^
对于二分类问题,大牛给出了一个小的Notation。
输入神经网络时样本数据的形状:
X.shape=(nx,m)
目标数据的形状:
Y=[y(1),y(2),⋯,y(m)]
Y.shape=(1,m)
逻辑回归中,预测值:
引入Sigmoid函数,预测值:
注意点:函数的一阶导数可以用其自身表示,
这里可以解释梯度消失的问题,当 z=0 时,导数最大,但是导数最大为 σ′(0)=σ(0)(1−σ(0))=0.5(1−0.5)=0.25 ,这里导数仅为原函数值的0.25倍。
参数梯度下降公式的不断更新, σ′(z) 会变得越来越小,每次迭代参数更新的步伐越来越小,最终接近于0,产生梯度消失的现象。
一般经验来说,使用平方错误(squared error)来衡量Loss Function:
但是,对于logistic regression 来说,一般不适用平方错误来作为Loss Function,这是因为上面的平方错误损失函数一般是非凸函数(non-convex),其在使用低度下降算法的时候,容易得到局部最优解,而不是全局最优解。因此要选择凸函数。
逻辑回归的Loss Function:
全部训练数据集的Loss function总和的平均值即为训练集的代价函数(Cost function)。
用梯度下降法(Gradient Descent)算法来最小化Cost function,以计算出合适的w和b的值。
每次迭代更新的修正表达式:
在程序代码中,我们通常使用dw来表示 ∂J(w,b)∂w ,用db来表示 ∂J(w,b)∂b 。
对单个样本而言,逻辑回归Loss function表达式:
前面过程的da、dz求导:
再对 w1、w2 和b进行求导:
梯度下降法:
对m个样本来说,其Cost function表达式如下:
Cost function 关于w和b的偏导数可以写成所有样本点偏导数和的平均形式:
在深度学习的算法中,我们通常拥有大量的数据,在程序的编写过程中,应该尽最大可能的少使用loop循环语句,利用python可以实现矩阵运算,进而来提高程序的运行速度,避免for循环的使用。
逻辑回归向量化
所有m个样本的线性输出Z可以用矩阵表示:
python代码:
Z = np.dot(w.T,X) + b
A = sigmoid(Z)
逻辑回归梯度下降输出向量化
dZ对于m个样本,维度为 (1,m) ,表示为:
db可以表示为:
db = 1/m*np.sum(dZ)
dw = 1/m*np.dot(X,dZ.T)
单次迭代梯度下降算法流程
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
虽然在Python有广播的机制,但是在Python程序中,为了保证矩阵运算的正确性,可以使用reshape()函数来对矩阵设定所需要进行计算的维度,这是个好的习惯;
如果用下列语句来定义一个向量,则这条语句生成的a的维度为(5,),既不是行向量也不是列向量,称为秩(rank)为1的array,如果对a进行转置,则会得到a本身,这在计算中会给我们带来一些问题。
a = np.random.randn(5)
a = np.random.randn(5,1)
b = np.random.randn(1,5)
assert(a.shape == (5,1))
a.reshape((5,1))
Cost function的由来:
预测输出 y^ 的表达式:
其中,
y^ 可以看作预测输出为正类(+1)的概率:
当 y=1 时, P(y|x)=y^ ;当 y=0 时, P(y|x)=1−y^ 。
将两种情况整合到一个式子中,可得:
对上式进行log处理(这里是因为log函数是单调函数,不会改变原函数的单调性):
概率 P(y|x) 越大越好,即判断正确的概率越大越好。这里对上式加上负号,则转化成了单个样本的Loss function,我们期望其值越小越好:
对于m个训练样本来说,假设样本之间是独立同分布的,我们总是希望训练样本判断正确的概率越大越好,则有:
同样引入log函数,加负号,则可以得到Cost function:
本周(Week2)的课后编程题请参见:
吴恩达Coursera深度学习课程 DeepLearning.ai 编程作业(1-2)