注:本文转载自https://github.com/ysh329/Chinese-UFLDL-Tutorial
因为github上的makedown格式显示的不够完全,看的非常不方便,因此放到CSDN上比较好查阅学习。
Softmax 回归(Softmax Regression)
介绍(Introduction)
Softmax 回归(或称为多元逻辑斯特回归),是逻辑斯特回归用来处理多类分类问题的更一般化形式。在逻辑斯特回归中,假定类别标签都是二元的:即 y(i)∈{0,1} 。之前曾用这样的一个分类器来做两类的(数字 1 和 0 的)手写数字分类。然而, Softmax 回归可处理 K 个类别的分类问题,其中类别标签 y(i)∈{1,K} 。
不妨再回顾一下逻辑斯特回归,有
m
个已标记类别的训练集
其中,模型参数 θ 在最小化代价函数时求得:
在 Softmax 回归的设定中,(与前文中两类分类不同)因为重点关注在多类分类,即类别标签
y
可以取
给出测试输入
x
,希望假设可以针对同一样本在不同的
这里, θ(1),θ(2),…,θ(K)∈Rn 是模型的参数。需要注意的是, 1∑Kj=1exp(θ(j)⊤x) 这一项对分布进行了标准化( normalize ),所以其(最终)会加和为一项。
为方便起见,也写
θ
来表示模型的所有参数。当你实现 Softmax 回归时,
n
行
代价函数(Cost Function)
现在来描述 Softmax 回归的代价函数。在下面的方程中,
1{⋅}
被称为“指示器函数”( indicator function ,译者注:老版教程中译为“示性函数”),即
1{值为真的表达式}=1
,
1{值为假的表达式}=0
。例如,
1{2+2=4}
求出的数值为
1
;而
值得注意的是,逻辑斯特回归的代价函数也可等价地写成如下形式:
除了需要将 K 个不同的类标签的概率值相加外,逻辑斯特回归的代价函数与 Softmax 的代价函数是相似的。需要注意的是,在 Softmax 回归中有:
对于 J(θ) 的最小化(最优化)问题,目前还没有闭式解法(译者注:闭式解法, closed−formway ,即计算解析解的方法,指无需通过迭代计算而得到结果的解法)。因此,如往常一样,使用优化算法通过迭代的方式求解。对目标函数求导数(即梯度),其梯度为:
回想
∇θ(k)
符号的含义。尤其需要注意的是,
∇θ(k)J(θ)
本身就是一个向量,所以,其第
j
个元素即
有了该导数公式,之后可将其插入到一个优化包中并最小化
Softmax 回归的参数属性(Properties of Softmax regression parameterization)
Softmax 回归有一个不同寻常的特性,那就是参数冗余( redundant )。为解释这个特性,假设有参数向量 θ(j) ,对该向量减去某个固定的向量 ψ ,此时,向量中的每个元素 θ(j) 就被 θ(j)−ψ (其中 j=1,...,k )替代了。那么此时,假设在计算输入样本的类标签的概率时,就表示为:
换句话说,从参数向量中的每个元素 θ(j) 中减去 ψ 一点也不会影响到假设的类别预测!这表明了 Softmax 回归的参数中是有多余的。正式地说, Softmax 模型是过参数化的( overparameterized ,或参数冗余的),这意味着对任何一个拟合数据的假设而言,多种参数取值有可能得到同样的假设 hθ ,即从输入 x 经过不同的模型参数的假设计算从而得到同样的分类预测结果。
进一步说,若成本函数
注意到,通过设定 ψ=θ(K) ,总是可以用 θ(K)−ψ=0⃗ (0⃗ 是全零向量,其元素值均为0) 代替 θ(K) ,而不会对假设函数有任何影响。因此,可以去掉参数向量 θ 中的最后一个(或该向量中任意其它任意一个)元素 θ(K) ,而不影响假设函数的表达能力。实际上,因参数冗余的特性,与其优化全部的 K⋅n 个参数 (θ(1),θ(2),…,θ(K)) (其中 θ(k)∈Rn ),也可令 θ(K)=0⃗ ,只优化剩余的 K⋅n 个参数,算法依然能够正常工作。
与逻辑斯特回归的关系(Relationship to Logistic Regression)
在 K=2 特例中,一个可以证明的是 Softmax 回归简化为了逻辑斯特回归,表明 Softmax 回归是逻辑斯特回归的一般化形式。更具体地说,当 K=2 ,Softmax 回归的假设函数为
$$
\begin{align}
h_\theta(x) &=
\frac{1}{ \exp(\theta^{(1)\top}x) + \exp( \theta^{(2)\top} x^{(i)} ) }
\end{align}
$$
利用“假设是过参数化的”(或说“假设的回归参数冗余”)这一特点,设定 ψ=θ(2) ,并且从这两个向量中都减去向量 θ(2) ,得到
$$
\begin{align}
h(x) &=
\frac{1}{ \exp( (\theta^{(1)}-\theta^{(2)})^\top x^{(i)} ) + \exp(\vec{0}^\top x) }
&=
&=
\end{align}
$$
因此,用一个参数向量 θ′ 来表示 θ(2)−θ(1) ,就会发现 Softmax 回归预测其中一个类别的概率为 11+exp(−(θ′)⊤x(i)) ,另一个类别的概率为 1−11+exp(−(θ′)⊤x(i)) ,这与逻辑斯特回归是一致的。
练习 1C(Exercise 1C)
针对这一部分练习的初学者代码(Starter code)已经在 GitHub 代码仓库 中的 ex1/
目录下。
在本次练习中,您将会借助
MNIST
数据集,训练一个用于处理
10
个数字的分类器。这部分代码除会读取整个
MNIST
数据的训练和测试集外,其余的部分会与先前在练习 1B 中的代码(仅仅是识别数字
0
和
这部分代码的表现应该和在练习 1B 中的一样:读取训练和测试数据,同时加入截距项,然后借助 softmax_regression_vec.m
文件调用 minFunc
作为目标函数。当训练完成后,将会输出手写数字识别问题中,这
10
个类(译者注:对应从
0
到
您的任务是实现 softmax_regression_vec.m
文件中计算 softmax 目标函数
J(θ;X,y)
的部分,同时将计算结果存储在变量
f
中。
您也务必计算梯度项 minFunc
提供了向量参数 g=g(:)
;
如果有必要得到梯度权,您可以以写一段使用 for 循环的代码开始(请务必使用前面介绍的渐变检查调试策略!)。然而,您也许会发现这个实现的版本速度太慢,以至于优化不能通过所有的方式( 译者注:翻译不确定。“However, you might find that this implementation is too slow to run the optimizer all the way through.”)。在您得到一个运行较慢梯度权计算的版本后,您可以在进行所有实验前,尝试尽可能地将您的代码进行向量化处理。
下面是几条 MATLAB 的小提示,可能对您实现或者加速代码能起到作用(这些提示可能多少会有用处,但更多地取决于您的实现策略)。
假设有一个矩阵
A ,想从每行抽出单个元素。其中,从第 i 行抽出的元素,其列值并存在变量y(i) 中, y 是一个行向量。这个转换过程可以用函数sub2ind
来实现:I=sub2ind(size(A), 1:size(A,1), y); values = A(I);
这段代码将会采用索引对
(i,j) ,并计算出矩阵 A 中在(i,j) 位置处的一维索引。所以, I(1) 将会矩阵 A 中位置在(1,y(1)) 处的元素下标,同样, I(2) 将会矩阵 A 中位置在(2,y(2)) 处的元素下标。当您计算预测类标签概率 y^(i)k=exp(θ⊤:,kx(i))/(∑Kj=1exp(θ⊤:,jx(i))) 时,试着用矩阵乘法以及
bsxfun
来加速计算。比方说,当 θ 是矩阵的形式时,您可以为每个样本及其对应的 9 类使用a=θ⊤X 这样矩阵的形式,来计算乘积(再次强调一下,第 10 类已经从 θ 中省略了,也就是说 a(10,:) 的值被假定为 0 <script type="math/tex" id="MathJax-Element-145">0</script> )。