softmax
https://www.zhihu.com/question/41252833
http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92
其中p为真实分布,q非真实分布。(q越接近p 交叉熵的值越低)
在softmax分类算法中,使用交叉熵来进行样本预测(交叉熵越低,样本预测越准确),以手写数字识别为例:
手写数字1,那么真实分布就是(0,1,0,0,0, 0,0,0,0,0)
手写数字2,那么真实分布就是(0,0,1,0,0, 0,0,0,0,0)
…
所以手写数字1,对应的交叉熵就是:H = 1log1/p(1)+0log1/p(2) +…+0log1/p(9) = 1log1/p(1) = -log p(1)
softmax中的交叉熵:
image.png
求导获取梯度更新的公式(更深入的话可研究一下矩阵求导):
image.png
W更新公式:
用矩阵表示,则为(假设x(i)为[1~1024]): - { x[11024] * ([0,1,0,0,0, 0,0,0,0,0] - [p(0),p(1),…,p(10)] ) } * 1/m
如要了解具体的参数变化,需针对梯度下降法,进行研究
全部参数初始化为0 ,W[102410]
import numpy as np
x1=np.reshape([1,0],(1,2))
x2=np.reshape([0,1],(1,2))
x3=np.reshape([1,1],(1,2))
x4=np.reshape([0,0],(1,2))
w=np.random.randn(2, 4)*0.001
y1 = np.reshape([1,0,0,0],(1,4))
y2 = np.reshape([0,1,0,0],(1,4))
y3 = np.reshape([0,0,1,0],(1,4))
y4 = np.reshape([0,0,0,1],(1,4))
for i in range(5000):
ys1 = np.dot(x1, w)
ps1 = np.exp(ys1) / np.sum(np.exp(ys1))
print(ps1)
ys2 = np.dot(x2, w)
ps2 = np.exp(ys2) / np.sum(np.exp(ys2))
print(ps2)
ys3 = np.dot(x3, w)
ps3 = np.exp(ys3) / np.sum(np.exp(ys3))
print(ps3)
ys4 = np.dot(x4, w)
ps4 = np.exp(ys4) / np.sum(np.exp(ys4))
print(ps4)
w += 0.02 * np.dot(x1.T,((y1 - ps1)))
w += 0.02 * np.dot(x2.T,((y2 - ps2)))
w += 0.02 * np.dot(x3.T, ((y3 - ps3)))
w += 0.02 * np.dot(x4.T, ((y3 - ps3)))
总结:
y(i)
x(i) * W = ys(i) ----softmax----->ps(i)
W += 0.02 * (x(i).T *(y(i)- ps(i)))
y(i)为标签,x(i)为样本