深度学习教程 | 神经网络基础

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 本节介绍神经网络的基础——逻辑回归,通过对逻辑回归模型结构的分析,过渡到后续神经网络模型。内容包括二分类问题、逻辑回归模型及损失函数,梯度下降算法,计算图与正向传播及反向传播。

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/35
本文地址http://www.showmeai.tech/article-detail/213
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容


第1门课 神经网络和深度学习,第2周:神经网络的编程基础

本系列为吴恩达老师《深度学习专项课程(Deep Learning Specialization)》学习与总结整理所得,对应的课程视频可以在这里查看。


引言

ShowMeAI前一篇文章 深度学习概论 中我们对深度学习(Deep Learning)进行了简单介绍:

  • 我们以房价预测为例,对应讲解了神经网络(Neural Network)模型结构和基础知识。
  • 介绍了针对监督学习的几类典型神经网络:Standard NN,CNN和RNN。
  • 介绍了「结构化数据」和「非结构化数据」2种不同类型的数据。
  • 分析了近些年来深度学习热门,及其性能优于传统机器学习的原因(Data,Computation和Algorithms)。

本节内容我们展开介绍神经网络的基础:逻辑回归(Logistic Regression)。我们将通过对逻辑回归模型结构的分析,过渡到后续神经网络模型。(关于逻辑回归模型,大家也可以阅读ShowMeAI的文章 图解机器学习 | 逻辑回归算法详解 学习)

1.算法基础与逻辑回归

逻辑回归(Logistic regression) 是一个用于二分类的算法。

1.1 二分类问题与机器学习基础

二分类 Binary Classification

二分类就是输出 equation?tex=y 只有 {0,1} 两个离散值(也有 {-1,1} 的情况)。我们以一个「图像识别」问题为例,判断图片是否是猫。识别是否是「猫」,这是一个典型的二分类问题——0代表「非猫(not cat)」,1代表「猫(cat)」。(关于机器学习基础知识大家也可以查看ShowMeAI文章 图解机器学习 | 机器学习基础知识)。

算法基础与逻辑回归

从机器学习的角度看,我们的输入 equation?tex=x 此时是一张图片,彩色图片包含RGB三个通道,图片尺寸为 equation?tex=%2864%2C64%2C3%29

数据与向量化格式

有些神经网络的输入是一维的,我们可以将图片 equation?tex=x (维度 equation?tex=%2864%2C64%2C3%29 )展平为一维特征向量(feature vector),得到的特征向量维度为 equation?tex=%2812288%2C1%29。我们一般用列向量表示样本,把维度记为 equation?tex=n_x

如果训练样本有 equation?tex=m 张图片,那么我们用矩阵存储数据,此时数据维度变为 equation?tex=%28n_x%2Cm%29

数据与向量化格式

  • 矩阵 equation?tex=X 的行 equation?tex=n_x 代表了每个样本 equation?tex=x%5E%7B%28i%29%7D 特征个数
  • 矩阵 equation?tex=X 的列 equation?tex=m 代表了样本个数。

我们可以对训练样本的标签 equation?tex=Y 也做一个规整化,调整为1维的形态,标签 equation?tex=Y 的维度为 equation?tex=%281%2Cm%29

1.2 逻辑回归算法

逻辑回归 Logistic Regression

逻辑回归是最常见的二分类算法(详细算法讲解也可阅读ShowMeAI文章 图解机器学习 | 逻辑回归算法详解),它包含以下参数:

  • 输入的特征向量: equation?tex=x%20%5Cin%20R%5E%7Bn_x%7D,其中 equation?tex=%7Bn_x%7D 是特征数量
  • 用于训练的标签: equation?tex=y%20%5Cin%200%2C1
  • 权重: equation?tex=w%20%5Cin%20R%5E%7Bn_x%7D
  • 偏置: equation?tex=b%20%5Cin%20R
  • 输出: equation?tex=%5Chat%7By%7D%20%3D%20%5Csigma%28w%5ETx%2Bb%29

输出计算用到了Sigmoid函数,它是一种非线性的S型函数,输出被限定在 equation?tex=%5B0%2C1%5D 之间,通常被用在神经网络中当作激活函数(Activation Function)使用。

逻辑回归做图像分类

Sigmoid函数的表达式如下:

equation?tex=s%20%3D%20%5Csigma%28w%5ETx%2Bb%29%20%3D%20%5Csigma%28z%29%20%3D%20%5Cfrac%7B1%7D%7B1%2Be%5E%7B-z%7D%7D

实际上,逻辑回归可以看作非常小的一个神经网络。

1.3 逻辑回归的损失函数

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

在机器学习中,损失函数(loss function)用于量化衡量预测结果与真实值之间的差距,我们会通过优化损失函数来不断调整模型权重,使其最好地拟合样本数据。

在回归类问题中,我们会使用均方差损失(MSE):

equation?tex=L%28%5Chat%7By%7D%2Cy%29%20%3D%20%5Cfrac%7B1%7D%7B2%7D%28%5Chat%7By%7D-y%29%5E2

