知识总结:MarsCode AI 的底层原理(四) | 豆包MarsCode AI刷题

82 阅读9分钟

序言

机器学习是人工智能的基础知识,也是 LangChain 以及大语言模型的基础,在本系列文章中,笔者将会结合笔者所在大学人工智能实验室的课程、吴恩达教授 2021 — 2023 年的网课,以及《动手学深度学习》的教程,作为 LangChain 课程的补充,陪大家回顾机器学习的一些基础知识点。并且结合 MarsCode AI刷题的案例,带大家看看机器学习是如何应用到实际项目中的

以下是知识总结 MarsCode AI 的底层原理的学习大纲.

image.png

第一章 机器学习简介

1. 什么是机器学习

机器学习简单地说,就是把把人类学习的过程数学化、模型化。

下面这一张图生动地反映了传统编程和机器学习的区别:

暂时无法在飞书文档外展示此内容

几乎所有的机器学习都包括以下三个部分:数据、模型和损失函数。

数据(Data):不同的应用需要处理不同的数据。豆包 MarsCode AI 处理的数据以代码和自然语言为主

模型(Model):我们需要根据实际情况训练出特定的模型,来应对特定的需求。

评估(Model Evaluation):从日常生活的角度看,我们评价豆包 MarsCode AI 的质量主要在于它自动生成代码的精准程度。但是“精准程度”对于计算机科学家来说是无法准确度量的,因此,科学家总结了众多模型,决定使用损失函数(loss function)来对模型进行统一的评价。损失主要包括三种:(Hinge Loss, Logistic Loss, Softmax Loss)

机器学习是一个综合性很强的科目,这一门学科融合的科目不下数十种,在此进行简单地列举:高等数学(数学分析)、线性代数(抽象代数)、概率论与数理统计、统计科学、数据挖掘、控制理论、决策理论、认知科学、心理学模型、基因科学、进化论模型、数据库、信息理论。

机器学习其实和一些哲学思想也紧密相关,以下是笔者的老师结合科研经验总结出来的导图: image.png

2. 机器学习的分类

(1) 有监督的学习(Supervised Learning)

如何理解有监督的学习?在现实生活中,人类幼崽是在父母和祖辈的监督下成长的。在机器学习的领域中,有监督的学习就是从被标记的训练集合上训练模型或者函数。

经典的使用案例:预测某个地区的房产价格、预测某一位同学的 GPA、判断图片是不是猫猫狗狗......

(2) 无监督的学习(Unsupervised Learning)

如何理解无监督的学习?无监督的学习指的是去除掉特定的标志(labels),让模型自行学习不同训练集合的内在联系。在这种情况,模型通过对比来学习被隐藏的结构,就像是父母要我们向榜样学习一样。

经典的使用案例:K-Means Clustering(聚类算法)实现文档归类、图像分割......

(3) 强化学习(Reinforcement Learning)

强化学习主要包括了Agent(助理)、环境、状态、行为和奖励五个部分,Agent的目的是在一段时间以内积累出最大化的累计奖励。在现实生活中,当父母生气时,孩子的表现会更乖。面对上级领导的时候,观察他们的面部表情很重要。

经典的使用案例:用 AI 玩黄金矿工小游戏、用 AI 完成下棋......

3. 机器学习与概率统计

以下是机器学习常用的概率论知识,读者可回顾概率基础、连续/离散随机变量、边缘概率/联合概率/条件概率、求和规则、乘法规则、条件树、边缘概率和联合概率的知识点进行复习。

在这里,我们特别回顾一下贝叶斯理论及其推导过程。我们用一道例题来说明贝叶斯理论及其作用:

乘法规则可以推导出:P(Y, X) = P (X | Y) * P(Y)

乘法规则也可以推出:P(X, Y) = P (Y | X) * P(X)

两个式子经过联立,即可得到贝叶斯公式

简单来说:

  • 先验概率是“在没有新信息之前,我相信的概率”。
  • 后验概率是“在考虑了新信息之后,我相信的概率”。
  • 边缘概率是“在不考虑其他因素的情况下,某个因素发生的概率”。

贝叶斯定理在医疗诊断等方面发挥了重要的作用。我们举一个牙科的例子进行说明:

在更进阶的情况,如果加上进食冷热食物是否疼痛加剧,或者咨询患者是否经常熬夜,那么医生判定牙疼的全流程将进化成一个思维链条,通过这一个链条,医生可以更加精准地判定患者牙疼的原因。

4. 信息论简介

信息论可以利用数学知识表示信息。我们对于一个事件 A 的信息度量是这样的:

I ( A ) 表示信息的内容,是一个随机的变量

P ( A ) 表示事件发生的概率

b 是 基底文件

举个例子:某国足球谁都打不过,某国乒乓球谁都打不过。虽然中文语句是一样的,但是如果球队输球了,一个 I ( A ) 为 0, 另一个 I ( A )为正无穷,就是因为概率差别太大了。

