文档章节

浅谈神经网络(基础概念篇)

Uknowzheng
 Uknowzheng
发布于 02/20 23:44
字数 3327
阅读 13
收藏 0

前言

为什么会谈神经网络?目前深度学习是最火的研究方向,而深度学习的基础就是神经网络。所以通过对神经网络的学习,可以掌握一门强大的机器学习的一种方式,能够做一些智能化的事情。

基础知识篇

由于要了解神经网络,需要对机器学习这门学科要有前置的一些认识,所以基础篇会讲解一部分关于机器学习相关的概念和流程。

什么是机器学习?

机器学习是人工智能的一个分支,通过机器学习算法从数据中自动分析获得规律,并利用规律对未知数据进行预测。

关于机器学习可以分为几种类型:

  • 监督学习
  • 无监督学习
  • 半监督学习

有监督和无监督的学习差异在于:

有监督学习方法必须要有人工标记的数据集用于学习(根据数据集还需要划分为训练集/测试集/验证集),而非监督学习没有标记好的数据集,只有一组数据,在该组数据集内寻找规律(前者可以理解为利用现有数据分类,后者则为利用数据聚类)。半监督学习则是基于有监督和无监督进行组合的一种学习方式。

关于有监督学习涉及到的算法基本为回归算法和分类算法,举例如下:

  • 线性回归
  • 逻辑回归
  • 朴素贝叶斯
  • 决策树
  • 神经网络
  • KNN
  • SVM

关于无监督学习涉及到的算法基本为聚类算法,举例如下:

  • k-means
  • PCA
  • GMM

所以总结下来,本文主要讲的范围就是有监督学习下的深度神经网络的学习,这也是目前用的过程最为广泛的机器学习方法。至于其他的有监督的学习算法和无监督的学习算法,读者可以自行找书籍学习了解。后续本文主要围绕神经网络来讲解。

关于有监督学习工程化相关概念

有监督学习的工程化就是需要人工标记的正确数据样本(一组特征对应的正确标签)通过模型的训练,对结果的评估计算,不断调整完善计算参数的过程。最终的结果就是希望模型评估出的结果能够逼近我们实际正确的标签。

这里介绍几个工程中基本的概念:

标签

标签是我们要预测的事物,即简单线性回归中的 y 变量。标签可以是小麦未来的价格、图片中显示的动物品种、音频剪辑的含义或任何事物。

特征

特征是输入变量,简单的机器学习项目可能会使用单个特征(特征必须具体不能太宽泛),而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:

模型

模型定义了特征与标签之间的关系。例如,垃圾邮件检测模型可能会将某些特征与“垃圾邮件”紧密联系起来。可以用简单的数学公式来理解模型:

y=f(x)
这里的y为标签,x输入项为特征,而整个公式就是模型

一般来说模型的形成,需要进行训练和推断两个过程:

  • 训练:通过有标签的样本,让模型学习特征跟标签的关系。
  • 推断:通过训练后的模型来对无标签的样本进行推断,让模型对新的特征进行预测来得到有用的结果。

根据模型的用途,可分为两种用途的模型:

  • 回归模型:回归模型可预测连续值。如加利福尼亚州一栋房产的价值是多少?用户点击此广告的概率是多少?
  • 分类模型:分类模型可预测离散值。某个指定电子邮件是垃圾邮件还是非垃圾邮件?这是一张狗、猫还是仓鼠图片?
模型训练过程:损失评估和降低损失

模型的训练过程,同样的输入特征,模型训练输出的实际结果和正确数据样本集的实际结果必然会有一定的差异,这里怎么评估模型的实际结果和样本集中的正确结果之间的差异大小称为损失评估。这里会涉及到一些常用的损失函数:平方函数(L2损失)和均方误差(MSE)损失函数等。

评估出损失之后,就需要考虑怎么降低损失,从而对模型参数进行调整,这个过程称为降低损失(主要描述了损失跟模型参数的调整关系,通过一定的学习速率可以使得当损失最小)。常用的降低损失的方法为梯度下降法。梯度下降方法也有对应的一些函数。

