学习笔记 - 机器学习与传统编程的区别在哪里?

从0开始学习大语言模型 - By 林亦LYi

本文仅为个人学习笔记
仅对视频内容作为记录与分享 (侵删)

 
图片来自视频截图

 

1. 关于机器学习

机器学习是一个非常笼统的概念,很多事情都可以归类到这个领域来,像预测电影票房,人脸识别,让计算机去自动打游戏下棋,比如说前几年很火的AlphaGo等等,这些都属于机器学习。

 
在语言分析和语言生成这个视角下的机器学习是什么呢?
 

1.1 监督学习

回想一下,我们以前是如何学习一门新语言的?

比如学英语,一开始就是一个单词一个单词的学,死记硬背。

慢慢的,我们认识的单词多了,可以尝试看一些简单的段落了

这些段落往往是一边是句子,一边是一些单词的对应的中文含义。
 
图片来自视频截图

图片来自视频截图

 
我们要做的就是:记住这些英文词汇和他们对应的含义

通过将陌生词汇与他们的含义对照,我们就逐步把对语言的认知建立起来了,这个过程就叫 监督学习

监督学习的主要特征就是用到了大量 标记数据,也就是要学习的内容

通过学习者能够理解的方式做了 “标记”,于是我们才能够把未知信息与已知信息一一对应起来

建立他们的关系,然后再往陌生的,更复杂的情况去推导。

比如我们知道 time 是时间,fly 是飞行

那当我们看到 “time flies very fast” 这种高级的、没见过的用法时

就可以推导分析出它的含义是 “时光荏苒”,用有限的知识解决无限的问题,这种就叫 监督学习
 

1.2 无监督学习

除了上面的这种情况,有时我们可能得不到单词表那样明确的指导

就像刚出生,我们连普通话都不会,再比如说,早些年只身去国外闯荡的人们

像这样的情况,其实最后大家都能适应下来,那么这种情况下是怎么学的呢?

这时候就只能 通过阅读听力 或者 观察 语言在日常生活中的使用。

比如某些词汇总是在类似的情境下反复出现,或者某些词似乎具有相似的结构或音韵特征

比如 “fuck” “shit” ,发音都很有力量感,而且一看就不是和别人礼貌打招呼的时候会用的词。
 
图片来自视频截图

图片来自视频截图

 
就这样我们逐渐就会摸索出来一套潜在的规则和分类

自然而然的就会把词汇分成 动词名词形容词

即使整个过程没有人告诉我们应该怎么分类,这个就叫做 无监督学习

由此就构成了机器学习的两个基本类型:无监督学习监督学习

当然在细分领域还有诸如半监督学习之类的,但是归根结底,这些方法都是为了让机器能够像人一样学习。
 

2. 机器学习与传统编程

随着时间和练习不断提高知识和技能,让计算机能够通过算法自行找出数据之间的关系和模式

而不需要人类直接编程具体的步骤来执行这一任务

这一概念正式机器学习与传统编程的根本区别所在

它的深远意义在于,只要我们找到一套能有效学习到东西的算法,它就可以广泛的适用到不同的领域。

比如我们搞了一套算法,喂给它人脸的照片他就能学会定位人脸

那同样这套算法,你让他去学定位人手也是可以的,给它看大量包含手部的照片就可以了,而不需要像传统

编程一样,重新从头写一套规则告诉它人手长啥样。
 
图片来自网络

图片来自视频截图

 
然而当我们真正照着这个思路走的时候呢,许多具体的问题就出来了,那就是 数据模型

我们已经知道,机器学习本质上是构建一套神经网络模型,让模型从大量数据中学习。

怎么获取到足够多而且高质量的 数据

怎么构建一个能力强,学习效率高的 模型

这两个问题就是学习效果的关键,整个机器学习的研究史,也基本是围绕着这两点而展开的。

今天人工智能领域的热词 “大语言模型”,它就是在这两方面都取得了突破

那么这个所谓的 “大语言模型” 到底是怎么实现的呢?

 

3. 关于模型

模型通常被用来表示对现实世界现象的简化和抽象

而在机器学习领域,我们可以把模型看成一个 函数

再直白一点就是一个有输入有输出的黑盒子,这个黑盒子的内部结构可能无比复杂。

但是这些我们都不用管,我们只关心它 能不能针对输入给出正确的输出

比如你输入一张狗的照片,它的输出就应该是 “狗”,而不能是 “小六”,它要是看着狗的照片说这是小六,那它就学坏了。
 
图片来自视频截图

图片来自视频截图

 
把模型类比成这个黑盒子之后

