李宏毅机器学习课程实战路线:从神经网络到强化学习与大模型
2026/8/31 6:39:29 网站建设 项目流程

如果你准备系统入门人工智能,应该在很多学习资料、课程推荐帖和知乎答案里都看到过李宏毅机器学习这门课。作为一门面向中文学习者的 AI 入门课程,它的优势不在于堆砌公式,而在于把机器学习、深度学习、神经网络、强化学习、计算机视觉、自然语言处理等模块用“讲给普通人听”的方式拆开揉碎。很多初学者靠这套课程建立起了对 AI 整体知识框架的认知,后续再看论文、做项目才不会一头雾水。

这篇文章不是课程复述,而是基于李宏毅课程的知识体系,整理一份可执行的学习路线。我们会先梳理机器学习与深度学习的基本概念,再结合完整代码示例,拆解神经网络、CV、NLP、强化学习和大模型这些核心方向。无论你是零基础转行、在校学生期末复习,还是工作中需要补 AI 知识,都可以把本文当作一份“导读 + 实战索引”。

1. 为什么很多人选择李宏毅机器学习系列课程

1.1 课程到底在讲什么

李宏毅机器学习课程的内容覆盖面非常广,从最基础的“什么是机器学习”开始,一路讲到 CNN、RNN、Transformer、Self-Attention、生成模型、强化学习,甚至包括当前大模型背后的核心思想。课程的核心逻辑是:先让你理解模型怎么“学习”,再让你动手训练模型,最后再讨论如何改进模型。

课程最经典的部分是对“深度学习”的解释。它没有一上来就扔出反向传播公式,而是先用“找一个函数”的角度,把机器学习定义成“找函数”的过程。比如图像识别就是找一个输入图片、输出类别的函数;语音识别就是找一个输入音频、输出文本的函数;下围棋则是找一个输入棋盘状态、输出落子位置的函数。这个视角非常适合新手建立全局观。

1.2 适合哪些人学习

如果你是零基础,但具备基本的 Python 语法能力,可以直接跟着这门课走。课程不要求高等数学达到多深水平,但建议先了解导数、偏导数、向量和内积等概念,否则后续看反向传播和 Transformer 的 QKV 矩阵运算时会比较吃力。

如果你已经有机器学习基础,只是对深度学习、强化学习或大模型不熟悉,也可以挑选课程中的对应章节做针对性学习。比如很多做后端开发的同学,已经了解逻辑回归和决策树,但不知道 CNN 为什么能提取图像特征,那么直接看“卷积神经网络”章节就够。

1.3 学习前需要哪些基础

建议先掌握 Python 基础,至少会写循环、函数、列表推导式,会安装第三方库。数学方面,重点复习以下内容:

  • 导数与链式法则:理解梯度下降和反向传播。
  • 线性代数基础:矩阵乘法、向量内积、转置。
  • 概率论基础:条件概率、最大似然估计、贝叶斯公式。

不需要一开始就刷完整本《机器学习》周志华或《深度学习》花书,而是带着课程中的问题去查阅。这样效率更高,也不容易劝退。

2. 机器学习核心概念准备

2.1 三大学习范式:监督学习、无监督学习、强化学习

机器学习算法按训练方式可以粗略分成三类,这也是课程最早建立的知识框架。

监督学习是最常见的类型。训练数据中包含输入和标签,模型需要学到输入到标签的映射关系。比如给一张猫的图片,标签是“猫”;给一条评论,标签是“正面”或“负面”。常见的监督学习算法包括线性回归、逻辑回归、决策树、随机森林、支持向量机、神经网络等。

无监督学习的数据没有标签。算法需要自己从数据中发现结构。典型的任务包括聚类、降维、异常检测。比如电商平台根据用户购买行为把用户分成不同群体,就属于无监督学习的应用。

强化学习则完全不同。它由一个智能体(Agent)和环境(Environment)组成,智能体不断做出动作,环境返回新的状态和奖励。目标是通过经验积累,学习到一个能让累积奖励最大化的策略。自动驾驶、游戏 AI、机器人控制都属于强化学习的典型场景。

2.2 损失函数与优化器

机器学习几乎所有问题最终都归结为“最小化损失函数”。

损失函数衡量模型预测结果与真实标签之间的差距。回归问题常用均方误差(MSE),分类问题常用交叉熵。模型训练的过程就是不断调整参数,使损失函数的值下降。

