神经网络先导课
什么是神经网络什么是机器学习,这节课都会从零开始解释。
什么是模型?
设计模型的底层是设计能解决真实问题的数学公式
最常见的模型:分类问题
输入给定一组符合要求的输入数据,已知类别总数为n(n选1),经过一系列数学公式计算后输出n个概率,分别代表属于某类别的概率。
确定数学公式:先确定公式、再确定参数
当问题过于复杂时,难以设计相关的公式,统一套用数学公式--神经网络数学公式。

每条线都模拟不同长度、不同强度、不同正负的人脑里的神经电信号传导。(模拟人脑,设计一种一劳永逸的公式结构)
基于MNIST数据库的图像识别
MNIST数据库:包含了70000张手写数字的图像,每一张都是28×28像素的灰度图像,其中60000 张用于训练,10000张用于测试,每张图像的内容只包含一个手写数字,为0到9的其中一个数字。
任务:给定一张28×28像素的灰度图像,经过一系列数学公式计算后输出10个概率,分别代表该图像中的内容是0-9内某个数字的概率。(十个概率相加要等于100%)

28×28像素就有784维的一个向量,可以把这样一张灰度图片转变为784个数字表示,需要一个这样的公式:
其中,x0到x783,这784个数值就是根据灰度图片所输入的数据;w0到w784,这785个数值就是权重,也就是大模型需要自己学习得到的待确定的参数,w就类似于y=ax+b函数中的a和b。
模型训练结束之后,这785个w参数就确定下来,公式就会变为z和x的表达式。当x的输入确定之后(也就是选定了一张图片进行测试),z0就可以通过上述公式计算得出,z1、z2、z....m计算公式。同理,且每个z都分别拥有属于自己的785个参数。
于是从x向量到z向量的过程,总计有785*(m+1)个参数,假设m=31,则此步骤的参数总数有785*32=25120个。
而从z向量到y向量的计算过程也是非常类似的,有属于每个y的待确定的w参数,而最后需要输出的概率y分别是图片为0-9的概率,共十个,所以y0-y9都有属于自己的参数。
(GPT4有1.8万亿个这样的参数)
设计参数
由此可得,在万金油的公式下,确定参数与公式结构同样重要,甚至比设计公式更难。
假如我们这么设计,当输入的x向量是784维时,设定往后推导的z向量长度也为784,则x向量与z向量等长。
线性变化
z向量中的每一个值,都等于x相同位置的值减去下一个像素的值,也就是z[i]=x[i]-x[i+1],z[0[=x[0]-x[1]......
相当于这个公式,w0设置为1,w1设置为-1,其他w都设置为0。即z0=x0-x1。

这个时候,手写绘制的数字1的图像,由有值数字组成绘制形状的矩阵转变成绘制边界的矩阵。如下面两张图的变化。


让当前像素减去相邻像素的值,如果两个像素同为背景或者同一物体,相减之后的值不会很大,相反,物体边缘的变化度数字都会偏高,这样大模型就能更好的检索出物体的边界。通过人工设置参数,达到边缘检测的效果。(这是线性变化的部分)
非线性变化
如果想更直观,(可以再加一次非线性变化),让现在所有是0的地方继续为0,所有非0的地方变为1。区分开两个数字所代表的颜色,我们就得到了右下角的图。


边缘检测之后大模型怎么分类?
得到边缘信息之后,大模型怎么判断这个边缘的图片更贴合哪个数字呢?
我们需要再进一步的处理。
一层一层从x向量到z向量的过程,就是特征提取的过程。
我们已经得到了用1区分边界的只有0和1的图,可以将每行的数字相加,能得到每个数字的边缘情况,很显然他们是不同的,大模型进行规律学习之后可以通过相加的数字推测这张图片是什么数字。(例如1每行相加的值会基本相等)


算法工程师要干的事情就是设计参数以及设计大模型怎么判断的方法。
大模型学习之后,输出十个概率,分别是每个数字的概率。在经过softmax归一化之后,使得十个概率相加等于100%。
而算出这个值的过程,是我们人工设定了w参数,达到了这个效果。当我们换参数之后,可能有不同的作用,也可能有更好的效果。
这就是神经网络。
而深度神经网络,就是x到z的这种层数特别深,更有助于提取一些隐藏的不容易发现的特征信息。
深度学习就是在深度神经网络上,做训练和学习。
来敲定有几层,每一层的向量维度有多大,每一层的线性变化和非线性变化满足什么参数(线性变化大多是万金油公式,主要区分的是非线性变化)
神经网络与机器学习
公式结构设计确定之后,有多少个待确定的参数也就定了,但每个参数都是未知的。
确定参数:求助机器学习(通过计算机完成大规模数学计算,以找到相对更优的参数组合的过程)也就是我们说的模型训练。
机器学习整个过程:从最简单的一个神经网络举例:y=ax+b。
这里的现实意义是已知一些动物的身长和体重,现重新给一个新的动物的身长体重,根据参考判断属于什么种类的动物:是蛇还是鳄?
先随机初始化一组(a,b),在训练数据集中利用y=ax+b进行分类,计算分类结果的误差。思考如何更新ab的值可以减小误差,计算出一组新的ab值,回到上面分类不断循环重复。
怎么定义误差?
怎么定义误差?正确率可能意义不大,对的比例和错的比例这个百分比会更重要一些。最简单的方法就是看绝对值,我们已知的点的位置和拟定的函数的位置之间的距离。这个时候在函数上或者下的位置距离通常是带符号的,没有办法更直观的只看他的差度。
我们尝试再加一个平方。



基于此我们能拿到每一类针对随机选择的函数的所有误差以及总误差。我们的目标就是总误差最小化,所以尝试修改ab的值,第一步先得明确a、b的变化趋势,分别是变大还是变小可以减小总误差。

我们构建一个 (ax+b-y) 的平方作为损失函数,绘制三维函数图来判断不同 a、b 值下的总误差的值。

穷举ab的值之后,绘制图形

很明显能看到图形的低点,那是损失函数最低的时候。
找损失函数最低的过程,就是模型训练学习、深度学习的过程。
当然这是最简单的神经网络的状态,我们还可以用数学直观感受,但参数过多的时候,是人类相当难以解决的,只能通过大模型去慢慢训练。
如何去找最低点呢
多维的曲面不好看,可以尝试留一变一的想法,保持a或b的值不动,将曲面图编程简单的平面二维函数,判断另一个值往什么方向走会变大、往什么方向走会变小。这就是梯度下降的过程。
变化多少呢?这就是步长。一般会随着训练变化越来越小、越来越精。
所以每往前迈一步都需要计算总误差、a和b的梯度方向。根据变化再决定下一步的梯度方向以及步长。
发现总误差不怎么变化开始收敛之后,训练接近尾声。

那总误差收敛的低值就是最好的吗
其实也未必。这和我们设计的损失函数的公式相关,这通常由算法工程师进行设计,更适合于当下情况的损失函数往往能训练处更好的结果。
模型输出是个概率数字,如何基于概率数字计算误差呢?

模型一定能根据概率排序给出一个答案,他认为更符合哪个数字,概率越大越接近于1的数字误差越大、概率越小越远离1的数字误差越大。这里需要通过一个公式来表达出来这层关系。这里选用-ln()的方式。概率越远离1的时候,函数变化率越大,在负值的加成下升的飞快,更能反映出大误差。
每一张图片都有一个误差,我们最后就能得到一个总误差。总误差让每个参数找到自己的梯度方向,进行优化,慢慢找到合适的一组w参数。

联合概率本身是相乘的,加上ln之后就变成相加了。

影响总误差的参数都有哪些?(几十万的参数,我们只需要分别计算每一个参数的梯度方向)
比如,我们现在要计算其中某个参数的梯度方向,可以假设其它参数都不再改变,那么影响总误差的参数就只剩下一个。
随机初始化一组参数;在训练数据集中,利用神经网络进行分类;计算分类结果的误差;计算这么多的参数的值应该如何变化可以减小误差;计算出一组新的参数值;回到步骤2(分类)。
整理一下相关的概念:
分类任务:有几个选项,就输出几个概率(归一化之后相加为一)
神经网络:万金油公式
机器学习:模型训练、模型学习
参数:y=ax+b中的a和b,成千上亿的w
损失函数:总误差
梯度下降:每个参数分别计算,算的时候砍一刀
学习率:学习率越大模型训练的越快,学习率越小训练的越慢但是精度越高。和步长是配合的,步长是动态的,如果总误差降得很大步长可以放心的保持较高的值,如果总误差接近收敛,这个时候步长就得缩小。
常见的损失函数(比如lnx)
常见激活函数:神经网络中非现行的变化,线性变化是神经网络的万金油公式。
神经网络层数:大模型都成百上千层,每一层编码层都有非常多的神经网络。
......
纯粹课程笔记。
更多推荐
所有评论(0)