桂电准大二 | 关于深度学习
桂电准大二 | 关于深度学习
大家好,我目前在桂电就读,马上升大二,前段时间因为有做某些东西的需求,于是去浅浅接触了一下深度学习大致框架,在此分享一下我自己的思考。
首先,大家天天在用AI,或多或少也听说过一些相关名词,比如LLM,prompt,以及前两天很火的harness等等,这些大模型的底层架构细节在这里咱就不聊了,这篇文章主要是讲解作为一个刚入门深度学习的我来说,我眼中的大模型框架是张什么样子的,以及深度学习,包括神经网络,又是干嘛的。
大家不妨先设想一个最基本的场景,你丢给大模型一张黑白相间的像素图片,假如上面标有数字,模型是怎么识别出这个图片标有数字到底是几的?也就是不同输入是如何对应不同输出的?那么既然是存在输入输出就肯定涉及函数了,事实上也确实可以把整体大致理解成一个很复杂很复杂的函数,只是参数量很恐怖罢了。
有了函数之后,我们要如何确认函数可以达到我们想要的目的呢?因为一张黑白相间的像素图片每个像素点上对应的都是这个点的信息,代表黑白程度,通常在0-1之间,而整个图片是有很多像素点的,这么多信息想要进行处理,最后想得到一个准确数值,那么就要分多次进行处理了,事实上也确实是这样做的(也可以理解为是识别数字各个部分最后组合起来,但是这么说也只是方便理解整体过程,因为实际上神经层每一步并不是这样)。
接下来,既然要多次进行处理,也就是分多个神经层,每一层包含多个神经元来处理上一层的信息,通常来说就是Ax,此处x是上层输出,A是具体某一层各个神经元和上一层之间的权重,最后加上一个激活函数。为什么要有激活函数呢?回答这个问题前,首先为了说明激活函数的作用,我们可以先假设用 sigmoid 作为例子,但实际的网络可能会用 ReLU 等其他激活函数。简单来说,如果是用的sigmoid,我们要确保最终的结果是落在某个特定区间里面,以保证下一层神经元的输入是正常的,因此要用激活函数去处理Ax的信息,其核心作用是引入非线性,否则多层线性变换最终可以合并成单层,网络就失去了表达复杂函数的能力。至于输出是否落在某个区间,取决于任务需要,但是光有A和sigmoid还不行?为什么呢,咱们不妨想一想,不同图像肯定是有不同特征的,对应的在图像里面的关注区间也不一样,那要准确识别到这些区间,就要去额外加上其他数据量,假设是b,那么最终结果就是sigmoid(Ax+b),当然取决于实际情况,可能不会用这个。
既然每一层的处理都是sigmoid(Ax+b),那你会不会想这个模型也是挺简单易懂的?事实也确实是这样,大框架确实没错,但是问题在于,如何确认正确的框架在实际应用中一定可以得到我们想要的结果呢?我们如何确保各个神经层的权重,偏置都是合理的呢?这就涉及到训练模型的问题了。
通常来说,对于一个还没有训练好的模型,理论上的输出和实际可能并不是相同的,就算是相同的,对应识别到正确结果的概率,通常也不是百分百,那我们要做的也就是尽量增加正确结果的概率,那怎么办嘞?
我们不妨从最简单的一个场景入手,对于y=f(x)这种最简单的一元函数,要找到极值其实是很容易的,也就是用导数去求解,因为结果越接近极值,对应某个点的斜率绝对值就是越小的,此时结果和极值的差值就越小,但是对于神经网络来说,对应数学模型是一个及其复杂的多元函数,那我们不妨把一元函数推广到二元函数z=f(x,y)试试看?
假设我们想要找到z的极值点,而任意输入x,y对应输出又不太可能一定是z,那怎么办嘞?设想一下,每次我们输入对应输出,但是输出不同结果的概率一定不同,至少不可能一定是某一个百分百,那我们如果想要对应结果无限接近百分百,就要从结果入手去分析,事实上,既然概率不一样,那我们把这个差值尽量缩小不就可以了?但是问题在于,每一层的任意激活神经元的数值都是对下一层有影响的,包括不同权重和偏置以及激活函数,而我们手上的有效信息只有概率差值,也许你会感到头疼,但是聪明的你不妨设想一下,当输出确定而函数参数不确定的时候,我们要让概率差更小(可以是交叉熵或者均方误差之类的,总之叫做损失函数),也就是损失函数更小,那么函数参数就变成了自变量,损失函数变成了结果,我们要不断地调整参数去使得损失函数更小,这个问题不就转换成了,是在z=f(x,y)中要找到z(损失函数)的最小值吗?
那么对于在z=f(x,y)中要找z(损失函数)的最小值这个具体问题来说,理论上对于任意输入,只要找到对应点梯度下降最快的方向,然后一直往下就可以了。但是此时求出来的可能只是距离某一个点对应的小范围内的最小值,比如f=(x)函数来说,不同区间是有不同的最小值的,此处同理,因此要用大量不同的输入去寻找最小值,也就是常说的用大量数据去训练模型,这个过程也是我们熟知的反向传播算法,具体算法原理也就是运用导数和链式法则而已。不过此处说明一下,实际训练时不会显式地划分区间去求解,而是通过大量的随机初始点,让优化过程在不同的起始位置出发,从而找到泛化能力更好的参数配置。回到正题,实际上,损失函数的输入函数空间维度巨大,远远大于常规的二元或者三元函数,因此是在一个上千上万甚至更高维度的输入空间中去提取一些低维有效信息,当然这个也只是一个基本原理框架,实际在训练的过程中,还会去提前处理好数据集,以及在训练细节中做出一些改变,用于模型完善,并且减小过拟合。
当然以上只是一个深度学习的简单框架,算是自己的一个入门级理解,对于深度学习,算是一个层数很多的神经网络,而神经网络算是机器学习的子集,如果继续往下细分的话,像transformer架构,以及CNN等,还会涉及注意力机智,用于文本情况下上下文联系,以及基本的引入卷积核进行彩色图像的RGB多通道识别等等,都是一些具体细分方向的知识,这些不是本文的重点,但它们都建立在我前面描述的框架之上,本文不做相关深究。
总之,以上只是一些个人的入门级思考,如果有关键性错误还请各位老师及时指出,本人感激不尽!
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!


