1. 从一行代码到一套系统我理解的Python与人工智能很多人第一次接触人工智能是从一段Python代码开始的。可能是几行import可能是一个简单的线性回归也可能是跑通某个开源项目后屏幕上跳出来的识别结果。那一瞬间的兴奋感很真实但紧接着的困惑也很真实——Python和人工智能到底是什么关系为什么几乎所有AI教程都默认用Python学完Python语法之后距离真正做出一个能用的AI应用还有多远我自己是从Python爬虫入门的后来因为项目需要转向数据分析和机器学习再后来开始接触深度学习框架。这一路踩过的坑、绕过的弯比任何一本教材都来得深刻。这篇文章不打算写成又一份“Python入门到精通”的目录而是想把我对Python与人工智能之间关系的理解拆开来讲清楚Python在AI领域到底扮演什么角色它的边界在哪里一个普通人从零开始应该怎么走以及那些教程里不会告诉你的真实体验。如果你正在犹豫要不要学Python或者已经装好了环境却不知道下一步该做什么又或者你只是好奇“人工智能大作业”里那些代码到底在干什么那这篇内容应该能给你一些参考。我会尽量用从业者之间聊天的口吻把技术细节讲透同时把那些容易让人卡住的环节提前标出来。2. Python在人工智能里的真实定位2.1 为什么AI领域几乎被Python“垄断”这个问题我被问过很多次。答案其实不复杂Python不是最快的语言也不是最优雅的语言但它是胶水语言里生态最完整的那一个。人工智能的核心是数学计算和数据处理而Python恰好在这两个方向上都有极其成熟的库。拿数据处理来说NumPy让矩阵运算变得像写数学公式一样自然Pandas把表格数据的清洗和转换压缩成了几行链式调用。如果换成C同样的操作代码量可能要翻五倍而且调试成本极高。再往上层走scikit-learn封装了几乎所有经典机器学习算法PyTorch和TensorFlow把神经网络的构建和训练抽象成了搭积木一样的过程。这些库的存在让研究者可以把精力集中在模型设计和实验上而不是重复造轮子。另一个关键因素是社区效应。当绝大多数论文的开源代码都是Python写的当GitHub上AI项目的默认语言是Python当Stack Overflow上关于深度学习的提问几乎都附带Python代码片段时选择其他语言就意味着主动放弃整个生态的支持。我试过用其他语言复现一篇论文的模型光是找对应的数值计算库和自动求导工具就花了两天而Python版本可能半小时就跑起来了。还有一个容易被忽略的点Python的交互式特性。Jupyter Notebook这种工具让数据探索和模型调试变得极其直观你可以一段一段地执行代码随时查看中间结果画图验证假设。这种“边写边看”的工作方式在AI研发中几乎是刚需。相比之下编译型语言的“改一行等三分钟”体验在实验阶段会严重拖慢节奏。2.2 Python不是AI的全部但它是入口这里需要澄清一个常见的误解学会Python不等于学会人工智能。Python只是工具就像学会用笔不等于会写小说。人工智能的核心是数学——线性代数、概率论、微积分、优化理论这些才是模型背后的真正逻辑。我见过不少人把Python语法背得滚瓜烂熟lambda、装饰器、生成器用得飞起但一遇到“为什么这里要用交叉熵损失”或者“梯度消失是什么原因”就卡住了。反过来数学基础扎实的人即使Python写得不够Pythonic也能很快把模型调通。所以我的建议一直是Python要学到够用数学要学到理解。那“够用”是什么标准我的经验是能熟练使用列表推导和字典操作理解函数和类的基本用法会读报错信息并定位问题能用NumPy做数组运算能用Pandas做数据清洗能用Matplotlib画图。达到这个水平就可以开始动手做AI项目了。剩下的语法细节在项目中遇到再查完全来得及。2.3 从脚本到系统Python在AI工程中的角色演变刚开始学的时候Python对我来说就是写脚本的工具。一个文件几十行代码跑完输出结果结束。但真正进入AI项目之后我发现Python的角色远不止于此。在一个完整的AI系统里Python可能同时承担着数据预处理管道、模型训练脚本、推理服务接口、结果可视化工具等多重身份。数据清洗用Pandas特征工程用scikit-learn模型训练用PyTorch服务部署用FastAPI监控用Flask写个小面板——这些全是Python。它像一条线把整个流程串了起来。这种“全栈”能力是Python在AI领域不可替代的重要原因。你不需要在多种语言之间来回切换不需要为每个环节单独维护一套工具链。当然性能瓶颈的地方最终还是要用C或CUDA来优化但那是后期的事情。在原型验证和快速迭代阶段Python的效率优势无可比拟。3. 从零搭建Python人工智能开发环境3.1 安装Python版本选择和路径陷阱Python安装本身不难但有几个细节如果没注意后面会反复出问题。首先是版本选择。截至我写这篇文章的时候Python 3.10和3.11是AI生态兼容性最好的版本。3.12虽然已经发布但部分深度学习库的预编译包还没跟上安装时可能需要从源码编译对新手不太友好。我的建议是直接用3.10或3.11稳定省心。其次是安装路径。Windows用户最容易踩的坑是路径里带中文或空格。比如默认的C:\Users\张三\AppData\Local\Programs\Python这个“张三”就会让某些库在编译时找不到路径。我一般建议手动指定一个纯英文、无空格的路径比如C:\Python311。安装时记得勾选“Add Python to PATH”这个选项能省掉后面手动配置环境变量的麻烦。Linux用户相对简单但要注意系统自带的Python版本可能比较老不要直接覆盖系统Python而是用pyenv或conda来管理独立版本。macOS用户如果用Homebrewbrew install python3.11之后可能需要手动把python3.11链接到python3。提示安装完成后在终端输入python --version确认版本。如果提示“不是内部或外部命令”说明PATH没配好需要手动添加。3.2 虚拟环境为什么每个项目都要独立虚拟环境是Python开发中最重要的习惯之一但很多新手会忽略它。简单说虚拟环境就是给每个项目一个独立的“房间”里面装的库互不干扰。项目A用PyTorch 1.13项目B用PyTorch 2.0如果没有虚拟环境两个项目会互相覆盖依赖最后谁都跑不起来。创建虚拟环境的命令很简单python -m venv myenvWindows下激活myenv\Scripts\activateLinux或macOS下激活source myenv/bin/activate激活后终端提示符前面会出现(myenv)表示当前在这个环境里。所有pip install安装的库都只影响这个环境。退出用deactivate。我自己的习惯是每个项目目录下都放一个venv文件夹配合.gitignore排除掉这样代码仓库干净环境也能随时重建。如果项目依赖比较复杂我会用conda来管理因为conda不仅能管Python包还能管CUDA、cuDNN这些底层库省去很多配置麻烦。3.3 编辑器与IDEVSCode和PyCharm怎么选这个问题没有标准答案取决于你的使用场景。VSCode的优势是轻量、灵活、插件丰富。装个Python插件再配个Jupyter插件就能覆盖大部分AI开发需求。它的远程开发功能特别好用可以直接连到服务器上的代码目录在本地编辑在服务器运行。对于需要GPU的训练任务这个功能能省很多事。配置的时候注意选择正确的Python解释器按CtrlShiftP输入“Python: Select Interpreter”选中你虚拟环境里的python.exe。PyCharm的优势是开箱即用、功能完整。专业版对科学计算和数据库的支持很好调试器比VSCode更强大重构功能也更完善。缺点是启动慢、占内存社区版功能有限。如果你主要做大型项目开发PyCharm专业版值得考虑如果只是跑实验、写脚本VSCode足够。我自己的组合是日常写代码用VSCode因为启动快、插件顺手做复杂调试和重构时切到PyCharm。两者都装按场景切换不冲突。3.4 核心库安装一次配好长期受益环境配好之后需要安装AI开发的核心库。我一般按这个顺序来pip install numpy pandas matplotlib scikit-learn pip install torch torchvision torchaudio pip install jupyter notebookNumPy是数值计算的基础Pandas负责表格数据处理Matplotlib用来画图scikit-learn提供经典机器学习算法。PyTorch的安装命令根据系统不同会有变化建议直接去官网复制对应的命令尤其是需要GPU支持的时候要选对CUDA版本。安装完成后跑一段测试代码验证import numpy as np import pandas as pd import torch print(np.__version__) print(pd.__version__) print(torch.__version__) print(torch.cuda.is_available())如果torch.cuda.is_available()返回True说明GPU环境配置成功。返回False的话检查CUDA版本和PyTorch版本是否匹配以及显卡驱动是否更新到最新。注意不要一次性安装所有能想到的库。库越多依赖冲突的概率越大。按需安装用到什么装什么保持环境干净。4. Python基础语法中与AI最相关的部分4.1 数据结构列表、字典和NumPy数组Python原生的列表和字典是基础中的基础但在AI开发中真正高频使用的是NumPy数组。理解它们之间的区别能帮你写出更高效的代码。列表是动态的、可以混合类型的用起来灵活但速度慢。NumPy数组是固定类型的、连续内存存储的支持向量化运算。举个例子如果要把一个列表里的每个元素都乘以2用列表推导是[x*2 for x in lst]用NumPy是arr * 2。后者不仅写法更简洁底层执行效率也高得多因为NumPy的运算是在C层面完成的。字典在AI中常用于配置管理和特征映射。比如模型超参数用字典存标签到类别的映射用字典存。Pandas的DataFrame本质上就是字典的增强版每一列是一个Series整个表可以按列名索引。我刚开始学的时候习惯用列表存所有数据后来发现数据量一大就卡得不行。换成NumPy数组之后同样的操作快了十几倍。这个教训让我明白在AI领域数据结构的选择直接决定代码能不能跑得动。4.2 函数与类从写脚本到写模块写脚本的时候代码是流水账从上到下执行。但AI项目通常需要反复实验这时候函数和类就变得很重要。函数把一段逻辑封装起来方便复用和测试。比如数据预处理可以写成一个函数输入原始数据输出清洗后的数据。这样换数据集的时候只需要改输入不用重写整个流程。类则适合封装有状态的对象。比如一个模型训练器可以用类来管理模型、优化器、学习率调度器这些组件。PyTorch的nn.Module就是类的典型应用你定义一个网络结构继承nn.Module实现forward方法框架会自动帮你处理反向传播和参数更新。我的经验是先写函数再考虑类。不要一上来就设计复杂的类结构那样容易过度工程化。等代码重复出现三次以上再抽象成类也不迟。4.3 异常处理与调试让报错信息为你所用Python的报错信息其实很有用但很多人看到红色文字就慌了直接去搜“XXX错误怎么解决”。更好的做法是先读报错信息本身。报错信息通常包含三部分错误类型、错误描述、调用栈。调用栈从下往上看最后一行是出错的位置往上是调用链。比如File train.py, line 42, in module告诉你出错在train.py第42行。再往下看错误类型KeyError: label说明字典里没有label这个键。AI项目中最常见的错误包括形状不匹配RuntimeError: shape mismatch、数据类型不对TypeError: expected LongTensor、CUDA内存不足RuntimeError: CUDA out of memory。这些错误的解决方法在Stack Overflow上基本都能找到关键是要能准确描述问题。我习惯在关键步骤加print或assert来验证中间结果。比如数据加载后打印形状模型输出后检查维度。这些简单的检查能提前发现大部分问题比等到训练跑完才发现错误要省时间得多。4.4 文件操作与数据读写AI项目的入口和出口AI项目离不开数据读写。读数据用open、pandas.read_csv、numpy.load写结果用to_csv、savefig、torch.save。这些操作本身不难但有几个细节容易出问题。路径问题是最常见的。相对路径是相对于当前工作目录的不是相对于脚本文件的。在Jupyter里工作目录是启动目录在脚本里是执行命令的目录。我一般用os.path.dirname(os.path.abspath(__file__))来获取脚本所在目录然后拼接路径这样不管在哪里执行都不会错。编码问题也很烦人。中文数据用pd.read_csv读取时可能需要指定encodinggbk或encodingutf-8-sig。如果报UnicodeDecodeError先试试这两个编码。大文件读取要注意内存。Pandas的read_csv有个chunksize参数可以分块读取避免一次性加载导致内存溢出。处理图像数据时用ImageFolder或DataLoader来批量加载不要手动循环读文件。5. 人工智能核心概念与Python实现对照5.1 从线性回归理解“模型”是什么线性回归是很多人接触的第一个机器学习模型也是理解AI原理的最佳起点。它的目标很简单找到一条直线让这条直线尽可能接近所有数据点。用Python实现线性回归可以用scikit-learnfrom sklearn.linear_model import LinearRegression import numpy as np X np.array([[1], [2], [3], [4], [5]]) y np.array([2, 4, 6, 8, 10]) model LinearRegression() model.fit(X, y) print(model.coef_) # 斜率 print(model.intercept_) # 截距 print(model.predict([[6]])) # 预测这段代码背后发生的事情是模型通过最小化预测值和真实值之间的平方误差找到了最优的斜率和截距。fit就是训练过程predict就是推理过程。所有复杂的神经网络本质上都是在做类似的事情只是模型从直线变成了多层非线性变换。理解了这个你就理解了AI的核心用数据调整模型参数让模型输出接近真实结果。剩下的都是在这个框架上的扩展。5.2 神经网络用PyTorch搭一个最简单的网络PyTorch是目前最流行的深度学习框架之一它的设计哲学是“像写NumPy一样写神经网络”。下面是一个最简单的全连接网络import torch import torch.nn as nn class SimpleNet(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(10, 32) self.fc2 nn.Linear(32, 1) self.relu nn.ReLU() def forward(self, x): x self.relu(self.fc1(x)) x self.fc2(x) return x model SimpleNet() print(model)这个网络有两层第一层把10维输入映射到32维第二层把32维映射到1维输出。forward定义了数据如何流过网络。训练的时候PyTorch会自动计算梯度并更新参数。我刚开始学的时候最大的困惑是“为什么需要激活函数”。后来理解了如果没有激活函数多层线性变换叠加起来还是线性变换网络再深也等价于一层。激活函数引入了非线性让网络能拟合复杂的函数关系。ReLU是最常用的激活函数因为它计算简单、梯度稳定。5.3 数据预处理模型效果的上限往往在这里决定有一句话在AI圈流传很广数据和特征决定了机器学习的上限模型和算法只是逼近这个上限。我自己的经验完全印证了这一点。数据预处理包括缺失值处理、异常值检测、特征缩放、类别编码等步骤。用Pandas做这些操作非常方便import pandas as pd from sklearn.preprocessing import StandardScaler df pd.read_csv(data.csv) df df.dropna() # 删除缺失值 df df[df[age] 0] # 过滤异常值 scaler StandardScaler() df[[height, weight]] scaler.fit_transform(df[[height, weight]])特征缩放特别重要。如果两个特征的数值范围差异很大比如年龄是0到100收入是0到100000梯度下降会走得很慢因为损失函数的等高线被拉得很扁。标准化之后所有特征都在同一量级训练会稳定很多。类别特征需要编码。简单的可以用pd.get_dummies做独热编码复杂的可以用LabelEncoder或TargetEncoder。独热编码的缺点是维度会膨胀如果类别很多要考虑用嵌入层来降维。5.4 模型评估与调参不要只看准确率模型训练完之后需要评估它的效果。准确率是最直观的指标但很多时候不够用。比如一个二分类问题如果正负样本比例是99比1模型全部预测为负也能达到99%的准确率但这个模型毫无价值。更全面的评估需要看精确率、召回率、F1分数以及混淆矩阵。scikit-learn提供了这些工具from sklearn.metrics import classification_report, confusion_matrix y_pred model.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))调参是另一个重要环节。学习率、批大小、网络层数、正则化系数这些超参数都会影响最终效果。我一般先用默认参数跑一遍然后根据损失曲线调整学习率再根据验证集表现调整模型复杂度。网格搜索和随机搜索是常用的自动化调参方法但计算成本高实际项目中更多是靠经验和手动调整。提示验证集和测试集要严格分开。验证集用来调参测试集用来最终评估。如果反复用测试集调参测试结果就失去了参考意义。6. 实操项目从数据到可运行的原型6.1 项目选择从“能跑通”开始新手做项目最容易犯的错误是选了一个太复杂的题目比如“做一个能对话的AI助手”或者“训练一个图像生成模型”。这些项目涉及的技术栈太深卡住的地方太多很容易半途而废。我的建议是从结构化数据的分类或回归任务开始。比如泰坦尼克号生存预测、房价预测、鸢尾花分类。这些数据集小、特征清晰、结果容易验证适合把完整流程走一遍。走完之后你对数据加载、模型训练、评估、调参就有了直观感受。第二个项目可以尝试图像分类用CIFAR-10或MNIST数据集。这两个数据集内置在PyTorch里加载方便训练速度快适合理解卷积神经网络。第三个项目可以尝试文本分类用IMDB影评数据集做情感分析理解词嵌入和循环网络。每个项目不需要做到完美关键是跑通全流程。从读数据到出结果中间每一步都亲手写过比看十篇教程都有用。6.2 完整流程拆解以图像分类为例下面以CIFAR-10图像分类为例拆解一个完整的AI项目流程。第一步加载数据import torch from torchvision import datasets, transforms transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) train_set datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform) test_set datasets.CIFAR10(root./data, trainFalse, downloadTrue, transformtransform) train_loader torch.utils.data.DataLoader(train_set, batch_size64, shuffleTrue) test_loader torch.utils.data.DataLoader(test_set, batch_size64, shuffleFalse)ToTensor把图像转成张量Normalize把像素值标准化到-1到1之间。DataLoader负责批量加载和打乱顺序。第二步定义模型import torch.nn as nn import torch.nn.functional as F class CNN(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(3, 32, 3, padding1) self.conv2 nn.Conv2d(32, 64, 3, padding1) self.pool nn.MaxPool2d(2, 2) self.fc1 nn.Linear(64 * 8 * 8, 256) self.fc2 nn.Linear(256, 10) def forward(self, x): x self.pool(F.relu(self.conv1(x))) x self.pool(F.relu(self.conv2(x))) x x.view(-1, 64 * 8 * 8) x F.relu(self.fc1(x)) x self.fc2(x) return x这个网络有两个卷积层、两个池化层、两个全连接层。卷积层提取图像特征池化层降低维度全连接层做分类。第三步训练循环import torch.optim as optim model CNN() criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) for epoch in range(10): running_loss 0.0 for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() print(fEpoch {epoch1}, Loss: {running_loss/len(train_loader):.4f})每个批次做四件事清空梯度、前向传播、计算损失、反向传播更新参数。循环十轮观察损失是否下降。第四步评估correct 0 total 0 with torch.no_grad(): for inputs, labels in test_loader: outputs model(inputs) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() print(fAccuracy: {100 * correct / total:.2f}%)在测试集上计算准确率如果达到60%以上说明模型学到了东西。CIFAR-10的随机猜测准确率是10%60%已经是不错的结果。6.3 代码组织让项目可维护项目跑通之后下一步是整理代码。我习惯把代码分成几个模块data.py数据加载和预处理model.py模型定义train.py训练循环evaluate.py评估脚本config.py超参数配置这样拆分的好处是换模型只需要改model.py换数据只需要改data.py训练逻辑不用动。配置文件用字典或argparse管理方便做实验对比。版本控制也很重要。用Git管理代码每次实验记录commit和对应的结果。我见过太多人跑了几十组实验最后忘了哪组参数对应哪个结果。用wandb或tensorboard记录训练曲线比手动记笔记靠谱得多。6.4 从原型到可用部署的初步思路模型训练好之后如果想让别人也能用就需要部署。最简单的部署方式是用Flask或FastAPI写一个HTTP接口from fastapi import FastAPI import torch app FastAPI() model torch.load(model.pth) model.eval() app.post(/predict) def predict(data: dict): tensor torch.tensor(data[input]) with torch.no_grad(): output model(tensor) return {prediction: output.tolist()}这个接口接收JSON输入返回预测结果。用uvicorn启动后就可以通过HTTP请求调用。生产环境还需要考虑并发、超时、日志、监控等问题但原型阶段这样已经够用。如果模型比较大可以用ONNX或TorchScript导出脱离Python环境运行。如果要做成桌面应用可以用PyQt或Tkinter包一层界面。如果要做成网页可以用Gradio或Streamlit快速搭建交互页面。这些工具让AI模型的展示和分享变得非常简单。7. 常见问题与排查技巧实录7.1 环境配置类问题速查问题现象可能原因解决方法python不是内部或外部命令PATH未配置重新安装勾选Add to PATH或手动添加安装目录到环境变量pip install速度慢默认源在国外换国内镜像源如清华源、阿里源ModuleNotFoundError库未安装或环境不对确认虚拟环境已激活用pip list检查CUDA out of memory显存不足减小batch size清理缓存或用梯度累积RuntimeError: shape mismatch张量维度不匹配打印各步骤形状检查view和reshape参数UnicodeDecodeError文件编码问题指定encodinggbk或encodingutf-8-sig7.2 训练过程中的典型故障损失不下降是最常见的问题。可能的原因包括学习率太大导致震荡学习率太小导致收敛慢数据没有归一化模型太简单拟合不了或者标签有问题。排查顺序是先检查数据再调学习率最后考虑换模型。过拟合表现为训练集准确率很高但验证集很低。解决方法包括增加数据量、加正则化L2或Dropout、减小模型复杂度、早停。我一般先加Dropout试试效果不明显再考虑其他方法。梯度爆炸或消失在深层网络中常见。梯度爆炸表现为损失变成NaN解决方法有梯度裁剪、减小学习率、用BatchNorm。梯度消失表现为深层参数不更新解决方法有残差连接、用ReLU替代Sigmoid、用LSTM替代RNN。7.3 那些教程不会告诉你的经验不要迷信默认参数。PyTorch的默认初始化、默认学习率、默认优化器都是通用配置不一定适合你的任务。多试试不同的组合记录结果慢慢就有感觉了。数据比模型重要。我做过一个项目换了三种模型架构准确率只提升了2%。后来花时间清洗数据、补充特征准确率直接涨了15%。这个经历让我彻底相信在数据上花的时间回报率远高于在模型上花的时间。小步快跑不要憋大招。不要想着一次写出完美的代码先写一个能跑通的版本然后逐步改进。每次只改一个地方跑一遍看结果确认有效再继续。这样即使出问题也能快速定位。学会看官方文档。PyTorch、NumPy、Pandas的官方文档写得很好有示例有说明。遇到问题先查文档比搜博客靠谱。博客可能过时文档永远是最新的。保持环境可复现。用pip freeze requirements.txt导出依赖用Docker封装环境用随机种子固定结果。这些习惯在团队协作和论文复现中特别重要。7.4 学习路径上的岔路口学Python和AI的过程中会遇到很多选择先学数学还是先学编程学PyTorch还是TensorFlow做CV还是NLP我的建议是先动手再补理论。先跑通一个项目感受一下AI能做什么然后再回头补数学和理论。有了直观感受学理论会更有方向感。框架选择上PyTorch目前是学术界主流TensorFlow在工业界部署更成熟。新手建议从PyTorch开始因为它的调试更直观社区更活跃。等有了一定基础再学TensorFlow也不迟。方向选择上CV和NLP是目前岗位最多的两个方向。CV入门相对直观因为图像可以看到NLP涉及的语言学概念多一些但大模型时代NLP的机会也更多。我的建议是选一个自己感兴趣的方向深入不要贪多。8. 我在这条路上踩过的坑和真实体会回过头看我从第一次写print(hello world)到能独立完成一个AI项目花了大概一年半时间。这中间有几个月是纯浪费的——反复装环境、反复看入门教程、反复在“学什么”和“怎么学”之间纠结。如果让我重新走一遍我会把时间压缩到半年以内。最大的体会是不要等准备好了再开始。我当初总觉得“数学没学好不能碰机器学习”“Python没学完不能做项目”结果拖了很久。后来被迫接了一个任务边做边学反而进步最快。真实项目会逼着你解决问题解决问题的过程就是最好的学习。第二个体会是输出倒逼输入。我开始写技术笔记之后发现自己对很多概念的理解其实很模糊。为了写清楚不得不去查资料、做实验、验证想法。这个过程让我的理解深入了很多。如果你也在学AI建议你试着把学到的东西讲给别人听或者写成文章效果比单纯看书好得多。第三个体会是工具在变基础不变。框架从Theano到TensorFlow到PyTorch每年都有新东西。但线性代数、概率论、优化方法这些基础十年都没变过。把基础打牢学新工具只是几天的事。反过来如果只会调库换个框架就抓瞎了。最后分享一个我常用的学习方法费曼技巧。学一个概念的时候假装要讲给一个完全不懂的人听。如果讲不清楚说明自己没真懂。回去重新学直到能讲清楚为止。这个方法帮我搞定了反向传播、注意力机制、批归一化这些难点。你也可以试试。