传统程序员对机器学习的理解
作为Java程序员出生的我,最近从零手写了一个大模型(如果你对这个感兴趣,可以看文末的介绍),让我对机器学习有了新的认识,今天借这篇文章来聊聊我理解的机器学习。
作为Java程序员出生的我,最近从零手写了一个大模型(如果你对这个感兴趣,可以看文末的介绍),让我对机器学习有了新的认识,今天借这篇文章来聊聊我理解的机器学习。
传统编程的本质和局限性
传统编程的本质就是通过代码来编写业务规则,也就是写各种if...else,但并不是所有业务场景都能通过编写规则来实现,比如:
-
如何判断一张图片中是否有猫?
-
如何判断一封邮件是不是垃圾邮件?
-
如何判断一段评论是好评还是差评?
-
...
包含猫的图片千奇百怪,而制造垃圾邮件的方式也是层出不穷(人们对垃圾的理解也不一样),以上这些业务场景,如果由人类去编写判断规则(if...else),那么代码量、复杂度都是巨大的,并且还要持续维护,此时,就需要利用机器学习了。
机器学习的本质
所谓机器学习,就是让机器来自动学习,那么,机器是怎么学的呢?最终学到的成果是什么呢?
传统编程的运行方式是:输入数据+代码规则=输出结果
机器学习的运行方式是:输入数据+预期结果=模型规则
可以看到机器学习的运行方式是以结果为导向,人类只需要提供输入数据(比如图片)和预期目标(是不是有猫),然后让机器来自动学习并总结其中的规则,总结出来的规则我们给它一个高大上的名字,叫做模型。
那么机器学习中的规则,或者说模型,到底是什么呢?难道也是代码?
机器学习中的规则不是代码,而是函数,也就是y=f(x),x就是输入,y就是结果,不过这个函数可以是很简单的线性函数y=wx+b
,也可是很复杂的Transformer,需要根据业务场景来定义不同的函数。
比如,我们想要根据前三个月的房价来预测明天的房价,那么可以用ReLU+线性函数。
比如,我们想要判断图片中有没有猫,可以用sigmoid函数,因为这个函数呈S型,适合二分类问题。
只不过,一个函数不止有x和y,还有w和b,比如线性函数y=wx+b
,其中w和b就是模型参数,不同的w和b,最终对应的函数其实不一样,尽管都是线性函数。
比如w=1,b=1,那么函数为y=x+1
,当x=1时,y=2
比如w=2,b=2,那么函数为y=2x+2
,当x=1时,y=4
也就说,不同的参数对应了不同的函数,也就是对应了不同的模型,而机器学习就是需要根据输入数据和预期结果找到最合适的w和b,也就是,找到最合适的参数从而使得由这些参数构造出来的函数能够让输入数据对应的预测结果和真实结果之间的误差比较小。
你可能会问,为什么不是让误差为0,而是比较小?
因为我们希望机器学习训练出来的模型能够举一反三,不出现过拟合。
所谓过拟合,相当于一个记忆力特别好的学生,他能把考过的题目都记下来,如果下一次考试考的都是旧题,那么他能打100分,但是如果下一次考试考的都是新题,那么他只能打0分,这就是过拟合,也就是学过度了,对于机器学习而言也类似,我们往往不需要模型把提供的数据和结果都记住,而是希望它总结规律,然后在新数据上能够举一反三。
因此,机器学习的学习成果就是得到了一个具体的函数,而学习的过程就是不断调整函数中的参数,使得函数能够最小化输入数据对应的预期结果和真实结果之间的误差。
而不断修改参数的过程就是模型训练,参数越多,函数越复杂,模型功能也就越强大。
另外,模型的输入可以是一张图片或一段文字,但由于模型就是一个数学函数,所以我们需要把图片和文字转成数字。
图片是由很多个像素点构成的,每个像素点就是一个色值(0-255),彩色像素点就是由RGB三个色值组成,所以一张图片可以看成是由一堆数字构成,而这一堆数字可以用矩阵来表示,因此一张图片就对应一个矩阵,我们称之为特征矩阵。
同样,一段文字也需要转成数字表示,简单做法就是把这段文字中的每个字用新华字典中的每个字对应的序号进行替换,也能将一段文字转成一堆数字,不过这一块真正的做法会更复杂一点,需要涉及到one-hot编码、词向量、词袋模型等相关知识,一篇文章不够,我在手写大模型的过程中都手写了一遍,还挺有意思的,大家可以关注我,后续我再详细解释。
模型的输入是数字,经过函数计算后,最终的结果肯定也是数字,比如,模型输出0.6,那么这个0.6可以表示输入的图片中60%的概率有猫,如果是文本生成,那么0.6可以表示下一个词为“周瑜”的概率是60%,如果房价预测,那么0.6可以是0.6万每平方。
可以看到,机器学习的内部世界是由数字组成的,输入和输出都是数字,模型的本质就是一个数学函数,内部机制就是做数学运算,因此GPU是非常适合机器学习的。
更多推荐
所有评论(0)