1.softmax回归模型
softmax回归跟线性回归⼀样将输⼊特征与权重做线性叠加。
与线性回归的⼀个主要不同在于,
softmax回归的输出值个数等于标签⾥的类别数。
因为⼀共有4种特征和3种输出动物类别,
所以权重包含12个标量(带下标的w)、偏差包含3个标量(带下标的b),且对每个输⼊计算o1, o2, o3这3个输出:
image.png
softmax回归同线性回归⼀样,也是⼀个单层神经⽹络。
由于每个输出o1, o2, o3的计算都要依赖于所有的输⼊x1, x2, x3, x4,
softmax回归的输出层也是⼀个全连接层.
image.png
softmax模型定义:
image.png
def net(X):
return softmax(nd.dot(X.reshape((-1, num_inputs)), W) + b)
2.softmax运算
思考一个问题,为什么要进行softmax运算???
解释:
既然分类问题需要得到离散的预测输出,⼀个简单的办法是将输出值oi当作预测类别是i的置信
度,并将值最⼤的输出所对应的类作为预测输出,即输出argmaxi oi。例如,如果o1, o2, o3分别为0.1, 10, 0.1,由于o2最⼤,那么预测类别为2,其代表猫。
然而,直接使⽤输出层的输出有两个问题。
⼀⽅⾯,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。
例如,刚才举的例⼦中的输出值10表⽰“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果o1 = o3 = 103,那么输出值10却⼜表⽰图像类别为猫的概率很低。
另⼀⽅⾯,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
softmax运算符(softmax operator)解决了以上两个问题。
说白了,就是softmax能够将输出值变换成值为正切和为1的概率分布.
能更好的表达样本预测各个输出的概率.
image.png
3.softmax运算的实现
softmax运算是为了表达样本预测各个输出的概率,
softmax运算会先通过exp函数对每个元素做指数运算,
再对exp矩阵同⾏元素求和,
最后令矩阵每⾏各元素与该⾏元素之和相除。
这样⼀来,最终得到的矩阵每⾏元素和为1且⾮负。
因此,该矩阵每⾏都是合法的概率分布。
softmax运算的输出矩阵中的任意⼀⾏元素代表了⼀个样本在各个输出类别上的预测概率。
from mxnet import autograd, nd
# softmax运算
def softmax(X):
X_exp = X.exp()
# 只对同一行的元素求和,并在结果中保留行和列这两个维度
partition = X_exp.sum(axis=1, keepdims=True)
return X_exp / partition # 这⾥应⽤了⼴播机制
if __name__ == "__main__":
X = nd.random.normal(shape=(2, 5))
# 对于随机输⼊,我们将每个元素变成了⾮负数,且每⼀⾏和为1
X_prob = softmax(X)
print(X_prob, X_prob.sum(axis=1))
image.png
参考:
动手学深度学习第三章.
网友评论