非监督特征学习与深度学习(五)----Softmax 回归(Softmax Regression)

注:本文转载自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 个已标记类别的训练集 {(x(1),y(1)),,(x(m),y(m))} ,其中(每个样本的)输入特征是 x(i)Rn 。在先前的逻辑斯特回归中,分类设定是两类,所以类标签 y(i){0,1} ,假设采取的形式为:

hθ(x)=11+exp(θx),

其中,模型参数 θ 在最小化代价函数时求得:

J(θ)=[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]

在 Softmax 回归的设定中,(与前文中两类分类不同)因为重点关注在多类分类,即类别标签 y 可以取 K 个不同的值,而不仅限于(两类分类中的)两个值。因此,训练集样本 {(x(1),y(1)),,(x(m),y(m))} 的类别标签值有 y(i){1,2,,K} 。(注意:通常类别标签起始于 1 ,而不是 0 )。举个例子,在 MNIST 数字识别任务(译者注: MNIST 是一个手写数字识别库,由 NYU 的 Yann LeCun 等人维护。http://yann.lecun.com/exdb/mnist/ )中, K=10 ,即类别总数是 10 个。

给出测试输入 x ,希望假设可以针对同一样本在不同的 k (其中, k=1,...,K )值下估计概率 P(y=k|x) 的值。也就是说,想要估计类标签取 K 个不同的值时的概率。由此,假设将会输出 K 维向量(该向量元素值和为 1 ),它给出的是 K 个类别对应的估计概率值。更具体地说,假设 hθ(x) 会采取形式为:

hθ(x)=P(y=1|x;θ)P(y=2|x;θ)P(y=K|x;θ)=1Kj=1exp(θ(j)x)exp(θ(1)x)exp(θ(2)x)exp(θ(K)x)

这里, θ(1),θ(2),,θ(K)Rn 是模型的参数。需要注意的是, 1Kj=1exp(θ(j)x) 这一项对分布进行了标准化( normalize ),所以其(最终)会加和为一项。

为方便起见,也写 θ 来表示模型的所有参数。当你实现 Softmax 回归时, n K 列的矩阵 θ 其实也是一列列 θ(k) 所组成的,即

θ=|θ(1)||θ(2)||||θ(K)|.

代价函数(Cost Function)

现在来描述 Softmax 回归的代价函数。在下面的方程中, 1{} 被称为“指示器函数”( indicator function ,译者注:老版教程中译为“示性函数”),即 1{}=1 1{}=0 。例如, 1{2+2=4} 求出的数值为 1 ;而 1{1+1=5} 求出的数值为 0 。代价函数将会是:

J(θ)=i=1mk=1K1{y(i)=k}logexp(θ(k)x(i))Kj=1exp(θ(j)x(i))

值得注意的是,逻辑斯特回归的代价函数也可等价地写成如下形式:

J(θ)=[i=1m(1y(i))log(1hθ(x(i)))+y(i)loghθ(x(i))]=[i=1mk=011{y(i)=k}logP(y(i)=k|x(i);θ)]

除了需要将 K 个不同的类标签的概率值相加外,逻辑斯特回归的代价函数与 Softmax 的代价函数是相似的。需要注意的是,在 Softmax 回归中有:

P(y(i)=k|x(i);θ)=exp(θ(k)x(i))Kj=1exp(θ(j)x(i))

对于 J(θ) 的最小化(最优化)问题,目前还没有闭式解法(译者注:闭式解法, closedformway ,即计算解析解的方法,指无需通过迭代计算而得到结果的解法)。因此,如往常一样,使用优化算法通过迭代的方式求解。对目标函数求导数(即梯度),其梯度为:

θ(k)J(θ)=i=1m[x(i)(1{y(i)=k}P(y(i)=k|x(i);θ))]

回想 θ(k) 符号的含义。尤其需要注意的是, θ(k)J(θ) 本身就是一个向量,所以,其第 j 个元素即 J(θ)θlk ,它是关于 θ(k) 的第 j 个元素的偏导数。

有了该导数公式,之后可将其插入到一个优化包中并最小化 J(θ)

Softmax 回归的参数属性(Properties of Softmax regression parameterization)

Softmax 回归有一个不同寻常的特性,那就是参数冗余( redundant )。为解释这个特性,假设有参数向量 θ(j) ,对该向量减去某个固定的向量 ψ ,此时,向量中的每个元素 θ(j) 就被 θ(j)ψ (其中 j=1,...,k )替代了。那么此时,假设在计算输入样本的类标签的概率时,就表示为:

P(y(i)=k|x(i);θ)=exp((θ(k)ψ)x(i))Kj=1exp((θ(j)ψ)x(i))=exp(θ(k)x(i))exp(ψx(i))Kj=1exp(θ(j)x(i))exp(ψx(i))=exp(θ(k)x(i))Kj=1exp(θ(j)x(i)).

换句话说,从参数向量中的每个元素 θ(j) 中减去 ψ 一点也不会影响到假设的类别预测!这表明了 Softmax 回归的参数中是有多余的。正式地说, Softmax 模型是过参数化的( overparameterized ,或参数冗余的),这意味着对任何一个拟合数据的假设而言,多种参数取值有可能得到同样的假设 hθ ,即从输入 x 经过不同的模型参数的假设计算从而得到同样的分类预测结果。

进一步说,若成本函数 J(θ) 被某组模型参数 (θ(1),θ(2),,θ(k)) 最小化,那么对任意的 ψ ,成本函数也可以被 (θ(1)ψ,θ(2)ψ,,θ(k)ψ) 最小化。因此, J(θ) 的最小值时的参数并不唯一。(有趣的是, J(θ) 仍是凸的,并且在梯度下降中不会遇到局部最优的问题,但是 Hessian 矩阵是奇异或不可逆的,这将会导致在牛顿法的直接实现上遇到数值问题。)

注意到,通过设定 ψ=θ(K) ,总是可以用 θ(K)ψ=0⃗ 0⃗ 0 代替 θ(K) ,而不会对假设函数有任何影响。因此,可以去掉参数向量 θ 中的最后一个(或该向量中任意其它任意一个)元素 θ(K) ,而不影响假设函数的表达能力。实际上,因参数冗余的特性,与其优化全部的 Kn 个参数 (θ(1),θ(2),,θ(K)) (其中 θ(k)Rn ),也可令 θ(K)=0⃗  ,只优化剩余的 Kn 个参数,算法依然能够正常工作。

与逻辑斯特回归的关系(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)} ) }

