Softmax回归

abstract: 李沐动手深度学习–softmax回归的数学原理与从零实现 story: 什么是适合新手的教程? Attention: 关于语法的讲解主要涉及torch库,其他库的用法可能略有出入 一. 回归 vs 分类 本质上:输出连续与否 譬如softmax回归,其输出是预测为某类别的概率,是连续值,属于[0, 1]之间,故即使最后用于分类问题,其本质也是一个回归模型 二. 神经元与激活函数 2.1 神经元 所谓神经元,指的是一个运算过程:f(W*X + b) ,W是该神经元前一层的权重,X是该神经元前一层的输出,这两者通常是两个矩阵。b是偏置,决定W*X有多难被激活(对于阶跃函数或ReLu这种激活函数,自变量小于零时函数值为0,故可以通过调节偏置b的值,进而调节W*X被激活的阈值)。而f()就是激活函数。 2.2 激活函数 神经网络中,激活函数必须是非线性的,否则网络的层数和深度都没有意义。而激活函数是非线性的,不代表网络一定是非线性的。非线性的网络需要满足两个条件: 非线性的激活函数 复合运算或者高次运算 在网络中,复合运算就是指多层网络,即至少存在一层隐藏层神经元,两组W权重矩阵的网络 三. softmax 3.1 两个作用 非负化 将数值映射到0-1区间(概率化) 3.2 公式 $$\frac{}$$四.代码一般结构 4.1 工具函数 4.1.1 定义net 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def softmax(X): ''' softmax 的 Docstring :param X: 二维矩阵,每行代表一个样本,每列代表一个类别,即每行代表一个样本的各类别的得分 ''' X_exp = torch.exp(X) example_sum = X_exp.sum(dim=1, keepdim=True) return X_exp / example_sum def net(X): ''' net 的 Docstring batch_size*(H*W) @ (H*W)*num_classes -> batch_size*num_classes :param X: 输入数据,形状为 (batch_size, 1, 28, 28),需要先 reshape 成 (batch_size, 784) 才能与权重矩阵 W 相乘. ''' return softmax(torch.matmul(X.reshape(-1,W.shape[0]), W) + b) # 这里reshape不会改变原始数据形状, 也不创建新副本, 数据还是那个数据,这里创建了一个新视图,改变了查看数据的方式 -sum(dim = 0): dim等于几,shape中第几项就变为1。比如dim = 0,一个[2,3]的矩阵变为了[1,3],也就是对每一行求和,成了一个列向量;同样地,dim = 1时对每一列求和,成了一个行向量 ...

February 14, 2026 · 4 min · pearl