模型训练的过程,就是 调整这个盒子里密密麻麻的小开关,训练完之后,每一个小开关的状态就被锁死了。

然后这时候塞进去一张 的照片,在输出端的小灯,就得亮起来

问它这是 小六 吗,这个小灯就得灭掉,这样它就学明白了。

 

3.1 神经网络模型

如今流行的语言模型,是基于一种叫 神经网络 的技术

顾名思义,它模仿的是我们大脑神经系统的结构,基本结构是 神经元

神经元是大脑中一种能够以简单方式相互交流的细胞

通常理解来说可以认为它有很多条腿,大部分腿都比较短,用来 接收刺激

然后其中一条腿比较长,连接到另一个神经元上负责 向下传递刺激

这样一个结构,就可以让神经元根据输入做出一些简单判断

比如说某个小老弟在学高数,他的神经元的几条短腿接收到的就是 褪色的教材封面 枯燥的文字 晦涩的公式

汇总到一起,他的那条长腿可能就是完全麻掉的,无动于衷。
 
图片来自视频截图

图片来自视频截图

 

这时候给他换个场景:

比如说玩原神,那这几条短腿收到的就是 鲜艳的画面 精致的人物 优雅的角色服装

这些刺激一过来,这个神经元最长的那一条,就会兴奋起来,输出信号狠狠地刺激下一个神经元

当把成千上万个这样的神经元组合到一起之后,这些刺激就会汇总成一个更高层级的输出。
 
图片来自视频截图

图片来自视频截图

 

比如另一个神经元发出了 “生活费到账” 的刺激信号

这小老弟可能反手就是一个648,做出了一个令人遗憾的选择 QAQ
 
图片来自视频截图

图片来自视频截图

 
机器学习里的 神经网络模型,就是借鉴了这个生物学结构

它的基本单元被称为一个 感知机单元,结构和神经元很类似,也是有多个输入和输出。
 
图片来自视频截图

图片来自视频截图

 

感知机单元的运行过程,就像评分投票,每个输入都是一个分数,而每个分数又对应不同的权重。

举个例子,现在有三个等级不同,话语权不同的评委进行打分

那最终的得分就是这三对数字乘起来再求和

0.1 * 0.5 + 0.1 * 0.1 + 0.4 * 0.4 = 0.22
 
图片来自视频截图

图片来自视频截图

 

而这个感知机特别的地方就是,它有个 分数线

比如说0.5,过了这个线它就输出1表示激活;没过就输出0,表示未激活。

这样就模拟了生物神经元的过程。
 

图片来自视频截图

 

但这个设计,如果真正落实到数学计算上,就又会遇到新的问题,就是我 没法往回追溯 了。

还是原神的这个例子

现在我启动了原神之后,我的感知机兴奋了,输出了1

可是我怎么知道哪个因素是最关键的因素呢?是 画面人物、还是 服装 呢?

一个自然的想法,就是我分别在这三个方向上加大力度

我让画面更鲜艳,人物更精致,或者服装更优雅,可是这么干之后,我会发现,输出还是1,啥也分析不出来。
 
图片来自视频截图

图片来自视频截图

 
所以这里要做一个修改,就是我不再粗暴的一过线就输出1,而是在过线之后,把实际分数作为输出。

这样我还是从这三个角度,分别加大力度,从输出分数的变化幅度,我就能追回去,知道哪个因素对感知机的影响最大
 
图片来自视频截图

图片来自视频截图

 
对输出的调整 就是今天深度学习中最常见的一种 激活函数 了。
 
图片来自视频截图

图片来自视频截图

 

现在咱们已经知道一个 感知机单元 是怎么运作的了

把它们连成多层网络结构,它们就也会像神经元组成大脑那样,展现出强大的信息归纳的能力。

一个简单的 多层神经网络模型,包含一个 输入层, 两个 隐藏层 和一个 输出层

前面提到,模型本质上就是一个 能读进来输入然后输出准确答案的黑盒子

这个答案可能是一个 “猫”、“狗”、“小六” 这样的分类标签,也可能是一个预测出来的数值。
 
图片来自视频截图

图片来自视频截图

 

这些都需要 在输入和输出正确答案之间建立起正确的映射关系

在神经网络模型里,每个单元之间的连接都是一个 权重数值,这些数值可以在输入输出之间,建立起无数种映射关系

可是怎么才能确定这些大量的权重数值,每个分别应该是多少呢?
 
图片来自视频截图

图片来自视频截图

 

3.2 反向传播算法

3.2.1 函数、导数、偏导数

函数的定义:简单理解就是一个写死的对应关系

比如 y = 2x,你输入 2 它就输出 4,你输入 3 它就输出 6

