从零实现MNIST神经网络:Gradient descent 3D可视化需求问询
Loss Landscape 3D可视化实现步骤
1. 高维参数降维处理
你的模型参数总维度达784128 + 12810 + 128 + 10 = 102,506,直接做3D可视化不现实,必须先将高维参数投影到2D平面:
- 把所有参数(W1、W2、b1、b2)flatten成一维向量
params_vec,每个训练步骤对应一个该向量 - 选择降维方案:
- PCA降维:对训练过程中保存的所有
params_vec做PCA,提取前2个主成分作为投影的x、y轴,能最大程度保留参数变化的核心方向 - 随机方向投影:随机生成两个正交高维向量作为基,将每个
params_vec投影到这两个基上得到x、y值(适合快速验证,但可能无法捕捉参数变化的主要趋势)
- PCA降维:对训练过程中保存的所有
2. 生成Loss Landscape基底网格
确定投影方向后,绘制目标区域的loss分布:
- 划定投影范围:根据训练轨迹的投影结果,取x、y轴的最小/最大值,再向外扩展10%-20%,确保覆盖轨迹及周边区域
- 生成网格点:用
np.meshgrid生成均匀分布的x、y网格(比如50x50密度) - 还原高维参数:将网格点的(x,y)映射回高维参数空间(如PCA逆变换、随机基线性组合),叠加初始参数偏移,保证网格聚焦在轨迹附近
- 计算网格点loss:固定用MNIST验证集(或训练集子集)计算每个网格点对应参数的损失值,作为z轴数值
3. 训练轨迹投影转换
对保存的每一步参数执行相同降维操作:
- 每个训练步骤的
params_vec通过同一投影方法,得到对应的(x,y)坐标 - 同步记录该步骤的loss值,作为轨迹的z坐标
4. 3D可视化绘制
用Python可视化工具实现:
- Matplotlib:用
plot_surface绘制loss landscape的3D曲面,用plot3D绘制训练轨迹(可按训练步数递增设置颜色渐变,比如从蓝到红),添加坐标轴标签(x: 主成分1/随机方向1,y: 主成分2/随机方向2,z: Loss) - Plotly:生成交互式3D图,方便旋转查看细节,用
Surface绘制曲面,Scatter3d绘制轨迹,支持hover显示每一步的步数与loss值
关键注意事项
- 计算网格点loss时,建议用小批量数据或验证集子集,降低计算量
- 若用PCA,需用所有训练参数拟合PCA模型,不能仅取部分步骤数据
- 轨迹绘制可每隔N步取一个点,避免点过多导致图形杂乱
- 给loss landscape添加颜色映射,用颜色区分loss高低,提升直观性
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

