该算法的Python实现,可以查看 深度学习入门—softmax回归 Python实现。本文论述算法原理
Softmax可以理解为logistic在多类上的扩展。模型如下:
假设我们拥有数据:
(x(i),y(i)),m=0,1,2,...
,此时我们对每一样本,都有假设:
其中 θ1,θ2,…,θk∈Rn+1 是模型的参数。请注意 1∑kj=1eθTjx(i) 这一项对概率分布进行归一化,使得所有概率之和为 1 。
为了方便起见,我们同样使用符号
θ
来表示全部的模型参数。在实现Softmax回归时,将
θ
用一个
k×(n+1)
的矩阵来表示会很方便,该矩阵是将
θ1,θ2,…,θk
按行罗列起来得到的,如下所示:
接下来是代价函数:
首先,先认识一个这样的符号:
这符号是示性函数。
代价函数表达如下:
目前,对于 J(θ) 的最小化问题,目前还没有闭式解法。因此,我们使用迭代的优化算法(例如梯度下降法,或 L-BFGS)。经过求导,我们得到梯度公式如下:
∇θjJ(θ) 本身是一个向量,它的第 l个元素∂J(θ)∂θjl 是 J(θ)对θj 的第 l 个分量的偏导数。
有了上面的偏导数公式以后,我们就可以将它代入到梯度下降法等算法中,来最小化
J(θ)
。 例如,在梯度下降法的标准实现中,每一次迭代需要进行如下更新:
θj:=θj−α∇θjJ(θ)(j=1,…,k)
。
当实现 softmax 回归算法时, 我们通常会使用上述代价函数的一个改进版本。具体来说,就是和权重衰减(weight decay)一起使用。我们接下来介绍它的细节。
权重衰减
我们通过添加一个权重衰减项
λ2∑ki=1∑nj=0θ2ij
来修改代价函数,这个衰减项会惩罚过大的参数值,现在我们的代价函数变为:
有了这个权重衰减项以后 (λ>0) ,代价函数就变成了严格的凸函数,这样就可以保证得到唯一的解了。 此时的 Hessian矩阵变为可逆矩阵,并且因为 J(θ) 是凸函数,梯度下降法和 L-BFGS 等算法可以保证收敛到全局最优解。
为了使用优化算法,我们需要求得这个新函数 J(θ) 的导数,如下:
梯度检验
在完成代价函数偏导数 ∇θjJ(θ) 的求导后,我们最好验证一下该求导结果是否正确。如果计算错误,我们能够直接判断我们的代码出现了问题。
梯度检验主要利用下面一条式子:
转换为:
如果能验证到
则求导结果是正确的
上式两端值的接近程度取决于 J 的具体形式。但是在假定 EPSILON=10−4 的情况下,你通常会发现上式左右两端至少有4位有效数字是一样的(通常会更多)。
但要注意的是, θ 一般情况下都是向量,这时候再具体代码实现时,要注意。
假设我们有一个用于计算
∂∂θiJ(θ)的函数gi(θ)
;我们想要检验
gi
是否输出正确的求导结果。我们定义
θ(i+)=θ+EPSILON×e⃗ i
,其中
是第
i
个基向量(维度和
θ
相同,在第
i
行是
“1”
而其他行是
“0”)
。所以,
θ(i+)
和
θ
几乎相同,除了第
i
行元素增加了
EPSILON
。类似地,
θ(i−)=θ−EPSILON×e⃗ i
得到的第
i
行减小了
EPSILON。
然后我们可以对每个
i
检查下式是否成立,进而验证
gi(θ)
的正确性:
下面给出梯度检查的代码。如果我们想检查参数的梯度是否正确,我们需要以下几个步骤:
首先使用一个或多个样本对算法进行训练,这样就能获得每个权重的梯度。
将
wij
加上一个很小的值(),重新计算神经网络在这个样本下的
wij
。
将
wij
减上一个很小的值(),重新计算神经网络在这个样本下的
wij
。
根据检验公式计算出期望的梯度值,和第一步获得的梯度值进行比较,它们应该几乎相等(至少4位有效数字相同)。
Softmax 回归 vs. k 个二元分类器
如果你在开发一个音乐分类的应用,需要对k种类型的音乐进行识别,那么是选择使用 softmax 分类器呢,还是使用 logistic 回归算法建立 k 个独立的二元分类器呢?
这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签(即:一首歌只能属于这四种音乐类型的其中一种),此时你应该使用类别数 k = 4 的softmax回归。(如果在你的数据集中,有的歌曲不属于以上四类的其中任何一类,那么你可以添加一个“其他类”,并将类别数 k 设为5。)
如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用4个二分类的 logistic 回归分类器更为合适。这样,对于每个新的音乐作品 ,我们的算法可以分别判断它是否属于各个类别。
现在我们来看一个计算视觉领域的例子,你的任务是将图像分到三个不同类别中。(i) 假设这三个类别分别是:室内场景、户外城区场景、户外荒野场景。你会使用sofmax回归还是 3个logistic 回归分类器呢? (ii) 现在假设这三个类别分别是室内场景、黑白图片、包含人物的图片,你又会选择 softmax 回归还是多个 logistic 回归分类器呢?
在第一个例子中,三个类别是互斥的,因此更适于选择softmax回归分类器 。而在第二个例子中,建立三个独立的 logistic回归分类器更加合适。