https://www.bilibili.com/read/cv12359258
笔记所有素材均来源于网络
近来,深度神经网络在人工智能领域被广泛应用,还记得我在当初学习时走了不少弯路……
一些 “教程” 一上来就大谈 “偏导数” “矩阵” 之类的概念,让人云里雾里
这篇文章会尝试讲清楚最本质的东西,一种类似于直觉或哲学的东西,所以 不涉及计算。一旦你明白它的本质,如何计算应该是心中有数的……
(这是我本人的个人理解,若有什么不对,望不吝指正)
什么是神经网络?以及它解决了什么?
一直以来,计算机都只能处理具有明确步骤 精确任务:例如加减乘除、查找数据、求解方程等。但对于 模糊任务:手写识别、图片分类、聊天对话等,却无能为力……
一个原因是:即使是一个简单的手写数字识别任务,世界上最聪明的工程师也无法给一大堆 凌乱的像素 与 抽象的数字 找到明确的关系
模糊任务处理本质是一个 数据处理 问题,问题在于如何找到处理方法……
于是人们发明了 神经网络,用模型里的参数表示出通用的数据处理流程
也就是说,只要找到合适的 模型参数,就可以把输入的凌乱的数据(猫狗图片、评价文本等),变成抽象概念(猫、狗、好评度等)【下面看看 —— 什么是模型?】
先让我们看看一个简单 全连接神经网络 的结构:
由许多许多 人工神经元 (说是受人脑启发,但更像是蹭热度)组成,用于处理数据
信号一层层的被传递、处理,最终产生输出(但我们尚未知晓里面发生了什么)
(图1)简单全连接神经网络结构图
而且,一大堆乱七八糟的连线,所以还是先看看 单神经元 结构图:
(图2)单人工神经元【可以看作一个数据加工厂】
单神经元运算过程如下:
将对应的 输入X 与对应的 权重W 相乘并求和(权重可以理解为重要程度)
将 加权和 加上 偏置B 送入 激活函数 ,最后输出……
现在再看(图1)是否有了一些头绪?那些写着 +1 的圈圈就是 偏置B
这么多东西怎么来,一会儿再说……
而乱成一锅粥的箭头是 输入与输出的流向 和 权重,只要弄清什么是 激活函数 即可
激活函数 顾名思义,是一个函数。常用的是 Leaky ReLU,图像如下:
Leaky ReLU
Leaky ReLU 的函数表达式很容易写出来:
所以完整单神经元的表达式呼之欲出!
现在只要按照(图1)的数据流向,将一层网络的输出作为下层网络输入,层层嵌套计算即可,最后一层便是整个网络的输出
重点,激活函数是固定的,在输入确定的情况下,权重 与 偏置 决定着模型的输出!这些东
就是模型的 参数,像网络层数,每层个数等叫 超参数,因为一旦确定一般不更改
因此我们所需要的便是找到合适的 参数,使得模型可以正确的将数据转化为概念
假若我们有一张猫图,应该如何将其输入模型,看看它到底是不是猫呢?最简单粗暴的方法就是把它变成黑白猫:从上到下,从左往右把所有像素点的亮度值输入进去……
假设图片有n个像素点,那么输入层就有n个神经元
我们并不知道合适的参数是什么,所以可以试着随机初始化它们。但这样的模型是不可以使用的,因为它完全在瞎搞,甚至可能把老鼠的图片判定为猫
我们构建网络模型的目的,是为了判定图片是否是猫,我们当然希望 准确率 越高越好!
而那数不尽的参数让我们发愁:想象有一台机器,可以 计算模型的准确率,我们便可以依据这台神奇的机器来确定参数
旋钮是参数,绿色的条是准确率
然后我们就可以 对每个参数 这样做:
增大这个参数,如果 准确率提升,说明我们做对了,尝试 增大些
增大这个参数,如果 准确率降低,说明我们做错了,尝试 减小些
这便是 神经网络的奥秘 —— 根据参数对结果的影响,进行针对性调整。这个过程叫做 训练
可能有人会问:梯度呢?偏导呢?网上一堆吓人的概念那里去了?【下面讲 梯度 是什么】
既然我们要根据每个参数对准确率的影响,来针对性调整。总不能人工一个个调吧?
要想把这个过程 自动化,就要 定量衡量参数对准确率的影响!
同样的改动大小,不同参数对准确率的影响不同,因此,可以 将影响定义为一个比值:
当 被设定得越小,它就越接近所谓的 梯度(这事实上是数学上的极限值)
但是,准确率 怎么得到?事实上,我们一般不用准确率作为标准,而是以 错误程度 为标准。请原谅我上文为了解释清楚,故意偷换了标准……(本质是一样的)
所以,上文的调整步骤应该变为:
增大这个参数,如果 错误程度 降低,说明我们做对了,尝试增大些
增大这个参数,如果 错误程度 提升,,说明我们做错了,减少参数值
梯度的近似表达为:
现在,我们需要计算模型的 错误程度。假若模型最后只有一个输出 —— 是猫输出1,否则为0
那么,当输入单张图片的时候,我们可以这样计量 错误
图片为多个时,将所有的的错误求平均即可
(比如可以用0代表不是猫,1代表是猫)
这里的 真实值 指的是模型 应该输出的值 (而 真实值 确实需要人类手动提供……)
像这样,用来衡量错误程度的标准,叫 损失函数!训练的目的便是 让损失函数值最小
把一堆猫图输入模型,有了人类提供的标签,神经网络便可以知道自己与理想的差距。根据损失函数的指引,调整每一个参数的大小,直至完全正确的达到预期!
对于最后一层有多个神经元的情况,你应该知道 什么是正确的输出,给模型一个 标准答案,然后再用损失函数,衡量错误程度……
当然,有的时候也会出岔子,模型把我们给的所有数据 死记硬背 下来,导致它实际上效果不好。它没有真正的做判断,而是在 背答案,这种现象被称之为 过拟合
下期利用全连接拟合 图像,带大家熟悉流程! 作者:若小仟 https://www.bilibili.com/read/cv12359258 出处:bilibili