优化器是更新参数的算法。最基础的是梯度下降,每次沿损失函数梯度的反方向走一小步。后来的 SGD、Momentum、Adam 等优化器都是在梯度下降基础上做了改进,用来加快收敛、跳出局部最优。

2.3 过拟合与正则化

过拟合是机器学习中最重要的一个坎。当模型在训练集上表现很好,但在测试集上表现很差,通常就是过拟合了。原因一般是模型太复杂、训练数据太少、训练时间太长。

解决办法有很多:

  • 增加训练数据,或者做数据增强。
  • 降低模型复杂度,减少网络层数或神经元数量。
  • 添加正则化项,例如 L1、L2 正则化。
  • 使用 Dropout,在训练时随机丢弃部分神经元。
  • 早停(Early Stopping),在验证集指标不再提升时停止训练。

课程中反复强调:不能只看训练集准确率,必须划分出验证集和测试集。这个习惯从第一天开始就要养成。

3. 深度学习与神经网络基础

3.1 神经元、激活函数、反向传播

深度学习的核心是神经网络。一个最简单的神经元会接收多个输入,做加权求和后加上偏置,再经过激活函数输出。

激活函数的作用是给模型引入非线性。如果没有激活函数,多层神经网络无论有多少层,本质上都是线性变换,无法解决非线性问题。常见激活函数有 ReLU、Sigmoid、Tanh、GELU。

反向传播是深度学习训练的基石,它通过链式法则计算损失函数对每个参数的梯度,然后利用优化器更新参数。如果你暂时记不住公式也没关系,但必须理解整个流程:前向传播计算输出,计算损失,反向传播计算梯度,优化器更新参数。

3.2 全连接网络代码示例

下面用 PyTorch 实现一个简单的全连接神经网络,用于 MNIST 手写数字分类。这是一个最基础的多分类任务,非常适合理解神经网络训练全流程。

# 文件路径:mlp_mnist.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms # 1. 数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 2. 定义全连接网络 class MLP(nn.Module): def __init__(self): super(MLP, self).__init__() self.fc1 = nn.Linear(28 * 28, 256) self.fc2 = nn.Linear(256, 128) self.fc3 = nn.Linear(128, 10) self.relu = nn.ReLU() def forward(self, x): x = x.view(-1, 28 * 28) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x # 3. 定义模型、损失函数、优化器 model = MLP() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 4. 训练一个 epoch def train_one_epoch(model, loader, criterion, optimizer): model.train() total_loss = 0.0 correct = 0 total = 0 for images, labels in loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() total_loss += loss.item() preds = outputs.argmax(dim=1) correct += (preds == labels).sum().item() total += labels.size(0) avg_loss = total_loss / len(loader) acc = correct / total return avg_loss, acc # 5. 验证 def evaluate(model, loader): model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in loader: outputs = model(images) preds = outputs.argmax(dim=1) correct += (preds == labels).sum().item() total += labels.size(0) return correct / total # 6. 训练 3 个 epoch for epoch in range(3): train_loss, train_acc = train_one_epoch(model, train_loader, criterion, optimizer) test_acc = evaluate(model, test_loader) print(f"Epoch {epoch + 1} | Loss: {train_loss:.4f} | Train Acc: {train_acc:.4f} | Test Acc: {test_acc:.4f}")

这个示例虽然简单,但已经覆盖了深度学习训练的基本流程:加载数据、定义模型、设置损失函数与优化器、训练循环、验证循环。后续学习 CNN、RNN、Transformer,都是在替换中间的网络结构,流程本身大同小异。

3.3 优化器与学习率

学习率是训练神经网络时最敏感的“旋钮”。学习率太大,损失函数可能在最小值附近震荡,甚至发散;学习率太小,训练速度非常慢,可能长期停在较差解。

建议在实际项目中先使用 Adam 优化器,初始学习率设置为 0.001。然后观察训练损失曲线,再决定是否调低。如果损失持续不下降,不要急着调网络结构,先检查学习率是否合适。

4. 从经典机器学习到深度学习

4.1 线性回归与逻辑回归示例

深度学习之前,机器学习中最基础的模型是线性回归和逻辑回归。李宏毅课程里会从这两个模型讲起,因为它们能解释什么是“找函数”。

