1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
学习如何用神经网络的思维模式提出机器学习问题、如何使用向量化加速你的模型。
本周学习内容
逻辑回归是一个用于二分分类的算法。
二分分类问题中,目标就是训练出一个分类器,以图片特征向量x作为输入,预测结果标签y是1或者0。
python命令: X.shape,输出矩阵X的维度(nx,m),表示X是一个nx X m矩阵
python命令: Y.shape,输出矩阵X的维度(1,m),表示Y是一个1 X m矩阵(构建NN中的输出标签通常放在矩阵列中)
本节介绍逻辑回归模型。
给定x,想知道预测y为1的概率, y ^ = P ( y = 1 ∣ x ) \hat y=P(y=1|x) y^=P(y=1∣x)
x是一个nx维向量, x ∈ R n x x \in R^{n_x} x∈Rnx
已知逻辑回归2个参数:w也是一个nx维向量, w ∈ R n x w \in R^{n_x} w∈Rnx;b是一个实数, b ∈ R b \in R b∈R
由于在这里,y的预测概率值范围 0 ≤ y ^ ≤ 1 0\leq \hat y \leq1 0≤y^≤1,显然使用线性回归 y ^ = w T x + b \hat y =w^Tx+b y^=wTx+b来分类是不适合的(y可能比1大很多,也可能是复制)。
所以,我们这里要使用sigmoid函数,y预测值 y ^ = σ ( w T x + b ) \hat y =\sigma(w^Tx+b) y^=σ(wTx+b)
sigmoid函数表示如下
σ ( z ) = 1 1 + e − z \sigma{(z)}=\frac{1}{1+e^{-z}} σ(z)=1+e−z1
这样一来,逻辑回归算法就是要学习w和b参数,使得y得到很好的预测。
为了训练逻辑回归的参数w和b,需要定义一个损失函数Loss function(或者叫误差函数error function)。优化模型,就是要最小化损失函数。
我们定义
y ^ ( i ) = σ ( w T x ( i ) + b ) \hat y^{(i)}=\sigma(w^Tx^{(i)}+b) y^(i)=σ(wTx(i)+b)
其中 σ ( z ( i ) ) = 1 1 + e − z ( i ) \sigma(z^{(i)})= \frac1{1+ e^{−z^{(i)}}} σ(z(i))=1+e−z(i)1
符号约定:带有上标i的x,y和z,表示x,y和z与第i个训练样本有关。
损失函数(误差函数)
用来测量预测值 y ^ ( i ) \hat y^{(i)} y^(i)和期望输出值 y ( i ) y^{(i)} y(i)之间的差异。它可以用来衡量算法的运行情况。
简单来说,损失函数就是用来衡量预测值和实际值有多接近,即算法的效果。
我们可以利用平方误差定义损失函数 L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L(\hat y,y)=\frac 12(\hat y -y)^2 L(y^,y)=21(y^−y)2,但是用这个损失函数学习参数,优化时候可能会非凸(可以得到多个局部最优值,但是找不到全局最优值),这对于梯度下降算法不太好。
在逻辑回归中定义损失函数如下,它会起到和平方误差相似的作用,这会给我们凸的优化问题(容易优化)
L ( y ^ ( i ) , y ( i ) ) = − ( y ( i ) l o g ( y ^ ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ) L(\hat y{(i)},y^{(i)})=−( y^{(i)}log(\hat y^{(i)})+(1−y^{(i)})log (1−\hat y^{(i)})) L(y^(i),y(i))=−(y(i)log(y^(i))+(1−y(i))log(1−y^(i)))
分析一下这个损失函数的效果。这也是为什么要在逻辑回归中选用这个损失函数的原因。
损失函数是在单个训练样本中定义的,它衡量了(参数w和b在)单个训练样本上的表现。
成本函数
(cost function)衡量的是(参数w和b在)全体样本上的表现。
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = − 1 m ∑ i = 1 m [ ( y ( i ) l o g ( y ^ ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] J(w,b)= \frac1m\sum_{i=1}^m L(\hat y^{(i)},y^{(i)})=− \frac1m \sum_{i=1}^m[( y^{(i)}log(\hat y^{(i)})+(1−y^{(i)})log (1−\hat y^{(i)})] J(w,b)=m1i=1∑mL(y^(i),y(i))=−m1i=1∑m[(y(i)log(y^(i))+(1−y(i))log(1−y^(i))]
上式表面成本函数即所有训练样本损失函数之和。
所以在逻辑回归中,我们就是要找到合适的w和b,让成本函数J(总体成本)尽量小。
梯度下降算法用来训练或者学习训练集上的参数w和b。
我们已经知道成本函数J(w,b)被定义成损失函数的平均值,即 1 m \frac 1m m1的损失函数之和。显然,要提高算法的效果,就是要找到使得成本函数J尽可能小的w和b。下图中,最下方红色箭头所指的红点,就是J的最小值。
上图中的J函数是一个凸函数。凸函数是逻辑回归使用这个特定成本函数J的重要原因之一。
为了找到更好的参数值,我们首先要用某个初始值来初始化w和b。
对于逻辑回归,任何初始化方法都有效。一般做法会用0来初始化,不过逻辑回归并不需要如此。因为函数是凸的,无论在哪个点初始化,最终都会到达(或者大致到达)同一个点。
梯度下降法所做的就是,从初始点(图中最上方红色箭头指向的点)开始,朝最陡的下坡方向走一步。梯度下降一步后(初始点下方,箭头指向的点),或许会停下来,因为它试图沿着最快的方向向下走,或者说尽快向下走,这就是梯度下降的一次迭代。反复迭代后,梯度下降终于到达(或者大致接近)全局最优值点(图中最下方红点)。
以上就是梯度下降法的基本原理。
观察上图,有一个代表成本函数J(w)的曲线,为了方便说明,这里做了简化,省略了参数b,只使用一维曲线来替代多维曲线。
梯度下降算法实际就是在重复更新参数w
w : = w − α d J ( w ) d w w:=w - \alpha \frac{dJ(w)}{dw} w:=w−αdwdJ(w)
其中
在算法收敛之前,会重复更新w。
上图中,假设算法从右边开始计算,函数J曲线上最右边点的导数代表了这个点的斜率dw,即高除以宽(看上去象一个小三角形)。在这个点的斜率dw是正的,根据公式 w : = w − α d w w:=w - \alpha dw w:=w−αdw,w会变小,也就是沿曲线向左下方移动一步。梯度下降算法就是按照方法,逐步的减少参数w。
同理,如果w在曲线的最左部,这里点的斜率是负数, d J ( w ) d w < 0 \frac{dJ(w)}{dw}<0 dwdJ(w)<0,所以w是逐步增加。不断用梯度下降法来迭代,w会变得越来越大。
无论初始位置在左边或者右边,梯度下降法都会让参数w朝着全局最小值方向移动。
以上是J(w)只有一个参数w的简化情况。
对于J(w,b),梯度下降法实际需要更新两个参数w和b
w : = w − α d J ( w , b ) d w w:=w - \alpha \frac{dJ(w,b)}{dw} w:=w−αdwdJ(w,b)
b : = b − α d J ( w , b ) d b b:=b - \alpha \frac{dJ(w,b)}{db} b:=b−αdbdJ(w,b)
这里的 d J ( w , b ) d w \frac{dJ(w,b)}{dw} dwdJ(w,b)是函数J对于w的偏导数,通常用dw表示。 d J ( w , b ) d b \frac{dJ(w,b)}{db} dbdJ(w,b)是函数J对于b的偏导数,通常用db表示。偏导数就是计算函数关于其中一个变量在对应点的斜率。
符号约定
导数用符号 d 表示,而偏导数通常用符号 ∂ 表示。
2020-4-29 吴恩达-NN&DL-w2 NN基础(2.5 导数,2.6 更多导数的例子)
2020-4-29 吴恩达-NN&DL-w2 NN基础(2.5 导数,2.6 更多导数的例子)
2020-4-30 吴恩达-NN&DL-w2 NN基础(2.7 计算图,2.8 计算图的导数计算,2.9 逻辑回归中的梯度下降法,2.10 m 个样本的梯度下降)
2020-4-30 吴恩达-NN&DL-w2 NN基础(2.7 计算图,2.8 计算图的导数计算,2.9 逻辑回归中的梯度下降法,2.10 m 个样本的梯度下降)
2020-4-30 吴恩达-NN&DL-w2 NN基础(2.7 计算图,2.8 计算图的导数计算,2.9 逻辑回归中的梯度下降法,2.10 m 个样本的梯度下降)
2020-4-30 吴恩达-NN&DL-w2 NN基础(2.7 计算图,2.8 计算图的导数计算,2.9 逻辑回归中的梯度下降法,2.10 m 个样本的梯度下降)
2020-5-1 吴恩达-NN&DL-w2 NN基础(2.11 向量化 Vectorization,2.12 向量化的更多例子)
2020-5-1 吴恩达-NN&DL-w2 NN基础(2.11 向量化 Vectorization,2.12 向量化的更多例子)
2020-5-2 吴恩达-NN&DL-w2 NN基础(2.13 向量化逻辑回归,2.14 向量化逻辑回归的梯度输出)
2020-5-2 吴恩达-NN&DL-w2 NN基础(2.13 向量化逻辑回归,2.14 向量化逻辑回归的梯度输出)
2020-5-3 吴恩达-NN&DL-w2 NN基础(2.15 Python 中的广播)
2020-5-3 吴恩达-NN&DL-w2 NN基础(2.16 关于 python / numpy 向量的说明)
省略
2020-5-5 吴恩达-NN&DL-w2 NN基础(2.18 (选修)logistic 损失函数的解释)
2020-5-31 吴恩达-NN&DL-w2 NN基础(课后作业)
2020-6-6 吴恩达-NN&DL-w2 NN基础(课后编程-Logistic Regression with a Neural Network mindset)