熵是一个用于表示预期平均信息含量的变量。

第二章 (重点)线性回归和梯度下降

线性回归是拟合数据的方法,梯度下降是寻找最优解的技巧。

1. 人类学习与机器学习的对比

  人类学习的目的是理解、适应,并且改变不确定性。

  对比人类学习和机器学习,我们可以发现,人类的学习经过了输入 —— 内化 —— 输出的流程。事实上,机器学习的思想也如出一辙。

  简单地来说,机器学习包含了以下三个步骤:

  (1) 定义一系列函数

  (2) 检测这一个函数是否优秀

  (3) 挑选出最好的函数

 2. 线性回归

  前言

  假设我们输入 N 个数字,构成一个名为 X 的输入集合,每一个数字包含 m 个特征。

  输出也是 N 个数字,构成一个名为 Y 的输出集合。

  我们的目标就是使用机器学习完成 X -> Y 的映射。

  简单的线性回归描述了一个变量 x 和一个响应变量 y 的线性关系。

  损失的定义

  包括了绝对值损失,最小方差损失,还有损失函数总和。

  事实上,这两种损失之间可以通过简单的微积分运算转换得来。

  损失函数越小,就说明这个函数拟合得越好。损失函数在机器学习中发挥了极其重要的作用。

  利用线性代数知识的进一步推导

 3. 闭式解

  我们根据矩阵运算的性质一定得到了矩阵形式的损失最优解。

  如何求解出最小值呢?引入微分的思想进行求解!

  我们令 a = Y - Xw,根据复合函数求导数的原则,对 w 进行求导:

  RLS(正则化最小方差)回归算法:

  我们在损失函数中增加一个常量用于处理正则化,从而避免了矩阵的逆无法求解的问题,线性回归是唯一一个可以正确找到正则化关系的机器学习回归方法。

4. 梯度下降

除了求解闭式解之外,我们还有其他的优化方法去逼近最佳的 w 值吗?梯度下降!

  对于 w 的通用的优化方法,总共三步走:

  for k in range (1, epoches + 1):
      ① 寻找一个可行的搜索方向 d (怎么找?很有难度!) 
      ② 寻找一个好的步长 η[k] (怎么找?)
      ③ 更新 w 的值: w[k + 1] = w[k] + η[k] * d[k]

  我们在推导的时候总是使用列向量,以下是数学推导:

  所以我们可以将三步走拓展到五步走

  w[0] = 0
  for k in range (1, epoches + 1):
      ① 构造前向传播,用于求解损失函数 L[w[k]]
      ② 构造反向传播,用语计算梯度 w[k] = derivation(L[w[k]], w[k])
      ③ d = - w[k] 
      ④ 定义一个好的步长 η[k] (步长过长会导致发散,步长过短会导致收敛过慢,所以需要开发者调节)
      一般来说,调节方案可以使 η[k + 1] = η[k] / ( k + 1 )
      ⑤ 更新 w 的值: w[k + 1] = w[k] + η[k] * d[k]

5. 利用 PyTorch 解决简单的线性回归问题

  样例一:根据其他科目的绩点预测机器学习的绩点

样例二:使用 PyTorch 的简单 API 实现线性回归

# 经典导包
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据,在实际的情况下应该是读取数据信息
np.random.seed(0)
X = np.random.rand(100, 1) * 10  # 100个样本,特征在0到10之间
y = 2.5 * X + np.random.randn(100, 1)  # 真实线性关系加上一些噪声

# 将数据转化为转换为PyTorch的张量
X_tensor = torch.FloatTensor(X)
y_tensor = torch.FloatTensor(y)

# 定义线性回归模型类,实现初始化和前向传播两个函数
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)  # 输入特征数量为1,输出也为1

    def forward(self, x):
        return self.linear(x)

# 创建线性回归模型实例
model = LinearRegressionModel()

# 定义损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降

# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    # 调用 API 对模型进行训练
    model.train()
    
    # 前向传播
    outputs = model(X_tensor)
    loss = criterion(outputs, y_tensor)
    
    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    # 每隔一段时间,打印结果
    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

6. 常考面试题

(1) 说说你了解的机器学习是什么?

www.mianshiya.com/bank/182183…

(2) 监督学习、半监督学习和无监督学习分别是什么?它们的区别在哪?

www.mianshiya.com/bank/182183…

(3) 机器学习常见的算法有哪些?

www.mianshiya.com/bank/182183…

(4) 什么是损失函数?损失函数的作用是什么?

www.mianshiya.com/bank/182183…

(5)什么是梯度下降?工作原理是什么?有哪些变体?

www.mianshiya.com/bank/182183…

(6)什么是线性回归?请解释其假设和工作原理。

www.mianshiya.com/bank/182183…

(7)进行线性回归之前?为什么需要对特征进行离散化?

www.mianshiya.com/bank/182183…