目录
一、神经网络本质
在深度学习的热门领域中,CV把图像数据转化为计算机能识别的特征,NLP把文本数据转化为计算机能识别的特征,DM把结构化文本数据转化为计算机能识别的特征。整个深度学习都在干的一件事——提特征。
那么深度学习的”训练“、”学习“是什么意思呢?
给了原始的输入输出数据,比如下图通过360°移动”四不像“可以得到不同的”映射“,但关键是怎么把特征学好,这就是深度学习本质问题:怎么对输入输出做变换才能得到好的特征。
”映射“是对输入输出数据做了什么?
从以上例子就是把一个“四不像”通过“投影”成一个我们需要的“映射”,最后这个“兔子”比我们原来的“四不像“识别起来更轻松。
同样,神经网络就是找到一个通用方向,把输入的数据映射到这个方向以后,用映射后的特征能够更精准地去做预测,深度学习的本质问题是怎么对输入数据做变化才能得到好的特征。
二、神经网络的核心原理
1. 前向传播
1.1 数据预处理
拿到了数据之后,不能直接的输入到神经网络当中,要稍微做一些改变。比如:做一个标准化的操作。 不同的预处理结果会使得模型的效果发生很大的差异!
1.2 参数初始化
1.3 线性函数
公式
对于每一层神经元的计算,可以表示为:
其中,是第 l 层的权重矩阵,
是上一层的输出,
是第 l 层的偏置项,
是该层的加权输入。
就像做课后练习,z(答案)与a(题目)都是已知的,怎么答这个题(调整W与b)让预测值与真实值更接近,以后加入新数据(a),通过W与b得到新的预测结果。
注意:W和b开始都是随机初始化的,就像零基础啥也不懂,全靠后天训练调整正确率
以识别猫的照片举例
这个猫由每一个像素点决定的,这里有32 * 32 * 3=3072个像素点。不同的像素点对于它是猫是促进的作用,有些是抑制的作用。所以每一个像素点对应的权重w是不一样的。3072个像素点对应3072个权重参数。
x 代表像素点,32 * 32 * 3=3072 * 1。可以理解为把每一个像素点拉长了,总共有3072个格(像素点)。权重参数w 为1 * 3072个。它们相乘=1 * 1(一个点或者一个值)。
比如我们要做一个十分类任务(猫、狗、蛇.....),当前这个点要分别计算它属于十个类别各自的得分值,把所有像素点都考虑进去。w1表示它属于猫类别的得分,w2表示它属于狗类别的得分。...w10...。最后w就是10 * 3072(10代表十个不同的类别,十个结果)最后相乘完=10 * 1,表示它得到10个类别各自的得分(比如猫400分,狗300分)。b为偏置项,微调(上下进行浮动),w起决定性作用。各自类别,各自微调。b的10 * 1,十个数。
注意:W、b、X均为矩阵
这里把猫当做四个像素点,做三分类,分别得到得分值。3 * 4(3代表类别个数,4代表猫有四个像素点,每个像素点要对应一个权重值)。计算:0.2 * 56 +(-0.5)* 231 + 0.1 * 24 + 2.0 * 2 + 1.1 = -96.8(猫类别的得分)。权重参数中,数值越大影响越重要,正值代表促进,负值代表抑制。
那么这个 3 * 4 的矩阵是怎么来的呢?
它是一步一步优化而来的,一开始可以是随机构建的,值也是随机值。如上图做的不好,结果错误。x (输入数据)是不变的,需要变的是w,神经网络在整个生命周期过程中,就在做一件事,什么样的w能更适合于咱们的数据去做当前的任务,就怎么样去改变这个w。因为w里面的值,会对结果产生决定性的影响。开始随机选择一些值,接下来在迭代的过程中,要想一种优化方法,不断地去改进w这个参数。
1.4 损失函数
如何衡量分类的结果呢?
结果的得分值有着明显的差异,我们需要明确的指导模型的当前效果,有多好或是多差!
损失函数如何定义:
首先得到一个结果,损失函数是我们得到结果之后才能做一个评估。刚才是看如何得到结果。上图就是三个类别(猫、汽车、青蛙)。当前第一个数据来了,猫:3.2,汽车5.1,青蛙-1.7.这件事做的不好,不好了就要计算上图的式子,计算当前它属于其他错误类别(Sj)- 正确类别(Syi)得分再 + 1。计算错误类别比正确类别高了多少,损失函数越低越好。为什么加1,相当于加了一个△,比如,car=3.15,时,3.15-3.2= -0.05<0,认为正确类别比错误类别高,就认为它没有损失,但是还是存在问题。如果+1 ,就可以区分开,(容忍程度)正确类别至少要比错误类别高1以上,才是没有损失的。
1.5 Softmax分类器
现在我们得到的是一个输入的得分值,但我们想知道识别的结果有多差,我们需要一个指标——损失,做的好损失低,做的差损失高。
首先,我们需要拉开数据的差异,这里用非线性的方式(指数增长,线性方式拉不开太大差异)
其次,通过归一化得到每个分类的概率(按照归一化公式)。
最后,算出损失值(log曲线符合损失,概率为1损失为0,越接近0损失越大需要在前面加负号),只求正确类别的就行了(正确越高,错误越低)
1.6 激活函数
激活函数(Activation Function)是神经网络中的一种非线性函数,用于引入非线性特性,提高模型的表示能力和学习能力。激活函数将输入信号进行非线性变换,输出一个新的值作为神经元的激活状态。
常见的激活函数有以下几种:
- Sigmoid 函数:Sigmoid 函数将输入映射到 (0, 1) 范围内,它具有平滑的 S 形曲线。公式为:f(x) = 1 / (1 + exp(-x))。Sigmoid 函数在过去被广泛使用,但在深度神经网络中逐渐被其他激活函数取代,因为它存在梯度消失的问题。
- Tanh 函数:Tanh 函数将输入映射到 (-1, 1) 范围内,类似于 Sigmoid 函数,但在原点附近更为平缓。公式为:f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))。Tanh 函数也存在梯度消失的问题,但相对于 Sigmoid 函数,它的输出有均值为零的特性。
- ReLU 函数:ReLU(Rectified Linear Unit)函数将负值映射为零,正值保持不变,可以简单地表示为 f(x) = max(0, x)。ReLU 函数在实践中广泛使用,它解决了梯度消失问题,且计算速度快。但它的一个缺点是在负值区间的梯度为零,可能导致神经元的死亡。
- Leaky ReLU 函数:Leaky ReLU 函数是对 ReLU 函数的改进,当输入为负时引入一个小的斜率(一般为 0.01),可表示为 f(x) = max(0.01x, x)。这样可以解决 ReLU 函数中负值区间的梯度为零的问题。
- Softmax 函数:Softmax 函数常用于多分类问题中,在输出层将多个神经元的原始分数转化为归一化的概率分布。Softmax 函数将每个神经元的原始分数通过指数化和归一化操作,确保所有输出的和为 1,使其可以表示概率分布。
除了上述常见的激活函数,还有一些其他的变体和改进版本,如 PReLU、ELU、SELU 等,它们在不同场景下可能具有更好的性能和鲁棒性。在选择激活函数时,需要根据任务的特性和数据集的情况进行选择,以及考虑梯度消失、梯度爆炸、运算速度等因素。
1.7 正则化
正则化是一种常见的技术手段,主要用于防止过拟合现象的发生。它通过向目标函数添加额外的约束条件(通常是参数范数),从而减少模型复杂度并提升泛化能力。
有损失函数后,还需要对损失函数进行一个改进。不光有w,还有一个正则化,如上图。模型A和模型B,结果的得分一样,但是A只考虑了局部,B考虑了全部。A就相当于过拟合了。
前面的一块为data loss ,数据在当前函数当中得到的一个损失,正则化惩罚项表示当前这一组模型由于它的权重参数所带来的损失(和数据没关系,只关注权重参数w)。
w1的平方+w2的平方+...+w10的平方.前面再乘上一个,
越大代表不希望过拟合。
1.8 正则化作用
惩罚值加在损失函数中。如图:
惩罚力度对结果影响
如第一幅图只关注局部特征导致过拟合现象,从左往右,随着惩罚力度增加,边界更加平滑,泛化能力更强。
2. 反向传播(了解)
在pytorch框架中,前向传播由我们设计方法,反向传播是自动化执行,不用参与。
神经网络将很多个线性回归组合在一起,有层级,所以求梯度的过程是使用链式法则逐层计算的,就像等级森严的公司投资亏钱后,董事长找经理,经理找职工。
注意:梯度是一步一步传的
反向传播举例:
2.1 梯度下降
引入:我们需要找一个W(权重)的值使loss(损失)为最小值,我们很难猜出来最优解,所以我们要去尝试如何接近这个最优解。
常规套路:机器学习的套路就是我交给机器一堆数据,然后告诉它什么样的学习方式是对的(目标函数),然后让他朝着这个方向去做
如何优化:一口吃不成个胖子,我们要静悄悄的一步步的完成迭代(每次优化一点点,累积起来就是个大成绩了),沿着每一此迭代的最优解(每一步的最优解都不同)走。
注意:
- 正常梯度是数值上升方向(损失变大),所以沿着梯度的反方向,叫做梯度下降
- X(特征)之间互不影响,各自独自更新。
2.2 学习率
学习率一开四有个warmup(预热)的过程,一般是前500次迭代从0缓慢地预热到设定的基准学习率,就像打高尔夫,球一开始快,距离洞口越近打得越慢,有个衰减的过程。
2.3 梯度下降分类
每个样本算出来损失不一样,有些离群点算出来可能非常离谱,不太准确,所以有三种计算方式。
bitch:选择训练样本数量
注意:公式负号的含义是往梯度的反方向。
三、神经网络整体架构
上图是将输入数据经过好几个线性(可以有非线性)组合变换得到想要的输出结果。
什么叫做层次? 神经网络一层一层来办事的。
3.1 隐藏层
在输入层和输出层之间,我们有一个或多个隐藏层,对输入数据执行一系列非线性变换。这些隐藏层的目的是从输入数据中提取对当前任务更有意义的高级特征。您可以决定在网络中添加多少隐藏层。
ConvNetJS demo: Classify toy 2D data
在以上链接中,我们在simple data 中将代码改成一个特征,如下:
看上去像切了一刀,但有一个点未正确分类,这时候把特征改成3
如图,看上去像切了2刀,算法正确率得到提高。
3.2 神经元
神经元(数据的量或者叫矩阵的大小)。比如现在有一组数据,这组数据有三个特征:x1(age),x2(体重),x3(身高)。input 红色的圈代表输入数据特征有多少个的。
3.3 全连接
全连接指每一层的神经元与上一层的所有神经元全连接,常用于图像分类、文本分类等任务。
隐层 1 当中,把原始输入的三个特征转换成现在的四个特征。把输入的特征转换成它能更认识的一些信息。如隐层1 当中第一个圈(age*0.1+w*0.3+h*0.3)它没有具体的意思,只是一个数值(在计算机眼中更容易分辨,是一个更好的特征)。神经网络通过反向传播算出来最好的组合方式。如何由 1*3 变到 1*4 ,由 x * w1[3,4] 权重参数矩阵。由隐层1到隐层2,再乘一个 w2[4*4] 的矩阵。最后到 output,中间连一个 w3[4*1] 的矩阵。
最后预测结果的好坏和 w1,w2,w3 有关。什么样的权重参数是适合当前任务的。求解。
3.4 非线性
加在了每一步进行矩阵计算之后,x 与 w1 组合完之后,进行非线性变换,然后再和 w2组合,以此类推。如下图:
非线性神经网络与线性神经网络的主要区别在于它们处理的输入-输出关系的性质。
线性神经网络的输出与输入之间的关系是线性的,而非线性神经网络的输出与输入之间的关系是非线性的。非线性神经网络能够学习到复杂的数据模式,从而实现更高的准确性和性能。
四、过拟合
过拟合指算法在训练集上指标特别高,实际测试集上指标特别低。实际应用指算法在A场景适用,但在B场景不适用
如图框住的点为离群点(标注错误或异常),使算法开辟边界去捞,但是后续新数据出现在该区域中会被判定为正确,与实际不符,出现过拟合。
过拟合是神经网络非常头疼的一个大问题!以下为避免过拟合的基本方法:
数据集扩充:增加训练数据的数量可以有效减少过拟合。可以使用数据增强技术如旋转、翻转、缩放等操作来生成更多的训练样本,以提高模型的泛化能力。
正则化(Regularization):正则化通过在损失函数中添加一个惩罚项,限制模型参数的大小,避免模型过于复杂而导致过拟合。常见的正则化方法包括L1正则化和L2正则化。
早停(Early Stopping):训练过程中监控验证集的性能,当验证集性能不再提升时停止训练,避免过拟合。早停可以通过设置一个合适的阈值或者监控验证集误差的变化来实现。
Dropout:常用的正则化技术,通过在训练过程中随机丢弃一部分神经元的输出,以减少神经元之间的依赖关系,防止过拟合。训练过程中每一层,每一次随机选择固定比例的一部分进行丢弃。
以上便是《投影重构术:神经网络的动态炼金》的所有内容。
从混沌数据到澄明特征,权重之火在梯度迭代中淬炼认知的黄金;从线性叠加到非线性跃迁,激活函数为原始像素重赋新形。这场动态炼金的本质,是以数学为坩埚、以损失为焰火,将万物投影为机器可读的诗篇。
👨💻 互动时间
各位技术大佬们!如果发现文中骚操作有bug,欢迎评论区弹幕式轰炸!
小白兄弟萌遇到报错问题?私信秒回技能已冷却完毕!
(您的每一次点赞/收藏/转发,都是我疯狂输出干货的蓝Buff!❤️🔥)