softmax

作者: 有花落蝶 | 来源:发表于2018-04-08 23:05 被阅读0次

    https://www.zhihu.com/question/41252833
    http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92

    屏幕快照 2018-04-08 下午11.26.14.png

    其中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
    求导获取梯度更新的公式(更深入的话可研究一下矩阵求导):
    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[1024
    10]

    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)为样本

    相关文章

      网友评论

        本文标题:softmax

        本文链接:https://www.haomeiwen.com/subject/cgmphftx.html