逻辑回归的损失函数

但是在逻辑回归中,我们并不倾向于使用这样的损失函数。逻辑回归使用平方差损失会得到非凸的损失函数,它会有很多个局部最优解。梯度下降法可能找不到全局最优值,从而给优化带来困难。

因此我们调整成使用对数损失(二元交叉熵损失):

equation?tex=L%28%5Chat%7By%7D%2Cy%29%20%3D%20-%28y%5Clog%5Chat%7By%7D%29%2B%281-y%29%5Clog%281-%5Chat%7By%7D%29

逻辑回归的损失函数

刚才我们给到的是单个训练样本中定义的损失函数,它衡量了在单个训练样本上的表现。我们定义代价函数(Cost Function,或者称作成本函数)为全体训练样本上的表现,即 equation?tex=m 个样本的损失函数的平均值,反映了 equation?tex=m 个样本的预测输出与真实样本输出 equation?tex=y 的平均接近程度。

成本函数的计算公式如下:

equation?tex=J%28w%2Cb%29%20%3D%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5EmL%28%5Chat%7By%7D%5E%7B%28i%29%7D%2Cy%5E%7B%28i%29%7D%29

2.梯度下降法(Gradient Descent)

梯度下降 Gradient Descent

刚才我们了解了损失函数(Loss Function)与成本函数定义,下一步我们就要找到最优的 equation?tex=wequation?tex=b 值,最小化 equation?tex=m 个训练样本的Cost Function。这里用到的方法就叫做梯度下降(Gradient Descent)算法。

在数学上,1个函数的梯度(gradient)指出了它的最陡增长方向。也就是说,沿着梯度的方向走,函数增长得就最快。那么沿着梯度的负方向走,函数值就下降得最快。