线性回归用于预测连续数值,比如房价、温度。逻辑回归其实不是回归,而是分类模型,它在线性输出的基础上加了一个 Sigmoid 函数,把输出映射到 0 到 1 之间,表示概率。

下面用 scikit-learn 演示一个简单的逻辑回归分类任务。

# 文件路径:logistic_iris.py from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据 data = load_iris() X = data.data y = data.target # 只使用前两类数据,方便理解二分类 X = X[y != 2] y = y[y != 2] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 训练逻辑回归 model = LogisticRegression(max_iter=200) model.fit(X_train, y_train) # 预测与评估 y_pred = model.predict(X_test) acc = accuracy_score(y_test, y_pred) print(f"Test Accuracy: {acc:.4f}")

很多初学者会问:既然深度学习这么强,为什么还要学逻辑回归?原因是逻辑回归结构简单、可解释性强、训练成本低,在很多中小型项目中仍然是首选的 baseline 模型。先学会它,再理解神经网络的“深度”到底改进了什么。

4.2 卷积神经网络与计算机视觉

计算机视觉是深度学习落地最成熟的领域之一。CNN(卷积神经网络)之所以适合图像任务,是因为它通过卷积核自动提取局部特征,比如边缘、纹理、形状。相比全连接网络,CNN 的参数更少,并且具有平移不变性。

一个典型的 CNN 结构由卷积层、池化层、全连接层组成。卷积层作用在图像局部区域上,池化层用于降低特征图尺寸,全连接层最后输出分类结果。

下面是一个简单的 CNN 图像分类代码片段,同样使用 MNIST。

# 文件路径:cnn_mnist.py import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, num_classes=10): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(32 * 7 * 7, 128) self.fc2 = nn.Linear(128, num_classes) self.relu = nn.ReLU() def forward(self, x): x = self.pool(self.relu(self.conv1(x))) # 输出尺寸 16 * 14 * 14 x = self.pool(self.relu(self.conv2(x))) # 输出尺寸 32 * 7 * 7 x = x.view(x.size(0), -1) x = self.relu(self.fc1(x)) x = self.fc2(x) return x

在实际工程中,直接用 ResNet、MobileNet、EfficientNet 等预训练模型做迁移学习,效果通常比从零训练更好。迁移学习的关键是:在一个大数据集(比如 ImageNet)上预训练过的模型,已经学到了通用的视觉特征,只需要在目标任务上微调最后的几层。

4.3 RNN、Transformer 与自然语言处理

自然语言处理是另一个核心方向。早期 NLP 任务主要依赖 RNN 和 LSTM,它们按顺序处理句子,但长距离依赖问题很难解决。后来 Transformer 提出了 Self-Attention 机制,句子中每个词都能直接与所有词计算相关性,彻底改变了 NLP 的格局。

李宏毅课程中会重点讲 Self-Attention,这是理解大模型的关键。Self-Attention 会计算 Query、Key、Value 三组向量,然后根据 Query 与 Key 的相似度加权地聚合 Value。通过多层 Self-Attention,模型可以捕捉句子内部的复杂关系。

如果一开始不理解 QKV,可以这样记忆:Query 表示“我在找什么”,Key 表示“我是什么”,Value 表示“我携带的信息”。注意力机制就是让每个词根据相关性去提取其他词的信息。

自然语言处理任务包括文本分类、命名实体识别、机器翻译、问答系统、文本生成等。今天的 GPT、BERT 等预训练语言模型,本质上都是基于 Transformer 构建的。

5. 强化学习核心概念与简单实现

5.1 强化学习框架:状态、动作、奖励

强化学习是很多初学者觉得最难的部分,因为它和我们平时接触的监督学习很不一样。强化学习没有现成的输入输出标签,只能通过与环境交互获得奖励信号。核心要素包括:

  • 状态(State):智能体当前观察到的环境信息。
  • 动作(Action):智能体基于策略做出决策。
  • 奖励(Reward):环境对动作的反馈。
  • 策略(Policy):从状态到动作的映射。
  • 价值函数(Value Function):评估某个状态或动作的长期收益。

训练过程中,智能体会不断尝试动作,根据奖励调整策略。这个过程很像“放羊式学习”:做得好就奖励多一点,做得不好就避免这种选择。

5.2 Q-Learning 表格示例

Q-Learning 是强化学习最基础的算法之一。它用一个 Q 表记录“在某个状态下做某个动作”的价值,训练时不断更新这个 Q 表。

