MNIST实验(二):CNN
上一篇MNIST实验里,我用MLP跑通了手写数字识别,最后测试准确率大约是97.52%。当时最大的收获是先把PyTorch的训练流程跑通:数据、模型、loss、反向传播、参数更新、测试准确率。 这次我继续在MNIST上跑了一个CNN baseline。最后测试准确率到了98.82%,比之前的MLP高一些。 这篇不是要把CNN讲成完整教程,我现在也还没到完全理解卷积神经网络的程度。它更像是一次实验记录:从MLP过渡到CNN,先看看为什么图像任务里CNN会更自然一些。 为什么在MLP之后学CNNMLP,Multilayer Perceptron,多层感知机,处理MNIST时会先把图片拉平成一长串数字。 MNIST图片原本是28x28的二维灰度图,但MLP里的Flatten()会把它变成784个数字: 12nn.Flatten()nn.Linear(28 * 28, 128) 这样当然也能训练,而且之前MLP baseline已经能达到97%以上准确率。但问题是,图片原来的二维结构被直接拉平了。 比如一个数字的笔画、边缘、转折,其实都和局部区域有关。MLP把图片拉平以后,模型还是可以学...
机器学习(三)
前两篇主要围绕线性回归:从代价函数、梯度下降,到多维特征、向量化、特征缩放和多项式回归。它们解决的主要是回归问题,也就是预测连续值,比如房价、利润、温度。 这一篇开始进入分类问题。分类不是预测一个连续数字,而是预测类别。比如是否垃圾邮件、是否患病、是否通过审核,或者图片里是不是某个数字。 这篇也会把过拟合和正则化放进来。因为学到这里我开始意识到,模型不只是要在训练集上表现好,还要在新数据上靠谱。 从回归问题转向分类问题回归(Regression,回归)的输出是连续值。比如预测房价时,结果可能是 232、460 这样的数字。 分类(Classification,分类)的输出是类别。最简单的是二分类问题,标签通常写成: y \in \{0,1\}这里: $0$:负类。 $1$:正类。 比如: 邮件不是垃圾邮件:0。 邮件是垃圾邮件:1。 没有患病:0。 患病:1。 我现在先把分类理解成:模型不是预测“多少”,而是预测“属于哪一类”。 为什么不能直接用线性回归做分类线性回归的输出是: f_{\mathbf{w},b}(\mathbf{x})=\mathbf{w}\cdot\...
机器学习(二)
上一篇主要把机器学习入门、监督学习、线性回归模型和代价函数顺了一遍。那时候我已经知道,训练线性回归大概就是找到合适的 $w$ 和 $b$,让代价函数 $J(w,b)$ 尽可能小。 这一篇就接着往下走:模型不是靠我手动试 $w$ 和 $b$,而是用梯度下降一点点自己调整参数。然后再从单特征扩展到多维特征,看看向量化、特征缩放和多项式回归为什么会出现。 我现在对这部分的理解是:梯度下降是训练的核心方法,多维特征让模型能处理更真实的问题,特征缩放和向量化则是在让训练更顺、更高效。 梯度下降:模型怎么自己变好梯度下降(Gradient Descent,梯度下降)可以先理解成:沿着代价函数下降的方向,一步一步调整参数。 在线性回归里,参数更新公式是: w := w-\alpha\frac{\partial J(w,b)}{\partial w} b := b-\alpha\frac{\partial J(w,b)}{\partial b}这里: $w,b$:模型参数。 $J(w,b)$:代价函数,用来衡量预测错多少。 $\alpha$:学习率,控制每一步走多大。 $\frac{\par...
隐私保护(一):MPC、SMPC、HE、DP
我现在还没有深入读隐私计算论文,也没有真正实现过这些协议。这篇只是先把几个经常出现的名词放到一张地图里,避免后面学联邦学习时完全陌生。 最开始我以为,联邦学习既然“不把原始数据传到服务器”,那是不是就天然安全。后来发现这个想法太粗了。 联邦学习确实减少了原始数据集中到服务器上的风险,但模型更新、梯度、参数变化这些信息本身,也可能泄露东西。 这里我会想到以前接触CTF和Web安全时的一些经验。比如一个网站不是说“密码没有明文写在页面上”就一定安全,中间还可能有中间人攻击、接口泄露、权限绕过、请求重放等问题。很多风险不是出现在最表面的数据本身,而是出现在传输过程、协议设计、权限边界和中间状态里。 联邦学习给我的感觉也有点像这样:原始数据不直接上传,只是解决了一类风险,但训练过程里还有客户端更新、服务器聚合、通信链路、参与方是否可信这些环节。如果这些地方没有保护好,攻击者仍然可能从“看起来不是原始数据”的信息里推回去。 为什么联邦学习会遇到隐私保护联邦学习,Federated Learning,大致思路是:数据留在各个客户端,本地训练模型,再把模型更新发给服务器聚合。 这个流程比集中式...
MNIST 实验(一):MLP
在补机器学习基础之前,我其实已经先用MNIST跑过一个MLP baseline。代码能跑起来,准确率也能到97%左右,但当时更多是“先跑通”,很多细节还没完全理解。 这篇先把这次实验整理下来。它不是说我已经懂深度学习了,而是记录我第一次完整看到: 数据->模型->loss->反向传播->更新参数->测试准确率 这个流程。 实验目标MNIST是手写数字识别数据集。每张图片是28x28的灰度图,对应一个0到9的数字标签。 这次实验的目标很简单:用一个最基础的MLP,Multilayer Perceptron,多层感知机,完成MNIST的10分类任务。 加载数据脚本里先写了一个get_dataloaders函数: 123456789101112131415161718192021222324252627def get_dataloaders(batch_size: int) -> tuple[DataLoader, DataLoader]: transform = transforms.ToTensor() train_dataset =...
机器学习(一)
最近本来想继续往CNN学,但回头看了一下,发现自己虽然已经用MNIST跑过MLP,也能看懂训练准确率在变化,可是对“模型到底怎么学会的”还没有那么稳。 所以这篇先不急着写神经网络,而是把吴恩达机器学习课程里最前面的概念整理一遍。我的目标不是把机器学习讲成教材,而是把自己现在能理解到的链条写清楚: 数据给进去,模型先做预测;预测和真实答案之间有差距;代价函数把这个差距算出来;梯度下降再一点点调整参数,让差距变小。 为什么先学机器学习我现在的理解是,深度学习和联邦学习并不是凭空冒出来的。 深度学习里也有模型、参数、损失函数、梯度下降和优化器;联邦学习只是把训练过程放到多个客户端上,还要考虑数据不能直接集中起来的问题。如果这些基础概念不稳,后面看到FedAvg、客户端更新、服务器聚合时,很容易只记住流程,但不知道每一步为什么存在。 所以我先回到机器学习的起点,把几个最基本的问题弄明白: 模型到底在学什么? 特征和标签分别是什么? 训练为什么能让参数变好? 为什么从一个特征预测,可以扩展到多个特征一起预测? 监督学习和无监督学习机器学习(Machine Learning,机器学习)可...
第一篇文章
这是我博客的第一篇文章