(更详细的最优化数学知识可以阅读ShowMeAI文章 图解AI数学基础 | 微积分与最优化

模型的训练目标是寻找合适的 equation?tex=wequation?tex=b 以最小化代价函数值。我们先假设 equation?tex=wequation?tex=b 都是一维实数,则代价函数 equation?tex=J 关于 equation?tex=wequation?tex=b 的图如下所示:

梯度下降法

上图中的代价函数 equation?tex=J 是一个凸函数,只有一个全局最低点,它能保证无论我们初始化模型参数如何(在曲面上任何位置),都能够寻找到合适的最优解。

基于梯度下降算法,得到以下参数 equation?tex=w 的更新公式:

equation?tex=w%20%3A%3D%20w%20-%20%5Calpha%5Cfrac%7BdJ%28w%2C%20b%29%7D%7Bdw%7D

公式中 equation?tex=%5Calpha 为学习率,即每次更新的 equation?tex=w 的步长。

成本函数 equation?tex=J%28w%2C%20b%29 中对应的参数 equation?tex=b 更新公式为:

equation?tex=b%20%3A%3D%20b%20-%20%5Calpha%5Cfrac%7BdJ%28w%2C%20b%29%7D%7Bdb%7D

3.计算图(Computation Graph)

计算图 Computation Graph

对于神经网络而言,训练过程包含了两个阶段:前向传播(Forward Propagation)和反向传播(Back Propagation)。

  • 前向传播是从输入到输出,由神经网络前推计算得到预测输出的过程
  • 反向传播是从输出到输入,基于Cost Function对参数 equation?tex=wequation?tex=b 计算梯度的过程。

下面,我们结合一个例子用计算图(Computation graph)的形式来理解这两个阶段。

3.1 前向传播(Forward Propagation)

假如我们的Cost Function为 equation?tex=J%28a%2Cb%2Cc%29%3D3%28a%2Bbc%29,包含 equation?tex=aequation?tex=bequation?tex=c 三个变量。

我们添加一些中间变量,用 equation?tex=u 表示 equation?tex=bcequation?tex=v 表示 equation?tex=a%2Bu,则 equation?tex=J%3D3v

整个过程可以用计算图表示:

计算图

在上图中,我们让 equation?tex=a%3D5equation?tex=b%3D3equation?tex=c%3D2,则 equation?tex=u%3Dbc%3D6equation?tex=v%3Da%2Bu%3D11equation?tex=J%3D3v%3D33

计算图中,这种从左到右,从输入到输出的过程,就对应着神经网络基于 equation?tex=xequation?tex=w 计算得到Cost Function的前向计算过程。

3.2 反向传播(Back Propagation)

计算图导数 Derivatives with a Computation Graph

我们接着上个例子中的计算图讲解反向传播,我们的输入参数有 equation?tex=aequation?tex=bequation?tex=c 三个。

先计算 equation?tex=J 对参数 equation?tex=a 的偏导数

计算图

从计算图上来看,从右到左, equation?tex=Jequation?tex=v 的函数, equation?tex=vequation?tex=a 的函数。基于求导链式法则得到:

equation?tex=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20a%7D%3D%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20v%7D%5Ccdot%20%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20a%7D%3D3%5Ccdot%201%3D3

计算 equation?tex=J 对参数 equation?tex=b 的偏导数

计算图

从计算图上来看,从右到左, equation?tex=Jequation?tex=v 的函数, equation?tex=vequation?tex=u 的函数, equation?tex=uequation?tex=b 的函数。同样可得:

equation?tex=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20b%7D%3D%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20v%7D%5Ccdot%20%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20u%7D%5Ccdot%20%5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20b%7D%3D3%5Ccdot%201%5Ccdot%20c%3D3%5Ccdot%201%5Ccdot%202%3D6

计算 equation?tex=J 对参数 equation?tex=c 的偏导数

计算图

此时从右到左, equation?tex=Jequation?tex=v 的函数, equation?tex=vequation?tex=u 的函数, equation?tex=uequation?tex=c 的函数。可得:

equation?tex=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20c%7D%3D%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20v%7D%5Ccdot%20%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20u%7D%5Ccdot%20%5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20c%7D%3D3%5Ccdot%201%5Ccdot%20b%3D3%5Ccdot%201%5Ccdot%203%3D9

这样就完成了从右往左的反向传播与梯度(偏导)计算过程。

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

逻辑回归的梯度下降 Logistic Regression Gradient Descent

回到我们前面提到的逻辑回归问题,我们假设输入的特征向量维度为2(即 equation?tex=%5Bx_1%2C%20x_2%5D ),对应权重参数 equation?tex=w_1equation?tex=w_2equation?tex=b 得到如下的计算图:

逻辑回归中的梯度下降法

反向传播计算梯度

求出 equation?tex=L 对于 equation?tex=a 的导数

逻辑回归中的梯度下降法

求出 equation?tex=L 对于 equation?tex=z 的导数

逻辑回归中的梯度下降法

继续前推计算

逻辑回归中的梯度下降法

基于梯度下降可以得到参数更新公式

逻辑回归中的梯度下降法

梯度下降的例子 Gradient Descent on m Examples

逻辑回归中的梯度下降法

前面提到的是对单个样本求偏导和应用梯度下降算法的过程。对于有 equation?tex=m 个样本的数据集,Cost Function equation?tex=J%28w%2Cb%29equation?tex=a%5E%7B%28i%29%7D 和 权重参数 equation?tex=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;
AI 代码解读

接着再对 equation?tex=w_1equation?tex=w_2equation?tex=b 进行迭代。

上述计算过程有一个缺点:整个流程包含两个for循环。其中:

  • 第一个for循环遍历 equation?tex=m 个样本
  • 第二个for循环遍历所有特征

如果有大量特征,在代码中显示使用for循环会使算法很低效。向量化可以用于解决显式使用for循环的问题。

5.向量化(Vectorization)

向量化 Vectorization

继续以逻辑回归为例,如果以非向量化的循环方式计算 equation?tex=z%3Dw%5ETx%2Bb,代码如下:

z = 0;
for i in range(n_x):
    z += w[i] * x[i]
z += b
AI 代码解读

基于向量化的操作,可以并行计算,极大提升效率,同时代码也更为简洁:
(这里使用到python中的numpy工具库,想了解更多的同学可以查看ShowMeAI图解数据分析 系列中的numpy教程,也可以通过ShowMeAI制作的 numpy速查手册 快速了解其使用方法)

z = np.dot(w, x) + b
AI 代码解读

不用显式for循环,实现逻辑回归的梯度下降的迭代伪代码如下:

equation?tex=Z%3Dw%5ETX%2Bb%3Dnp.dot%28w.T%2C%20x%29%20%2B%20b

equation?tex=A%3D%5Csigma%28Z%29

equation?tex=dZ%3DA-Y

equation?tex=dw%3D%5Cfrac%7B1%7D%7Bm%7DXdZ%5ET

equation?tex=db%3D%5Cfrac%7B1%7D%7Bm%7Dnp.sum%28dZ%29

equation?tex=w%3A%3Dw-%5Csigma%20dw

equation?tex=b%3A%3Db-%5Csigma%20db

参考资料

ShowMeAI系列教程推荐

推荐文章

ShowMeAI用知识加速每一次技术成长

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
打赏
0
0
1
0
2387
分享
相关文章
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
135 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
356 55
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
162 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
51 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
6天前
|
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
54 20
基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
本项目基于YOLOv4深度学习网络,利用MATLAB 2022a实现排队人数统计的算法仿真。通过先进的计算机视觉技术,系统能自动、准确地检测和统计监控画面中的人数,适用于银行、车站等场景,优化资源分配和服务管理。核心程序包含多个回调函数,用于处理用户输入及界面交互,确保系统的高效运行。仿真结果无水印,操作步骤详见配套视频。
54 18
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
220 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
45 3
基于yolov4深度学习网络的公共场所人流密度检测系统matlab仿真,带GUI界面
本项目使用 MATLAB 2022a 进行 YOLOv4 算法仿真,实现公共场所人流密度检测。通过卷积神经网络提取图像特征,将图像划分为多个网格进行目标检测和识别,最终计算人流密度。核心程序包括图像和视频读取、处理和显示功能。仿真结果展示了算法的有效性和准确性。
88 31
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等