下面用一个极简示例演示 Q-Learning 的更新逻辑。

# 文件路径:q_learning_demo.py import numpy as np # 假设有 5 个状态,每个状态有 2 个动作 n_states = 5 n_actions = 2 Q = np.zeros((n_states, n_actions)) # 奖励定义:进入状态 4 会得到奖励 rewards = np.array([ [-1, -1], [-1, -1], [-1, -1], [-1, -1], [10, 10] ]) alpha = 0.1 # 学习率 gamma = 0.9 # 折扣因子 epsilon = 0.1 # 探索率 def choose_action(state): if np.random.random() < epsilon: return np.random.randint(n_actions) return np.argmax(Q[state]) def step(state, action): # 简单模拟:动作 0 走向下一个状态,动作 1 原地不动 next_state = state + 1 if action == 0 else state next_state = min(next_state, n_states - 1) reward = rewards[next_state].max() return next_state, reward for episode in range(100): state = 0 while state != n_states - 1: action = choose_action(state) next_state, reward = step(state, action) # Q-Learning 更新公式 best_next = np.max(Q[next_state]) Q[state, action] += alpha * (reward + gamma * best_next - Q[state, action]) state = next_state print("训练后的 Q 表:") print(Q)

这个例子非常简略,真实场景中状态空间往往巨大,无法使用表格,所以需要用神经网络来逼近 Q 函数,也就是 DQN。再后来的 Policy Gradient、PPO、Actor-Critic 等算法,则是直接优化策略本身。

5.3 策略梯度与后续方向

策略梯度方法的核心思想是:如果某个动作带来的奖励高,就增加这个动作的概率;如果奖励低,就降低概率。相比 Q-Learning 的“先学价值再做动作”,策略梯度可以直接输出动作概率分布,适合连续动作空间场景。

学习强化学习时,建议按照 Q-Learning -> DQN -> Policy Gradient -> PPO 的顺序逐步推进。不要一开始就尝试复现 AlphaGo,需要先在小规模环境上跑通代码,理解算法每个模块的作用。

6. 大模型时代需要补充的知识

6.1 从 Transformer 到大模型

大模型并不是一个全新算法,而是 Transformer 架构、海量数据、大算力三者结合的产物。ChatGPT、GPT-4、LLaMA 等模型的核心能力都来自 Transformer 的堆叠和预训练。

用通俗的话说,大模型比小模型多了三个变化:参数量更大、训练数据更多、训练方式更复杂。以 GPT 为例,它的训练目标很简单:预测下一个词。但就是这样一个简单的目标,在海量文本上训练之后,模型展现出了阅读理解、写作、代码生成、推理等能力。这种现象被称为“涌现能力”。

学习大模型之前,建议先把 Self-Attention、Transformer 的结构搞清楚,这样再看指令微调、RLHF、LoRA 等概念时会轻松很多。

6.2 大模型微调与部署

在实际项目中,直接在 GPU 上从零训练大模型并不现实。更多场景是在已有开源模型基础上做微调。

常用的轻量微调方式是 LoRA(Low-Rank Adaptation)。它通过给原始权重矩阵增加低秩分解的旁路,训练时只更新旁路参数,大幅降低显存需求。

下面是一个概念性示例,展示用 Transformers 加载预训练模型的思路,实际运行时需要根据你安装的版本调整模型名称和参数。

# 文件路径:load_model_demo.py # 仅供参考,实际运行需要安装 transformers 和对应框架 from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "Qwen/Qwen2-0.5B-Instruct" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) prompt = "请用一句话介绍机器学习" inputs = tokenizer(prompt, return_tensors="pt") outputs = model.generate(**inputs, max_new_tokens=50) response = tokenizer.decode(outputs[0], skip_special_tokens=True) print(response)

这里不详细展开训练代码,是因为大模型微调与不同框架、版本绑定很深。初学者建议先跑通推理,再使用 LLaMA Factory、peft 等工具做 LoRA 微调。

6.3 大模型部署中的精度选择

部署大模型时,选对数值精度非常重要。FP32 是单精度浮点数,占用 4 字节;FP16 和 BF16 都是 2 字节,能节省一半显存,但数值范围和精度不同。BF16 保留更大的指数范围,在训练中更稳定;FP16 在某些 GPU 上推理速度更快。TF32 是 NVIDIA 显卡上的特殊格式,用于加速矩阵计算,精度介于 FP32 和 FP16 之间。