这种把每个输入都乘以2的对应关系呢,就是个 函数
在这里插入图片描述

导数的定义:用来衡量输出相对于输入的变化速度的

比如说输入变量调大一点点,从 2 变成 2.1,增加 0.1

那 y=2x 这个函数的输出就会增加 0.2,这里的 2 就是 导数

在这里插入图片描述

偏导数的定义:不同的输入变量,分别对应的权重是多少

还是前面原神的例子: 任务 场景 服装 都是刺激我兴奋的元素,那到底哪个因素作用最大呢?

 
实际在计算机里训练一个神经网络的流程是这样的:

训练程序会为每个输入变量随机分配一个 0~1 的 权重值

场景:0.5、 任务:0.1、服装:0.4
 
图片来自视频截图

图片来自视频截图

 

然后假设这三方面的值都是 可以量化 的,比如在某一个游戏时刻:

场景的精美度是 0.1,人物的美观度是 0.1,服装的优雅度是 0.4
 
图片来自视频截图

图片来自视频截图

 

那这第一轮随机权重计算下来的分数就是 0.22 = 0.1 * 0.5 + 0.1 * 0.1 + 0.4 * 0.4

这就完成了一轮 前向传播,根据输入把输出算了出来

但这时候我们发现这个结果是不准确的,因为算出来 0.2 这个分数并不高

可是实际上我可能对着这个0.4分的服装已经兴奋起来了,我的兴奋值可能已经达到了0.6

所以这个预测值和实际情况就有了 偏差,那这个偏差该怎么衡量呢?

图片来源网络

图片来自视频截图

 

3.2.2 损失函数

损失函数的定义:通常是基于统计学的数学模型,常见的有以下几种:

均方误差、交叉商损失、绝对误差

损失函数的结果永远是一个 非负数值 ,它不能小于零

因此这个数就被用来 衡量模型的判断和实际情况的偏差有多大

比如说用 绝对误差,那这个模型的输出和我的实际兴奋值的偏差就是 0.38 = 0.6 - 0.22

那要怎么让这个偏差缩小,让模型真正做到看到一个游戏画面就能准确的知道我有没有兴奋呢?

首先我们知道这个模型的输入输出之间的关系完全是由 权重数值 决定的

因此输入的权重值一变,输出就会完全不一样,可是这些权重该怎么改呢?

这时候我们就可以把 偏差看成是一个关于这些权重值的函数,也就是刚刚说的 损失函数

小六补充:这里这句话其实我不太理解,如果有数学大神,可以在评论区指导一下 QAQ

我们希望找到的就是损失函数变化最快的方向,也就是 梯度
 

3.2.3 梯度

梯度的定义:可以看作是一个函数在特定点上的 “斜率” 或者 “坡度”,它总是指向函数增长最快的方向
 
图片来自视频截图

图片来自视频截图

 

想象你站在某座山上,梯度 告诉你的就是往哪个方向走能最快的上山

那相应的加个负号,原地转180度就是下山最快的方向

一直让权重数值沿着这个方向走,损失函数的值也就是模型输出和实际情况的 偏差就会越来越小

这个过程就叫 梯度下降

回到原神的例子,咱们说那三个输入分别是x1,x2,x3,而对应的三个权重值分别是w1,w2,w3
 

图片来自视频截图

图片来自视频截图

 
那现在这个模型给出的关系就是:y= w1x1 + w2x2 + w3x3
 
图片来自视频截图

图片来自视频截图

 
这时候如果咱们反过来把它看成是一个 y关于权重w的线性函数 ,那对这三个权重值分别求偏导

 图片来自视频截图

图片来自视频截图

 
结果就是:x1、x2、x3

想让偏差减小,就需要把 0.22 往 0.6 上拉,也就是调整 x1、x2、x3 的值

小六补充:对不起,其实这里我也没听懂…所以宇宙的尽头真的就只剩数学了对吗

但这只是三个变量,在神经网络的实际使用里面

变量权重的数量可能有上千万乃至数10亿,数百亿个,而且是层层向下传导,这要怎么解决呢?

 在这里插入图片描述

图片来自视频截图

 

3.2.4 链式法则

链式法则的定义:链式法则是一种 计算复合函数导数 的方法

当一个函数是由多个函数嵌套而成的时候,它的导数就等于外部函数的导数,再乘以内部函数的导数

按照这个法则,我们就可以把一个很复杂的函数一层层拆解,得到每一层,每一个权重值的偏导

最后汇集成一个超高维度的梯度,就像是把洋葱一层层剥开一样。
 
图片来自视频截图

