文档章节

Softmax分类函数

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:19
字数 1344
阅读 3
收藏 0

这篇教程是翻译Peter Roelants写的神经网络教程,作者已经授权翻译,这是原文

该教程将介绍如何入门神经网络,一共包含五部分。你可以在以下链接找到完整内容。

softmax分类函数


这部分教程将介绍两部分:

  • softmax函数
  • 交叉熵损失函数

在先前的教程中,我们已经使用学习了如何使用Logistic函数来实现二分类问题。对于多分类问题,我们可以使用多项Logistic回归,该方法也被称之为softmax函数。接下来,我们来解释什么事softmax函数,以及怎么得到它。

我们先导入教程需要使用的软件包。

import numpy as np 
import matplotlib.pyplot as plt  
from matplotlib.colors import colorConverter, ListedColormap 
from mpl_toolkits.mplot3d import Axes3D  
from matplotlib import cm

Softmax函数

在之前的教程中,我们已经知道了Logistic函数只能被使用在二分类问题中,但是它的多项式回归,即softmax函数,可以解决多分类问题。假设softmax函数ς的输入数据是C维度的向量z,那么softmax函数的数据也是一个C维度的向量y,里面的值是0或者1。softmax函数其实就是一个归一化的指数函数,定义如下:


softmax函数

式子中的分母充当了正则项的作用,可以使得


作为神经网络的输出层,softmax函数中的值可以用C个神经元来表示。

对于给定的输入z,我们可以得到每个分类的概率t = c for c = 1 ... C可以表示为:


概率方程

其中,P(t=c|z)表示,在给定输入z时,该输入数据是c分类的概率。

下图展示了在一个二分类(t = 1, t = 2)中,输入向量是z = [z1, z2],那么输出概率P(t=1|z)如下图所示。

# Define the softmax function
def softmax(z):
    return np.exp(z) / np.sum(np.exp(z))
# Plot the softmax output for 2 dimensions for both classes
# Plot the output in function of the weights
# Define a vector of weights for which we want to plot the ooutput
nb_of_zs = 200
zs = np.linspace(-10, 10, num=nb_of_zs) # input 
zs_1, zs_2 = np.meshgrid(zs, zs) # generate grid
y = np.zeros((nb_of_zs, nb_of_zs, 2)) # initialize output
# Fill the output matrix for each combination of input z's
for i in range(nb_of_zs):
    for j in range(nb_of_zs):
        y[i,j,:] = softmax(np.asarray([zs_1[i,j], zs_2[i,j]]))
# Plot the cost function surfaces for both classes
fig = plt.figure()
# Plot the cost function surface for t=1
ax = fig.gca(projection='3d')
surf = ax.plot_surface(zs_1, zs_2, y[:,:,0], linewidth=0, cmap=cm.coolwarm)
ax.view_init(elev=30, azim=70)
cbar = fig.colorbar(surf)
ax.set_xlabel('$z_1$', fontsize=15)
ax.set_ylabel('$z_2$', fontsize=15)
ax.set_zlabel('$y_1$', fontsize=15)
ax.set_title ('$P(t=1|\mathbf{z})$')
cbar.ax.set_ylabel('$P(t=1|\mathbf{z})$', fontsize=15)
plt.grid()
plt.show()

P(t=1|z)的概率

softmax函数的导数

在神经网络中,使用softmax函数,我们需要知道softmax函数的导数。如果我们定义:


那么可以得到:


因此,softmax函数的输出结果y对于它的输入数据z的导数∂yi/∂zj可以定义为:


导数推导

注意,当i = j时,softmax函数的倒数推导结果和Logistic函数一样。

softmax函数的交叉熵损失函数

在学习softmax函数的损失函数之前,我们先从学习它的最大似然函数开始。给定模型的参数组θ,利用这个参数组,我们可以得到输入样本的正确预测,正如在Logistic损失函数推导中,我们可以仿照写出这个的最大似然估计:


最大似然估计

根据联合概率,我们可以将似然函数改写成:P(t,z|θ),根据条件分布,我们最终可以得到如下公式:


条件分布

因为我们不关心z的概率,所以公式又可以改写为:L(θ|t,z)=P(t|z,θ)。而且,P(t|z, θ)可以被写成P(t|z),如果θ会一个定值。因为,每一个ti都是依赖于整个z,而且只有其中一个t将会被激活,所以我们可以得到下式:


概率推导

正如我们在Logistic函数中推导损失函数的导数一样,最大化似然函数就是最小化它的负对数释然函数:


负对数似然函数

其中,ξ表示交叉熵误差函数。在二分类问题中,我们将t2定义为t2=1−t1。同理,在softmax函数中,我们也可以定义为:


交叉熵误差函数

n个样本的批处理中,交叉熵误差函数可以这样计算:


批处理

其中,当且仅当tic1,那么样本i是属于类别cyic是样本i属于类别c的概率。

softmax函数的交叉熵损失函数的推导

损失函数对于zi的导数∂ξ/∂zi求解如下:


求导过程

上式已经求解了当i=ji≠j的两种情况。

最终的结果为∂ξ/∂zi=yi−ti for all i ∈ C,这个求导结果和Logistic函数的交叉熵损失函数求导是一样的,再次证明softmax函数是Logistic函数的一个扩展板。

完整代码,点击这里

本文转载自:http://www.jianshu.com/p/8eb17fa41164

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2634
码字总数 82983
作品 0
程序员
机器学习之softmax函数

Softmax分类函数 这篇教程是翻译Peter Roelants写的神经网络教程,作者已经授权翻译,这是原文。 该教程将介绍如何入门神经网络,一共包含五部分。你可以在以下链接找到完整内容。 (一)神经...

qq_37634812
2017/12/07
0
0
深度学习-softmax损失函数

softmax损失函数 softmax函数定义 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而进行多分类! softmax计算公式,假设我们有一个数组,V,V...

googler_offer
01/21
0
0
斯坦福CS231n assignment1:softmax损失函数求导

分类 在前文斯坦福CS231n assignment1:SVM图像分类原理及实现中我们讲解了利用SVM模型进行图像分类的方法,本文我们讲解图像分类的另一种实现,利用softmax进行图像分类。 softmax和svm模型...

JackMeGo
03/22
0
0
神经网络常用激活函数对比:sigmoid VS sofmax(附python源码)

首发地址:https://yq.aliyun.com/articles/73661 更多深度文章,请关注:https://yq.aliyun.com/cloud Softmax函数与Sigmoid函数之间的区别 作者介绍: Saimadhu Polamuri:是一名自学成才的...

uncle_ll
2017/07/12
0
0
三分钟带你对 Softmax 划重点

1. 什么是Softmax Softmax 在机器学习和深度学习中有着非常广泛的应用。尤其在处理多分类(C > 2)问题,分类器最后的输出单元需要Softmax 函数进行数值处理。关于Softmax 函数的定义如下所示...

红色石头Will
06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
48分钟前
1
0
OSChina 周四乱弹 —— 上帝对我单身年限的惩罚越来越长了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享张卫健的单曲《身体健康》 《身体健康》- 张卫健 手机党少年们想听歌,请使劲儿戳(这里) 昨天是重阳节咯, 可惜小小编辑总是晚...

小小编辑
50分钟前
10
0
django rest framework 外键序列化方法与问题总结

django rest framework 外键序列化方法与问题总结 当借口中需要出现一对多关系的时候,我们可以用rest_framwork的序列化功能来处理,代码如下. # models.pyfrom django.db import modelscl...

_Change_
昨天
3
0
SingleNumber136 leetCode

Given a non-empty array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you im......

woshixin
昨天
3
0
String ,  StringBuffer ,  StringBuilder的区别

String , StringBuffer , StringBuilder的区别 String 首先,String 是用来表示一个字符串常量的,它是一个不可变对象,意味着,一旦我们创建了某个字符串之后,就不能再改变它的值了,我们可...

tsmyk0715
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部