[exp(θ(1)x)exp(θ(2)x)]

\end{align}
$$

利用“假设是过参数化的”(或说“假设的回归参数冗余”)这一特点,设定 ψ=θ(2) ,并且从这两个向量中都减去向量 θ(2) ,得到

$$
\begin{align}
h(x) &=

\frac{1}{ \exp( (\theta^{(1)}-\theta^{(2)})^\top x^{(i)} ) + \exp(\vec{0}^\top x) }

[exp((θ(1)θ(2))x)exp(0⃗ x)]
\

&=

11+exp((θ(1)θ(2))x(i))exp((θ(1)θ(2))x)1+exp((θ(1)θ(2))x(i))
\

&=

11+exp((θ(1)θ(2))x(i))111+exp((θ(1)θ(2))x(i))

\end{align}
$$

因此,用一个参数向量 θ 来表示 θ(2)θ(1) ,就会发现 Softmax 回归预测其中一个类别的概率为 11+exp((θ)x(i)) ,另一个类别的概率为 111+exp((θ)x(i)) ,这与逻辑斯特回归是一致的。

练习 1C(Exercise 1C)

针对这一部分练习的初学者代码(Starter code)已经在 GitHub 代码仓库 中的 ex1/ 目录下。

在本次练习中,您将会借助 MNIST 数据集,训练一个用于处理 10 个数字的分类器。这部分代码除会读取整个 MNIST 数据的训练和测试集外,其余的部分会与先前在练习 1B 中的代码(仅仅是识别数字 0 1)非常类似,并且标签值 y(i) 从原本的 2 类到现在的 10 类, 即 y(i){1,,10} 。(标签值的改变可以使您方便地将 y(i) 的值作为矩阵的下标。)

这部分代码的表现应该和在练习 1B 中的一样:读取训练和测试数据,同时加入截距项,然后借助 softmax_regression_vec.m 文件调用 minFunc 作为目标函数。当训练完成后,将会输出手写数字识别问题中,这 10 个类(译者注:对应从 0 9 10 个数字)的训练和测试集上的准确率。

您的任务是实现 softmax_regression_vec.m 文件中计算 softmax 目标函数 J(θ;X,y) 的部分,同时将计算结果存储在变量 f 中。

您也务必计算梯度项 θJ(θ;X,y) ,并将其结果存在变量 g 中。请不要忘记 minFunc 提供了向量参数 θ 。初学者代码将会对参数 θ 变形为一个 n K1 列的矩阵(对于 10 个类这种情况,即 K=10 )。同时,您也不要忘记了如何将返回的梯度 g 返回成一个向量的方法,即 g=g(:)

如果有必要得到梯度权,您可以以写一段使用 for 循环的代码开始(请务必使用前面介绍的渐变检查调试策略!)。然而,您也许会发现这个实现的版本速度太慢,以至于优化不能通过所有的方式( 译者注:翻译不确定。“However, you might find that this implementation is too slow to run the optimizer all the way through.”)。在您得到一个运行较慢梯度权计算的版本后,您可以在进行所有实验前,尝试尽可能地将您的代码进行向量化处理。

下面是几条 MATLAB 的小提示,可能对您实现或者加速代码能起到作用(这些提示可能多少会有用处,但更多地取决于您的实现策略)。

  1. 假设有一个矩阵 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> )。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值