图片来自视频截图

 

这整个过程就像是二刷一部电影

从结尾开始逐步的回溯到开头,理解每个事件,每个线索是如何影响后续事件,最终影响整个故事走向

整个流程就是

  1. 先把输出算出来
     
    图片来自视频截图
图片来自视频截图

 
2. 再反向把权重的梯度找出来
图片来自视频截图
 

  1. 最后再让所有的权重沿着这个梯度的方向前进一点点,我们就完成了一步更新,模型就朝着更 准确 的方向又靠近了一些
     

图片来自视频截图

图片来自视频截图

 

一开始所有权重都是随机乱生成的,所以模型的修正速度会快一些

但越往后准确率提的越来越高,这个速度就会逐渐慢下来,这时候我们就说这个模型的训练 收敛

等待模型收敛是个耐心活,而且并不是所有的模型都一定能在训练过程中收敛

模型本身 有问题,训练数据 有问题或者 超参数 设置的问题,都可能会导致模型训不出来,一直在波动

就好比说玩原神,手机发热卡了,手机信号不好都会影响着游戏的结果

 

3.2.5 超参数

常见的超参数有以下几种:批量大小、迭代部署、激活函数、优化器选、学习率

它们不改变模型结构,但是会控制模型怎么训练这个过程

这里面最重要的一个超参数是 学习率学习率决定的是模型参数的更新幅度

前面提到 梯度 能指出偏差减小最快的那个方向,但这只是基于损失函数这一刻所在的这一个点

你要是一步迈大了,反而可能一下子跳到更高的地方上去了,老也下不去
 
图片来自视频截图

图片来自视频截图

 

但你如果步子总是非常小也不好,一方面你移动的速度会特别慢

另一方面,假如说大山谷前面还有个小坑,你可能就直接陷进这个小坑里,再也走不出来了,永远摸不到山谷里更低的那个点

所以这也是需要反复测试,积累经验,直到和模型融为一体,臻于化境,心如止水。
 
图片来自视频截图

图片来自视频截图

 

而其他的超参数设置也都类似,各有各的特征和局限

都是需要反复磨练,需要研究人员根据模型的表现依赖直觉和试验去反复调整。

然而超参数还不是最麻烦的

甚至现在如果你经费就是充足的话,你都可以直接把超参数丢给机器去学习让电脑自己去试试

真正从底层决定训练能不能成的,其实是模型的结构本身

当年深度学习曾经差点儿没发展下去,就是发现 层数增加到一定程度之后,模型是学不明白了

前面说模型的输出越来越准,靠的是 通过反向传播的过程调整每一层的权重

但是在一个层数非常多的模型里,这个 反向传播的过程会把很多导数值接连相乘,层数越多长的就越多

模型的权重值一开始都是随机的,所以这些导数值也都是不确定的

假如有很多值都是大于1的,那这些数乘起来就会 导致梯度爆炸,模型开始剧烈波动

反过来的话就是 梯度消失,模型可能还远远没学明白,但就是不动了

所以深度学习刚有点火的意思就发展不下去了,直到 残差网络 的出现。
 
图片来自视频截图

图片来自视频截图

 

3.2.5 残差网络

残差网络的定义:在计算网络层输出的时候,从前面再加一层,加到一块
 
在这里插入图片描述
 
这样在计算梯度的时候,下一层的变化就被上一层的原始信息给稀释了一部分

但又没有完全清除掉,从头到尾梯度变化的稳定性就增强了很多,不会爆炸,也不会消失了

这样一来,构建足够深的神经网络才成为了可能。

在参残差网络之前,神经网络的深度通常在几层到几十层之间

像著名的 AlexNet 有8层,VGG 是16~19层,那时候这都已经是相当深了
 
在这里插入图片描述
 

可残差网络出来之后,神经网络都是上百乃至上千层的,也就具备了解决更加复杂问题的能力

他的作者 何凯明 也因此拿到了2016年的CPI最佳论文奖 (膜拜大神)

今天的残差网络已经成了神经网络里一个几乎必备的结构了,几乎所有的大模型里都可以看到的

但是走到这,把超参数调好,把模型深度拉大,就一定能让电脑学明白了吗?

 

欠拟合与过拟合

其实未必,数据 也是很重要的,我让你12年只学数学,然后高考考你英语,就问你懵不懵吧

机器学习领域的学者不会犯这么低级的错误

但有些时候可能数据太复杂了,以至于模型能力根本不足以找到合适的关系,这就会导致 欠嵌合

也就是 模型准确率升到一定程度之后就升不上去了,不过这问题危害不大,改进就可以了。