选择哪种精度,需要结合显卡类型、模型规模、任务精度要求综合考虑。只要 GPU 支持,大部分场景会优先使用 FP16 或 BF16 减少显存占用,从而提升推理吞吐量。

7. 学习路线规划与避坑建议

7.1 按阶段安排学习计划

如果要把李宏毅课程体系完整学一遍,建议按以下阶段推进:

第一阶段(第 1 到 2 周)学习机器学习基础概念,包括回归、分类、损失函数、梯度下降、过拟合。目标是能看懂课程中的案例分析,并用 scikit-learn 跑通一个简单分类任务。

第二阶段(第 3 到 4 周)学习神经网络与反向传播,用 PyTorch 实现全连接网络、CNN、RNN 等基础结构。不用追求结果多好,关键是理解前向传播、反向传播和训练循环。

第三阶段(第 5 到 6 周)深入计算机视觉和自然语言处理方向,分别完成一个项目。CV 可以选猫狗分类、手写数字识别;NLP 可以选文本情感分析、新闻标题分类。

第四阶段(第 7 到 8 周)学习强化学习基础,先跑通 Q-Learning,再看 DQN 和 Policy Gradient。

第五阶段(第 9 周起)补充大模型知识,理解 Transformer、预训练、微调、部署的基本链路。

7.2 学习中的常见误区

第一个误区是只看视频不动手。很多同学收藏了视频,看了十几遍,却一行代码没写过。学机器学习,代码和数学推导必须结合。看完一节,就去找对应的开源示例,自己跑一遍,改改参数,看看结果变化。

第二个误区是陷入公式推导出不来。课程中有些数学细节,比如反向传播的链式法则展开,刚开始可以只掌握大框架。先让代码跑起来,之后再回头补数学。

第三个误区是频繁更换学习资料。今天看李宏毅,明天看吴恩达,后天又去刷西瓜书,结果一直停留在“线性回归”的位置。建议选定一条主线,遇到某个知识点卡住了,再查其他资料补充。

7.3 动手实践建议

动手实践建议从“小数据集 + 小模型”开始。很多同学一上来就想复现 YOLO 或者 GPT,结果被环境配置和显存限制劝退。更合理的方式是先在 MNIST、CIFAR-10、IMDB 等小规模数据集上做实验,把模型训练流程跑通,再逐步增加数据和模型复杂度。

每次实验建议记录三样东西:数据集、模型结构、超参数。这样在结果变差时,才能定位是自己改了模型还是调整了学习率导致的。

8. 常见问题与排查思路

问题现象常见原因解决思路
安装 PyTorch 后无法调用 GPUCUDA 版本和驱动不匹配运行nvidia-smi查看驱动支持的最高 CUDA,再安装匹配的 PyTorch 版本
训练 Loss 一直是 NaN学习率过大、数据未归一化调低学习率,检查输入数据是否包含 NaN 或过大数值
模型训练准确率很低模型结构过于简单、特征未提取充分尝试增加层数、使用预训练模型、数据增强
训练集效果好但测试集效果差过拟合使用正则化、Dropout、增加数据、早停
强化学习训练不收敛奖励设计不合理、探索率设置不当检查奖励范围,调整 epsilon 衰减策略
加载大模型时显存不足参数规模太大或精度设置过高使用 FP16/BF16 精度,开启梯度检查点,或使用量化加载

遇到报错时,先读完整报错信息,再搜索关键异常类型。不要一上来就重装环境,很多问题只是版本冲突或路径错误。

9. 总结与下一步

这篇内容从机器学习基础概念出发,梳理了深度学习、神经网络、计算机视觉、自然语言处理、强化学习和大模型等核心知识点,并给出了可以直接运行的代码示例。如果你顺着这篇文章的脉络去学习,建议按顺序完成三件事:先掌握“找函数”的机器学习世界观,再用 PyTorch 跑通图像分类任务,最后用强化学习或大模型项目收尾。

学完这些基础后,你可以继续研究 Transformer 的原始论文、PyTorch 官方教程,或者尝试参加 Kaggle 比赛来检验自己的水平。遇到不懂的地方,把问题拆小,多跑实验,慢慢就会形成自己的理解和经验。如果这篇文章对你有帮助,建议收藏起来,搭配课程视频和上面的代码练习,边看边动手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询