关于梯度下降法

假如我们研究的是回归问题,所产生的损失与w1的图形始终是凸形。换言之,图形始终是碗状图,如下所示:

凸形问题只有一个最低点;即只存在一个斜率正好为 0 的位置。这个最小值就是损失函数收敛之处。通过计算整个数据集中每个可能值的损失函数来找到收敛点这种方法效率太低。我们可以通过梯度下降法,梯度下降法的第一个阶段是为w1选择一个起始值(起点)。起点并不重要;因此很多算法就直接将w1设为 0 或随机选择一个值。下图显示的是我们选择了一个稍大于 0 的起点:

然后,梯度下降法算法会计算损失曲线在起点处的梯度。简而言之,梯度是偏导数的矢量;它可以让您了解哪个方向距离目标“更近”或“更远”。请注意,损失相对于单个权重的梯度就等于导数。 请注意,梯度是一个矢量,因此具有以下两个特征:

  • 方向
  • 大小

梯度始终指向损失函数中增长最为迅猛的方向。梯度下降法算法会沿着负梯度的方向走一步,以便尽快降低损失。

为了确定损失函数曲线上的下一个点,梯度下降法算法会将梯度大小的一部分与起点相加,如下图所示:

然后,梯度下降法会重复此过程,逐渐接近最低点。

关于学习速率

梯度矢量具有方向和大小。梯度下降法算法用梯度乘以一个称为学习速率(有时也称为步长)的标量,以确定下一个点的位置。例如,如果梯度大小为 2.5,学习速率为 0.01,则梯度下降法算法会选择距离前一个点 0.025 的位置作为下一个点。我们会花费相当多的时间来调整学习速率。

  • 如果您选择的学习速率过小,就会花费太长的学习时间:

  • 如果您指定的学习速率过大,下一个点将永远在 U 形曲线的底部随意弹跳。

  • 损失函数的梯度较小,则可以放心地试着采用更大的学习速率,以补偿较小的梯度并获得更大的步长。学习速率刚好的情况。

总结

总体来说有监督学习工程化主要就是通过正确的标签数据对应的特征进行输入,经过模型得到实际结果,再将实际结果和正确的标签结果进行损失评估得到一个损失大小的值,然后通过降低损失的算法来根据损失大小的值按一定的学习速率来调整模型参数的权重值,使得参数经过几轮训练后得到最优解(用数学的话讲:就是不断的拟合数据,得到最合适的函数)。最后得到的模型就可以用于进行预测或者是分类求解新的数据。

关于标签数据的一些问题(如何提高数据质量以及模型效果)

泛化数据:解决过拟合问题

过拟合模型在训练过程中产生的损失很低,但在预测新数据方面的表现却非常糟糕。当有新数据加入的时候,模型并不能很好地对数据进行预测。所以要经可能适当的拟合我们的数据。尽可能的泛化数据:

将数据划分成三份,分别为训练集/验证集/测试集。并按照如下流程:

这样可以达到以下效果:

  • 训练集用于日常训练。
  • 验证集上获得最佳效果的模型。
  • 使用测试集再次检查该模型的有效性。

当然这里对于过拟合的问题还有涉及到的数据正则化,降低复杂模型的复杂度来防止过拟合,这种原则称为正则化。(有 L1和L2 正则化公式,具体可以自行谷歌了解)

特征处理:特征工程(怎么处理特征归类,规范化特征)

左侧表示来自输入数据源的原始数据,右侧表示特征矢量,也就是组成数据集中样本的浮点值集。 特征工程指的是将原始数据转换为特征矢量。进行特征工程预计需要大量时间,用于解决该类映射问题。 机器学习模型通常期望样本表示为实数矢量。这种矢量的构建方法如下:为每个字段衍生特征,然后将它们全部连接到一起。

  • 数值映射:

机器学习模型根据浮点值进行训练,因此整数和浮点原始数据不需要特殊编码。

  • 字符串映射:

模型无法通过字符串值学习规律,因此您需要进行一些特征工程来将这些值转换为数字形式。然后,使用该词汇表创建一个独热编码,用于将指定字符串值表示为二元矢量。在该矢量(与指定的字符串值对应)中,该矢量的长度等于词汇表中的元素数。

  • 枚举映射:

分类特征具有一组离散的可能值。例如,名为 Lowland Countries 的特征只包含 3 个可能值:

 {'Netherlands', 'Belgium', 'Luxembourg'}

将分类特征(如 Lowland Countries)编码为枚举类型或表示不同值的整数离散集。例如:

将荷兰表示为 0
将比利时表示为 1
将卢森堡表示为 2
  • 良好的特征特点:

    • 避免很少使用的离散特征值(数据尽可能出现多次,避免使用很偏离数据集合的数据)
    • 最好具有清晰明确的含义
    • 排除异常的值(需要进行数据的清洗)
    • 尽可能使用稳定的数据,不会随着时间变化
  • 数据清理:由于少量的错误数据也会破坏整体数据集合,所以我们需要对数据做清理。

    • 缩放特征值帮助梯度下降法更快速地收敛
    • 处理极端离群值(处理离散数据)
    • 分解特征,了解特征。以便于更好抽出具体的特征。(特征分箱/特征清查/特征组合)

总结

为什么要撸这么多机器学习概念相关的基础篇,主要是为了能够更好了解机器学习入门的一些老生长谈的词汇,机器学习方向是很广的,了解概念帮助写代码更轻松。本文后续准备往神经网络方向去讲,当然神经网络其实最合适的场景是用于解决图像的问题。相反,其他的类型的问题,可能就不太合适用神经网络去解决了,明确自己场景用各种机器学习方法进行组合才是最合适的。目前神经网络这块框架其实不少,类似tensorflow(提供了相对底层的接口)或者Keras(提供了相对高级的接口) 这类的深度学习框架。当然,其他的算法也有对应的框架(强化学习如openAI)或者是机器学习算法库,只不过这块要自己写算法而已,数学功底才是硬核。

© 著作权归作者所有

共有 人打赏支持
Uknowzheng
粉丝 56
博文 7
码字总数 21689
作品 0
深圳
程序员
私信 提问
微软WSFC全方位解析

Windows Server Failover Clustering是微软重要的Windows Server功能,它为微软众多企业级平台提供底层高可用机制,掌握WSFC的概念原理,功能使用,故障排错将对管理员运维有很大帮助,本系列...

老收藏家
2017/12/24
0
0
浅谈前端与网络请求

作者:不洗碗工作室 - 张景浩 博客地址:http://michaelcode.cn版权归作者所有,转载请注明出处 toc: 前端 学前端也有一段时间了,想浅谈一下前端与网络请求。谈网络请求,自然绕不开的一个话...

不洗碗工作室
2017/12/08
0
0
【文集】xlua

前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议,也受到广大开发者的热捧,我把相关的一些资料做了一个整理。 腾讯开源手游热更新方案:Unity3D下的XLua方案介绍 腾讯开...

CatherinePlans
2017/11/05
0
0
机器学习 人工智能 博文链接汇总

115 [入门问题] [TensorFlow] [深度学习] [好玩儿的算法应用实例] [聊天机器人] [神经网络] [机器学习] [机器学习算法应用实例] [自然语言处理] [数据科学] [Python] [Java] [机器学习--初...

aliceyangxi1987
2017/05/13
0
0
《网络黑白》一书所抄袭的文章列表

这本书实在是垃圾,一是因为它的互联网上的文章拼凑而成的,二是因为拼凑水平太差,连表述都一模一样,还抄得前言不搭后语,三是因为内容全都是大量的科普,不涉及技术也没有干货。所以大家也...

wizardforcel0
2018/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部