但另一种情况就比较隐蔽了,有时候模型能力太强了,干脆的把数据全原样背下来了,甚至会记住一些干扰因素

比如我告诉他现在这个画面里是小六,结果他可能记成了有这个键盘的画面的就是小六

当换成狗坐这儿,他还是觉得这是小六,他就坏了呀!!!

所以它其实并没有学到真正具备普遍性的规律,这就是 过拟合

过拟合的模型看上去表现很好,但只是在他学习过的数据上,真正拿出去解决实际问题,反而解决不了
 

真正学明白了的模型,是要具备泛化能力的

在机器学习中,泛化 指的是 模型遇到从未见过的数据的时候能不能整明白,它是衡量模型性能的一个关键指标

一个具有良好泛化能力的模型,应该能够适应陌生的数据环境,而不仅仅只是在训练数据上表现出色

因为真实世界的变化是无穷无尽的,只有真正从数据里面学到了底层的规律,才能推而广之解决更多的同类问题。
 
 
那怎么来评估一个模型的泛化能力呢?

我们会把数据划分为 训练集验证集测试集

训练集

就像是平常的作业和习题,模型通过学习训练集上的数据来识别模式和规律
 
验证集

就像是模拟考试,用来阶段性的评估模型表现,模型通过训练级的数据更新内部的权重值,然后经过验证及检测能力。

检测出来发现效果不好的话,我们就调整 超参数 或者是 修改网络结构,直到他在验证集这个模拟考试能拿到高分
 
测试集

测试集就是最终的高考,它评估的就是模型未来放到真实世界之后,最终的性能大概会是什么样
 
在这里插入图片描述

图片来自视频截图

 

在之前的过程里面,模型只学习过训练集,然后通过对训练过程的调整,它又做到了能把规律推广到验证集上

但测试集他是从来没沾过边的,如果测试集他也能搞定了,那它就大概率成了

4. 面临的问题

然而当大模型时代到来之后,一个超级超级大参数几百上千亿的模型把这个泛化的概念又给颠覆了

因为这种模型真的太大了,即使是一个装了互联网全部文字的数据集,它都有能力给完全背下来

那最终他表现出来的能力到底是因为真的理解了人类知识,还是在机械的照搬的背下来的文字呢?

因此也就有人质疑,就是说 目前大模型并没有真正体现智能和学习能力,只是背东西比较猛而已

关于这个话题的探讨,咱们就后面再进行吧

但无论如何,今天这种 从小型专用模型到大型通用模型的转变,标志着深度学习进入了一个重要的发展阶段

 

5. 写在最后

这个视频在我看第一遍的时候就觉得非常生动有趣,特别是视频中的例子与手绘的图片
让我这个对AI、大模型语言、机器学习这些几乎一窍不通的人,好像也明白了点什么
不过当我在做详细的笔记后发现,视频没有一个很清晰的框架,看似讲了很多知识点
但是学下来还是有点杂乱,不知道哪块知识和哪块是一起的,但也可能是因为我没有一点基础知识

笔记总结不易

听说一键三连明天就会发大财 QAQ

这里是专注于分享优秀学习资源的频道

如果大家有觉得写得很棒的文章可以私聊我噢~~

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Python学习笔记》是由皮大庆编写的一本关于Python语言学习的教材。在这本书中,作者详细介绍了Python语言的基础知识、语法规则以及常用的编程技巧。 首先,作者简要介绍了Python语言的特点和优势。他提到,Python是一种易于学习和使用的编程语言,受到了广大程序员的喜爱。Python具有简洁、清晰的语法结构,使得代码可读性极高,同时也提供了丰富的库和模块,能够快速实现各种功能。 接着,作者详细讲解了Python的基本语法。他从变量、数据类型、运算符等基础知识开始,逐步介绍了条件语句、循环控制、函数、模块等高级概念。同时,作者通过大量的示例代码和实践案例,帮助读者加深对Python编程的理解和应用。 在书中,作者还特别强调了编写规范和良好的编程习惯。他从命名规范、注释风格、代码缩进等方面指导读者如何写出清晰、可读性强的Python代码。作者认为,良好的编程习惯对于提高代码质量和提高工作效率非常重要。 此外,作者还介绍了Python的常用库和模块。他提到了一些常用的库,如Numpy、Pandas、Matplotlib等。这些库在数据处理、科学计算、可视化等领域有广泛的应用,帮助读者更好地解决实际问题。 总的来说,《Python学习笔记》是一本非常实用和全面的Python学习教材。通过学习这本书,读者可以系统地学习和掌握Python编程的基础知识和高级应用技巧,为以后的编程学习和工作打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值