- 作者:韩信子 @ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/213
- 申明:版权所有,转载请分割平台与作者并注明出处
珍藏 ShowMeAI 查看更多精彩内容
本系列为吴恩达老师《深度学习专项课程 (Deep Learning Specialization)》学习与总结整顿所得,对应的课程视频能够在 这里 查看。
引言
在 ShowMeAI 前一篇文章 深度学习概论 中咱们对深度学习(Deep Learning) 进行了简略介绍:
- 咱们以房价预测为例,对应解说了神经网络 (Neural Network) 模型构造和基础知识。
- 介绍了针对监督学习的几类典型神经网络:Standard NN,CNN 和 RNN。
- 介绍了「结构化数据」和「非结构化数据」2 种不同类型的数据。
- 剖析了近些年来深度学习热门,及其性能优于传统机器学习的起因(Data,Computation 和 Algorithms)。
本节内容咱们开展介绍神经网络的根底:逻辑回归 (Logistic Regression)。咱们将通过对逻辑回归模型构造的剖析,过渡到后续神经网络模型。(对于逻辑回归模型,大家也能够浏览 ShowMeAI 的文章 图解机器学习 | 逻辑回归算法详解 学习)
1. 算法根底与逻辑回归
逻辑回归(Logistic regression) 是一个用于二分类的算法。
1.1 二分类问题与机器学习根底
二分类就是输入 \(y\)只有 {0,1} 两个离散值 (也有 {-1,1} 的状况)。咱们以一个「 图像识别 」问题为例,判断图片是否是猫。辨认是否是「猫」,这是一个典型的二分类问题——0 代表「非猫(not cat)」,1 代表「猫(cat)」。(对于机器学习基础知识大家也能够查看 ShowMeAI 文章 图解机器学习 | 机器学习基础知识)。
从机器学习的角度看,咱们的输出 \(x\)此时是一张图片,彩色图片蕴含 RGB 三个通道,图片尺寸为 \((64,64,3)\)。
有些神经网络的输出是一维的,咱们能够将图片 \(x\)(维度 \((64,64,3)\))展平为一维特征向量(feature vector),失去的特征向量维度为 \((12288,1)\)。咱们个别用列向量示意样本,把维度记为 \(n_x\)。
如果训练样本有 \(m\)张图片,那么咱们用矩阵存储数据,此时数据维度变为 \((n_x,m)\)。
- 矩阵 \(X\)的行 \(n_x\)代表了每个样本 \(x^{(i)}\)特色个数
- 矩阵 \(X\)的列 \(m\)代表了样本个数。
咱们能够对训练样本的标签 \(Y\)也做一个规整化,调整为 1 维的状态,标签 \(Y\)的维度为 \((1,m)\)。
1.2 逻辑回归算法
逻辑回归是最常见的二分类算法 (具体算法解说也可浏览 ShowMeAI 文章 图解机器学习 | 逻辑回归算法详解),它蕴含以下参数:
- 输出的特征向量:\(x \in R^{n_x}\),其中 \({n_x}\)是特色数量
- 用于训练的标签:\(y \in 0,1\)
- 权重:\(w \in R^{n_x}\)
- 偏置:\(b \in R\)
- 输入:\(\hat{y} = \sigma(w^Tx+b)\)
输入计算用到了 Sigmoid 函数,它是一种非线性的 S 型函数,输入被限定在 \([0,1]\) 之间,通常被用在神经网络中当作激活函数 (Activation Function) 应用。
Sigmoid 函数的表达式如下:
$
s = \sigma(w^Tx+b) = \sigma(z) = \frac{1}{1+e^{-z}}
$
实际上,逻辑回归能够看作十分小的一个神经网络。
1.3 逻辑回归的损失函数
在机器学习中,损失函数 (loss function) 用于量化掂量预测后果与实在值之间的差距,咱们会通过优化损失函数来一直调整模型权重,使其最好地拟合样本数据。
在回归类问题中,咱们会应用均方差损失(MSE):
$$
L(\hat{y},y) = \frac{1}{2}(\hat{y}-y)^2
$$
然而在逻辑回归中,咱们并不偏向于应用这样的损失函数。逻辑回归应用平方差损失会失去非凸的损失函数,它会有很多个部分最优解。梯度降落法可能找不到全局最优值,从而给优化带来艰难。
因而咱们调整成应用对数损失(二元穿插熵损失):
$$
L(\hat{y},y) = -(y\log\hat{y})+(1-y)\log(1-\hat{y})
$$
方才咱们给到的是单个训练样本中定义的损失函数,它掂量了在单个训练样本上的体现。咱们定义 代价函数 (Cost Function,或者称作老本函数) 为整体训练样本上的体现,即 \(m\)个样本的损失函数的平均值,反映了 \(m\)个样本的预测输入与实在样本输入 \(y\)的均匀靠近水平。
老本函数的计算公式如下:
$$
J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})
$$
2. 梯度降落法(Gradient Descent)
方才咱们理解了损失函数 (Loss Function) 与老本函数定义,下一步咱们就要找到最优的 \(w\)和 \(b\)值,最小化 \(m\)个训练样本的 Cost Function。这里用到的办法就叫做 梯度降落 (Gradient Descent) 算法。
在数学上,1 个函数的梯度 (gradient) 指出了它的最陡增长方向。也就是说,沿着梯度的方向走,函数增长得就最快。那么沿着梯度的负方向走,函数值就降落得最快。
(更具体的最优化数学知识能够浏览 ShowMeAI 文章 图解 AI 数学根底 | 微积分与最优化)
模型的训练指标是寻找适合的 \(w\)与 \(b\)以最小化代价函数值。咱们先假如 \(w\)与 \(b\)都是一维实数,则代价函数 \(J\)对于 \(w\)与 \(b\)的图如下所示:
上图中的代价函数 \(J\)是一个 凸函数,只有一个全局最低点,它能保障无论咱们初始化模型参数如何(在曲面上任何地位),都可能寻找到适合的最优解。
基于梯度降落算法,失去以下参数 \(w\)的更新公式:
$$
w := w – \alpha\frac{dJ(w, b)}{dw}
$$
公式中 \(\alpha\)为学习率,即每次更新的 \(w\)的步长。
老本函数 \(J(w, b)\)中对应的参数 \(b\)更新公式为:
$$
b := b – \alpha\frac{dJ(w, b)}{db}
$$
3. 计算图(Computation Graph)
对于神经网络而言,训练过程蕴含了两个阶段:前向流传 (Forward Propagation) 和反向流传(Back Propagation)。
- 前向流传是从输出到输入,由神经网络前推计算失去预测输入的过程
- 反向流传是从输入到输出,基于 Cost Function 对参数 \(w\)和 \(b\)计算梯度的过程。
上面,咱们联合一个例子用计算图 (Computation graph) 的模式来了解这两个阶段。
3.1 前向流传(Forward Propagation)
如果咱们的 Cost Function 为 \(J(a,b,c)=3(a+bc)\),蕴含 \(a\)、\(b\)、\(c\)三个变量。
咱们增加一些两头变量,用 \(u\)示意 \(bc\),\(v\)示意 \(a+u\),则 \(J=3v\)。
整个过程能够用计算图示意:
在上图中,咱们让 \(a=5\),\(b=3\),\(c=2\),则 \(u=bc=6\),\(v=a+u=11\),\(J=3v=33\)。
计算图中,这种从左到右,从输出到输入的过程,就对应着神经网络基于 \(x\)和 \(w\)计算失去 Cost Function 的前向计算过程。
3.2 反向流传(Back Propagation)
咱们接着上个例子中的计算图解说反向流传,咱们的输出参数有 \(a\)、\(b\)、\(c\)三个。
① 先计算 \(J\)对参数 \(a\)的偏导数
从计算图上来看,从右到左,\(J\)是 \(v\)的函数,\(v\)是 \(a\)的函数。基于求导链式法则失去:
$$
\frac{\partial J}{\partial a}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial a}=3\cdot 1=3
$$
② 计算 \(J\)对参数 \(b\)的偏导数
从计算图上来看,从右到左,\(J\)是 \(v\)的函数,\(v\)是 \(u\)的函数,\(u\)是 \(b\)的函数。同样可得:
$$
\frac{\partial J}{\partial b}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial b}=3\cdot 1\cdot c=3\cdot 1\cdot 2=6
$$
③ 计算 \(J\)对参数 \(c\)的偏导数
此时从右到左,\(J\)是 \(v\)的函数,\(v\)是 \(u\)的函数,\(u\)是 \(c\)的函数。可得:
$$
\frac{\partial J}{\partial c}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial c}=3\cdot 1\cdot b=3\cdot 1\cdot 3=9
$$
这样就实现了从右往左的反向流传与梯度 (偏导) 计算过程。
4. 逻辑回归中的梯度降落法
回到咱们后面提到的逻辑回归问题,咱们假如输出的特征向量维度为 2(即 \([x_1, x_2]\)),对应权重参数 \(w_1\)、\(w_2\)、\(b\)失去如下的计算图:
反向流传计算梯度
① 求出 \(L\)对于 \(a\)的导数
② 求出 \(L\)对于 \(z\)的导数
③ 持续前推计算
④ 基于梯度降落能够失去参数更新公式
后面提到的是对单个样本求偏导和利用梯度降落算法的过程。对于有 \(m\)个样本的数据集,Cost Function \(J(w,b)\)、\(a^{(i)}\) 和 权重参数 \(w_1\) 的计算如图所示。
残缺的 Logistic 回归中某次训练的流程如下,这里仅假如特征向量的维度为 2:
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_1\)、\(w_2\)、\(b\)进行迭代。
上述计算过程有一个毛病:整个流程蕴含两个 for 循环。其中:
- 第一个 for 循环遍历 \(m\)个样本
- 第二个 for 循环遍历所有特色
如果有大量特色,在代码中显示应用 for 循环会使算法很低效。向量化 能够用于解决显式应用 for 循环的问题。
5. 向量化(Vectorization)
持续以逻辑回归为例,如果以非向量化的循环形式计算 \(z=w^Tx+b\),代码如下:
z = 0;
for i in range(n_x):
z += w[i] * x[i]
z += b
基于向量化的操作,能够并行计算,极大晋升效率,同时代码也更为简洁:
(这里应用到 python 中的 numpy 工具库,想理解更多的同学能够查看 ShowMeAI 的 图解数据分析 系列中的 numpy 教程,也能够通过 ShowMeAI 制作的 numpy 速查手册 疾速理解其应用办法)
z = np.dot(w, x) + b
不必显式 for 循环,实现逻辑回归的梯度降落的迭代伪代码如下:
$$Z=w^TX+b=np.dot(w.T, x) + b$$
$$A=\sigma(Z)$$
$$dZ=A-Y$$
$$dw=\frac{1}{m}XdZ^T$$
$$db=\frac{1}{m}np.sum(dZ)$$
$$w:=w-\sigma dw$$
$$b:=b-\sigma db$$
参考资料
- 图解机器学习 | 逻辑回归算法详解
- 图解机器学习 | 机器学习基础知识)
- 图解 AI 数学根底 | 微积分与最优化)
- 图解数据分析
- numpy 速查手册
ShowMeAI 系列教程举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
举荐文章
- 深度学习教程 | 深度学习概论
- 深度学习教程 | 神经网络根底
- 深度学习教程 | 浅层神经网络
- 深度学习教程 | 深层神经网络
- 深度学习教程 | 深度学习的实用层面
- 深度学习教程 | 神经网络优化算法
- 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
- 深度学习教程 | AI 利用实际策略(上)
- 深度学习教程 | AI 利用实际策略(下)
- 深度学习教程 | 卷积神经网络解读
- 深度学习教程 | 经典 CNN 网络实例详解
- 深度学习教程 | CNN 利用:指标检测
- 深度学习教程 | CNN 利用:人脸识别和神经格调转换
- 深度学习教程 | 序列模型与 RNN 网络
- 深度学习教程 | 自然语言解决与词嵌入
- 深度学习教程 | Seq2seq 序列模型和注意力机制
\